Alexandre Julliard : user32: DCX_NORESETATTRS should be applied at DC release time.
Alexandre Julliard
julliard at winehq.org
Fri Jul 23 10:05:42 CDT 2010
Module: wine
Branch: master
Commit: f1ea06375d76c9f8e181e3ee4874ddef661e80c2
URL: http://source.winehq.org/git/wine.git/?a=commit;h=f1ea06375d76c9f8e181e3ee4874ddef661e80c2
Author: Alexandre Julliard <julliard at winehq.org>
Date: Thu Jul 22 20:00:35 2010 +0200
user32: DCX_NORESETATTRS should be applied at DC release time.
---
dlls/user32/painting.c | 21 ++++++++++++++-------
dlls/user32/tests/dce.c | 9 +++------
2 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/dlls/user32/painting.c b/dlls/user32/painting.c
index efb0884..5e57e7f 100644
--- a/dlls/user32/painting.c
+++ b/dlls/user32/painting.c
@@ -168,6 +168,16 @@ static void update_visible_region( struct dce *dce )
/***********************************************************************
+ * reset_dce_attrs
+ */
+static void reset_dce_attrs( struct dce *dce )
+{
+ RestoreDC( dce->hdc, 1 ); /* initial save level is always 1 */
+ SaveDC( dce->hdc ); /* save the state again for next time */
+}
+
+
+/***********************************************************************
* release_dce
*/
static void release_dce( struct dce *dce )
@@ -329,6 +339,7 @@ void free_dce( struct dce *dce, HWND hwnd )
if (!--dce->count)
{
/* turn it into a cache entry */
+ reset_dce_attrs( dce );
release_dce( dce );
dce->flags |= DCX_CACHE;
}
@@ -455,6 +466,7 @@ static INT release_dc( HWND hwnd, HDC hdc, BOOL end_paint )
dce = (struct dce *)GetDCHook( hdc, NULL );
if (dce && dce->count)
{
+ if (!(dce->flags & DCX_NORESETATTRS)) reset_dce_attrs( dce );
if (end_paint || (dce->flags & DCX_CACHE)) delete_clip_rgn( dce );
if (dce->flags & DCX_CACHE) dce->count = 0;
ret = TRUE;
@@ -898,6 +910,7 @@ BOOL WINAPI EndPaint( HWND hwnd, const PAINTSTRUCT *lps )
HDC WINAPI GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
{
static const DWORD clip_flags = DCX_PARENTCLIP | DCX_CLIPSIBLINGS | DCX_CLIPCHILDREN | DCX_WINDOW;
+ static const DWORD user_flags = clip_flags | DCX_NORESETATTRS; /* flags that can be set by user */
struct dce *dce;
BOOL bUpdateVisRgn = TRUE;
HWND parent;
@@ -1021,18 +1034,12 @@ HDC WINAPI GetDCEx( HWND hwnd, HRGN hrgnClip, DWORD flags )
}
dce->hwnd = hwnd;
- dce->flags = (dce->flags & ~clip_flags) | (flags & clip_flags);
+ dce->flags = (dce->flags & ~user_flags) | (flags & user_flags);
if (SetHookFlags( dce->hdc, DCHF_VALIDATEVISRGN )) bUpdateVisRgn = TRUE; /* DC was dirty */
if (bUpdateVisRgn) update_visible_region( dce );
- if (!(flags & DCX_NORESETATTRS))
- {
- RestoreDC( dce->hdc, 1 ); /* initial save level is always 1 */
- SaveDC( dce->hdc ); /* save the state again for next time */
- }
-
TRACE("(%p,%p,0x%x): returning %p\n", hwnd, hrgnClip, flags, dce->hdc);
return dce->hdc;
}
diff --git a/dlls/user32/tests/dce.c b/dlls/user32/tests/dce.c
index cfa07e5..c366ebc 100644
--- a/dlls/user32/tests/dce.c
+++ b/dlls/user32/tests/dce.c
@@ -66,10 +66,7 @@ static void test_dc_attributes(void)
hdc = hdcs[i] = GetDCEx( hwnd_cache, 0, DCX_USESTYLE | DCX_NORESETATTRS );
if (!hdc) break;
rop = GetROP2( hdc );
- if (hdc == old_hdc)
- todo_wine ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
- else
- ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
+ ok( rop == def_rop, "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
if (hdc == old_hdc)
{
found_dc = 1;
@@ -104,8 +101,8 @@ static void test_dc_attributes(void)
rop = GetROP2( hdc );
if (hdc == old_hdc)
{
- todo_wine ok( rop == R2_WHITE || broken( rop == def_rop),
- "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
+ ok( rop == R2_WHITE || broken( rop == def_rop),
+ "wrong ROP2 %d after release %p/%p\n", rop, old_hdc, hdc );
SetROP2( old_hdc, def_rop );
}
else
More information about the wine-cvs
mailing list