2 * Unit test suite for bitmaps
4 * Copyright 2004 Huw Davies
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
30 #include "wine/test.h"
34 static void test_createdibitmap(void)
37 BITMAPINFOHEADER bmih
;
39 HBITMAP hbm
, hbm_colour
, hbm_old
;
43 screen_depth
= GetDeviceCaps(hdc
, BITSPIXEL
);
44 memset(&bmih
, 0, sizeof(bmih
));
45 bmih
.biSize
= sizeof(bmih
);
50 bmih
.biCompression
= BI_RGB
;
52 /* First create an un-initialised bitmap. The depth of the bitmap
53 should match that of the hdc and not that supplied in bmih.
56 /* First try 32 bits */
57 hbm
= CreateDIBitmap(hdc
, &bmih
, 0, NULL
, NULL
, 0);
58 ok(hbm
!= NULL
, "CreateDIBitmap failed\n");
59 ok(GetObject(hbm
, sizeof(bm
), &bm
), "GetObject failed\n");
61 ok(bm
.bmBitsPixel
== screen_depth
, "CreateDIBitmap created bitmap of incorrect depth %d != %d\n", bm
.bmBitsPixel
, screen_depth
);
66 hbm
= CreateDIBitmap(hdc
, &bmih
, 0, NULL
, NULL
, 0);
67 ok(hbm
!= NULL
, "CreateDIBitmap failed\n");
68 ok(GetObject(hbm
, sizeof(bm
), &bm
), "GetObject failed\n");
70 ok(bm
.bmBitsPixel
== screen_depth
, "CreateDIBitmap created bitmap of incorrect depth %d != %d\n", bm
.bmBitsPixel
, screen_depth
);
75 hbm
= CreateDIBitmap(hdc
, &bmih
, 0, NULL
, NULL
, 0);
76 ok(hbm
!= NULL
, "CreateDIBitmap failed\n");
77 ok(GetObject(hbm
, sizeof(bm
), &bm
), "GetObject failed\n");
79 ok(bm
.bmBitsPixel
== screen_depth
, "CreateDIBitmap created bitmap of incorrect depth %d != %d\n", bm
.bmBitsPixel
, screen_depth
);
82 /* Now with a monochrome dc we expect a monochrome bitmap */
83 hdcmem
= CreateCompatibleDC(hdc
);
85 /* First try 32 bits */
87 hbm
= CreateDIBitmap(hdcmem
, &bmih
, 0, NULL
, NULL
, 0);
88 ok(hbm
!= NULL
, "CreateDIBitmap failed\n");
89 ok(GetObject(hbm
, sizeof(bm
), &bm
), "GetObject failed\n");
91 ok(bm
.bmBitsPixel
== 1, "CreateDIBitmap created bitmap of incorrect depth %d != %d\n", bm
.bmBitsPixel
, 1);
96 hbm
= CreateDIBitmap(hdcmem
, &bmih
, 0, NULL
, NULL
, 0);
97 ok(hbm
!= NULL
, "CreateDIBitmap failed\n");
98 ok(GetObject(hbm
, sizeof(bm
), &bm
), "GetObject failed\n");
100 ok(bm
.bmBitsPixel
== 1, "CreateDIBitmap created bitmap of incorrect depth %d != %d\n", bm
.bmBitsPixel
, 1);
105 hbm
= CreateDIBitmap(hdcmem
, &bmih
, 0, NULL
, NULL
, 0);
106 ok(hbm
!= NULL
, "CreateDIBitmap failed\n");
107 ok(GetObject(hbm
, sizeof(bm
), &bm
), "GetObject failed\n");
109 ok(bm
.bmBitsPixel
== 1, "CreateDIBitmap created bitmap of incorrect depth %d != %d\n", bm
.bmBitsPixel
, 1);
112 /* Now select a polychrome bitmap into the dc and we expect
113 screen_depth bitmaps again */
114 hbm_colour
= CreateCompatibleBitmap(hdc
, 1, 1);
115 hbm_old
= SelectObject(hdcmem
, hbm_colour
);
117 /* First try 32 bits */
118 bmih
.biBitCount
= 32;
119 hbm
= CreateDIBitmap(hdcmem
, &bmih
, 0, NULL
, NULL
, 0);
120 ok(hbm
!= NULL
, "CreateDIBitmap failed\n");
121 ok(GetObject(hbm
, sizeof(bm
), &bm
), "GetObject failed\n");
123 ok(bm
.bmBitsPixel
== screen_depth
, "CreateDIBitmap created bitmap of incorrect depth %d != %d\n", bm
.bmBitsPixel
, screen_depth
);
127 bmih
.biBitCount
= 16;
128 hbm
= CreateDIBitmap(hdcmem
, &bmih
, 0, NULL
, NULL
, 0);
129 ok(hbm
!= NULL
, "CreateDIBitmap failed\n");
130 ok(GetObject(hbm
, sizeof(bm
), &bm
), "GetObject failed\n");
132 ok(bm
.bmBitsPixel
== screen_depth
, "CreateDIBitmap created bitmap of incorrect depth %d != %d\n", bm
.bmBitsPixel
, screen_depth
);
137 hbm
= CreateDIBitmap(hdcmem
, &bmih
, 0, NULL
, NULL
, 0);
138 ok(hbm
!= NULL
, "CreateDIBitmap failed\n");
139 ok(GetObject(hbm
, sizeof(bm
), &bm
), "GetObject failed\n");
141 ok(bm
.bmBitsPixel
== screen_depth
, "CreateDIBitmap created bitmap of incorrect depth %d != %d\n", bm
.bmBitsPixel
, screen_depth
);
144 SelectObject(hdcmem
, hbm_old
);
145 DeleteObject(hbm_colour
);
148 /* If hdc == 0 then we get a 1 bpp bitmap */
150 bmih
.biBitCount
= 32;
151 hbm
= CreateDIBitmap(0, &bmih
, 0, NULL
, NULL
, 0);
152 ok(hbm
!= NULL
, "CreateDIBitmap failed\n");
153 ok(GetObject(hbm
, sizeof(bm
), &bm
), "GetObject failed\n");
155 ok(bm
.bmBitsPixel
== 1, "CreateDIBitmap created bitmap of incorrect depth %d != %d\n", bm
.bmBitsPixel
, 1);
162 #define test_color_todo(got, exp, txt, todo) \
163 if (!todo && got != exp && screen_depth < 24) { \
164 todo_wine ok(0, #txt " failed at %d-bit screen depth: got 0x%06x expected 0x%06x - skipping DIB tests\n", \
165 screen_depth, (UINT)got, (UINT)exp); \
167 } else if (todo) todo_wine { ok(got == exp, #txt " failed: got 0x%06x expected 0x%06x\n", (UINT)got, (UINT)exp); } \
168 else ok(got == exp, #txt " failed: got 0x%06x expected 0x%06x\n", (UINT)got, (UINT)exp) \
170 #define test_color(hdc, color, exp, todo_setp, todo_getp) \
173 c = SetPixel(hdc, 0, 0, color); \
174 if (!is_win9x) { test_color_todo(c, exp, SetPixel, todo_setp); } \
175 c = GetPixel(hdc, 0, 0); \
176 test_color_todo(c, exp, GetPixel, todo_getp); \
179 static void test_dibsections(void)
181 HDC hdc
, hdcmem
, hdcmem2
;
182 HBITMAP hdib
, oldbm
, hdib2
, oldbm2
;
183 char bmibuf
[sizeof(BITMAPINFO
) + 256 * sizeof(RGBQUAD
)];
184 char bcibuf
[sizeof(BITMAPCOREINFO
) + 256 * sizeof(RGBTRIPLE
)];
185 BITMAPINFO
*pbmi
= (BITMAPINFO
*)bmibuf
;
186 BITMAPCOREINFO
*pbci
= (BITMAPCOREINFO
*)bcibuf
;
192 char logpalbuf
[sizeof(LOGPALETTE
) + 256 * sizeof(PALETTEENTRY
)];
193 LOGPALETTE
*plogpal
= (LOGPALETTE
*)logpalbuf
;
196 HPALETTE hpal
, oldpal
;
203 screen_depth
= GetDeviceCaps(hdc
, BITSPIXEL
) * GetDeviceCaps(hdc
, PLANES
);
204 memset(pbmi
, 0, sizeof(bmibuf
));
205 pbmi
->bmiHeader
.biSize
= sizeof(pbmi
->bmiHeader
);
206 pbmi
->bmiHeader
.biHeight
= 16;
207 pbmi
->bmiHeader
.biWidth
= 16;
208 pbmi
->bmiHeader
.biBitCount
= 1;
209 pbmi
->bmiHeader
.biPlanes
= 1;
210 pbmi
->bmiHeader
.biCompression
= BI_RGB
;
211 pbmi
->bmiColors
[0].rgbRed
= 0xff;
212 pbmi
->bmiColors
[0].rgbGreen
= 0;
213 pbmi
->bmiColors
[0].rgbBlue
= 0;
214 pbmi
->bmiColors
[1].rgbRed
= 0;
215 pbmi
->bmiColors
[1].rgbGreen
= 0;
216 pbmi
->bmiColors
[1].rgbBlue
= 0xff;
218 hdib
= CreateDIBSection(hdc
, pbmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
219 ok(hdib
!= NULL
, "CreateDIBSection failed\n");
220 ok(GetObject(hdib
, sizeof(DIBSECTION
), &dibsec
) != 0, "GetObject failed for DIBSection\n");
221 ok(dibsec
.dsBmih
.biClrUsed
== 2,
222 "created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec
.dsBmih
.biClrUsed
, 2);
224 /* Test if the old BITMAPCOREINFO structure is supported */
226 pbci
->bmciHeader
.bcSize
= sizeof(BITMAPCOREHEADER
);
227 pbci
->bmciHeader
.bcBitCount
= 0;
230 ret
= GetDIBits(hdc
, hdib
, 0, 16, NULL
, (BITMAPINFO
*) pbci
, DIB_RGB_COLORS
);
231 ok(ret
, "GetDIBits doesn't work with a BITMAPCOREHEADER\n");
232 ok((pbci
->bmciHeader
.bcWidth
== 16) && (pbci
->bmciHeader
.bcHeight
== 16)
233 && (pbci
->bmciHeader
.bcBitCount
== 1) && (pbci
->bmciHeader
.bcPlanes
== 1),
234 "GetDIBits did't fill in the BITMAPCOREHEADER structure properly\n");
236 ret
= GetDIBits(hdc
, hdib
, 0, 16, &coreBits
, (BITMAPINFO
*) pbci
, DIB_RGB_COLORS
);
237 ok(ret
, "GetDIBits doesn't work with a BITMAPCOREHEADER\n");
238 ok((pbci
->bmciColors
[0].rgbtRed
== 0xff) && (pbci
->bmciColors
[0].rgbtGreen
== 0) &&
239 (pbci
->bmciColors
[0].rgbtBlue
== 0) && (pbci
->bmciColors
[1].rgbtRed
== 0) &&
240 (pbci
->bmciColors
[1].rgbtGreen
== 0) && (pbci
->bmciColors
[1].rgbtBlue
== 0xff),
241 "The color table has not been translated to the old BITMAPCOREINFO format\n");
243 hcoredib
= CreateDIBSection(hdc
, (BITMAPINFO
*) pbci
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
244 ok(hcoredib
!= NULL
, "CreateDIBSection failed with a BITMAPCOREINFO\n");
246 ZeroMemory(pbci
->bmciColors
, 256 * sizeof(RGBTRIPLE
));
247 ret
= GetDIBits(hdc
, hcoredib
, 0, 16, &coreBits
, (BITMAPINFO
*) pbci
, DIB_RGB_COLORS
);
248 ok(ret
, "GetDIBits doesn't work with a BITMAPCOREHEADER\n");
249 ok((pbci
->bmciColors
[0].rgbtRed
== 0xff) && (pbci
->bmciColors
[0].rgbtGreen
== 0) &&
250 (pbci
->bmciColors
[0].rgbtBlue
== 0) && (pbci
->bmciColors
[1].rgbtRed
== 0) &&
251 (pbci
->bmciColors
[1].rgbtGreen
== 0) && (pbci
->bmciColors
[1].rgbtBlue
== 0xff),
252 "The color table has not been translated to the old BITMAPCOREINFO format\n");
254 DeleteObject(hcoredib
);
257 hdcmem
= CreateCompatibleDC(hdc
);
258 oldbm
= SelectObject(hdcmem
, hdib
);
260 ret
= GetDIBColorTable(hdcmem
, 0, 2, rgb
);
261 ok(ret
== 2, "GetDIBColorTable returned %d\n", ret
);
262 ok(!memcmp(rgb
, pbmi
->bmiColors
, 2 * sizeof(RGBQUAD
)),
263 "GetDIBColorTable returns table 0: r%02x g%02x b%02x res%02x 1: r%02x g%02x b%02x res%02x\n",
264 rgb
[0].rgbRed
, rgb
[0].rgbGreen
, rgb
[0].rgbBlue
, rgb
[0].rgbReserved
,
265 rgb
[1].rgbRed
, rgb
[1].rgbGreen
, rgb
[1].rgbBlue
, rgb
[1].rgbReserved
);
267 c0
= RGB(pbmi
->bmiColors
[0].rgbRed
, pbmi
->bmiColors
[0].rgbGreen
, pbmi
->bmiColors
[0].rgbBlue
);
268 c1
= RGB(pbmi
->bmiColors
[1].rgbRed
, pbmi
->bmiColors
[1].rgbGreen
, pbmi
->bmiColors
[1].rgbBlue
);
270 test_color(hdcmem
, DIBINDEX(0), c0
, 0, 1);
271 test_color(hdcmem
, DIBINDEX(1), c1
, 0, 1);
272 test_color(hdcmem
, DIBINDEX(2), c0
, 1, 1);
273 test_color(hdcmem
, PALETTEINDEX(0), c0
, 1, 1);
274 test_color(hdcmem
, PALETTEINDEX(1), c0
, 1, 1);
275 test_color(hdcmem
, PALETTEINDEX(2), c0
, 1, 1);
276 test_color(hdcmem
, PALETTERGB(pbmi
->bmiColors
[0].rgbRed
, pbmi
->bmiColors
[0].rgbGreen
,
277 pbmi
->bmiColors
[0].rgbBlue
), c0
, 1, 1);
278 test_color(hdcmem
, PALETTERGB(pbmi
->bmiColors
[1].rgbRed
, pbmi
->bmiColors
[1].rgbGreen
,
279 pbmi
->bmiColors
[1].rgbBlue
), c1
, 1, 1);
280 test_color(hdcmem
, PALETTERGB(0, 0, 0), c0
, 1, 1);
281 test_color(hdcmem
, PALETTERGB(0xff, 0xff, 0xff), c0
, 1, 1);
282 test_color(hdcmem
, PALETTERGB(0, 0, 0xfe), c1
, 1, 1);
284 SelectObject(hdcmem
, oldbm
);
287 pbmi
->bmiHeader
.biBitCount
= 4;
288 for (i
= 0; i
< 16; i
++) {
289 pbmi
->bmiColors
[i
].rgbRed
= i
;
290 pbmi
->bmiColors
[i
].rgbGreen
= 16-i
;
291 pbmi
->bmiColors
[i
].rgbBlue
= 0;
293 hdib
= CreateDIBSection(hdcmem
, pbmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
294 ok(hdib
!= NULL
, "CreateDIBSection failed\n");
295 ok(GetObject(hdib
, sizeof(DIBSECTION
), &dibsec
) != 0, "GetObject failed for DIB Section\n");
296 ok(dibsec
.dsBmih
.biClrUsed
== 16,
297 "created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec
.dsBmih
.biClrUsed
, 16);
300 pbmi
->bmiHeader
.biBitCount
= 8;
302 for (i
= 0; i
< 128; i
++) {
303 pbmi
->bmiColors
[i
].rgbRed
= 255 - i
* 2;
304 pbmi
->bmiColors
[i
].rgbGreen
= i
* 2;
305 pbmi
->bmiColors
[i
].rgbBlue
= 0;
306 pbmi
->bmiColors
[255 - i
].rgbRed
= 0;
307 pbmi
->bmiColors
[255 - i
].rgbGreen
= i
* 2;
308 pbmi
->bmiColors
[255 - i
].rgbBlue
= 255 - i
* 2;
310 hdib
= CreateDIBSection(hdcmem
, pbmi
, DIB_RGB_COLORS
, (void**)&bits
, NULL
, 0);
311 ok(hdib
!= NULL
, "CreateDIBSection failed\n");
312 ok(GetObject(hdib
, sizeof(DIBSECTION
), &dibsec
) != 0, "GetObject failed for DIB Section\n");
313 ok(dibsec
.dsBmih
.biClrUsed
== 256,
314 "created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec
.dsBmih
.biClrUsed
, 256);
316 oldbm
= SelectObject(hdcmem
, hdib
);
318 for (i
= 0; i
< 256; i
++) {
319 test_color(hdcmem
, DIBINDEX(i
),
320 RGB(pbmi
->bmiColors
[i
].rgbRed
, pbmi
->bmiColors
[i
].rgbGreen
, pbmi
->bmiColors
[i
].rgbBlue
), 0, 0);
321 test_color(hdcmem
, PALETTERGB(pbmi
->bmiColors
[i
].rgbRed
, pbmi
->bmiColors
[i
].rgbGreen
, pbmi
->bmiColors
[i
].rgbBlue
),
322 RGB(pbmi
->bmiColors
[i
].rgbRed
, pbmi
->bmiColors
[i
].rgbGreen
, pbmi
->bmiColors
[i
].rgbBlue
), 0, 0);
325 SelectObject(hdcmem
, oldbm
);
328 pbmi
->bmiHeader
.biBitCount
= 1;
330 /* Now create a palette and a palette indexed dib section */
331 memset(plogpal
, 0, sizeof(logpalbuf
));
332 plogpal
->palVersion
= 0x300;
333 plogpal
->palNumEntries
= 2;
334 plogpal
->palPalEntry
[0].peRed
= 0xff;
335 plogpal
->palPalEntry
[0].peBlue
= 0xff;
336 plogpal
->palPalEntry
[1].peGreen
= 0xff;
338 index
= (WORD
*)pbmi
->bmiColors
;
341 hpal
= CreatePalette(plogpal
);
342 ok(hpal
!= NULL
, "CreatePalette failed\n");
343 oldpal
= SelectPalette(hdc
, hpal
, TRUE
);
344 hdib
= CreateDIBSection(hdc
, pbmi
, DIB_PAL_COLORS
, (void**)&bits
, NULL
, 0);
345 ok(hdib
!= NULL
, "CreateDIBSection failed\n");
346 ok(GetObject(hdib
, sizeof(DIBSECTION
), &dibsec
) != 0, "GetObject failed for DIB Section\n");
347 ok(dibsec
.dsBmih
.biClrUsed
== 2,
348 "created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec
.dsBmih
.biClrUsed
, 2);
350 /* The colour table has already been grabbed from the dc, so we select back the
353 SelectPalette(hdc
, oldpal
, TRUE
);
354 oldbm
= SelectObject(hdcmem
, hdib
);
355 oldpal
= SelectPalette(hdcmem
, hpal
, TRUE
);
357 ret
= GetDIBColorTable(hdcmem
, 0, 2, rgb
);
358 ok(ret
== 2, "GetDIBColorTable returned %d\n", ret
);
359 ok(rgb
[0].rgbRed
== 0xff && rgb
[0].rgbBlue
== 0xff && rgb
[0].rgbGreen
== 0 &&
360 rgb
[1].rgbRed
== 0 && rgb
[1].rgbBlue
== 0 && rgb
[1].rgbGreen
== 0xff,
361 "GetDIBColorTable returns table 0: r%02x g%02x b%02x res%02x 1: r%02x g%02x b%02x res%02x\n",
362 rgb
[0].rgbRed
, rgb
[0].rgbGreen
, rgb
[0].rgbBlue
, rgb
[0].rgbReserved
,
363 rgb
[1].rgbRed
, rgb
[1].rgbGreen
, rgb
[1].rgbBlue
, rgb
[1].rgbReserved
);
365 c0
= RGB(plogpal
->palPalEntry
[0].peRed
, plogpal
->palPalEntry
[0].peGreen
, plogpal
->palPalEntry
[0].peBlue
);
366 c1
= RGB(plogpal
->palPalEntry
[1].peRed
, plogpal
->palPalEntry
[1].peGreen
, plogpal
->palPalEntry
[1].peBlue
);
368 test_color(hdcmem
, DIBINDEX(0), c0
, 0, 1);
369 test_color(hdcmem
, DIBINDEX(1), c1
, 0, 1);
370 test_color(hdcmem
, DIBINDEX(2), c0
, 1, 1);
371 test_color(hdcmem
, PALETTEINDEX(0), c0
, 0, 1);
372 test_color(hdcmem
, PALETTEINDEX(1), c1
, 0, 1);
373 test_color(hdcmem
, PALETTEINDEX(2), c0
, 1, 1);
374 test_color(hdcmem
, PALETTERGB(plogpal
->palPalEntry
[0].peRed
, plogpal
->palPalEntry
[0].peGreen
,
375 plogpal
->palPalEntry
[0].peBlue
), c0
, 1, 1);
376 test_color(hdcmem
, PALETTERGB(plogpal
->palPalEntry
[1].peRed
, plogpal
->palPalEntry
[1].peGreen
,
377 plogpal
->palPalEntry
[1].peBlue
), c1
, 1, 1);
378 test_color(hdcmem
, PALETTERGB(0, 0, 0), c1
, 1, 1);
379 test_color(hdcmem
, PALETTERGB(0xff, 0xff, 0xff), c0
, 1, 1);
380 test_color(hdcmem
, PALETTERGB(0, 0, 0xfe), c0
, 1, 1);
381 test_color(hdcmem
, PALETTERGB(0, 1, 0), c1
, 1, 1);
382 test_color(hdcmem
, PALETTERGB(0x3f, 0, 0x3f), c1
, 1, 1);
383 test_color(hdcmem
, PALETTERGB(0x40, 0, 0x40), c0
, 1, 1);
385 /* Bottom and 2nd row from top green, everything else magenta */
386 bits
[0] = bits
[1] = 0xff;
387 bits
[13 * 4] = bits
[13*4 + 1] = 0xff;
390 pbmi
->bmiHeader
.biBitCount
= 32;
392 hdib2
= CreateDIBSection(NULL
, pbmi
, DIB_RGB_COLORS
, (void **)&bits32
, NULL
, 0);
393 ok(hdib2
!= NULL
, "CreateDIBSection failed\n");
394 hdcmem2
= CreateCompatibleDC(hdc
);
395 oldbm2
= SelectObject(hdcmem2
, hdib2
);
397 BitBlt(hdcmem2
, 0, 0, 16,16, hdcmem
, 0, 0, SRCCOPY
);
399 ok(bits32
[0] == 0xff00, "lower left pixel is %08lx\n", bits32
[0]);
400 ok(bits32
[17] == 0xff00ff, "bottom but one, left pixel is %08lx\n", bits32
[17]);
402 SelectObject(hdcmem2
, oldbm2
);
405 SelectObject(hdcmem
, oldbm
);
406 SelectObject(hdcmem
, oldpal
);
411 pbmi
->bmiHeader
.biBitCount
= 8;
413 memset(plogpal
, 0, sizeof(logpalbuf
));
414 plogpal
->palVersion
= 0x300;
415 plogpal
->palNumEntries
= 256;
417 for (i
= 0; i
< 128; i
++) {
418 plogpal
->palPalEntry
[i
].peRed
= 255 - i
* 2;
419 plogpal
->palPalEntry
[i
].peBlue
= i
* 2;
420 plogpal
->palPalEntry
[i
].peGreen
= 0;
421 plogpal
->palPalEntry
[255 - i
].peRed
= 0;
422 plogpal
->palPalEntry
[255 - i
].peGreen
= i
* 2;
423 plogpal
->palPalEntry
[255 - i
].peBlue
= 255 - i
* 2;
426 index
= (WORD
*)pbmi
->bmiColors
;
427 for (i
= 0; i
< 256; i
++) {
431 hpal
= CreatePalette(plogpal
);
432 ok(hpal
!= NULL
, "CreatePalette failed\n");
433 oldpal
= SelectPalette(hdc
, hpal
, TRUE
);
434 hdib
= CreateDIBSection(hdc
, pbmi
, DIB_PAL_COLORS
, (void**)&bits
, NULL
, 0);
435 ok(hdib
!= NULL
, "CreateDIBSection failed\n");
436 ok(GetObject(hdib
, sizeof(DIBSECTION
), &dibsec
) != 0, "GetObject failed for DIB Section\n");
437 ok(dibsec
.dsBmih
.biClrUsed
== 256,
438 "created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec
.dsBmih
.biClrUsed
, 256);
440 SelectPalette(hdc
, oldpal
, TRUE
);
441 oldbm
= SelectObject(hdcmem
, hdib
);
442 oldpal
= SelectPalette(hdcmem
, hpal
, TRUE
);
444 ret
= GetDIBColorTable(hdcmem
, 0, 256, rgb
);
445 ok(ret
== 256, "GetDIBColorTable returned %d\n", ret
);
446 for (i
= 0; i
< 256; i
++) {
447 ok(rgb
[i
].rgbRed
== plogpal
->palPalEntry
[i
].peRed
&&
448 rgb
[i
].rgbBlue
== plogpal
->palPalEntry
[i
].peBlue
&&
449 rgb
[i
].rgbGreen
== plogpal
->palPalEntry
[i
].peGreen
,
450 "GetDIBColorTable returns table %d: r%02x g%02x b%02x res%02x\n",
451 i
, rgb
[i
].rgbRed
, rgb
[i
].rgbGreen
, rgb
[i
].rgbBlue
, rgb
[i
].rgbReserved
);
454 for (i
= 0; i
< 256; i
++) {
455 test_color(hdcmem
, DIBINDEX(i
),
456 RGB(plogpal
->palPalEntry
[i
].peRed
, plogpal
->palPalEntry
[i
].peGreen
, plogpal
->palPalEntry
[i
].peBlue
), 0, 0);
457 test_color(hdcmem
, PALETTEINDEX(i
),
458 RGB(plogpal
->palPalEntry
[i
].peRed
, plogpal
->palPalEntry
[i
].peGreen
, plogpal
->palPalEntry
[i
].peBlue
), 0, 0);
459 test_color(hdcmem
, PALETTERGB(plogpal
->palPalEntry
[i
].peRed
, plogpal
->palPalEntry
[i
].peGreen
, plogpal
->palPalEntry
[i
].peBlue
),
460 RGB(plogpal
->palPalEntry
[i
].peRed
, plogpal
->palPalEntry
[i
].peGreen
, plogpal
->palPalEntry
[i
].peBlue
), 0, 0);
463 SelectPalette(hdcmem
, oldpal
, TRUE
);
464 SelectObject(hdcmem
, oldbm
);
477 hWnd
= CreateWindowExA(0, "EDIT", NULL
, 0,
479 NULL
, NULL
, NULL
, NULL
);
481 is_win9x
= GetWindowLongPtrW(hWnd
, GWLP_WNDPROC
) == 0;
484 test_createdibitmap();