1 /*
2  * PROJECT:         ReactOS api tests
3  * LICENSE:         GPL - See COPYING in the top level directory
4  * PURPOSE:         Test for NtUserSelectPalette
5  * PROGRAMMERS:
6  */
7 
8 #include <win32nt.h>
9 
10 FORCEINLINE
11 PALETTEENTRY
12 PALENTRY(BYTE r, BYTE g, BYTE b)
13 {
14     PALETTEENTRY ret;
15 
16     ret.peRed = r;
17     ret.peGreen = g;
18     ret.peBlue = b;
19     ret.peFlags = 0;
20     return ret;
21 }
22 
23 START_TEST(NtUserSelectPalette)
24 {
25     HINSTANCE hinst = GetModuleHandle(NULL);
26     HPALETTE hPal, hOldPal;
27     HWND hWnd;
28     HDC hDC, hCompDC;
29     struct
30     {
31         LOGPALETTE logpal;
32         PALETTEENTRY entry[20];
33     } pal;
34 
35     ZeroMemory(&pal, sizeof(pal));
36 
37     pal.logpal.palVersion = 0x300;
38     pal.logpal.palNumEntries = 6;
39     pal.entry[0] = PALENTRY(0,0,0);
40     pal.entry[1] = PALENTRY(255,255,255);
41     pal.entry[2] = PALENTRY(128,128,128);
42     pal.entry[3] = PALENTRY(128,0,0);
43     pal.entry[4] = PALENTRY(0,128,0);
44     pal.entry[5] = PALENTRY(0,0,128);
45 
46     hPal = CreatePalette(&pal.logpal);
47     ASSERT(hPal);
48     TEST(DeleteObject(hPal) == 1);
49     hPal = CreatePalette(&pal.logpal);
50     ASSERT(hPal);
51 
52     /* Create a window */
53     hWnd = CreateWindowW(L"BUTTON", L"TestWindow", WS_OVERLAPPEDWINDOW | WS_VISIBLE,
54                         CW_USEDEFAULT, CW_USEDEFAULT, 100, 100,
55                         NULL, NULL, hinst, 0);
56     hDC = GetDC(hWnd);
57     ASSERT(hDC);
58     hCompDC = CreateCompatibleDC(hDC);
59     ASSERT(hCompDC);
60 
61     /* Test NULL DC */
62     SetLastError(ERROR_SUCCESS);
63     hOldPal = NtUserSelectPalette(NULL, hPal, 0);
64     TEST(hOldPal == 0);
65     TEST(GetLastError() == ERROR_SUCCESS);
66 
67     /* Test invalid DC */
68     SetLastError(ERROR_SUCCESS);
69     hOldPal = NtUserSelectPalette((HDC)-1, hPal, 0);
70     TEST(hOldPal == 0);
71     TEST(GetLastError() == ERROR_SUCCESS);
72 
73     /* Test NULL palette */
74     SetLastError(ERROR_SUCCESS);
75     hOldPal = NtUserSelectPalette(hDC, NULL, 0);
76     TEST(hOldPal == 0);
77     TEST(GetLastError() == ERROR_SUCCESS);
78 
79     /* Test invalid palette */
80     SetLastError(ERROR_SUCCESS);
81     hOldPal = NtUserSelectPalette(hDC, (HPALETTE)-1, 0);
82     TEST(hOldPal == 0);
83     TEST(GetLastError() == ERROR_SUCCESS);
84 
85     /* Test valid palette */
86     hOldPal = NtUserSelectPalette(hDC, hPal, 0);
87     TEST(hOldPal != 0);
88     TEST(hOldPal == GetStockObject(DEFAULT_PALETTE));
89 
90     /* We cannot Delete the palette */
91     TEST(DeleteObject(hPal) == 0);
92 
93     /* We can still select the Palette into a compatible DC */
94     hOldPal = NtUserSelectPalette(hCompDC, hPal, 0);
95     TEST(hOldPal != 0);
96 
97 
98 
99 #if 0
100     RealizePalette(hDC);
101 
102     GetClientRect(hWnd, &rect);
103     FillRect(hDC, &rect, GetSysColorBrush(COLOR_BTNSHADOW));
104 
105     TEST(GetNearestColor(hDC, RGB(0,0,0)) == RGB(0,0,0));
106     TEST(GetNearestColor(hDC, RGB(0,0,1)) == RGB(0,0,1));
107 
108     ReleaseDC(hWnd, hDC);
109     DestroyWindow(hWnd);
110     RECT rect;
111     HBITMAP hBmp;
112 
113 
114     BITMAPINFOHEADER bmih = {sizeof(BITMAPINFOHEADER), // biSize
115                              3, // biWidth
116                              3, // biHeight
117                              1, // biPlanes
118                              8, // biBitCount
119                              BI_RGB, // biCompression
120                              0, // biSizeImage
121                              92, // biXPelsPerMeter
122                              92, // biYPelsPerMeter
123                              6,  // biClrUsed
124                              6}; // biClrImportant
125     BYTE bits[3][3] = {{0,1,2},{3,4,5},{6,1,2}};
126 
127     struct
128     {
129         BITMAPINFOHEADER bmih;
130         RGBQUAD colors[6];
131     } bmi = {{sizeof(BITMAPINFOHEADER),3,3,1,8,BI_RGB,0,92,92,6,6},
132                       {{0,0,0,0},{255,255,255,0},{255,0,0,0},
133                        {0,255,0,0},{0,0,255,0},{128,128,128,0}}};
134 
135     hBmp = CreateDIBitmap(hCompDC, &bmih, CBM_INIT, &bits, (BITMAPINFO*)&bmi, DIB_RGB_COLORS);
136     ASSERT(hBmp);
137 
138     SetLastError(0);
139     TEST(NtGdiSelectBitmap(hCompDC, hBmp));
140     hOldPal = NtUserSelectPalette(hCompDC, hPal, 0);
141     TEST(hOldPal != NULL);
142     RealizePalette(hCompDC);
143 
144     TEST(GetNearestColor(hCompDC, RGB(0,0,0)) == RGB(0,0,0));
145     TEST(GetNearestColor(hCompDC, RGB(0,0,1)) == RGB(0,0,0));
146     TEST(GetNearestColor(hCompDC, RGB(100,0,0)) == RGB(0,0,0));
147     TEST(GetNearestColor(hCompDC, RGB(250,250,250)) == RGB(255,255,255));
148     TEST(GetNearestColor(hCompDC, RGB(120,100,110)) == RGB(128,128,128));
149 
150 printf("nearest = 0x%x\n", GetNearestColor(hCompDC, RGB(120,100,110)));
151 #endif
152 
153 }
154