Charles Davis : winemac.drv: Fix our handling of bitmaps on the clipboard.
Alexandre Julliard
julliard at wine.codeweavers.com
Wed Mar 2 11:26:09 CST 2016
Module: wine
Branch: master
Commit: 9a18a62fb22d57092e6279e79ddb7e119088d47d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=9a18a62fb22d57092e6279e79ddb7e119088d47d
Author: Charles Davis <cdavis5x at gmail.com>
Date: Fri Feb 26 02:55:28 2016 -0700
winemac.drv: Fix our handling of bitmaps on the clipboard.
Signed-off-by: Charles Davis <cdavis5x at gmail.com>
Signed-off-by: Ken Thomases <ken at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/winemac.drv/clipboard.c | 87 ++++++++++++++++++++++++++++++++++++++------
1 file changed, 76 insertions(+), 11 deletions(-)
diff --git a/dlls/winemac.drv/clipboard.c b/dlls/winemac.drv/clipboard.c
index 97fa80e..188d4e2 100644
--- a/dlls/winemac.drv/clipboard.c
+++ b/dlls/winemac.drv/clipboard.c
@@ -73,6 +73,7 @@ typedef struct _WINE_CLIPFORMAT
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_dib_to_bitmap(CFDataRef data);
static HANDLE import_enhmetafile(CFDataRef data);
static HANDLE import_enhmetafile_to_metafilepict(CFDataRef data);
static HANDLE import_metafilepict(CFDataRef data);
@@ -93,6 +94,7 @@ static HANDLE import_utf16_to_unicodetext(CFDataRef data);
static CFDataRef export_clipboard_data(HANDLE data);
static CFDataRef export_bitmap_to_bmp(HANDLE data);
+static CFDataRef export_bitmap_to_dib(HANDLE data);
static CFDataRef export_dib_to_bmp(HANDLE data);
static CFDataRef export_enhmetafile(HANDLE data);
static CFDataRef export_hdrop_to_filenames(HANDLE data);
@@ -158,7 +160,6 @@ static const struct
BOOL synthesized;
} builtin_format_ids[] =
{
- { CF_DIBV5, CFSTR("org.winehq.builtin.dibv5"), import_clipboard_data, export_clipboard_data, FALSE },
{ CF_DIF, CFSTR("org.winehq.builtin.dif"), import_clipboard_data, export_clipboard_data, FALSE },
{ CF_DSPBITMAP, CFSTR("org.winehq.builtin.dspbitmap"), import_clipboard_data, export_clipboard_data, FALSE },
{ CF_DSPENHMETAFILE, CFSTR("org.winehq.builtin.dspenhmetafile"), import_clipboard_data, export_clipboard_data, FALSE },
@@ -193,11 +194,21 @@ static const struct
{ CF_OEMTEXT, CFSTR("public.utf16-plain-text"), import_utf16_to_oemtext, export_oemtext_to_utf16, TRUE },
{ CF_UNICODETEXT, CFSTR("public.utf16-plain-text"), import_utf16_to_unicodetext, export_unicodetext_to_utf16,TRUE },
+ { CF_BITMAP, CFSTR("org.winehq.builtin.bitmap"), import_bmp_to_bitmap, export_bitmap_to_bmp, FALSE },
+ { CF_DIB, CFSTR("org.winehq.builtin.bitmap"), import_bmp_to_dib, export_dib_to_bmp, TRUE },
+ { CF_DIBV5, CFSTR("org.winehq.builtin.bitmap"), import_bmp_to_dib, export_dib_to_bmp, TRUE },
+
{ CF_DIB, CFSTR("org.winehq.builtin.dib"), import_clipboard_data, export_clipboard_data, FALSE },
- { CF_DIB, CFSTR("com.microsoft.bmp"), import_bmp_to_dib, export_dib_to_bmp, TRUE },
+ { CF_BITMAP, CFSTR("org.winehq.builtin.dib"), import_dib_to_bitmap, export_bitmap_to_dib, TRUE },
+ { CF_DIBV5, CFSTR("org.winehq.builtin.dib"), import_clipboard_data, export_clipboard_data, TRUE },
+
+ { CF_DIBV5, CFSTR("org.winehq.builtin.dibv5"), import_clipboard_data, export_clipboard_data, FALSE },
+ { CF_BITMAP, CFSTR("org.winehq.builtin.dibv5"), import_dib_to_bitmap, export_bitmap_to_dib, TRUE },
+ { CF_DIB, CFSTR("org.winehq.builtin.dibv5"), import_clipboard_data, export_clipboard_data, TRUE },
- { CF_BITMAP, CFSTR("org.winehq.builtin.bitmap"), import_bmp_to_bitmap, export_bitmap_to_bmp, FALSE },
{ CF_BITMAP, CFSTR("com.microsoft.bmp"), import_bmp_to_bitmap, export_bitmap_to_bmp, TRUE },
+ { CF_DIB, CFSTR("com.microsoft.bmp"), import_bmp_to_dib, export_dib_to_bmp, TRUE },
+ { CF_DIBV5, CFSTR("com.microsoft.bmp"), import_bmp_to_dib, export_dib_to_bmp, TRUE },
{ 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 },
@@ -640,14 +651,13 @@ static HANDLE import_clipboard_data(CFDataRef data)
/**************************************************************************
- * import_bmp_to_bitmap
+ * create_bitmap_from_dib
*
- * Import BMP data, converting to CF_BITMAP format.
+ * Given a packed DIB, creates a bitmap object from it.
*/
-static HANDLE import_bmp_to_bitmap(CFDataRef data)
+static HANDLE create_bitmap_from_dib(HANDLE dib)
{
HANDLE ret = 0;
- HANDLE dib = import_bmp_to_dib(data);
BITMAPINFO *bmi;
if (dib && (bmi = GlobalLock(dib)))
@@ -666,6 +676,22 @@ static HANDLE import_bmp_to_bitmap(CFDataRef data)
ReleaseDC(NULL, hdc);
}
+ return ret;
+}
+
+
+/**************************************************************************
+ * import_bmp_to_bitmap
+ *
+ * Import BMP data, converting to CF_BITMAP format.
+ */
+static HANDLE import_bmp_to_bitmap(CFDataRef data)
+{
+ HANDLE ret;
+ HANDLE dib = import_bmp_to_dib(data);
+
+ ret = create_bitmap_from_dib(dib);
+
GlobalFree(dib);
return ret;
}
@@ -674,8 +700,8 @@ static HANDLE import_bmp_to_bitmap(CFDataRef data)
/**************************************************************************
* import_bmp_to_dib
*
- * Import BMP data, converting to CF_DIB format. This just entails
- * stripping the BMP file format header.
+ * Import BMP data, converting to CF_DIB or CF_DIBV5 format. This just
+ * entails stripping the BMP file format header.
*/
static HANDLE import_bmp_to_dib(CFDataRef data)
{
@@ -706,6 +732,24 @@ static HANDLE import_bmp_to_dib(CFDataRef data)
/**************************************************************************
+ * import_dib_to_bitmap
+ *
+ * Import device-independent bitmap data, converting to CF_BITMAP format.
+ */
+static HANDLE import_dib_to_bitmap(CFDataRef data)
+{
+ HANDLE ret;
+ HANDLE dib = import_clipboard_data(data);
+
+ ret = create_bitmap_from_dib(dib);
+
+ GlobalFree(dib);
+
+ return ret;
+}
+
+
+/**************************************************************************
* import_enhmetafile
*
* Import enhanced metafile data, converting it to CF_ENHMETAFILE.
@@ -1198,6 +1242,27 @@ static CFDataRef export_bitmap_to_bmp(HANDLE data)
/**************************************************************************
+ * export_bitmap_to_dib
+ *
+ * Export CF_BITMAP to a raw packed device-independent bitmap.
+ */
+static CFDataRef export_bitmap_to_dib(HANDLE data)
+{
+ CFDataRef ret = NULL;
+ HGLOBAL dib;
+
+ dib = create_dib_from_bitmap(data);
+ if (dib)
+ {
+ ret = export_clipboard_data(dib);
+ GlobalFree(dib);
+ }
+
+ return ret;
+}
+
+
+/**************************************************************************
* export_codepage_to_utf8
*
* Export string data in a specified codepage to UTF-8.
@@ -1248,8 +1313,8 @@ static CFDataRef export_codepage_to_utf16(HANDLE data, UINT cp)
/**************************************************************************
* export_dib_to_bmp
*
- * Export CF_DIB to BMP file format. This just entails prepending a BMP
- * file format header to the data.
+ * Export CF_DIB or CF_DIBV5 to BMP file format. This just entails
+ * prepending a BMP file format header to the data.
*/
static CFDataRef export_dib_to_bmp(HANDLE data)
{
More information about the wine-cvs
mailing list