Commit 9a013cc1 authored by Kevin Koltzau's avatar Kevin Koltzau Committed by Alexandre Julliard

CreateBrushIndirect should not return a stock brush.

parent 9d847413
......@@ -101,41 +101,12 @@ static HGLOBAL16 dib_copy(BITMAPINFO *info, UINT coloruse)
* - Windows 95 and earlier cannot create brushes from bitmaps or DIBs larger
* than 8x8 pixels. If a larger bitmap is given, only a portion of the bitmap
* is used.
* - If the brush to be created matches a stock brush, a stock brush will be
* returned. This behaviour is undocumented.
*/
HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush )
{
static const DWORD stockMap[] = { /* Map of RGB colors of stock brushes */
RGB(255,255,255), WHITE_BRUSH,
RGB(192,192,192), LTGRAY_BRUSH,
RGB(128,128,128), GRAY_BRUSH,
RGB(0,0,0), BLACK_BRUSH
};
BRUSHOBJ * ptr;
HBRUSH hbrush;
if (brush->lbStyle == BS_SOLID)
{
size_t i;
/* If a solid brush is created in a color matching one of the
* stock brushes, native returns the stock object (GDI heap
* optimisation). Some apps rely on this as they otherwise
* would leak their brushes.
*/
for (i = 0; i < (sizeof(stockMap)/sizeof(stockMap[0])); i += 2)
{
if (brush->lbColor == stockMap[i])
{
HBRUSH hBr = GetStockObject(stockMap[i + 1]);
if (hBr)
return hBr; /* Return stock brush */
break; /* Being called to create a stock brush, fall through */
}
}
}
if (!(ptr = GDI_AllocObject( sizeof(BRUSHOBJ), BRUSH_MAGIC,
(HGDIOBJ *)&hbrush, &brush_funcs ))) return 0;
ptr->logbrush.lbStyle = brush->lbStyle;
......
Makefile
bitmap.ok
brush.ok
gdiobj.ok
generated.ok
metafile.ok
......
......@@ -7,6 +7,7 @@ IMPORTS = user32 gdi32
CTESTS = \
bitmap.c \
brush.c \
gdiobj.c \
generated.c \
metafile.c
......
/*
* Unit test suite for brushes
*
* Copyright 2004 Kevin Koltzau
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <stdarg.h>
#include "windef.h"
#include "winbase.h"
#include "wingdi.h"
#include "wine/test.h"
typedef struct _STOCK_BRUSH {
COLORREF color;
int stockobj;
char *name;
} STOCK_BRUSH;
static void test_solidbrush()
{
static const STOCK_BRUSH stock[] = {
{RGB(255,255,255), WHITE_BRUSH, "white"},
{RGB(192,192,192), LTGRAY_BRUSH, "ltgray"},
{RGB(128,128,128), GRAY_BRUSH, "gray"},
{RGB(0,0,0), BLACK_BRUSH, "black"},
{RGB(0,0,255), -1, "blue"}
};
HBRUSH solidBrush;
HBRUSH stockBrush;
LOGBRUSH br;
size_t i;
for(i=0; i<sizeof(stock)/sizeof(stock[0]); i++) {
solidBrush = CreateSolidBrush(stock[i].color);
if(stock[i].stockobj != -1) {
stockBrush = (HBRUSH)GetStockObject(stock[i].stockobj);
ok(stockBrush!=solidBrush, "Stock %s brush equals solid %s brush\n", stock[i].name, stock[i].name);
}
else
stockBrush = NULL;
memset(&br, sizeof(br), 0);
ok(GetObject(solidBrush, sizeof(br), &br)!=0, "GetObject on solid %s brush failed, error=%ld\n", stock[i].name, GetLastError());
ok(br.lbStyle==BS_SOLID, "%s brush has wrong style, got %d expected %d\n", stock[i].name, br.lbStyle, BS_SOLID);
ok(br.lbColor==stock[i].color, "%s brush has wrong color, got 0x%08lx expected 0x%08lx\n", stock[i].name, br.lbColor, stock[i].color);
if(stockBrush) {
/* Sanity check, make sure the colors being compared do in fact have a stock brush */
ok(GetObject(stockBrush, sizeof(br), &br)!=0, "GetObject on stock %s brush failed, error=%ld\n", stock[i].name, GetLastError());
ok(br.lbColor==stock[i].color, "stock %s brush unexpected color, got 0x%08lx expected 0x%08lx\n", stock[i].name, br.lbColor, stock[i].color);
}
DeleteObject(solidBrush);
ok(GetObject(solidBrush, sizeof(br), &br)==0, "GetObject succeeded on a deleted %s brush\n", stock[i].name);
}
}
START_TEST(brush)
{
test_solidbrush();
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment