1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         Test for NtGdiRestoreDC
5  * PROGRAMMERS:
6  */
7 
8 #include <win32nt.h>
9 
10 static HBRUSH hbrush;
11 static HBITMAP hbitmap;
12 static HPEN hpen;
13 static HFONT hfont;
14 static HRGN hrgn, hrgn2;
15 
16 static
17 void
18 SetSpecialDCState(HDC hdc)
19 {
20     /* Select spcial Objects */
21     SelectObject(hdc, hbrush);
22     SelectObject(hdc, hpen);
23     SelectObject(hdc, hbitmap);
24     SelectObject(hdc, hfont);
25     SelectObject(hdc, hrgn);
26 
27     /* Colors */
28     SetDCBrushColor(hdc, RGB(12,34,56));
29     SetDCPenColor(hdc, RGB(23,34,45));
30 
31     /* Coordinates */
32     SetMapMode(hdc, MM_ANISOTROPIC);
33     SetGraphicsMode(hdc, GM_ADVANCED);
34     SetWindowOrgEx(hdc, 12, 34, NULL);
35     SetViewportOrgEx(hdc, 56, 78, NULL);
36     SetWindowExtEx(hdc, 123, 456, NULL);
37     SetViewportExtEx(hdc, 234, 567, NULL);
38 
39 
40 
41 }
42 
43 static
44 void
45 SetSpecialDCState2(HDC hdc)
46 {
47     /* Select spcial Objects */
48     SelectObject(hdc, GetStockObject(DC_BRUSH));
49     SelectObject(hdc, GetStockObject(DC_PEN));
50     SelectObject(hdc, GetStockObject(DEFAULT_BITMAP));
51     SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT));
52     SelectObject(hdc, hrgn2);
53 
54     /* Colors */
55     SetDCBrushColor(hdc, RGB(65,43,21));
56     SetDCPenColor(hdc, RGB(54,43,32));
57 
58     /* Coordinates */
59     SetMapMode(hdc, MM_ISOTROPIC);
60     SetGraphicsMode(hdc, GM_COMPATIBLE);
61     SetWindowOrgEx(hdc, 43, 21, NULL);
62     SetViewportOrgEx(hdc, 87, 65, NULL);
63     SetWindowExtEx(hdc, 654, 321, NULL);
64     SetViewportExtEx(hdc, 765, 432, NULL);
65 
66 
67 }
68 
69 static
70 void
71 Test_IsSpecialState(HDC hdc, BOOL bMemDC)
72 {
73     POINT pt;
74     SIZE sz;
75 
76     /* Test Objects */
77     TEST(SelectObject(hdc, GetStockObject(DC_BRUSH)) == hbrush);
78     TEST(SelectObject(hdc, GetStockObject(DC_PEN)) == hpen);
79     TEST(SelectObject(hdc, GetStockObject(DEFAULT_GUI_FONT)) == hfont);
80     if (bMemDC)
81     {
82         TEST(SelectObject(hdc, GetStockObject(DEFAULT_BITMAP)) == hbitmap);
83         TEST(SelectObject(hdc, hrgn2) == (PVOID)1);
84     }
85     else
86     {
87         TEST(SelectObject(hdc, GetStockObject(DEFAULT_BITMAP)) == 0);
88         TEST(SelectObject(hdc, hrgn2) == (PVOID)2);
89     }
90 
91     /* Test colors */
92     TEST(GetDCBrushColor(hdc) == RGB(12,34,56));
93     TEST(GetDCPenColor(hdc) == RGB(23,34,45));
94 
95     /* Test coordinates */
96     TEST(GetMapMode(hdc) == MM_ANISOTROPIC);
97     TEST(GetGraphicsMode(hdc) == GM_ADVANCED);
98     GetWindowOrgEx(hdc, &pt);
99     TEST(pt.x == 12);
100     TEST(pt.y == 34);
101     GetViewportOrgEx(hdc, &pt);
102     TEST(pt.x == 56);
103     TEST(pt.y == 78);
104     GetWindowExtEx(hdc, &sz);
105     ok(sz.cx == 123, "sz.cx == %ld\n", sz.cx);
106     ok(sz.cy == 456, "sz.cy == %ld\n", sz.cy);
107     GetViewportExtEx(hdc, &sz);
108     TEST(sz.cx == 234);
109     TEST(sz.cy == 567);
110 
111 
112 }
113 
114 
115 static
116 void
117 Test_SaveRestore(HDC hdc, BOOL bMemDC)
118 {
119     SetSpecialDCState(hdc);
120     NtGdiSaveDC(hdc);
121     SetSpecialDCState2(hdc);
122 
123     SetLastError(0);
124     TEST(NtGdiRestoreDC(hdc, 2) == 0);
125     TEST(GetLastError() == ERROR_INVALID_PARAMETER);
126 
127     SetLastError(0);
128     TEST(NtGdiRestoreDC(hdc, 0) == 0);
129     TEST(GetLastError() == ERROR_INVALID_PARAMETER);
130 
131     SetLastError(0);
132     TEST(NtGdiRestoreDC(hdc, -2) == 0);
133     TEST(GetLastError() == ERROR_INVALID_PARAMETER);
134 
135     SetLastError(0);
136     TEST(NtGdiRestoreDC(hdc, 1) == 1);
137     TEST(GetLastError() == 0);
138 
139     Test_IsSpecialState(hdc, bMemDC);
140 }
141 
142 
143 START_TEST(NtGdiRestoreDC)
144 {
145     HDC hdc;
146 
147     hdc = CreateCompatibleDC(0);
148     ASSERT(GdiIsHandleValid(hdc));
149 
150     SetLastError(0);
151     TEST(NtGdiRestoreDC(0, -10) == 0);
152     TEST(GetLastError() == ERROR_INVALID_HANDLE);
153 
154     SetLastError(0);
155     TEST(NtGdiRestoreDC(hdc, 0) == 0);
156     TEST(GetLastError() == ERROR_INVALID_PARAMETER);
157 
158     SetLastError(0);
159     TEST(NtGdiRestoreDC(hdc, 1) == 0);
160     TEST(GetLastError() == ERROR_INVALID_PARAMETER);
161 
162     /* Initialize objects */
163     hbrush = CreateSolidBrush(12345);
164     ASSERT(GdiIsHandleValid(hbrush));
165     hpen = CreatePen(PS_SOLID, 4, RGB(10,12,32));
166     ASSERT(GdiIsHandleValid(hpen));
167     hbitmap = CreateBitmap(10, 10, 1, 1, NULL);
168     ASSERT(GdiIsHandleValid(hbitmap));
169     hfont = CreateFont(10, 0, 0, 0, FW_NORMAL, 0, 0, 0, ANSI_CHARSET,
170                 OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,
171                 DEFAULT_PITCH, "Arial");
172     ASSERT(GdiIsHandleValid(hfont));
173     hrgn = CreateRectRgn(12, 14, 14, 17);
174     ASSERT(GdiIsHandleValid(hrgn));
175     hrgn2 = CreateRectRgn(1, 1, 2, 2);
176     ASSERT(GdiIsHandleValid(hrgn2));
177 
178     /* Test mem dc */
179     Test_SaveRestore(hdc, TRUE);
180     DeleteDC(hdc);
181 
182     /* Test screen DC */
183     hdc = GetDC(0);
184     ASSERT(GdiIsHandleValid(hdc));
185     Test_SaveRestore(hdc, FALSE);
186     ReleaseDC(0, hdc);
187 
188     /* Test info dc */
189     hdc = CreateICW(L"DISPLAY", NULL, NULL, NULL);
190     ASSERT(GdiIsHandleValid(hdc));
191     Test_SaveRestore(hdc, FALSE);
192     DeleteDC(hdc);
193 
194 }
195 
196