📄 bitmap.c
字号:
test_color(hdcmem, PALETTERGB(0, 0, 0), c1, 1, 1);
test_color(hdcmem, PALETTERGB(0xff, 0xff, 0xff), c0, 1, 1);
test_color(hdcmem, PALETTERGB(0, 0, 0xfe), c0, 1, 1);
test_color(hdcmem, PALETTERGB(0, 1, 0), c1, 1, 1);
test_color(hdcmem, PALETTERGB(0x3f, 0, 0x3f), c1, 1, 1);
test_color(hdcmem, PALETTERGB(0x40, 0, 0x40), c0, 1, 1);
/* Bottom and 2nd row from top green, everything else magenta */
bits[0] = bits[1] = 0xff;
bits[13 * 4] = bits[13*4 + 1] = 0xff;
test_dib_info(hdib, bits, &pbmi->bmiHeader);
pbmi->bmiHeader.biBitCount = 32;
hdib2 = CreateDIBSection(NULL, pbmi, DIB_RGB_COLORS, (void **)&bits32, NULL, 0);
ok(hdib2 != NULL, "CreateDIBSection failed\n");
hdcmem2 = CreateCompatibleDC(hdc);
oldbm2 = SelectObject(hdcmem2, hdib2);
BitBlt(hdcmem2, 0, 0, 16,16, hdcmem, 0, 0, SRCCOPY);
ok(bits32[0] == 0xff00, "lower left pixel is %08lx\n", bits32[0]);
ok(bits32[17] == 0xff00ff, "bottom but one, left pixel is %08lx\n", bits32[17]);
SelectObject(hdcmem2, oldbm2);
test_dib_info(hdib2, bits32, &pbmi->bmiHeader);
DeleteObject(hdib2);
SelectObject(hdcmem, oldbm);
SelectObject(hdcmem, oldpal);
DeleteObject(hdib);
DeleteObject(hpal);
pbmi->bmiHeader.biBitCount = 8;
memset(plogpal, 0, sizeof(logpalbuf));
plogpal->palVersion = 0x300;
plogpal->palNumEntries = 256;
for (i = 0; i < 128; i++) {
plogpal->palPalEntry[i].peRed = 255 - i * 2;
plogpal->palPalEntry[i].peBlue = i * 2;
plogpal->palPalEntry[i].peGreen = 0;
plogpal->palPalEntry[255 - i].peRed = 0;
plogpal->palPalEntry[255 - i].peGreen = i * 2;
plogpal->palPalEntry[255 - i].peBlue = 255 - i * 2;
}
index = (WORD*)pbmi->bmiColors;
for (i = 0; i < 256; i++) {
*index++ = i;
}
hpal = CreatePalette(plogpal);
ok(hpal != NULL, "CreatePalette failed\n");
oldpal = SelectPalette(hdc, hpal, TRUE);
hdib = CreateDIBSection(hdc, pbmi, DIB_PAL_COLORS, (void**)&bits, NULL, 0);
ok(hdib != NULL, "CreateDIBSection failed\n");
ok(GetObject(hdib, sizeof(DIBSECTION), &dibsec) != 0, "GetObject failed for DIB Section\n");
ok(dibsec.dsBmih.biClrUsed == 256,
"created DIBSection: wrong biClrUsed field: %lu, should be: %u\n", dibsec.dsBmih.biClrUsed, 256);
test_dib_info(hdib, bits, &pbmi->bmiHeader);
SelectPalette(hdc, oldpal, TRUE);
oldbm = SelectObject(hdcmem, hdib);
oldpal = SelectPalette(hdcmem, hpal, TRUE);
ret = GetDIBColorTable(hdcmem, 0, 256, rgb);
ok(ret == 256, "GetDIBColorTable returned %d\n", ret);
for (i = 0; i < 256; i++) {
ok(rgb[i].rgbRed == plogpal->palPalEntry[i].peRed &&
rgb[i].rgbBlue == plogpal->palPalEntry[i].peBlue &&
rgb[i].rgbGreen == plogpal->palPalEntry[i].peGreen,
"GetDIBColorTable returns table %d: r%02x g%02x b%02x res%02x\n",
i, rgb[i].rgbRed, rgb[i].rgbGreen, rgb[i].rgbBlue, rgb[i].rgbReserved);
}
for (i = 0; i < 256; i++) {
test_color(hdcmem, DIBINDEX(i),
RGB(plogpal->palPalEntry[i].peRed, plogpal->palPalEntry[i].peGreen, plogpal->palPalEntry[i].peBlue), 0, 0);
test_color(hdcmem, PALETTEINDEX(i),
RGB(plogpal->palPalEntry[i].peRed, plogpal->palPalEntry[i].peGreen, plogpal->palPalEntry[i].peBlue), 0, 0);
test_color(hdcmem, PALETTERGB(plogpal->palPalEntry[i].peRed, plogpal->palPalEntry[i].peGreen, plogpal->palPalEntry[i].peBlue),
RGB(plogpal->palPalEntry[i].peRed, plogpal->palPalEntry[i].peGreen, plogpal->palPalEntry[i].peBlue), 0, 0);
}
SelectPalette(hdcmem, oldpal, TRUE);
SelectObject(hdcmem, oldbm);
DeleteObject(hdib);
DeleteObject(hpal);
DeleteDC(hdcmem);
ReleaseDC(0, hdc);
}
void test_mono_dibsection(void)
{
HDC hdc, memdc;
HBITMAP old_bm, mono_ds;
char bmibuf[sizeof(BITMAPINFO) + 256 * sizeof(RGBQUAD)];
BITMAPINFO *pbmi = (BITMAPINFO *)bmibuf;
BYTE bits[10 * 4];
BYTE *ds_bits;
int num;
hdc = GetDC(0);
memdc = CreateCompatibleDC(hdc);
memset(pbmi, 0, sizeof(bmibuf));
pbmi->bmiHeader.biSize = sizeof(pbmi->bmiHeader);
pbmi->bmiHeader.biHeight = 10;
pbmi->bmiHeader.biWidth = 10;
pbmi->bmiHeader.biBitCount = 1;
pbmi->bmiHeader.biPlanes = 1;
pbmi->bmiHeader.biCompression = BI_RGB;
pbmi->bmiColors[0].rgbRed = 0xff;
pbmi->bmiColors[0].rgbGreen = 0xff;
pbmi->bmiColors[0].rgbBlue = 0xff;
pbmi->bmiColors[1].rgbRed = 0x0;
pbmi->bmiColors[1].rgbGreen = 0x0;
pbmi->bmiColors[1].rgbBlue = 0x0;
/*
* First dib section is 'inverted' ie color[0] is white, color[1] is black
*/
mono_ds = CreateDIBSection(hdc, pbmi, DIB_RGB_COLORS, (void**)&ds_bits, NULL, 0);
ok(mono_ds != NULL, "CreateDIBSection rets NULL\n");
old_bm = SelectObject(memdc, mono_ds);
/* black border, white interior */
Rectangle(memdc, 0, 0, 10, 10);
ok(ds_bits[0] == 0xff, "out_bits %02x\n", ds_bits[0]);
ok(ds_bits[4] == 0x80, "out_bits %02x\n", ds_bits[4]);
/* SetDIBitsToDevice with an inverted bmi -> inverted dib section */
memset(bits, 0, sizeof(bits));
bits[0] = 0xaa;
SetDIBitsToDevice(memdc, 0, 0, 10, 10, 0, 0, 0, 10, bits, pbmi, DIB_RGB_COLORS);
ok(ds_bits[0] == 0xaa, "out_bits %02x\n", ds_bits[0]);
/* SetDIBitsToDevice with a normal bmi -> inverted dib section */
pbmi->bmiColors[0].rgbRed = 0x0;
pbmi->bmiColors[0].rgbGreen = 0x0;
pbmi->bmiColors[0].rgbBlue = 0x0;
pbmi->bmiColors[1].rgbRed = 0xff;
pbmi->bmiColors[1].rgbGreen = 0xff;
pbmi->bmiColors[1].rgbBlue = 0xff;
SetDIBitsToDevice(memdc, 0, 0, 10, 10, 0, 0, 0, 10, bits, pbmi, DIB_RGB_COLORS);
ok(ds_bits[0] == 0x55, "out_bits %02x\n", ds_bits[0]);
SelectObject(memdc, old_bm);
DeleteObject(mono_ds);
/*
* Next dib section is 'normal' ie color[0] is black, color[1] is white
*/
pbmi->bmiColors[0].rgbRed = 0x0;
pbmi->bmiColors[0].rgbGreen = 0x0;
pbmi->bmiColors[0].rgbBlue = 0x0;
pbmi->bmiColors[1].rgbRed = 0xff;
pbmi->bmiColors[1].rgbGreen = 0xff;
pbmi->bmiColors[1].rgbBlue = 0xff;
mono_ds = CreateDIBSection(hdc, pbmi, DIB_RGB_COLORS, (void**)&ds_bits, NULL, 0);
ok(mono_ds != NULL, "CreateDIBSection rets NULL\n");
old_bm = SelectObject(memdc, mono_ds);
/* black border, white interior */
Rectangle(memdc, 0, 0, 10, 10);
ok(ds_bits[0] == 0x00, "out_bits %02x\n", ds_bits[0]);
ok(ds_bits[4] == 0x7f, "out_bits %02x\n", ds_bits[4]);
/* SetDIBitsToDevice with a normal bmi -> normal dib section */
SetDIBitsToDevice(memdc, 0, 0, 10, 10, 0, 0, 0, 10, bits, pbmi, DIB_RGB_COLORS);
ok(ds_bits[0] == 0xaa, "out_bits %02x\n", ds_bits[0]);
/* SetDIBitsToDevice with a inverted bmi -> normal dib section */
pbmi->bmiColors[0].rgbRed = 0xff;
pbmi->bmiColors[0].rgbGreen = 0xff;
pbmi->bmiColors[0].rgbBlue = 0xff;
pbmi->bmiColors[1].rgbRed = 0x0;
pbmi->bmiColors[1].rgbGreen = 0x0;
pbmi->bmiColors[1].rgbBlue = 0x0;
SetDIBitsToDevice(memdc, 0, 0, 10, 10, 0, 0, 0, 10, bits, pbmi, DIB_RGB_COLORS);
ok(ds_bits[0] == 0x55, "out_bits %02x\n", ds_bits[0]);
/*
* Take that 'normal' dibsection and change its colour table to an 'inverted' one
*/
pbmi->bmiColors[0].rgbRed = 0xff;
pbmi->bmiColors[0].rgbGreen = 0xff;
pbmi->bmiColors[0].rgbBlue = 0xff;
pbmi->bmiColors[1].rgbRed = 0x0;
pbmi->bmiColors[1].rgbGreen = 0x0;
pbmi->bmiColors[1].rgbBlue = 0x0;
num = SetDIBColorTable(memdc, 0, 2, pbmi->bmiColors);
ok(num == 2, "num = %d\n", num);
/* black border, white interior */
Rectangle(memdc, 0, 0, 10, 10);
todo_wine {
ok(ds_bits[0] == 0xff, "out_bits %02x\n", ds_bits[0]);
ok(ds_bits[4] == 0x80, "out_bits %02x\n", ds_bits[4]);
}
/* SetDIBitsToDevice with an inverted bmi -> inverted dib section */
memset(bits, 0, sizeof(bits));
bits[0] = 0xaa;
SetDIBitsToDevice(memdc, 0, 0, 10, 10, 0, 0, 0, 10, bits, pbmi, DIB_RGB_COLORS);
ok(ds_bits[0] == 0xaa, "out_bits %02x\n", ds_bits[0]);
/* SetDIBitsToDevice with a normal bmi -> inverted dib section */
pbmi->bmiColors[0].rgbRed = 0x0;
pbmi->bmiColors[0].rgbGreen = 0x0;
pbmi->bmiColors[0].rgbBlue = 0x0;
pbmi->bmiColors[1].rgbRed = 0xff;
pbmi->bmiColors[1].rgbGreen = 0xff;
pbmi->bmiColors[1].rgbBlue = 0xff;
SetDIBitsToDevice(memdc, 0, 0, 10, 10, 0, 0, 0, 10, bits, pbmi, DIB_RGB_COLORS);
ok(ds_bits[0] == 0x55, "out_bits %02x\n", ds_bits[0]);
SelectObject(memdc, old_bm);
DeleteObject(mono_ds);
/*
* Now a dib section with a strange colour map just for fun. This behaves just like an inverted one.
*/
pbmi->bmiColors[0].rgbRed = 0xff;
pbmi->bmiColors[0].rgbGreen = 0x0;
pbmi->bmiColors[0].rgbBlue = 0x0;
pbmi->bmiColors[1].rgbRed = 0xfe;
pbmi->bmiColors[1].rgbGreen = 0x0;
pbmi->bmiColors[1].rgbBlue = 0x0;
mono_ds = CreateDIBSection(hdc, pbmi, DIB_RGB_COLORS, (void**)&ds_bits, NULL, 0);
ok(mono_ds != NULL, "CreateDIBSection rets NULL\n");
old_bm = SelectObject(memdc, mono_ds);
/* black border, white interior */
Rectangle(memdc, 0, 0, 10, 10);
ok(ds_bits[0] == 0xff, "out_bits %02x\n", ds_bits[0]);
ok(ds_bits[4] == 0x80, "out_bits %02x\n", ds_bits[4]);
/* SetDIBitsToDevice with a normal bmi -> inverted dib section */
pbmi->bmiColors[0].rgbRed = 0x0;
pbmi->bmiColors[0].rgbGreen = 0x0;
pbmi->bmiColors[0].rgbBlue = 0x0;
pbmi->bmiColors[1].rgbRed = 0xff;
pbmi->bmiColors[1].rgbGreen = 0xff;
pbmi->bmiColors[1].rgbBlue = 0xff;
SetDIBitsToDevice(memdc, 0, 0, 10, 10, 0, 0, 0, 10, bits, pbmi, DIB_RGB_COLORS);
ok(ds_bits[0] == 0x55, "out_bits %02x\n", ds_bits[0]);
/* SetDIBitsToDevice with a inverted bmi -> inverted dib section */
pbmi->bmiColors[0].rgbRed = 0xff;
pbmi->bmiColors[0].rgbGreen = 0xff;
pbmi->bmiColors[0].rgbBlue = 0xff;
pbmi->bmiColors[1].rgbRed = 0x0;
pbmi->bmiColors[1].rgbGreen = 0x0;
pbmi->bmiColors[1].rgbBlue = 0x0;
SetDIBitsToDevice(memdc, 0, 0, 10, 10, 0, 0, 0, 10, bits, pbmi, DIB_RGB_COLORS);
ok(ds_bits[0] == 0xaa, "out_bits %02x\n", ds_bits[0]);
SelectObject(memdc, old_bm);
DeleteObject(mono_ds);
DeleteDC(memdc);
ReleaseDC(0, hdc);
}
static void test_bitmap(void)
{
char buf[256], buf_cmp[256];
HBITMAP hbmp, hbmp_old;
HDC hdc;
BITMAP bm;
INT ret;
hdc = CreateCompatibleDC(0);
assert(hdc != 0);
hbmp = CreateBitmap(15, 15, 1, 1, NULL);
assert(hbmp != NULL);
ret = GetObject(hbmp, sizeof(bm), &bm);
ok(ret == sizeof(bm), "wrong size %d\n", ret);
ok(bm.bmType == 0, "wrong bm.bmType %d\n", bm.bmType);
ok(bm.bmWidth == 15, "wrong bm.bmWidth %d\n", bm.bmWidth);
ok(bm.bmHeight == 15, "wrong bm.bmHeight %d\n", bm.bmHeight);
ok(bm.bmWidthBytes == 2, "wrong bm.bmWidthBytes %d\n", bm.bmWidthBytes);
ok(bm.bmPlanes == 1, "wrong bm.bmPlanes %d\n", bm.bmPlanes);
ok(bm.bmBitsPixel == 1, "wrong bm.bmBitsPixel %d\n", bm.bmBitsPixel);
ok(bm.bmBits == NULL, "wrong bm.bmBits %p\n", bm.bmBits);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -