Alexandre Julliard : wineps: Add support for PS_USERSTYLE pens.
Alexandre Julliard
julliard at winehq.org
Fri Oct 21 11:02:01 CDT 2011
Module: wine
Branch: master
Commit: f1faeb0f28916e5620482af099b8e92466d63ba8
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f1faeb0f28916e5620482af099b8e92466d63ba8
Author: Alexandre Julliard <julliard at winehq.org>
Date: Fri Oct 21 16:38:39 2011 +0200
wineps: Add support for PS_USERSTYLE pens.
---
dlls/wineps.drv/pen.c | 45 ++++++++++++++++++++++++++++-----------------
dlls/wineps.drv/ps.c | 16 +++++++++-------
dlls/wineps.drv/psdrv.h | 5 ++++-
3 files changed, 41 insertions(+), 25 deletions(-)
diff --git a/dlls/wineps.drv/pen.c b/dlls/wineps.drv/pen.c
index 55379db..422b049 100644
--- a/dlls/wineps.drv/pen.c
+++ b/dlls/wineps.drv/pen.c
@@ -28,11 +28,11 @@
WINE_DEFAULT_DEBUG_CHANNEL(psdrv);
-static const char PEN_dash[] = "50 30"; /* ----- ----- ----- */
-static const char PEN_dot[] = "20"; /* -- -- -- -- -- -- */
-static const char PEN_dashdot[] = "40 30 20 30"; /* ---- -- ---- -- */
-static const char PEN_dashdotdot[] = "40 20 20 20 20 20"; /* ---- -- -- ---- */
-static const char PEN_alternate[] = "1";
+static const DWORD PEN_dash[] = { 50, 30 }; /* ----- ----- ----- */
+static const DWORD PEN_dot[] = { 20 }; /* -- -- -- -- -- -- */
+static const DWORD PEN_dashdot[] = { 40, 30, 20, 30 }; /* ---- -- ---- -- */
+static const DWORD PEN_dashdotdot[] = { 40, 20, 20, 20, 20, 20 }; /* ---- -- -- ---- */
+static const DWORD PEN_alternate[] = { 1 };
/***********************************************************************
* SelectPen (WINEPS.@)
@@ -41,11 +41,11 @@ HPEN PSDRV_SelectPen( PHYSDEV dev, HPEN hpen )
{
PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
LOGPEN logpen;
+ EXTLOGPEN *elp = NULL;
if (!GetObjectW( hpen, sizeof(logpen), &logpen ))
{
/* must be an extended pen */
- EXTLOGPEN *elp;
INT size = GetObjectW( hpen, 0, NULL );
if (!size) return 0;
@@ -58,8 +58,6 @@ HPEN PSDRV_SelectPen( PHYSDEV dev, HPEN hpen )
logpen.lopnWidth.x = elp->elpWidth;
logpen.lopnWidth.y = 0;
logpen.lopnColor = elp->elpColor;
-
- HeapFree( GetProcessHeap(), 0, elp );
}
TRACE("hpen = %p colour = %08x\n", hpen, logpen.lopnColor);
@@ -94,34 +92,47 @@ HPEN PSDRV_SelectPen( PHYSDEV dev, HPEN hpen )
switch(physDev->pen.style) {
case PS_DASH:
- physDev->pen.dash = PEN_dash;
+ memcpy( physDev->pen.dash, PEN_dash, sizeof(PEN_dash) );
+ physDev->pen.dash_len = sizeof(PEN_dash) / sizeof(DWORD);
break;
case PS_DOT:
- physDev->pen.dash = PEN_dot;
+ memcpy( physDev->pen.dash, PEN_dot, sizeof(PEN_dot) );
+ physDev->pen.dash_len = sizeof(PEN_dot) / sizeof(DWORD);
break;
case PS_DASHDOT:
- physDev->pen.dash = PEN_dashdot;
+ memcpy( physDev->pen.dash, PEN_dashdot, sizeof(PEN_dashdot) );
+ physDev->pen.dash_len = sizeof(PEN_dashdot) / sizeof(DWORD);
break;
case PS_DASHDOTDOT:
- physDev->pen.dash = PEN_dashdotdot;
+ memcpy( physDev->pen.dash, PEN_dashdotdot, sizeof(PEN_dashdotdot) );
+ physDev->pen.dash_len = sizeof(PEN_dashdotdot) / sizeof(DWORD);
break;
case PS_ALTERNATE:
- physDev->pen.dash = PEN_alternate;
+ memcpy( physDev->pen.dash, PEN_alternate, sizeof(PEN_alternate) );
+ physDev->pen.dash_len = sizeof(PEN_alternate) / sizeof(DWORD);
+ break;
+
+ case PS_USERSTYLE:
+ physDev->pen.dash_len = min( elp->elpNumEntries, MAX_DASHLEN );
+ memcpy( physDev->pen.dash, elp->elpStyleEntry, physDev->pen.dash_len * sizeof(DWORD) );
break;
default:
- physDev->pen.dash = NULL;
+ physDev->pen.dash_len = 0;
}
- if ((physDev->pen.width > 1) && (physDev->pen.dash != NULL)) {
- physDev->pen.style = PS_SOLID;
- physDev->pen.dash = NULL;
+ if ((physDev->pen.width > 1) && physDev->pen.dash_len &&
+ physDev->pen.style != PS_USERSTYLE && physDev->pen.style != PS_ALTERNATE)
+ {
+ physDev->pen.style = PS_SOLID;
+ physDev->pen.dash_len = 0;
}
+ HeapFree( GetProcessHeap(), 0, elp );
physDev->pen.set = FALSE;
return hpen;
}
diff --git a/dlls/wineps.drv/ps.c b/dlls/wineps.drv/ps.c
index 09b02ef..7b8a0bf 100644
--- a/dlls/wineps.drv/ps.c
+++ b/dlls/wineps.drv/ps.c
@@ -125,9 +125,6 @@ static const char pssetfont[] = /* fontname, xx_scale, xy_scale, yx_scale, yy_sc
static const char pssetline[] = /* width, join, endcap */
"%d setlinewidth %u setlinejoin %u setlinecap\n";
-static const char pssetdash[] = /* dash, offset */
-"[%s] %d setdash\n";
-
static const char pssetgray[] = /* gray */
"%.2f setgray\n";
@@ -556,16 +553,21 @@ BOOL PSDRV_WriteSetPen(PHYSDEV dev)
{
PSDRV_PDEVICE *physDev = get_psdrv_dev( dev );
char buf[256];
+ DWORD i, pos;
sprintf(buf, pssetline, physDev->pen.width, physDev->pen.join, physDev->pen.endcap);
PSDRV_WriteSpool(dev, buf, strlen(buf));
- if(physDev->pen.dash) {
- sprintf(buf, pssetdash, physDev->pen.dash, 0);
+ if (physDev->pen.dash_len)
+ {
+ for (i = pos = 0; i < physDev->pen.dash_len; i++)
+ pos += sprintf( buf + pos, " %u", physDev->pen.dash[i] );
+ buf[0] = '[';
+ sprintf(buf + pos, "] %u setdash\n", 0);
}
else
- sprintf(buf, pssetdash, "", 0);
-
+ sprintf(buf, "[] %u setdash\n", 0);
+
PSDRV_WriteSpool(dev, buf, strlen(buf));
return TRUE;
diff --git a/dlls/wineps.drv/psdrv.h b/dlls/wineps.drv/psdrv.h
index adea39f..2ac748b 100644
--- a/dlls/wineps.drv/psdrv.h
+++ b/dlls/wineps.drv/psdrv.h
@@ -329,12 +329,15 @@ typedef struct {
BOOL set;
} PSBRUSH;
+#define MAX_DASHLEN 16
+
typedef struct {
INT style;
INT width;
BYTE join;
BYTE endcap;
- const char* dash;
+ DWORD dash[MAX_DASHLEN];
+ DWORD dash_len;
PSCOLOR color;
BOOL set;
} PSPEN;
More information about the wine-cvs
mailing list