0df71e9837c4a88f2d50839e50c693598cb76f14
[reactos.git] / rostests / apitests / gdi32api / tests / SelectObject.c
1 INT
2 Test_SelectObject(PTESTINFO pti)
3 {
4 HGDIOBJ hOldObj, hNewObj;
5 HDC hScreenDC, hDC, hDC2;
6 PGDI_TABLE_ENTRY pEntry;
7 PDC_ATTR pDc_Attr;
8 HANDLE hcmXform;
9 BYTE bmBits[4] = {0};
10
11 hScreenDC = GetDC(NULL);
12 ASSERT (hScreenDC != NULL);
13 hDC = CreateCompatibleDC(hScreenDC);
14 ASSERT (hDC != NULL);
15
16 /* Get the Dc_Attr for later testing */
17 pEntry = &GdiHandleTable[GDI_HANDLE_GET_INDEX(hDC)];
18 ASSERT(pEntry);
19 pDc_Attr = pEntry->UserData;
20 ASSERT(pDc_Attr);
21
22 /* Test incomplete dc handle doesn't work */
23 SetLastError(ERROR_SUCCESS);
24 hNewObj = GetStockObject(GRAY_BRUSH);
25 hOldObj = SelectObject((HDC)GDI_HANDLE_GET_INDEX(hDC), hNewObj);
26 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
27 RTEST(hOldObj == NULL);
28 RTEST(pDc_Attr->hbrush == GetStockObject(WHITE_BRUSH));
29 SelectObject(hDC, hOldObj);
30
31 /* Test incomplete hobj handle works */
32 hNewObj = GetStockObject(GRAY_BRUSH);
33 hOldObj = SelectObject(hDC, (HGDIOBJ)GDI_HANDLE_GET_INDEX(hNewObj));
34 RTEST(hOldObj == GetStockObject(WHITE_BRUSH));
35 RTEST(pDc_Attr->hbrush == hNewObj);
36 SelectObject(hDC, hOldObj);
37
38 /* Test wrong hDC handle type */
39 SetLastError(ERROR_SUCCESS);
40 hNewObj = GetStockObject(GRAY_BRUSH);
41 hDC2 = (HDC)((UINT_PTR)hDC & ~GDI_HANDLE_TYPE_MASK);
42 hDC2 = (HDC)((UINT_PTR)hDC2 | GDI_OBJECT_TYPE_PEN);
43 hOldObj = SelectObject(hDC2, hNewObj);
44 RTEST(GetLastError() == ERROR_INVALID_HANDLE);
45 RTEST(hOldObj == NULL);
46 RTEST(pDc_Attr->hbrush == GetStockObject(WHITE_BRUSH));
47
48 /* Test wrong hobj handle type */
49 SetLastError(ERROR_SUCCESS);
50 hNewObj = GetStockObject(GRAY_BRUSH);
51 hNewObj = (HGDIOBJ)((UINT_PTR)hNewObj & ~GDI_HANDLE_TYPE_MASK);
52 hNewObj = (HGDIOBJ)((UINT_PTR)hNewObj | GDI_OBJECT_TYPE_PEN);
53 hOldObj = SelectObject(hDC, hNewObj);
54 RTEST(GetLastError() == ERROR_SUCCESS);
55 RTEST(hOldObj == NULL);
56 RTEST(pDc_Attr->hbrush == GetStockObject(WHITE_BRUSH));
57
58 SetLastError(ERROR_SUCCESS);
59 hNewObj = (HGDIOBJ)0x00761234;
60 hOldObj = SelectObject(hDC, hNewObj);
61 RTEST(hOldObj == NULL);
62 RTEST(GetLastError() == ERROR_SUCCESS);
63 SelectObject(hDC, hOldObj);
64
65 /* Test DC */
66 SetLastError(ERROR_SUCCESS);
67 hOldObj = SelectObject(hDC, hScreenDC);
68 RTEST(hOldObj == NULL);
69 TEST(GetLastError() == ERROR_SUCCESS);
70
71 /* Test REGION */
72 SetLastError(ERROR_SUCCESS);
73 hNewObj = CreateRectRgn(0,0,0,0);
74 hOldObj = SelectObject(hDC, hNewObj);
75 RTEST((UINT_PTR)hOldObj == NULLREGION);
76 DeleteObject(hNewObj);
77
78 hNewObj = CreateRectRgn(0,0,10,10);
79 RTEST((UINT_PTR)SelectObject(hDC, hNewObj) == SIMPLEREGION);
80 hOldObj = CreateRectRgn(5,5,20,20);
81 RTEST(CombineRgn(hNewObj, hNewObj, hOldObj, RGN_OR) == COMPLEXREGION);
82 DeleteObject(hOldObj);
83 RTEST((UINT_PTR)SelectObject(hDC, hNewObj) == SIMPLEREGION); // ??? Why this?
84 DeleteObject(hNewObj);
85 RTEST(GetLastError() == ERROR_SUCCESS);
86
87 /* Test BITMAP */
88 hNewObj = CreateBitmap(2, 2, 1, 1, &bmBits);
89 ASSERT(hNewObj != NULL);
90 hOldObj = SelectObject(hDC, hNewObj);
91 RTEST(GDI_HANDLE_GET_TYPE(hOldObj) == GDI_OBJECT_TYPE_BITMAP);
92 hOldObj = SelectObject(hDC, hOldObj);
93 RTEST(hOldObj == hNewObj);
94
95 /* Test CLIOBJ */
96
97 /* Test PATH */
98
99 /* Test PALETTE */
100 SetLastError(ERROR_SUCCESS);
101 hNewObj = GetStockObject(DEFAULT_PALETTE);
102 hOldObj = SelectObject(hDC, hNewObj);
103 RTEST(hOldObj == NULL);
104 RTEST(GetLastError() == ERROR_INVALID_FUNCTION);
105
106 /* Test COLORSPACE */
107
108 /* Test FONT */
109
110 /* Test PFE */
111
112 /* Test BRUSH */
113 hNewObj = GetStockObject(GRAY_BRUSH);
114 hOldObj = SelectObject(hDC, hNewObj);
115 RTEST(hOldObj == GetStockObject(WHITE_BRUSH));
116 RTEST(pDc_Attr->hbrush == hNewObj);
117 RTEST(GDI_HANDLE_GET_TYPE(hOldObj) == GDI_OBJECT_TYPE_BRUSH);
118 SelectObject(hDC, hOldObj);
119
120 /* Test DC_BRUSH */
121 hNewObj = GetStockObject(DC_BRUSH);
122 hOldObj = SelectObject(hDC, hNewObj);
123 RTEST(pDc_Attr->hbrush == hNewObj);
124 SelectObject(hDC, hOldObj);
125
126 /* Test BRUSH color xform */
127 hcmXform = (HANDLE)pDc_Attr->hcmXform;
128
129
130 /* Test EMF */
131
132 /* test METAFILE */
133
134 /* Test ENHMETAFILE */
135
136 /* Test PEN */
137 hNewObj = GetStockObject(GRAY_BRUSH);
138 hOldObj = SelectObject(hDC, hNewObj);
139 RTEST(hOldObj == GetStockObject(WHITE_BRUSH));
140 RTEST(pDc_Attr->hbrush == hNewObj);
141 RTEST(GDI_HANDLE_GET_TYPE(hOldObj) == GDI_OBJECT_TYPE_BRUSH);
142 SelectObject(hDC, hOldObj);
143
144
145 /* Test EXTPEN */
146
147 /* Test METADC */
148
149
150 return APISTATUS_NORMAL;
151 }
152