pjBitsMsk[0] = 0xF0;
ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
ok(ret == 1, "MaskBlt failed (%d)\n", ret);
- ok (pjBitsDst[0] == 0xF0, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
+ ok(pjBitsDst[0] == 0xF0, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
/* Do the masking (NOTSRCERASE / SRCINVERT) */
pjBitsDst[0] = 0xF0; // 11110000
ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(NOTSRCERASE, SRCINVERT)); // 22
ok(ret == 1, "MaskBlt failed (%d)\n", ret);
- ok (pjBitsDst[0] == 0x16, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
+ ok(pjBitsDst[0] == 0x16, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
/* Do the masking (MERGEPAINT / DSxn) */
pjBitsDst[0] = 0xF0;
pjBitsMsk[0] = 0xAA;
ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(MERGEPAINT, 0x990000));
ok(ret == 1, "MaskBlt failed (%d)\n", ret);
- ok (pjBitsDst[0] == 0xE3, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
+ ok(pjBitsDst[0] == 0xE3, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
/* Try a ROP that needs a mask with a NULL mask bitmap handle */
ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, NULL, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
ret = MaskBlt(hdcDst, 0, 0, 8, 1, NULL, 0, 0, NULL, 0, 0, MAKEROP4(PATCOPY, 0xAA0000));
ok(ret == 0, "MaskBlt should fail, but succeeded (%d)\n", ret);
+
+ /* Try with a mask that is smaller than the rect */
+ DeleteObject(hbmMsk);
+ pbmi->bmiHeader.biWidth = 4;
+ hbmMsk = CreateDIBSection(hdcDst, pbmi, DIB_RGB_COLORS, (PVOID*)&pjBitsMsk, NULL, 0);
+
+ /* Do the masking (SRCCOPY / NOOP) */
+ pjBitsDst[0] = 0xAA; // 10101010
+ pjBitsSrc[0] = 0xCC; // 11001100
+ pjBitsMsk[0] = 0x33; // 00110011
+ ret = MaskBlt(hdcDst, 0, 0, 5, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
+ ok(ret == 0, "MaskBlt should fail, but succeeded (%d)\n", ret);
+ ret = MaskBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, hbmMsk, 1, 0, MAKEROP4(SRCCOPY, 0xAA0000));
+ ok(ret == 0, "MaskBlt should fail, but succeeded (%d)\n", ret);
+ ret = MaskBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, hbmMsk, 0, 1, MAKEROP4(SRCCOPY, 0xAA0000));
+ ok(ret == 0, "MaskBlt should fail, but succeeded (%d)\n", ret);
+ ret = MaskBlt(hdcDst, 0, 0, 4, 1, hdcSrc, 0, 0, hbmMsk, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
+ ok(ret == 1, "MaskBlt failed (%d)\n", ret);
+ ok(pjBitsDst[0] == 0x8A, "pjBitsDst[0] == 0x%x\n", pjBitsDst[0]);
+
}
void Test_MaskBlt_16bpp()
ok (pulBitsDst[1] == 0xfabefef6, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[1]);
}
+void Test_MaskBlt_Brush()
+{
+ HDC hdcDst, hdcSrc;
+ struct
+ {
+ BITMAPINFOHEADER bmiHeader;
+ ULONG aulColors[2];
+ } bmiData = {{sizeof(BITMAPINFOHEADER), 16, 16, 1, 1, BI_RGB, 0, 10, 10, 2,0}, {0, 0xFFFFFF}};
+ PBITMAPINFO pbmi = (PBITMAPINFO)&bmiData;
+ HBITMAP hbmDst, hbmSrc, hbmMsk;
+ PULONG pulBitsDst, pulBitsSrc, pulBitsMsk;
+ BOOL ret;
+ HBRUSH hbr;
+
+ /* Create a dest dc and bitmap */
+ hdcDst = CreateCompatibleDC(NULL);
+ hbmDst = CreateDIBSection(hdcDst, pbmi, DIB_RGB_COLORS, (PVOID*)&pulBitsDst, NULL, 0);
+ SelectObject(hdcDst, hbmDst);
+
+ /* Create a source dc and bitmap */
+ hdcSrc = CreateCompatibleDC(NULL);
+ hbmSrc = CreateDIBSection(hdcSrc, pbmi, DIB_RGB_COLORS, (PVOID*)&pulBitsSrc, NULL, 0);
+ SelectObject(hdcSrc, hbmSrc);
+
+ hbr = CreateHatchBrush(HS_CROSS, 0);
+ ok(hbr != 0, "failed to create brush\n");
+ ok(SelectObject(hdcDst, hbr) != 0, "failed to select brush\n");
+
+ /* Do the masking (SRCCOPY / NOOP) */
+ pulBitsDst[0] = 0x00000000;
+ pulBitsSrc[0] = 0xFFFFFFFF;
+ ret = MaskBlt(hdcDst, 0, 0, 8, 1, hdcSrc, 0, 0, NULL, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
+ ok(ret == 1, "MaskBlt failed (%d)\n", ret);
+ ok(pulBitsDst[0] == 0, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[0]);
+
+ /* Create a 1 bpp pattern brush */
+ pbmi->bmiHeader.biWidth = 8;
+ hbmMsk = CreateDIBSection(hdcDst, pbmi, DIB_RGB_COLORS, (PVOID*)&pulBitsMsk, NULL, 0);
+ ok(hbmMsk != 0, "CreateDIBSection failed\n");
+ hbr = CreatePatternBrush(hbmMsk);
+ ok(hbr != 0, "CreatePatternBrush failed\n");
+ ok(SelectObject(hdcDst, hbr) != 0, "failed to select brush\n");
+
+ /* Do the masking (SRCCOPY / NOOP) */
+ pulBitsDst[0] = 0x00000000;
+ pulBitsSrc[0] = 0xFFFFFFFF;
+ pulBitsMsk[0] = 0xCCAAFF00;
+ ret = MaskBlt(hdcDst, 0, 0, 16, 1, hdcSrc, 0, 0, NULL, 0, 0, MAKEROP4(SRCCOPY, 0xAA0000));
+ ok(ret == 1, "MaskBlt failed (%d)\n", ret);
+ ok(pulBitsDst[0] == 0, "pulBitsDst[0] == 0x%lx\n", pulBitsDst[0]);
+
+}
+
START_TEST(MaskBlt)
{
InitStuff();
Test_MaskBlt_1bpp();
- switch (GetDeviceCaps(GetDC(NULL), BITSPIXEL))
- {
- case 16: Test_MaskBlt_16bpp(); break;
- case 32: Test_MaskBlt_32bpp(); break;
- }
+ Test_MaskBlt_16bpp();
+ Test_MaskBlt_32bpp();
+ Test_MaskBlt_Brush();
}