LOGBRUSH.lbHatch must be a ULONG_PTR since it can contain a handle.

This commit is contained in:
Alexandre Julliard 2005-09-12 11:19:56 +00:00
parent 92a5149540
commit f4bf9dee3c
5 changed files with 28 additions and 16 deletions

View file

@ -119,14 +119,14 @@ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush )
ptr->logbrush.lbStyle = BS_PATTERN; ptr->logbrush.lbStyle = BS_PATTERN;
/* fall through */ /* fall through */
case BS_PATTERN: case BS_PATTERN:
ptr->logbrush.lbHatch = (LONG)BITMAP_CopyBitmap( (HBITMAP) ptr->logbrush.lbHatch ); ptr->logbrush.lbHatch = (ULONG_PTR)BITMAP_CopyBitmap( (HBITMAP) ptr->logbrush.lbHatch );
if (!ptr->logbrush.lbHatch) goto error; if (!ptr->logbrush.lbHatch) goto error;
break; break;
case BS_DIBPATTERNPT: case BS_DIBPATTERNPT:
ptr->logbrush.lbStyle = BS_DIBPATTERN; ptr->logbrush.lbStyle = BS_DIBPATTERN;
ptr->logbrush.lbHatch = (LONG)dib_copy( (BITMAPINFO *) ptr->logbrush.lbHatch, ptr->logbrush.lbHatch = (ULONG_PTR)dib_copy( (BITMAPINFO *) ptr->logbrush.lbHatch,
ptr->logbrush.lbColor); ptr->logbrush.lbColor);
if (!ptr->logbrush.lbHatch) goto error; if (!ptr->logbrush.lbHatch) goto error;
break; break;
@ -247,7 +247,7 @@ HBRUSH WINAPI CreateDIBPatternBrush( HGLOBAL hbitmap, UINT coloruse )
logbrush.lbStyle = BS_DIBPATTERN; logbrush.lbStyle = BS_DIBPATTERN;
logbrush.lbColor = coloruse; logbrush.lbColor = coloruse;
logbrush.lbHatch = (LONG)hbitmap; logbrush.lbHatch = (ULONG_PTR)hbitmap;
return CreateBrushIndirect( &logbrush ); return CreateBrushIndirect( &logbrush );
} }
@ -284,7 +284,7 @@ HBRUSH WINAPI CreateDIBPatternBrushPt( const void* data, UINT coloruse )
logbrush.lbStyle = BS_DIBPATTERNPT; logbrush.lbStyle = BS_DIBPATTERNPT;
logbrush.lbColor = coloruse; logbrush.lbColor = coloruse;
logbrush.lbHatch = (LONG) data; logbrush.lbHatch = (ULONG_PTR)data;
return CreateBrushIndirect( &logbrush ); return CreateBrushIndirect( &logbrush );
} }

View file

