Module: wine Branch: refs/heads/master Commit: 434a60ba1df0d8a124e9a09802a466d0492fd1d4 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=434a60ba1df0d8a124e9a098...
Author: Dmitry Timoshkov dmitry@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;