[PATCH 1/5] user32/tests: Add test for 8 bit image stretch mode in CopyImage().
Paul Gofman
gofmanp at gmail.com
Wed Jan 9 06:49:32 CST 2019
Signed-off-by: Paul Gofman <gofmanp at gmail.com>
---
dlls/user32/tests/cursoricon.c | 49 +++++++++++++++++++++++++++-------
1 file changed, 40 insertions(+), 9 deletions(-)
diff --git a/dlls/user32/tests/cursoricon.c b/dlls/user32/tests/cursoricon.c
index c598b232a0..f00d3f2a0c 100644
--- a/dlls/user32/tests/cursoricon.c
+++ b/dlls/user32/tests/cursoricon.c
@@ -2755,17 +2755,19 @@ static COLORREF get_color_from_bits(const unsigned char *bits, const BITMAPINFO
unsigned int row, unsigned int column)
{
const BITMAPINFOHEADER *h = &bmi->bmiHeader;
+ unsigned int stride, shift, mask;
const unsigned char *data;
- unsigned int stride;
RGBQUAD color;
- ok(h->biBitCount == 1 || h->biBitCount >= 24, "Unsupported bit count %u.\n", h->biBitCount);
+ ok(h->biBitCount <= 8 || h->biBitCount >= 24, "Unsupported bit count %u.\n", h->biBitCount);
stride = ((h->biBitCount * h->biWidth + 7) / 8 + 3) & ~3;
data = bits + row * stride + column * h->biBitCount / 8;
if (h->biBitCount >= 24)
return RGB(data[2], data[1], data[0]);
- color = bmi->bmiColors[!!(data[0] & (1u << (7 - (column % 8))))];
+ shift = 8 - h->biBitCount - (column * h->biBitCount) % 8;
+ mask = ~(~0u << h->biBitCount);
+ color = bmi->bmiColors[(data[0] >> shift) & mask];
return RGB(color.rgbRed, color.rgbGreen, color.rgbBlue);
}
@@ -2783,6 +2785,18 @@ static void test_CopyImage_StretchMode(void)
0x3f, 0xff, 0x00, 0x3f, 0xff, 0x3f, 0x00, 0x00,
0x3f, 0xff, 0x7f, 0x00, 0xff, 0x3f, 0x00, 0x00,
};
+ static const unsigned char test_bits_8[] =
+ {
+ 0x00, 0xff, 0x00, 0xff,
+ 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0x55, 0x00, 0xff,
+ 0x00, 0xff, 0xff, 0x00,
+ };
+ static const unsigned char expected_bits_8[] =
+ {
+ 0xff, 0xff, 0x00, 0x00,
+ 0x55, 0xff, 0x00, 0x00,
+ };
static const unsigned char test_bits_1[] =
{
0x30, 0x0, 0x0, 0x0,
@@ -2795,6 +2809,12 @@ static void test_CopyImage_StretchMode(void)
0x40, 0x0, 0x0, 0x0,
0x0, 0x0, 0x0, 0x0,
};
+ static const RGBQUAD colors_bits_1[] =
+ {
+ {0, 0, 0},
+ {0xff, 0xff, 0xff},
+ };
+ static RGBQUAD colors_bits_8[256];
static const struct
{
@@ -2802,19 +2822,25 @@ static void test_CopyImage_StretchMode(void)
WORD bit_count;
const unsigned char *test_bits, *expected_bits;
size_t test_bits_size, result_bits_size;
+ const RGBQUAD *bmi_colors;
+ size_t bmi_colors_size;
BOOL todo;
}
tests[] =
{
{4, 4, 2, 2, 24, test_bits_24, expected_bits_24,
- sizeof(test_bits_24), sizeof(expected_bits_24), TRUE},
+ sizeof(test_bits_24), sizeof(expected_bits_24), NULL, 0, TRUE},
{4, 4, 2, 2, 1, test_bits_1, expected_bits_1,
- sizeof(test_bits_1), sizeof(expected_bits_1), FALSE},
+ sizeof(test_bits_1), sizeof(expected_bits_1), colors_bits_1,
+ sizeof(colors_bits_1), FALSE},
+ {4, 4, 2, 2, 8, test_bits_8, expected_bits_8,
+ sizeof(test_bits_8), sizeof(expected_bits_8), colors_bits_8,
+ sizeof(colors_bits_8), TRUE},
};
HBITMAP bitmap, bitmap_copy;
+ unsigned int row, column, i;
unsigned char *result_bits;
- unsigned int row, column;
unsigned int test_index;
unsigned char *bits;
BITMAPINFO *bmi;
@@ -2825,14 +2851,19 @@ static void test_CopyImage_StretchMode(void)
bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi->bmiHeader.biPlanes = 1;
bmi->bmiHeader.biCompression = BI_RGB;
- bmi->bmiColors[1].rgbRed = 0xff;
- bmi->bmiColors[1].rgbGreen = 0xff;
- bmi->bmiColors[1].rgbBlue = 0xff;
+
+ for (i = 0; i < 256; ++i)
+ colors_bits_8[i].rgbRed = colors_bits_8[i].rgbGreen = colors_bits_8[i].rgbBlue = i;
hdc = GetDC(NULL);
for (test_index = 0; test_index < ARRAY_SIZE(tests); ++test_index)
{
+ if (tests[test_index].bmi_colors)
+ memcpy(bmi->bmiColors, tests[test_index].bmi_colors, tests[test_index].bmi_colors_size);
+ else
+ memset(bmi->bmiColors, 0, 256 * sizeof(RGBQUAD));
+
bmi->bmiHeader.biWidth = tests[test_index].width;
bmi->bmiHeader.biHeight = tests[test_index].height;
bmi->bmiHeader.biBitCount = tests[test_index].bit_count;
--
2.20.1
More information about the wine-devel
mailing list