From f4bf9dee3ca7a09fee83d694f1835edbcc548b28 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Mon, 12 Sep 2005 11:19:56 +0000 Subject: [PATCH] LOGBRUSH.lbHatch must be a ULONG_PTR since it can contain a handle. --- dlls/gdi/brush.c | 10 +++++----- dlls/gdi/enhmetafile.c | 7 +++++-- dlls/gdi/enhmfdrv/objects.c | 4 +++- dlls/gdi/tests/metafile.c | 6 +++--- include/wingdi.h | 17 ++++++++++++----- 5 files changed, 28 insertions(+), 16 deletions(-) diff --git a/dlls/gdi/brush.c b/dlls/gdi/brush.c index 72bb929e319..76f06ad0762 100644 --- a/dlls/gdi/brush.c +++ b/dlls/gdi/brush.c @@ -119,14 +119,14 @@ HBRUSH WINAPI CreateBrushIndirect( const LOGBRUSH * brush ) ptr->logbrush.lbStyle = BS_PATTERN; /* fall through */ 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; break; case BS_DIBPATTERNPT: ptr->logbrush.lbStyle = BS_DIBPATTERN; - ptr->logbrush.lbHatch = (LONG)dib_copy( (BITMAPINFO *) ptr->logbrush.lbHatch, - ptr->logbrush.lbColor); + ptr->logbrush.lbHatch = (ULONG_PTR)dib_copy( (BITMAPINFO *) ptr->logbrush.lbHatch, + ptr->logbrush.lbColor); if (!ptr->logbrush.lbHatch) goto error; break; @@ -247,7 +247,7 @@ HBRUSH WINAPI CreateDIBPatternBrush( HGLOBAL hbitmap, UINT coloruse ) logbrush.lbStyle = BS_DIBPATTERN; logbrush.lbColor = coloruse; - logbrush.lbHatch = (LONG)hbitmap; + logbrush.lbHatch = (ULONG_PTR)hbitmap; return CreateBrushIndirect( &logbrush ); } @@ -284,7 +284,7 @@ HBRUSH WINAPI CreateDIBPatternBrushPt( const void* data, UINT coloruse ) logbrush.lbStyle = BS_DIBPATTERNPT; logbrush.lbColor = coloruse; - logbrush.lbHatch = (LONG) data; + logbrush.lbHatch = (ULONG_PTR)data; return CreateBrushIndirect( &logbrush ); } diff --git a/dlls/gdi/enhmetafile.c b/dlls/gdi/enhmetafile.c index ae4b81b4ab4..1828e5fa66d 100644 --- a/dlls/gdi/enhmetafile.c +++ b/dlls/gdi/enhmetafile.c @@ -873,8 +873,11 @@ BOOL WINAPI PlayEnhMetaFileRecord( case EMR_CREATEBRUSHINDIRECT: { PEMRCREATEBRUSHINDIRECT pBrush = (PEMRCREATEBRUSHINDIRECT) mr; - (handletable->objectHandle)[pBrush->ihBrush] = - CreateBrushIndirect(&pBrush->lb); + LOGBRUSH brush; + brush.lbStyle = pBrush->lb.lbStyle; + brush.lbColor = pBrush->lb.lbColor; + brush.lbHatch = pBrush->lb.lbHatch; + (handletable->objectHandle)[pBrush->ihBrush] = CreateBrushIndirect(&brush); break; } case EMR_EXTCREATEFONTINDIRECTW: diff --git a/dlls/gdi/enhmfdrv/objects.c b/dlls/gdi/enhmfdrv/objects.c index 6d2626577e9..8c51f63303f 100644 --- a/dlls/gdi/enhmfdrv/objects.c +++ b/dlls/gdi/enhmfdrv/objects.c @@ -155,7 +155,9 @@ DWORD EMFDRV_CreateBrushIndirect( PHYSDEV dev, HBRUSH hBrush ) emr.emr.iType = EMR_CREATEBRUSHINDIRECT; emr.emr.nSize = sizeof(emr); 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 )) index = 0; diff --git a/dlls/gdi/tests/metafile.c b/dlls/gdi/tests/metafile.c index 3d19268e942..4fd07c83a7f 100644 --- a/dlls/gdi/tests/metafile.c +++ b/dlls/gdi/tests/metafile.c @@ -412,8 +412,8 @@ static void test_mf_PatternBrush(void) orig_lb->lbStyle = BS_PATTERN; orig_lb->lbColor = RGB(0, 0, 0); - orig_lb->lbHatch = (INT) CreateBitmap (8, 8, 1, 1, SAMPLE_PATTERN_BRUSH); - ok((HBITMAP *)orig_lb->lbHatch != NULL, "CreateBitmap error %ld.\n", GetLastError()); + orig_lb->lbHatch = (ULONG_PTR)CreateBitmap (8, 8, 1, 1, SAMPLE_PATTERN_BRUSH); + ok((HBITMAP)orig_lb->lbHatch != NULL, "CreateBitmap error %ld.\n", GetLastError()); hBrush = CreateBrushIndirect (orig_lb); 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()); ret = DeleteObject(hBrush); 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", GetLastError()); HeapFree (GetProcessHeap(), 0, orig_lb); diff --git a/include/wingdi.h b/include/wingdi.h index dd752c6a05a..e29bed95c32 100644 --- a/include/wingdi.h +++ b/include/wingdi.h @@ -478,11 +478,18 @@ typedef struct typedef struct { - UINT lbStyle; + UINT lbStyle; COLORREF lbColor; - INT lbHatch; + ULONG_PTR lbHatch; } LOGBRUSH, *PLOGBRUSH, *LPLOGBRUSH; +typedef struct +{ + UINT lbStyle; + COLORREF lbColor; + ULONG lbHatch; +} LOGBRUSH32, *PLOGBRUSH32, *LPLOGBRUSH32; + typedef LOGBRUSH PATTERN, *PPATTERN, *LPPATTERN; @@ -2117,9 +2124,9 @@ typedef struct { } EMRBITBLT, *PEMRBITBLT; typedef struct { - EMR emr; - DWORD ihBrush; - LOGBRUSH lb; + EMR emr; + DWORD ihBrush; + LOGBRUSH32 lb; } EMRCREATEBRUSHINDIRECT, *PEMRCREATEBRUSHINDIRECT; typedef struct {