Vincent Povirk : winex11.drv: Convert image/bmp X selections to Windows DIB .

Alexandre Julliard julliard at winehq.org
Fri May 1 09:33:21 CDT 2009


Module: wine
Branch: master
Commit: 272e2d2251c705ebed38692e888e84d0153613a4
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=272e2d2251c705ebed38692e888e84d0153613a4

Author: Vincent Povirk <vincent at codeweavers.com>
Date:   Fri Apr 24 17:19:38 2009 -0500

winex11.drv: Convert image/bmp X selections to Windows DIB.

---

 dlls/winex11.drv/clipboard.c |   53 +++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 52 insertions(+), 1 deletions(-)

diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index bb29b82..5a042f6 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -151,6 +151,7 @@ static HANDLE X11DRV_CLIPBOARD_ImportClipboardData(Display *d, Window w, Atom pr
 static HANDLE X11DRV_CLIPBOARD_ImportEnhMetaFile(Display *d, Window w, Atom prop);
 static HANDLE X11DRV_CLIPBOARD_ImportMetaFilePict(Display *d, Window w, Atom prop);
 static HANDLE X11DRV_CLIPBOARD_ImportXAPIXMAP(Display *d, Window w, Atom prop);
+static HANDLE X11DRV_CLIPBOARD_ImportImageBmp(Display *d, Window w, Atom prop);
 static HANDLE X11DRV_CLIPBOARD_ImportXAString(Display *d, Window w, Atom prop);
 static HANDLE X11DRV_CLIPBOARD_ImportUTF8(Display *d, Window w, Atom prop);
 static HANDLE X11DRV_CLIPBOARD_ImportCompoundText(Display *d, Window w, Atom prop);
@@ -192,6 +193,7 @@ static const WCHAR wszCF_DIF[] = {'W','C','F','_','D','I','F',0};
 static const WCHAR wszCF_TIFF[] = {'W','C','F','_','T','I','F','F',0};
 static const WCHAR wszCF_OEMTEXT[] = {'W','C','F','_','O','E','M','T','E','X','T',0};
 static const WCHAR wszCF_DIB[] = {'W','C','F','_','D','I','B',0};
+static const WCHAR wszIMAGEBMP[] = {'i','m','a','g','e','/','b','m','p',0};
 static const WCHAR wszCF_PALETTE[] = {'W','C','F','_','P','A','L','E','T','T','E',0};
 static const WCHAR wszCF_PENDATA[] = {'W','C','F','_','P','E','N','D','A','T','A',0};
 static const WCHAR wszCF_RIFF[] = {'W','C','F','_','R','I','F','F',0};
@@ -278,7 +280,10 @@ static WINE_CLIPFORMAT ClipFormats[]  =
         X11DRV_CLIPBOARD_ExportClipboardData, &ClipFormats[20], &ClipFormats[22]},
 
     { CF_DSPENHMETAFILE, wszCF_DSPENHMETAFILE, 0, CF_FLAG_BUILTINFMT, X11DRV_CLIPBOARD_ImportClipboardData,
-        X11DRV_CLIPBOARD_ExportClipboardData, &ClipFormats[21], NULL}
+        X11DRV_CLIPBOARD_ExportClipboardData, &ClipFormats[21], &ClipFormats[23]},
+
+    { CF_DIB, wszIMAGEBMP, 0, CF_FLAG_BUILTINFMT, X11DRV_CLIPBOARD_ImportImageBmp,
+        NULL, &ClipFormats[22], NULL},
 };
 
 #define GET_ATOM(prop)  (((prop) < FIRST_XATOM) ? (Atom)(prop) : X11DRV_Atoms[(prop) - FIRST_XATOM])
@@ -1318,6 +1323,52 @@ static HANDLE X11DRV_CLIPBOARD_ImportXAPIXMAP(Display *display, Window w, Atom p
 
 
 /**************************************************************************
+ *		X11DRV_CLIPBOARD_ImportImageBmp
+ *
+ *  Import image/bmp, converting the image to CF_DIB.
+ */
+static HANDLE X11DRV_CLIPBOARD_ImportImageBmp(Display *display, Window w, Atom prop)
+{
+    LPBYTE lpdata;
+    unsigned long cbytes;
+    HANDLE hClipData = 0;
+
+    if (X11DRV_CLIPBOARD_ReadProperty(display, w, prop, &lpdata, &cbytes))
+    {
+        BITMAPFILEHEADER *bfh = (BITMAPFILEHEADER*)lpdata;
+
+        if (cbytes >= sizeof(BITMAPFILEHEADER)+sizeof(BITMAPCOREHEADER) &&
+            bfh->bfType == 0x4d42 /* "BM" */)
+        {
+            BITMAPINFO *bmi = (BITMAPINFO*)(bfh+1);
+            HBITMAP hbmp;
+            HDC hdc;
+
+            hdc = GetDC(0);
+            hbmp = CreateDIBitmap(
+                hdc,
+                &(bmi->bmiHeader),
+                CBM_INIT,
+                lpdata+bfh->bfOffBits,
+                bmi,
+                DIB_RGB_COLORS
+                );
+
+            hClipData = X11DRV_DIB_CreateDIBFromBitmap(hdc, hbmp);
+
+            DeleteObject(hbmp);
+            ReleaseDC(0, hdc);
+        }
+
+        /* Free the retrieved property data */
+        HeapFree(GetProcessHeap(), 0, lpdata);
+    }
+
+    return hClipData;
+}
+
+
+/**************************************************************************
  *		X11DRV_CLIPBOARD_ImportMetaFilePict
  *
  *  Import MetaFilePict.




More information about the wine-cvs mailing list