[PATCH 3/3] user32: Test the behavior of the clipboard with DIBs.

Charles Davis cdavis5x at gmail.com
Fri Feb 26 03:55:30 CST 2016


Signed-off-by: Charles Davis <cdavis5x at gmail.com>
---
 dlls/user32/tests/clipboard.c | 193 +++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 192 insertions(+), 1 deletion(-)

diff --git a/dlls/user32/tests/clipboard.c b/dlls/user32/tests/clipboard.c
index be6c9bf..872b784 100644
--- a/dlls/user32/tests/clipboard.c
+++ b/dlls/user32/tests/clipboard.c
@@ -342,15 +342,94 @@ static HENHMETAFILE create_emf(void)
     return CloseEnhMetaFile(hdc);
 }
 
+static HGLOBAL create_dib(void)
+{
+#include "pshpack1.h"
+    static struct {
+        BITMAPINFOHEADER header;
+        RGBQUAD colors[4];
+        BYTE pixel;
+    } dib_info =
+    {
+        {
+            sizeof(dib_info),
+            2, 2,               /* width, height */
+            1,                  /* planes */
+            2,                  /* bits/pixel */
+            BI_RGB,             /* compression */
+            1,                  /* image size */
+            0, 0,               /* physical resolution (x, y) */
+            4,                  /* number of colors used */
+            0                   /* number of important colors (all) */
+        },
+        {
+            {0,0,0,0},          /* black */
+            {255,0,0,0},        /* red */
+            {0,255,0,0},        /* green */
+            {255,255,255,0}     /* white */
+        },
+        0xe4
+    };
+#include "poppack.h"
+    HGLOBAL dib = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE, sizeof(dib_info));
+    void *dib_ptr;
+    if (!dib) return NULL;
+    dib_ptr = GlobalLock(dib);
+    memcpy(dib_ptr, &dib_info, sizeof(dib_info));
+    GlobalUnlock(dib);
+    return dib;
+}
+
+static HGLOBAL create_dibv5(void)
+{
+#include "pshpack1.h"
+    static struct {
+        BITMAPV5HEADER header;
+        DWORD pixel;
+    } dib_info =
+    {
+        {
+            sizeof(dib_info),
+            1, 1,               /* width, height */
+            1,                  /* planes */
+            32,                 /* bits/pixel */
+            BI_RGB,             /* compression */
+            4,                  /* image size */
+            0, 0,               /* physical resolution (x, y) */
+            0,                  /* number of colors used */
+            0,                  /* number of important colors (all) */
+            0, 0, 0, 0,         /* RGBA bitmasks (only if BI_BITFIELDS) */
+            LCS_sRGB,           /* color-space type */
+            {{0,0,0},{0,0,0},{0,0,0}}, /* CIE endpoints */
+            0, 0, 0,            /* gamma curve (red, green, blue) */
+            LCS_GM_GRAPHICS,    /* rendering intent */
+            0, 0,               /* color profile (none) */
+            0
+        },
+        0
+    };
+#include "poppack.h"
+    HGLOBAL dib = GlobalAlloc(GMEM_DDESHARE|GMEM_MOVEABLE, sizeof(dib_info));
+    void *dib_ptr;
+    if (!dib) return NULL;
+    dib_ptr = GlobalLock(dib);
+    memcpy(dib_ptr, &dib_info, sizeof(dib_info));
+    GlobalUnlock(dib);
+    return dib;
+}
+
 static void test_synthesized(void)
 {
-    HGLOBAL h, htext;
+    HGLOBAL h, htext, hdib, hdibv5;
     HENHMETAFILE emf;
     BOOL r;
     UINT cf;
     HANDLE data;
+    BITMAPV5HEADER *dibv5_hdr;
 
     htext = create_text();
+    hdib = create_dib();
+    hdibv5 = create_dibv5();
     emf = create_emf();
 
     r = OpenClipboard(NULL);
@@ -397,7 +476,119 @@ static void test_synthesized(void)
 
     r = EmptyClipboard();
     ok(r, "gle %d\n", GetLastError());
+    r = CloseClipboard();
+    ok(r, "gle %d\n", GetLastError());
+
+    r = OpenClipboard(NULL);
+    ok(r, "gle %d\n", GetLastError());
+    h = SetClipboardData(CF_DIB, hdib);
+    ok(h == hdib, "got %p, gle %d\n", h, GetLastError());
+    r = CloseClipboard();
+    ok(r, "gle %d\n", GetLastError());
+
+    r = OpenClipboard(NULL);
+    ok(r, "gle %d\n", GetLastError());
+    cf = EnumClipboardFormats(0);
+    ok(cf == CF_DIB, "cf %08x\n", cf);
+    data = GetClipboardData(cf);
+    ok(data != NULL, "couldn't get data\n");
 
+    cf = EnumClipboardFormats(cf);
+    ok(cf == CF_BITMAP, "cf %08x\n", cf);
+
+    cf = EnumClipboardFormats(cf);
+    ok(cf == CF_DIBV5, "cf %08x\n", cf);
+
+    r = EmptyClipboard();
+    ok(r, "gle %d\n", GetLastError());
+    r = CloseClipboard();
+    ok(r, "gle %d\n", GetLastError());
+
+    r = OpenClipboard(NULL);
+    ok(r, "gle %d\n", GetLastError());
+    h = SetClipboardData(CF_DIB, hdibv5);
+    ok(h == hdibv5, "got %p, gle %d\n", h, GetLastError());
+    r = CloseClipboard();
+    ok(r, "gle %d\n", GetLastError());
+
+    r = OpenClipboard(NULL);
+    ok(r, "gle %d\n", GetLastError());
+    cf = EnumClipboardFormats(0);
+    ok(cf == CF_DIB, "cf %08x\n", cf);
+    data = GetClipboardData(cf);
+    ok(data != NULL, "couldn't get data\n");
+
+    cf = EnumClipboardFormats(cf);
+    ok(cf == CF_BITMAP, "cf %08x\n", cf);
+
+    cf = EnumClipboardFormats(cf);
+    ok(cf == CF_DIBV5, "cf %08x\n", cf);
+
+    r = EmptyClipboard();
+    ok(r, "gle %d\n", GetLastError());
+    r = CloseClipboard();
+    ok(r, "gle %d\n", GetLastError());
+
+    hdib = create_dib();
+    hdibv5 = create_dibv5();
+
+    r = OpenClipboard(NULL);
+    ok(r, "gle %d\n", GetLastError());
+    h = SetClipboardData(CF_DIBV5, hdibv5);
+    if (h == NULL)
+    {
+        trace("gle %d\n", GetLastError());
+        win_skip("version 5 DIBs are unsupported\n");
+        goto end;
+    }
+    ok(h == hdibv5, "got %p, gle %d\n", h, GetLastError());
+    r = CloseClipboard();
+    ok(r, "gle %d\n", GetLastError());
+
+    r = OpenClipboard(NULL);
+    ok(r, "gle %d\n", GetLastError());
+    cf = EnumClipboardFormats(0);
+    ok(cf == CF_DIBV5, "cf %08x\n", cf);
+    data = GetClipboardData(cf);
+    ok(data != NULL, "couldn't get data\n");
+
+    cf = EnumClipboardFormats(cf);
+    ok(cf == CF_BITMAP, "cf %08x\n", cf);
+
+    cf = EnumClipboardFormats(cf);
+    ok(cf == CF_DIB, "cf %08x\n", cf);
+
+    r = EmptyClipboard();
+    ok(r, "gle %d\n", GetLastError());
+    r = CloseClipboard();
+    ok(r, "gle %d\n", GetLastError());
+
+    r = OpenClipboard(NULL);
+    ok(r, "gle %d\n", GetLastError());
+    h = SetClipboardData(CF_DIBV5, hdib);
+    ok(h == hdib, "got %p, gle %d\n", h, GetLastError());
+    r = CloseClipboard();
+    ok(r, "gle %d\n", GetLastError());
+
+    r = OpenClipboard(NULL);
+    ok(r, "gle %d\n", GetLastError());
+    cf = EnumClipboardFormats(0);
+    ok(cf == CF_DIBV5, "cf %08x\n", cf);
+    data = GetClipboardData(cf);
+    ok(data != NULL, "couldn't get data\n");
+    dibv5_hdr = GlobalLock(data);
+    ok(dibv5_hdr->bV5Size == sizeof(BITMAPINFOHEADER)+4*4+1, "DIB size is %u\n", dibv5_hdr->bV5Size);
+    GlobalUnlock(data);
+
+    cf = EnumClipboardFormats(cf);
+    ok(cf == CF_BITMAP, "cf %08x\n", cf);
+
+    cf = EnumClipboardFormats(cf);
+    ok(cf == CF_DIB, "cf %08x\n", cf);
+
+end:
+    r = EmptyClipboard();
+    ok(r, "gle %d\n", GetLastError());
     r = CloseClipboard();
     ok(r, "gle %d\n", GetLastError());
 }
-- 
2.7.2




More information about the wine-patches mailing list