Huw Davies : gdi32: Add support for patterned pens.
Alexandre Julliard
julliard at winehq.org
Fri May 6 13:44:06 CDT 2011
Module: wine
Branch: master
Commit: 54397f1552cfc76de5b1ae9cda0e2328a0de791c
URL: http://source.winehq.org/git/wine.git/?a=commit;h=54397f1552cfc76de5b1ae9cda0e2328a0de791c
Author: Huw Davies <huw at codeweavers.com>
Date: Fri May 6 11:35:26 2011 +0100
gdi32: Add support for patterned pens.
---
dlls/gdi32/dibdrv/objects.c | 31 ++++++++++++++++++++++++++++++-
dlls/gdi32/gdi_private.h | 8 ++++++++
2 files changed, 38 insertions(+), 1 deletions(-)
diff --git a/dlls/gdi32/dibdrv/objects.c b/dlls/gdi32/dibdrv/objects.c
index 50b2996..25aad8e 100644
--- a/dlls/gdi32/dibdrv/objects.c
+++ b/dlls/gdi32/dibdrv/objects.c
@@ -544,6 +544,19 @@ static BOOL solid_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end)
return TRUE;
}
+static BOOL dashed_pen_line(dibdrv_physdev *pdev, POINT *start, POINT *end)
+{
+ return FALSE;
+}
+
+static const dash_pattern dash_patterns[4] =
+{
+ {2, {18, 6}, 24}, /* PS_DASH */
+ {2, {3, 3}, 6}, /* PS_DOT */
+ {4, {9, 6, 3, 6}, 24}, /* PS_DASHDOT */
+ {6, {9, 3, 3, 3, 3, 3}, 24} /* PS_DASHDOTDOT */
+};
+
/***********************************************************************
* dibdrv_SelectPen
*/
@@ -552,6 +565,7 @@ HPEN CDECL dibdrv_SelectPen( PHYSDEV dev, HPEN hpen )
PHYSDEV next = GET_NEXT_PHYSDEV( dev, pSelectPen );
dibdrv_physdev *pdev = get_dibdrv_pdev(dev);
LOGPEN logpen;
+ DWORD style;
TRACE("(%p, %p)\n", dev, hpen);
@@ -583,14 +597,29 @@ HPEN CDECL dibdrv_SelectPen( PHYSDEV dev, HPEN hpen )
pdev->defer |= DEFER_PEN;
- switch(logpen.lopnStyle & PS_STYLE_MASK)
+ style = logpen.lopnStyle & PS_STYLE_MASK;
+
+ switch(style)
{
case PS_SOLID:
if(logpen.lopnStyle & PS_GEOMETRIC) break;
if(logpen.lopnWidth.x > 1) break;
pdev->pen_line = solid_pen_line;
+ pdev->pen_pattern.count = 0;
pdev->defer &= ~DEFER_PEN;
break;
+
+ case PS_DASH:
+ case PS_DOT:
+ case PS_DASHDOT:
+ case PS_DASHDOTDOT:
+ if(logpen.lopnStyle & PS_GEOMETRIC) break;
+ if(logpen.lopnWidth.x > 1) break;
+ pdev->pen_line = dashed_pen_line;
+ pdev->pen_pattern = dash_patterns[style - PS_DASH];
+ pdev->defer &= ~DEFER_PEN;
+ break;
+
default:
break;
}
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index 695eff0..0a90fb1 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -92,6 +92,13 @@ typedef struct
const struct primitive_funcs *funcs;
} dib_info;
+typedef struct
+{
+ DWORD count;
+ DWORD dashes[16]; /* 16 is the maximium number for a PS_USERSTYLE pen */
+ DWORD total_len; /* total length of the dashes, should be multiplied by 2 if there are an odd number of dash lengths */
+} dash_pattern;
+
typedef struct dibdrv_physdev
{
struct gdi_physdev dev;
@@ -103,6 +110,7 @@ typedef struct dibdrv_physdev
/* pen */
DWORD pen_color, pen_and, pen_xor;
BOOL (* pen_line)(struct dibdrv_physdev *pdev, POINT *start, POINT *end);
+ dash_pattern pen_pattern;
/* brush */
UINT brush_style;
More information about the wine-cvs
mailing list