Dmitry Timoshkov : gdi: A better workaround for extended user style pens.

Alexandre Julliard julliard at wine.codeweavers.com
Thu Mar 9 06:29:09 CST 2006


Module: wine
Branch: refs/heads/master
Commit: 434a60ba1df0d8a124e9a09802a466d0492fd1d4
URL:    http://source.winehq.org/git/?p=wine.git;a=commit;h=434a60ba1df0d8a124e9a09802a466d0492fd1d4

Author: Dmitry Timoshkov <dmitry at codeweavers.com>
Date:   Thu Mar  9 15:12:43 2006 +0800

gdi: A better workaround for extended user style pens.

---

 dlls/gdi/enhmfdrv/objects.c |   23 ++++++++++++++---------
 dlls/gdi/mfdrv/objects.c    |   23 ++++++++++++++---------
 dlls/wineps/pen.c           |   23 ++++++++++++++---------
 dlls/x11drv/pen.c           |   23 ++++++++++++++---------
 4 files changed, 56 insertions(+), 36 deletions(-)

diff --git a/dlls/gdi/enhmfdrv/objects.c b/dlls/gdi/enhmfdrv/objects.c
index 9d8b14d..ad84301 100644
--- a/dlls/gdi/enhmfdrv/objects.c
+++ b/dlls/gdi/enhmfdrv/objects.c
@@ -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 --git a/dlls/gdi/mfdrv/objects.c b/dlls/gdi/mfdrv/objects.c
index e0859ac..a7bc229 100644
--- a/dlls/gdi/mfdrv/objects.c
+++ b/dlls/gdi/mfdrv/objects.c
@@ -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 --git a/dlls/wineps/pen.c b/dlls/wineps/pen.c
index 6944635..60e41ac 100644
--- a/dlls/wineps/pen.c
+++ b/dlls/wineps/pen.c
@@ -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 --git a/dlls/x11drv/pen.c b/dlls/x11drv/pen.c
index 26cffce..c0af04e 100644
--- a/dlls/x11drv/pen.c
+++ b/dlls/x11drv/pen.c
@@ -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-cvs mailing list