LOGBRUSH.lbHatch must be a ULONG_PTR since it can contain a handle.
diff --git a/dlls/gdi/brush.c b/dlls/gdi/brush.c
index 72bb929..76f06ad 100644
--- a/dlls/gdi/brush.c
+++ b/dlls/gdi/brush.c
@@ -119,14 +119,14 @@
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 @@
logbrush.lbStyle = BS_DIBPATTERN;
logbrush.lbColor = coloruse;
- logbrush.lbHatch = (LONG)hbitmap;
+ logbrush.lbHatch = (ULONG_PTR)hbitmap;
return CreateBrushIndirect( &logbrush );
}
@@ -284,7 +284,7 @@
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 ae4b81b..1828e5f 100644
--- a/dlls/gdi/enhmetafile.c
+++ b/dlls/gdi/enhmetafile.c
@@ -873,8 +873,11 @@
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 6d26265..8c51f63 100644
--- a/dlls/gdi/enhmfdrv/objects.c
+++ b/dlls/gdi/enhmfdrv/objects.c
@@ -155,7 +155,9 @@
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 3d19268..4fd07c8 100644
--- a/dlls/gdi/tests/metafile.c
+++ b/dlls/gdi/tests/metafile.c
@@ -412,8 +412,8 @@
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 @@
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 dd752c6..e29bed9 100644
--- a/include/wingdi.h
+++ b/include/wingdi.h
@@ -478,11 +478,18 @@
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 @@
} EMRBITBLT, *PEMRBITBLT;
typedef struct {
- EMR emr;
- DWORD ihBrush;
- LOGBRUSH lb;
+ EMR emr;
+ DWORD ihBrush;
+ LOGBRUSH32 lb;
} EMRCREATEBRUSHINDIRECT, *PEMRCREATEBRUSHINDIRECT;
typedef struct {