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