[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