Module: wine Branch: master Commit: f155db574f3c086a03f6876e016075b97064dcf6 URL: http://source.winehq.org/git/wine.git/?a=commit;h=f155db574f3c086a03f6876e01...
Author: Alexandre Julliard julliard@winehq.org Date: Wed Dec 28 17:41:15 2011 +0100
gdi32: Add support for 1-pixel wide PS_USERSTYLE pens.
---
dlls/gdi32/dibdrv/objects.c | 28 +++++++++++++++++++++++++++- 1 files changed, 27 insertions(+), 1 deletions(-)
diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c index ab0dd87..46f3092 100644 --- a/dlls/gdi32/dibdrv/objects.c +++ b/dlls/gdi32/dibdrv/objects.c @@ -1253,6 +1253,24 @@ static const dash_pattern dash_patterns_geometric[4] = {6, {3, 1, 1, 1, 1, 1}, 8} /* PS_DASHDOTDOT */ };
+static inline void set_dash_pattern( dash_pattern *pattern, DWORD count, DWORD *dashes ) +{ + DWORD i; + + pattern->count = count; + pattern->total_len = 0; + memcpy( pattern->dashes, dashes, count * sizeof(DWORD) ); + for (i = 0; i < count; i++) pattern->total_len += dashes[i]; + if (pattern->count % 2) pattern->total_len *= 2; +} + +static inline void scale_dash_pattern( dash_pattern *pattern, DWORD scale ) +{ + DWORD i; + for (i = 0; i < pattern->count; i++) pattern->dashes[i] *= scale; + pattern->total_len *= scale; +} + static inline int get_pen_device_width( dibdrv_physdev *pdev, int width ) { POINT pts[2]; @@ -1303,7 +1321,7 @@ HPEN dibdrv_SelectPen( PHYSDEV dev, HPEN hpen ) logpen.lopnColor = GetDCPenColor( dev->hdc );
pdev->pen_colorref = logpen.lopnColor; - memset( &pdev->pen_pattern, 0, sizeof(pdev->pen_pattern) ); + set_dash_pattern( &pdev->pen_pattern, 0, NULL );
pdev->defer |= DEFER_PEN;
@@ -1351,6 +1369,14 @@ HPEN dibdrv_SelectPen( PHYSDEV dev, HPEN hpen ) pdev->defer &= ~DEFER_PEN; break;
+ case PS_USERSTYLE: + if (pdev->pen_width > 1) break; /* not supported yet */ + pdev->pen_lines = dashed_pen_lines; + set_dash_pattern( &pdev->pen_pattern, elp->elpNumEntries, elp->elpStyleEntry ); + if (!(logpen.lopnStyle & PS_GEOMETRIC)) scale_dash_pattern( &pdev->pen_pattern, 3 ); + pdev->defer &= ~DEFER_PEN; + break; + default: break; }