A better workaround for extended user style pens
Dmitry Timoshkov
dmitry at codeweavers.com
Thu Mar 9 01:12:43 CST 2006
Hello,
this patch is aimed to fix a regression reported in the bug #4724.
Changelog:
A better workaround for extended user style pens.
diff -up cvs/hq/wine/dlls/gdi/enhmfdrv/objects.c wine/dlls/gdi/enhmfdrv/objects.c
--- cvs/hq/wine/dlls/gdi/enhmfdrv/objects.c 2006-02-18 09:39:48.000000000 +0800
+++ wine/dlls/gdi/enhmfdrv/objects.c 2006-03-09 13:36:44.000000000 +0800
@@ -401,16 +401,21 @@ static HPEN EMFDRV_CreatePenIndirect(PHY
if (!GetObjectW( hPen, sizeof(emr.lopn), &emr.lopn ))
{
/* must be an extended pen */
- EXTLOGPEN elp;
- if (!GetObjectW( hPen, sizeof(elp), &elp ))
- {
- FIXME("extended pen %p not supported\n", hPen);
- return 0;
- }
- emr.lopn.lopnStyle = elp.elpPenStyle;
- emr.lopn.lopnWidth.x = elp.elpWidth;
+ EXTLOGPEN *elp;
+ INT size = GetObjectW( hPen, 0, NULL );
+
+ if (!size) return 0;
+
+ elp = HeapAlloc( GetProcessHeap(), 0, size );
+
+ GetObjectW( hPen, size, elp );
+ /* FIXME: add support for user style pens */
+ emr.lopn.lopnStyle = elp->elpPenStyle;
+ emr.lopn.lopnWidth.x = elp->elpWidth;
emr.lopn.lopnWidth.y = 0;
- emr.lopn.lopnColor = elp.elpColor;
+ emr.lopn.lopnColor = elp->elpColor;
+
+ HeapFree( GetProcessHeap(), 0, elp );
}
emr.emr.iType = EMR_CREATEPEN;
diff -up cvs/hq/wine/dlls/gdi/mfdrv/objects.c wine/dlls/gdi/mfdrv/objects.c
--- cvs/hq/wine/dlls/gdi/mfdrv/objects.c 2006-02-18 09:39:48.000000000 +0800
+++ wine/dlls/gdi/mfdrv/objects.c 2006-03-09 13:36:07.000000000 +0800
@@ -406,16 +406,21 @@ HPEN MFDRV_SelectPen( PHYSDEV dev, HPEN
if (!GetObject16( HPEN_16(hpen), sizeof(logpen), &logpen ))
{
/* must be an extended pen */
- EXTLOGPEN elp;
- if (!GetObjectW( hpen, sizeof(elp), &elp ))
- {
- FIXME("extended pen %p not supported\n", hpen);
- return 0;
- }
- logpen.lopnStyle = elp.elpPenStyle;
- logpen.lopnWidth.x = elp.elpWidth;
+ EXTLOGPEN *elp;
+ INT size = GetObjectW( hpen, 0, NULL );
+
+ if (!size) return 0;
+
+ elp = HeapAlloc( GetProcessHeap(), 0, size );
+
+ GetObjectW( hpen, size, elp );
+ /* FIXME: add support for user style pens */
+ logpen.lopnStyle = elp->elpPenStyle;
+ logpen.lopnWidth.x = elp->elpWidth;
logpen.lopnWidth.y = 0;
- logpen.lopnColor = elp.elpColor;
+ logpen.lopnColor = elp->elpColor;
+
+ HeapFree( GetProcessHeap(), 0, elp );
}
index = MFDRV_CreatePenIndirect( dev, hpen, &logpen );
diff -up cvs/hq/wine/dlls/wineps/pen.c wine/dlls/wineps/pen.c
--- cvs/hq/wine/dlls/wineps/pen.c 2006-02-18 09:40:54.000000000 +0800
+++ wine/dlls/wineps/pen.c 2006-03-09 13:33:10.000000000 +0800
@@ -44,16 +44,21 @@ HPEN PSDRV_SelectPen( PSDRV_PDEVICE *phy
if (!GetObjectW( hpen, sizeof(logpen), &logpen ))
{
/* must be an extended pen */
- EXTLOGPEN elp;
- if (!GetObjectW( hpen, sizeof(elp), &elp ))
- {
- FIXME("extended pen %p not supported\n", hpen);
- return 0;
- }
- logpen.lopnStyle = elp.elpPenStyle;
- logpen.lopnWidth.x = elp.elpWidth;
+ EXTLOGPEN *elp;
+ INT size = GetObjectW( hpen, 0, NULL );
+
+ if (!size) return 0;
+
+ elp = HeapAlloc( GetProcessHeap(), 0, size );
+
+ GetObjectW( hpen, size, elp );
+ /* FIXME: add support for user style pens */
+ logpen.lopnStyle = elp->elpPenStyle;
+ logpen.lopnWidth.x = elp->elpWidth;
logpen.lopnWidth.y = 0;
- logpen.lopnColor = elp.elpColor;
+ logpen.lopnColor = elp->elpColor;
+
+ HeapFree( GetProcessHeap(), 0, elp );
}
TRACE("hpen = %p colour = %08lx\n", hpen, logpen.lopnColor);
diff -up cvs/hq/wine/dlls/x11drv/pen.c wine/dlls/x11drv/pen.c
--- cvs/hq/wine/dlls/x11drv/pen.c 2006-02-18 09:40:59.000000000 +0800
+++ wine/dlls/x11drv/pen.c 2006-03-09 13:31:40.000000000 +0800
@@ -41,16 +41,21 @@ HPEN X11DRV_SelectPen( X11DRV_PDEVICE *p
if (!GetObjectW( hpen, sizeof(logpen), &logpen ))
{
/* must be an extended pen */
- EXTLOGPEN elp;
- if (!GetObjectW( hpen, sizeof(elp), &elp ))
- {
- FIXME("extended pen %p not supported\n", hpen);
- return 0;
- }
- logpen.lopnStyle = elp.elpPenStyle;
- logpen.lopnWidth.x = elp.elpWidth;
+ EXTLOGPEN *elp;
+ INT size = GetObjectW( hpen, 0, NULL );
+
+ if (!size) return 0;
+
+ elp = HeapAlloc( GetProcessHeap(), 0, size );
+
+ GetObjectW( hpen, size, elp );
+ /* FIXME: add support for user style pens */
+ logpen.lopnStyle = elp->elpPenStyle;
+ logpen.lopnWidth.x = elp->elpWidth;
logpen.lopnWidth.y = 0;
- logpen.lopnColor = elp.elpColor;
+ logpen.lopnColor = elp->elpColor;
+
+ HeapFree( GetProcessHeap(), 0, elp );
}
physDev->pen.style = logpen.lopnStyle & PS_STYLE_MASK;
More information about the wine-patches
mailing list