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