Last Thursday I submitted a patch which was silently dropped. I'd be interested if someone could take a look at it and let me know what I'm missing plase. I've included the original patch e-mail for reference. The patch was tested on XP, 98, and Wine. I also ran it through valgrind and it passed patchwatcher without any errors. I've had the conformance test sitting around for a while and believe it's best put in the wine source tree (especially as a conformance test for the new DIB engine). It's a conformance test for a bug I fixed years ago in the Wine source tree:
* http://www.winehq.org/pipermail/wine-cvs/2005-January/013584.html * http://www.winehq.org/pipermail/wine-cvs/2005-January/013623.html Thanks for any assistance anyone may be able to provide. Glenn. On Thu, Sep 11, 2008 at 02:59:46PM -0400, Glenn Wurster wrote: > > Changelog: > gdi32/tests: Add font antialiasing tests > > Add tests to ensure that antialiasing is not used even if requested > when we are operating in a palette drawing mode, and that antialiasing > is used when operating in a non-palette mode. > > Changes since attempt 1: > * Clear the bitmap before we write the text to it. > * Document in this e-mail tests performed. > > Tested on XP (sp2), 98, and Wine, also run through Valgrind (did this on > the initial patch as well but forgot to mention that in the e-mail). > > Glenn Wurster. > > --- > dlls/gdi32/tests/font.c | 163 > +++++++++++++++++++++++++++++++++++++++++++++++ > 1 files changed, 163 insertions(+), 0 deletions(-) > diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c > index 7d2c036..088d4e6 100644 > --- a/dlls/gdi32/tests/font.c > +++ b/dlls/gdi32/tests/font.c > @@ -2430,6 +2430,168 @@ static void test_orientation(void) > DeleteDC(hdc); > } > > +static void clear_bmp(HDC hdc, int width, int height, COLORREF colour) > +{ > + HBRUSH hbrush, hbrush_old; > + HPEN hpen, hpen_old; > + > + hbrush = CreateSolidBrush(colour); > + ok(hbrush != NULL, "CreateSolidBrush failed.\n"); > + > + hpen = CreatePen(PS_SOLID, 0, colour); > + ok(hpen != NULL, "CreatePen failed.\n"); > + > + hpen_old = SelectObject( hdc, hpen ); > + hbrush_old = SelectObject( hdc, hbrush ); > + ok(hpen_old != NULL, "SelectObject failed.\n"); > + ok(hbrush_old != NULL, "SelectObject failed.\n"); > + > + ok(Rectangle(hdc, 0, 0, width, height), "Rectangle failed.\n"); > + > + SelectObject(hdc, hbrush_old); > + DeleteObject(hbrush); > + SelectObject(hdc, hpen_old); > + DeleteObject(hpen); > +} > + > +static COLORREF check_bmp_colors(HDC hdc, COLORREF * colours, int colorCnt, > int width, int height) > +{ > + COLORREF pixel; > + int x, y, z; > + for(y = 0; y < height; y++) > + { > + for(x = 0; x < width; x++) > + { > + pixel = GetPixel(hdc, x, y); > + for(z = 0; z < colorCnt; z++) > + { > + if(pixel == colours[z]) > + break; > + } > + if(z >= colorCnt) > + { > + return pixel; > + } > + } > + } > + return 0; > +} > + > +static void test_antialias(void) > +{ > + PALETTEENTRY paletteEntries[3] = { > + { 0x00, 0x00, 0x00, PC_NOCOLLAPSE }, > + { 0xFF, 0xFF, 0xFF, PC_NOCOLLAPSE }, > + { 0x44, 0x44, 0x44, PC_NOCOLLAPSE } > + }; > + HDC hdc; > + HFONT hfont, old_hfont; > + HPALETTE hpal, old_hpal; > + LOGPALETTE * lpal; > + HBITMAP hbmp, old_hbmp; > + BITMAPINFO * bmi; > + COLORREF colours[3]; > + int cntr; > + COLORREF pixel; > + > + hdc = CreateCompatibleDC(0); > + > + /* Create an antialiased font. We don't really care what the specific > font is */ > + hfont = CreateFont(32, 0, 0, 0, FW_REGULAR, FALSE, FALSE, FALSE, > ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, ANTIALIASED_QUALITY, > DEFAULT_PITCH | FF_DONTCARE, NULL); > + old_hfont = SelectObject(hdc, hfont); > + ok(old_hfont != NULL, "SelectObject failed.\n"); > + > + /* Set up a palette */ > + lpal = (LOGPALETTE *)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, > sizeof(LOGPALETTE) + 3*sizeof(PALETTEENTRY)); > + lpal->palNumEntries = 3; > + lpal->palVersion = 0x0300; > + lpal->palPalEntry[0] = paletteEntries[0]; > + lpal->palPalEntry[1] = paletteEntries[1]; > + lpal->palPalEntry[2] = paletteEntries[2]; > + hpal = CreatePalette(lpal); > + HeapFree(GetProcessHeap(), 0, lpal); > + old_hpal = SelectPalette(hdc, hpal, FALSE); > + ok(old_hpal != NULL, "SelectPalette failed.\n"); > + > + /* Create an 8bit bitmap to draw into */ > + bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFO) + > 3 * sizeof(RGBQUAD)); > + bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); > + bmi->bmiHeader.biWidth = 20; > + bmi->bmiHeader.biHeight = -20; > + bmi->bmiHeader.biPlanes = 1; > + bmi->bmiHeader.biBitCount = 8; > + bmi->bmiHeader.biCompression = BI_RGB; > + bmi->bmiHeader.biClrUsed = 3; > + for(cntr = 0; cntr < 3; cntr++) > + { > + bmi->bmiColors[cntr].rgbRed = paletteEntries[cntr].peRed; > + bmi->bmiColors[cntr].rgbGreen = paletteEntries[cntr].peGreen; > + bmi->bmiColors[cntr].rgbBlue = paletteEntries[cntr].peBlue; > + bmi->bmiColors[cntr].rgbReserved = 0; > + colours[cntr] = RGB(paletteEntries[cntr].peRed, > paletteEntries[cntr].peGreen, paletteEntries[cntr].peBlue); > + } > + > + hbmp = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, 0, 0, 0); > + ok(hbmp != NULL, "error=%d\n", GetLastError()); > + old_hbmp = SelectObject(hdc, hbmp); > + ok(old_hbmp != NULL, "error=%d\n", GetLastError()); > + > + HeapFree(GetProcessHeap(), 0, bmi); > + > + /* Set up the text colours */ > + SetTextColor(hdc, RGB(0xFF, 0xFF, 0xFF)); > + SetBkColor(hdc, RGB(0, 0, 0)); > + SetBkMode(hdc, OPAQUE); > + > + /* Draw an 'O' offset to see if antialiasing was > + * used. Antialiasing should be restricted to colours in the > + * palette (if it is done at all). */ > + clear_bmp(hdc, 20, 20, RGB(0, 0, 0)); > + ok(ExtTextOut(hdc, 0, -4, 0, NULL, "O", 1, NULL), "ExtTextOut > failed.\n"); > + pixel = check_bmp_colors(hdc, colours, 3, 20, 20); > + ok(pixel == 0, "Found invalid pixel: %x.\n", pixel); > + > + /* Cleanup the palette stuff */ > + SelectPalette(hdc, old_hpal, FALSE); > + DeleteObject(hpal); > + SelectObject(hdc, old_hbmp); > + DeleteObject(hbmp); > + > + /* Create an RGB bitmap to draw into */ > + bmi = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(BITMAPINFO)); > + bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); > + bmi->bmiHeader.biWidth = 20; > + bmi->bmiHeader.biHeight = -20; > + bmi->bmiHeader.biPlanes = 1; > + bmi->bmiHeader.biBitCount = 32; > + bmi->bmiHeader.biCompression = BI_RGB; > + bmi->bmiHeader.biClrUsed = 0; > + > + hbmp = CreateDIBSection(hdc, bmi, DIB_RGB_COLORS, 0, 0, 0); > + ok(hbmp != NULL, "error=%d\n", GetLastError()); > + old_hbmp = SelectObject(hdc, hbmp); > + ok(old_hbmp != NULL, "error=%d\n", GetLastError()); > + > + HeapFree(GetProcessHeap(), 0, bmi); > + > + /* Draw an 'O' offset to see if antialiasing was used. > + * Antialiasing should be used when we specify an antialiasing > + * font and use a RGB bitmap. */ > + clear_bmp(hdc, 20, 20, RGB(0, 0, 0)); > + ok(ExtTextOut(hdc, 0, -4, 0, NULL, "O", 1, NULL), "ExtTextOut > failed.\n"); > + pixel = check_bmp_colors(hdc, colours, 2, 20, 20); > + ok(pixel != 0, "Antialiasing was not used.\n"); > + > + /* Free the bitmap */ > + SelectObject(hdc, old_hbmp); > + DeleteObject(hbmp); > + > + /* Free the rest of our memory */ > + SelectObject(hdc, old_hfont); > + DeleteObject(hfont); > + DeleteDC(hdc); > +} > + > START_TEST(font) > { > init(); > @@ -2449,6 +2611,7 @@ START_TEST(font) > test_GetFontUnicodeRanges(); > test_nonexistent_font(); > test_orientation(); > + test_antialias(); > > /* On Windows Arial has a lot of default charset aliases such as Arial > Cyr, > * I'd like to avoid them in this test. >