CreateBrushIndirect should not return a stock brush.
This commit is contained in:
parent
9d8474138e
commit
9a013cc1cb
|
@ -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;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
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
|
||||
|
|
|
@ -0,0 +1,77 @@
|
|||
/*
|
||||
* 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();
|
||||
}
|
Loading…
Reference in New Issue