Vincent Povirk : winex11.drv: Export copied images as image/bmp.
Alexandre Julliard
julliard at winehq.org
Mon May 4 09:06:36 CDT 2009
Module: wine
Branch: master
Commit: 56a3e788eacee60c255b1b38a19d738ba4b5fe3d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=56a3e788eacee60c255b1b38a19d738ba4b5fe3d
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Thu Apr 30 14:40:29 2009 -0500
winex11.drv: Export copied images as image/bmp.
---
dlls/winex11.drv/clipboard.c | 73 +++++++++++++++++++++++++++++++++++++++++-
1 files changed, 72 insertions(+), 1 deletions(-)
diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index 5a042f6..f14a84c 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -161,6 +161,8 @@ static HANDLE X11DRV_CLIPBOARD_ExportString(Display *display, Window requestor,
Atom rprop, LPWINE_CLIPDATA lpData, LPDWORD lpBytes);
static HANDLE X11DRV_CLIPBOARD_ExportXAPIXMAP(Display *display, Window requestor, Atom aTarget,
Atom rprop, LPWINE_CLIPDATA lpdata, LPDWORD lpBytes);
+static HANDLE X11DRV_CLIPBOARD_ExportImageBmp(Display *display, Window requestor, Atom aTarget,
+ Atom rprop, LPWINE_CLIPDATA lpdata, LPDWORD lpBytes);
static HANDLE X11DRV_CLIPBOARD_ExportMetaFilePict(Display *display, Window requestor, Atom aTarget,
Atom rprop, LPWINE_CLIPDATA lpdata, LPDWORD lpBytes);
static HANDLE X11DRV_CLIPBOARD_ExportEnhMetaFile(Display *display, Window requestor, Atom aTarget,
@@ -283,7 +285,7 @@ static WINE_CLIPFORMAT ClipFormats[] =
X11DRV_CLIPBOARD_ExportClipboardData, &ClipFormats[21], &ClipFormats[23]},
{ CF_DIB, wszIMAGEBMP, 0, CF_FLAG_BUILTINFMT, X11DRV_CLIPBOARD_ImportImageBmp,
- NULL, &ClipFormats[22], NULL},
+ X11DRV_CLIPBOARD_ExportImageBmp, &ClipFormats[22], NULL},
};
#define GET_ATOM(prop) (((prop) < FIRST_XATOM) ? (Atom)(prop) : X11DRV_Atoms[(prop) - FIRST_XATOM])
@@ -1709,6 +1711,75 @@ static HANDLE X11DRV_CLIPBOARD_ExportXAPIXMAP(Display *display, Window requestor
/**************************************************************************
+ * X11DRV_CLIPBOARD_ExportImageBmp
+ *
+ * Export CF_DIB to image/bmp.
+ */
+static HANDLE X11DRV_CLIPBOARD_ExportImageBmp(Display *display, Window requestor, Atom aTarget, Atom rprop,
+ LPWINE_CLIPDATA lpdata, LPDWORD lpBytes)
+{
+ HANDLE hpackeddib;
+ LPBYTE dibdata;
+ UINT bmpsize;
+ HANDLE hbmpdata;
+ LPBYTE bmpdata;
+ BITMAPFILEHEADER *bfh;
+
+ *lpBytes = 0;
+
+ if (!X11DRV_CLIPBOARD_RenderFormat(display, lpdata))
+ {
+ ERR("Failed to export %04x format\n", lpdata->wFormatID);
+ return 0;
+ }
+
+ hpackeddib = lpdata->hData32;
+
+ dibdata = GlobalLock(hpackeddib);
+ if (!dibdata)
+ {
+ ERR("Failed to lock packed DIB\n");
+ return 0;
+ }
+
+ bmpsize = sizeof(BITMAPFILEHEADER) + GlobalSize(hpackeddib);
+
+ hbmpdata = GlobalAlloc(0, bmpsize);
+
+ if (hbmpdata)
+ {
+ bmpdata = GlobalLock(hbmpdata);
+
+ if (!bmpdata)
+ {
+ GlobalFree(hbmpdata);
+ GlobalUnlock(hpackeddib);
+ return 0;
+ }
+
+ /* bitmap file header */
+ bfh = (BITMAPFILEHEADER*)bmpdata;
+ bfh->bfType = 0x4d42; /* "BM" */
+ bfh->bfSize = bmpsize;
+ bfh->bfReserved1 = 0;
+ bfh->bfReserved2 = 0;
+ bfh->bfOffBits = sizeof(BITMAPFILEHEADER) + bitmap_info_size((BITMAPINFO*)dibdata, DIB_RGB_COLORS);
+
+ /* rest of bitmap is the same as the packed dib */
+ memcpy(bfh+1, dibdata, bmpsize-sizeof(BITMAPFILEHEADER));
+
+ *lpBytes = bmpsize;
+
+ GlobalUnlock(hbmpdata);
+ }
+
+ GlobalUnlock(hpackeddib);
+
+ return hbmpdata;
+}
+
+
+/**************************************************************************
* X11DRV_CLIPBOARD_ExportMetaFilePict
*
* Export MetaFilePict.
More information about the wine-cvs
mailing list