@ -873,8 +873,11 @@ BOOL WINAPI PlayEnhMetaFileRecord(
case EMR_CREATEBRUSHINDIRECT: case EMR_CREATEBRUSHINDIRECT:
{ {
PEMRCREATEBRUSHINDIRECT pBrush = (PEMRCREATEBRUSHINDIRECT) mr; PEMRCREATEBRUSHINDIRECT pBrush = (PEMRCREATEBRUSHINDIRECT) mr;
(handletable->objectHandle)[pBrush->ihBrush] = LOGBRUSH brush;
CreateBrushIndirect(&pBrush->lb); brush.lbStyle = pBrush->lb.lbStyle;
brush.lbColor = pBrush->lb.lbColor;
brush.lbHatch = pBrush->lb.lbHatch;
(handletable->objectHandle)[pBrush->ihBrush] = CreateBrushIndirect(&brush);
break; break;
} }
case EMR_EXTCREATEFONTINDIRECTW: case EMR_EXTCREATEFONTINDIRECTW:

View file

@ -155,7 +155,9 @@ DWORD EMFDRV_CreateBrushIndirect( PHYSDEV dev, HBRUSH hBrush )
emr.emr.iType = EMR_CREATEBRUSHINDIRECT; emr.emr.iType = EMR_CREATEBRUSHINDIRECT;
emr.emr.nSize = sizeof(emr); emr.emr.nSize = sizeof(emr);
emr.ihBrush = index = EMFDRV_AddHandle( dev, hBrush ); emr.ihBrush = index = EMFDRV_AddHandle( dev, hBrush );
emr.lb = logbrush; emr.lb.lbStyle = logbrush.lbStyle;
emr.lb.lbColor = logbrush.lbColor;
emr.lb.lbHatch = logbrush.lbHatch;
if(!EMFDRV_WriteRecord( dev, &emr.emr )) if(!EMFDRV_WriteRecord( dev, &emr.emr ))
index = 0; index = 0;

View file

@ -412,8 +412,8 @@ static void test_mf_PatternBrush(void)
orig_lb->lbStyle = BS_PATTERN; orig_lb->lbStyle = BS_PATTERN;
orig_lb->lbColor = RGB(0, 0, 0); orig_lb->lbColor = RGB(0, 0, 0);
orig_lb->lbHatch = (INT) CreateBitmap (8, 8, 1, 1, SAMPLE_PATTERN_BRUSH); orig_lb->lbHatch = (ULONG_PTR)CreateBitmap (8, 8, 1, 1, SAMPLE_PATTERN_BRUSH);
ok((HBITMAP *)orig_lb->lbHatch != NULL, "CreateBitmap error %ld.\n", GetLastError()); ok((HBITMAP)orig_lb->lbHatch != NULL, "CreateBitmap error %ld.\n", GetLastError());
hBrush = CreateBrushIndirect (orig_lb); hBrush = CreateBrushIndirect (orig_lb);
ok(hBrush != 0, "CreateBrushIndirect error %ld\n", GetLastError()); ok(hBrush != 0, "CreateBrushIndirect error %ld\n", GetLastError());
@ -437,7 +437,7 @@ static void test_mf_PatternBrush(void)
ok( ret, "DeleteMetaFile error %ld\n", GetLastError()); ok( ret, "DeleteMetaFile error %ld\n", GetLastError());
ret = DeleteObject(hBrush); ret = DeleteObject(hBrush);
ok( ret, "DeleteObject(HBRUSH) error %ld\n", GetLastError()); ok( ret, "DeleteObject(HBRUSH) error %ld\n", GetLastError());
ret = DeleteObject((HBITMAP *)orig_lb->lbHatch); ret = DeleteObject((HBITMAP)orig_lb->lbHatch);
ok( ret, "DeleteObject(HBITMAP) error %ld\n", ok( ret, "DeleteObject(HBITMAP) error %ld\n",
GetLastError()); GetLastError());
HeapFree (GetProcessHeap(), 0, orig_lb); HeapFree (GetProcessHeap(), 0, orig_lb);

View file

@ -478,11 +478,18 @@ typedef struct
typedef struct typedef struct
{ {
UINT lbStyle; UINT lbStyle;
COLORREF lbColor; COLORREF lbColor;
INT lbHatch; ULONG_PTR lbHatch;
} LOGBRUSH, *PLOGBRUSH, *LPLOGBRUSH; } LOGBRUSH, *PLOGBRUSH, *LPLOGBRUSH;
typedef struct
{
UINT lbStyle;
COLORREF lbColor;
ULONG lbHatch;
} LOGBRUSH32, *PLOGBRUSH32, *LPLOGBRUSH32;
typedef LOGBRUSH PATTERN, *PPATTERN, *LPPATTERN; typedef LOGBRUSH PATTERN, *PPATTERN, *LPPATTERN;
@ -2117,9 +2124,9 @@ typedef struct {
} EMRBITBLT, *PEMRBITBLT; } EMRBITBLT, *PEMRBITBLT;
typedef struct { typedef struct {
EMR emr; EMR emr;
DWORD ihBrush; DWORD ihBrush;
LOGBRUSH lb; LOGBRUSH32 lb;
} EMRCREATEBRUSHINDIRECT, *PEMRCREATEBRUSHINDIRECT; } EMRCREATEBRUSHINDIRECT, *PEMRCREATEBRUSHINDIRECT;
typedef struct { typedef struct {