[PATCH 1/2] user32: SetSysColors updates brushes from GetSysColorBrush and add test
Nikolay Sivov
bunglehead at gmail.com
Sat Jan 14 14:14:31 CST 2017
On 14.01.2017 22:33, Fabian Maurer wrote:
> Signed-off-by: Fabian Maurer <dark.shadow4 at web.de>
> ---
> dlls/gdi32/gdi32.spec | 2 ++
> dlls/gdi32/gdiobj.c | 12 ++++++++++++
> dlls/user32/sysparams.c | 23 +++++++++++++++++------
> dlls/user32/tests/sysparams.c | 16 ++++++++++++++++
> include/wine/gdi_driver.h | 2 ++
> 5 files changed, 49 insertions(+), 6 deletions(-)
>
> diff --git a/dlls/gdi32/gdi32.spec b/dlls/gdi32/gdi32.spec
> index 7792731b9e..f9c3fb9293 100644
> --- a/dlls/gdi32/gdi32.spec
> +++ b/dlls/gdi32/gdi32.spec
> @@ -518,6 +518,8 @@
> # GDI objects
> @ cdecl __wine_make_gdi_object_system(long long)
> @ cdecl __wine_set_visible_region(long long ptr ptr ptr)
> +@ cdecl __wine_GDI_ReleaseObj(ptr)
> +@ cdecl __wine_GDI_GetObjPtr(ptr long)
>
> # Graphics drivers
> @ cdecl __wine_set_display_driver(long)
> diff --git a/dlls/gdi32/gdiobj.c b/dlls/gdi32/gdiobj.c
> index 46b2241945..aa2ced1025 100644
> --- a/dlls/gdi32/gdiobj.c
> +++ b/dlls/gdi32/gdiobj.c
> @@ -880,6 +880,18 @@ void GDI_ReleaseObj( HGDIOBJ handle )
> LeaveCriticalSection( &gdi_section );
> }
>
> +/* Exports for user32, we need to be able to manipulate GDI objects where the official API doesn't allow us */
> +
> +void* CDECL __wine_GDI_GetObjPtr( HGDIOBJ handle, WORD type )
> +{
> + return GDI_GetObjPtr( handle, type );
> +}
> +
> +void CDECL __wine_GDI_ReleaseObj( HGDIOBJ handle )
> +{
> + GDI_ReleaseObj( handle );
> +}
> +
>
This is too much. If you only need to update object property while
keeping same handle, you only need one additional call like
__wine_set_gdi_object_color(), that should work for both brushes and
pens, checking if it's a system object too, as an additional precaution.
> +static void set_syscolors_gdi( INT index, COLORREF color )
> +{
> + HBRUSH brush = system_colors[index].brush;
> + LOGBRUSH *brush_info;
> +
> + if(brush)
> + {
> + /* Since LOGBRUSH is the first member in BRUSHOBJ we just do a cast here */
> + brush_info = __wine_GDI_GetObjPtr( brush, OBJ_BRUSH );
> + if(brush_info->lbColor != color)
> + brush_info->lbColor = color;
> + __wine_GDI_ReleaseObj( brush );
> + }
> +}
>
This looks very dirty.
More information about the wine-devel
mailing list