1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         Test for PatBlt
5  * PROGRAMMERS:     Timo Kreuzer
6  *                  Katayama Hirofumi MZ
7  */
8 
9 #include "precomp.h"
10 
11 HBITMAP ghbmpTarget;
12 PULONG gpulTargetBits;
13 HDC hdcTarget;
14 
15 void Test_PatBlt_Params()
16 {
17     BOOL ret;
18     ULONG i, rop;
19     HDC hdc;
20     HBITMAP hBitmap;
21     HGDIOBJ hOldBitmap;
22 
23     /* Test a rop that contains only the operation index */
24     ret = PatBlt(hdcTarget, 0, 0, 1, 1, PATCOPY & 0x00FF0000);
25     ok_long(ret, 1);
26 
27     /* Test a rop that contains arbitrary values outside the operation index */
28     ret = PatBlt(hdcTarget, 0, 0, 1, 1, (PATCOPY & 0x00FF0000) | 0xab00cdef);
29     ok_long(ret, 1);
30 
31     /* Test an invalid rop  */
32     SetLastError(0);
33     ok_long(PatBlt(hdcTarget, 0, 0, 1, 1, SRCCOPY) , 0);
34     ok_err(0);
35 
36     /* Test all rops */
37     for (i = 0; i < 256; i++)
38     {
39         rop = i << 16;
40         ret = PatBlt(hdcTarget, 0, 0, 1, 1, rop);
41 
42         /* Only these should succeed (they use no source) */
43         if ((i == 0) || (i == 5) || (i == 10) || (i == 15) || (i == 80) ||
44             (i == 85) || (i == 90) || (i == 95) || (i == 160) || (i == 165) ||
45             (i == 170) || (i == 175) || (i == 240) || (i == 245) ||
46             (i == 250) || (i == 255))
47         {
48             ok(ret == 1, "index %ld failed, but should succeed\n", i);
49         }
50         else
51         {
52             ok(ret == 0, "index %ld succeeded, but should fail\n", i);
53         }
54     }
55 
56     /* Test quaternary rop, the background part is simply ignored */
57     ret = PatBlt(hdcTarget, 0, 0, 1, 1, MAKEROP4(PATCOPY, PATINVERT));
58     ok_long(ret, 1);
59     ret = PatBlt(hdcTarget, 0, 0, 1, 1, MAKEROP4(PATCOPY, SRCCOPY));
60     ok_long(ret, 1);
61     ret = PatBlt(hdcTarget, 0, 0, 1, 1, MAKEROP4(SRCCOPY, PATCOPY));
62     ok_long(ret, 0);
63 
64     /* Test an info DC */
65     hdc = CreateICA("DISPLAY", NULL, NULL, NULL);
66     ok(hdc != 0, "\n");
67     SetLastError(0);
68     ok_long(PatBlt(hdc, 0, 0, 1, 1, PATCOPY), 1);
69     ok_err(0);
70     DeleteDC(hdc);
71 
72     /* Test a mem DC without selecting a bitmap */
73     hdc = CreateCompatibleDC(NULL);
74     ok(hdc != 0, "\n");
75     ok_long(PatBlt(hdc, 0, 0, 1, 1, PATCOPY), 1);
76     ok_err(0);
77     DeleteDC(hdc);
78 
79     /* Test with bitmap and negative values */
80     hdc = CreateCompatibleDC(NULL);
81     hBitmap = CreateCompatibleBitmap(hdc, 8, 8);
82     hOldBitmap = SelectObject(hdc, hBitmap);
83     SelectObject(hdc, GetStockObject(WHITE_BRUSH));
84     ok_long(PatBlt(hdc, 2, 2, -1, 1, PATCOPY), TRUE);
85     ok_long(GetPixel(hdc, 1, 1), RGB(0, 0, 0));
86     ok_long(GetPixel(hdc, 1, 2), RGB(255, 255, 255));
87     ok_long(GetPixel(hdc, 1, 3), RGB(0, 0, 0));
88     ok_long(GetPixel(hdc, 2, 1), RGB(0, 0, 0));
89     ok_long(GetPixel(hdc, 2, 2), RGB(0, 0, 0));
90     SetPixel(hdc, 1, 2, RGB(0, 0, 0));
91     ok_long(PatBlt(hdc, 2, 2, 1, -1, PATCOPY), TRUE);
92     ok_long(GetPixel(hdc, 1, 2), RGB(0, 0, 0));
93     ok_long(GetPixel(hdc, 1, 3), RGB(0, 0, 0));
94     ok_long(GetPixel(hdc, 2, 1), RGB(255, 255, 255));
95     ok_long(GetPixel(hdc, 2, 2), RGB(0, 0, 0));
96     ok_long(GetPixel(hdc, 2, 3), RGB(0, 0, 0));
97     SetPixel(hdc, 2, 1, RGB(0, 0, 0));
98     ok_long(PatBlt(hdc, 3, 2, -2, -1, PATCOPY), TRUE);
99     ok_long(GetPixel(hdc, 0, 2), RGB(0, 0, 0));
100     ok_long(GetPixel(hdc, 0, 3), RGB(0, 0, 0));
101     ok_long(GetPixel(hdc, 1, 1), RGB(255, 255, 255));
102     ok_long(GetPixel(hdc, 1, 2), RGB(0, 0, 0));
103     ok_long(GetPixel(hdc, 1, 3), RGB(0, 0, 0));
104     ok_long(GetPixel(hdc, 2, 1), RGB(255, 255, 255));
105     ok_long(GetPixel(hdc, 2, 2), RGB(0, 0, 0));
106     ok_long(GetPixel(hdc, 2, 3), RGB(0, 0, 0));
107     DeleteObject(SelectObject(hdc, hOldBitmap));
108     DeleteDC(hdc);
109 }
110 
111 void Test_BrushOrigin()
112 {
113     ULONG aulBits[2] = {0x5555AAAA, 0};
114     HBITMAP hbmp;
115     HBRUSH hbr;
116     BOOL ret;
117 
118     hbmp = CreateBitmap(2, 2, 1, 1, aulBits);
119     if (!hbmp)
120     {
121         printf("Couln not create a bitmap\n");
122         return;
123     }
124 
125     hbr = CreatePatternBrush(hbmp);
126     if (!hbr)
127     {
128         printf("Couln not create a bitmap\n");
129         return;
130     }
131 
132     if (!SelectObject(hdcTarget, hbr))
133     {
134         printf("failed to select pattern brush\n");
135         return;
136     }
137 
138     ret = PatBlt(hdcTarget, 0, 0, 2, 2, PATCOPY);
139     ok_long(ret, 1);
140     ok_long(gpulTargetBits[0], 0xffffff);
141     ok_long(gpulTargetBits[1], 0);
142     ok_long(gpulTargetBits[16], 0);
143     ok_long(gpulTargetBits[17], 0xffffff);
144     //printf("0x%lx, 0x%lx\n", gpulTargetBits[0], gpulTargetBits[1]);
145 
146     ret = PatBlt(hdcTarget, 1, 0, 2, 2, PATCOPY);
147     ok_long(ret, 1);
148     ok_long(gpulTargetBits[0], 0xffffff);
149     ok_long(gpulTargetBits[1], 0);
150     ok_long(gpulTargetBits[2], 0xffffff);
151     ok_long(gpulTargetBits[16], 0);
152     ok_long(gpulTargetBits[17], 0xffffff);
153     ok_long(gpulTargetBits[18], 0);
154 }
155 
156 START_TEST(PatBlt)
157 {
158     BITMAPINFO bmi;
159 
160     bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
161     bmi.bmiHeader.biWidth = 16;
162     bmi.bmiHeader.biHeight = -16;
163     bmi.bmiHeader.biPlanes = 1;
164     bmi.bmiHeader.biBitCount = 32;
165     bmi.bmiHeader.biCompression = BI_RGB;
166     bmi.bmiHeader.biSizeImage = 0;
167     bmi.bmiHeader.biXPelsPerMeter = 1;
168     bmi.bmiHeader.biYPelsPerMeter = 1;
169     bmi.bmiHeader.biClrUsed = 0;
170     bmi.bmiHeader.biClrImportant = 0;
171     ghbmpTarget = CreateDIBSection(NULL,
172                                    &bmi,
173                                    DIB_RGB_COLORS,
174                                    (PVOID*)&gpulTargetBits,
175                                    NULL,
176                                    0);
177     if (!ghbmpTarget)
178     {
179         printf("Couln not create target bitmap\n");
180         return;
181     }
182 
183     hdcTarget = CreateCompatibleDC(0);
184     if (!hdcTarget)
185     {
186         printf("Couln not create target dc\n");
187         return;
188     }
189 
190     if (!SelectObject(hdcTarget, ghbmpTarget))
191     {
192         printf("Failed to select bitmap\n");
193         return;
194     }
195 
196     Test_PatBlt_Params();
197 
198     Test_BrushOrigin();
199 }
200