implement PS_USERSTYLE handling, tested with Dia(win32)

James McKenzie jjmckenzie51 at earthlink.net
Sun Apr 5 16:54:49 CDT 2009


Hans Breuer wrote:
> From b89af7d06fc8cbf5210c61fd58ed62caeddad968 Mon Sep 17 00:00:00 2001
> From: Hans Breuer <hans at breuer.org>
> Date: Sun, 29 Mar 2009 18:27:29 +0200
> Subject: implement PS_USERSTYLE handling, tested with Dia(win32) - see
>  http://hans.breuer.org/dia/dia-wine.htm
>
> ---
>  dlls/winex11.drv/pen.c |   31 +++++++++++++++++++++++++++----
>  1 files changed, 27 insertions(+), 4 deletions(-)
>
> diff --git a/dlls/winex11.drv/pen.c b/dlls/winex11.drv/pen.c
> index 49fe74c..039798e 100644
> --- a/dlls/winex11.drv/pen.c
> +++ b/dlls/winex11.drv/pen.c
> @@ -54,12 +54,33 @@ HPEN CDECL X11DRV_SelectPen( X11DRV_PDEVICE
> *physDev, HPEN hpen )
>          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;
> -
> +        /* support for user style pens */
> +        if (MAX_DASHLEN < elp->elpNumEntries)
> +        {
> +            FIXME("PS_USERSTYLE: len(dashes)>MAX_DASHLEN %d,%d\n",
> elp->elpNumEntries, MAX_DASHLEN);
> +            physDev->pen.dash_len = 0;
> +        }
> +        else
> +        {
> +            BOOL overflow = FALSE;
> +            physDev->pen.dash_len = elp->elpNumEntries;
> +            for (i = 0; i < elp->elpNumEntries; ++i)
> +            {
> +                if (elp->elpStyleEntry[i] > 255)
> +                {
> +                    overflow = TRUE; /* can't fit the type */
> +                    physDev->pen.dashes[i] = 255;
> +                }
> +                else
> +                    physDev->pen.dashes[i] =
> (char)elp->elpStyleEntry[i];
> +            }
> +            if (overflow)
> +                FIXME("PS_USERSTYLE: dashes clipped (type overflow)\n");
> +        }
>          HeapFree( GetProcessHeap(), 0, elp );
>      }
>      else
> @@ -108,14 +129,16 @@ HPEN CDECL X11DRV_SelectPen( X11DRV_PDEVICE
> *physDev, HPEN hpen )
>              memcpy(physDev->pen.dashes, PEN_alternate,
> physDev->pen.dash_len);
>              break;
>        case PS_USERSTYLE:
> -        FIXME("PS_USERSTYLE is not supported\n");
> +            /* handled above */
> +            break;
>          /* fall through */
>        default:
>          physDev->pen.dash_len = 0;
>          break;
>      }
>      if(physDev->pen.ext && physDev->pen.dash_len &&
> -        (logpen.lopnStyle & PS_STYLE_MASK) != PS_ALTERNATE)
> +        (logpen.lopnStyle & PS_STYLE_MASK) != PS_ALTERNATE &&
> +        (logpen.lopnStyle & PS_STYLE_MASK) != PS_USERSTYLE)
>          for(i = 0; i < physDev->pen.dash_len; i++)
>              physDev->pen.dashes[i] *= (physDev->pen.width ?
> physDev->pen.width : 1);
>
This needs a conformance test to show this is what happens in Windows. 
If this is not supported in certain versions, you will also need to add
broken() code for those versions with what happens.  Look at the Wine
source code and search for the use of this call.

James McKenzie



More information about the wine-devel mailing list