Alexandre Julliard : winex11: Use the get_pixmap_image helper to import XA_PIXMAP clipboard formats.

Alexandre Julliard julliard at winehq.org
Mon May 14 14:26:04 CDT 2012


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Fri May 11 12:50:25 2012 +0200

winex11: Use the get_pixmap_image helper to import XA_PIXMAP clipboard formats.

---

 dlls/winex11.drv/clipboard.c |   81 +++++++++++++++++++++++++----------------
 1 files changed, 49 insertions(+), 32 deletions(-)

diff --git a/dlls/winex11.drv/clipboard.c b/dlls/winex11.drv/clipboard.c
index 6d0054e..ac17bdd 100644
--- a/dlls/winex11.drv/clipboard.c
+++ b/dlls/winex11.drv/clipboard.c
@@ -1328,10 +1328,10 @@ static HANDLE X11DRV_CLIPBOARD_ImportXAPIXMAP(Display *display, Window w, Atom p
 
     if (X11DRV_CLIPBOARD_ReadProperty(display, w, prop, &lpdata, &cbytes))
     {
-        HDC hdcMem;
-        X_PHYSBITMAP *physBitmap;
-        Pixmap orig_pixmap;
-        HBITMAP hBmp = 0;
+        XVisualInfo vis;
+        char buffer[FIELD_OFFSET( BITMAPINFO, bmiColors[256] )];
+        BITMAPINFO *info = (BITMAPINFO *)buffer;
+        struct gdi_image_bits bits;
         Window root;
         int x,y;               /* Unused */
         unsigned border_width; /* Unused */
@@ -1349,37 +1349,54 @@ static HANDLE X11DRV_CLIPBOARD_ImportXAPIXMAP(Display *display, Window w, Atom p
         TRACE("\tPixmap properties: width=%d, height=%d, depth=%d\n",
               width, height, depth);
 
-        /*
-         * Create an HBITMAP with the same dimensions and BPP as the pixmap,
-         * and make it a container for the pixmap passed.
-         */
-        if (!(hBmp = CreateBitmap( width, height, 1, pixmap_formats[depth]->bits_per_pixel, NULL )))
+        memset( &vis, 0, sizeof(vis) );
+        vis.depth = depth;
+        if (depth == screen_depth)
+        {
+            vis.visual     = visual;
+            vis.visualid   = visual->visualid;
+            vis.class      = visual->class;
+            vis.red_mask   = visual->red_mask;
+            vis.green_mask = visual->green_mask;
+            vis.blue_mask  = visual->blue_mask;
+        }
+        else switch (pixmap_formats[depth]->bits_per_pixel)
+        {
+        case 1:
+        case 4:
+        case 8:
+            break;
+        case 16:  /* assume R5G5B5 */
+            vis.red_mask   = 0x7c00;
+            vis.green_mask = 0x03e0;
+            vis.blue_mask  = 0x001f;
+            break;
+        case 24:  /* assume R8G8B8 */
+        case 32:  /* assume A8R8G8B8 */
+            vis.red_mask   = 0xff0000;
+            vis.green_mask = 0x00ff00;
+            vis.blue_mask  = 0x0000ff;
+            break;
+        default:
             return 0;
+        }
 
-        /* force bitmap to be owned by a screen DC */
-        hdcMem = CreateCompatibleDC( 0 );
-        SelectObject( hdcMem, SelectObject( hdcMem, hBmp ));
-        DeleteDC( hdcMem );
-
-        physBitmap = X11DRV_get_phys_bitmap( hBmp );
-
-        /* swap the new pixmap in */
-        orig_pixmap = physBitmap->pixmap;
-        physBitmap->pixmap = *pPixmap;
-
-        /*
-         * Create a packed DIB from the Pixmap wrapper bitmap created above.
-         * A packed DIB contains a BITMAPINFO structure followed immediately by
-         * an optional color palette and the pixel data.
-         */
-        hClipData = create_dib_from_bitmap( hBmp );
-
-        /* we can now get rid of the HBITMAP and its original pixmap */
-        physBitmap->pixmap = orig_pixmap;
-        DeleteObject(hBmp);
+        if (!get_pixmap_image( *pPixmap, width, height, &vis, info, &bits ))
+        {
+            DWORD info_size = bitmap_info_size( info, DIB_RGB_COLORS );
+            BYTE *ptr;
 
-        /* Free the retrieved property data */
-        HeapFree(GetProcessHeap(), 0, lpdata);
+            hClipData = GlobalAlloc( GMEM_MOVEABLE | GMEM_DDESHARE,
+                                     info_size + info->bmiHeader.biSizeImage );
+            if (hClipData)
+            {
+                ptr = GlobalLock( hClipData );
+                memcpy( ptr, info, info_size );
+                memcpy( ptr + info_size, bits.ptr, info->bmiHeader.biSizeImage );
+                GlobalUnlock( hClipData );
+            }
+            if (bits.free) bits.free( &bits );
+        }
     }
 
     return hClipData;




More information about the wine-cvs mailing list