Alexandre Julliard : gdi32: Move the whole DC restoring functionality into set_dc_state, and rename it to restore_dc_state.
Alexandre Julliard
julliard at winehq.org
Wed Apr 8 10:05:31 CDT 2009
Module: wine
Branch: master
Commit: d4c54be2722d9717e9c12ce38f837ede2e08133f
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d4c54be2722d9717e9c12ce38f837ede2e08133f
Author: Alexandre Julliard <julliard at winehq.org>
Date: Tue Apr 7 20:28:08 2009 +0200
gdi32: Move the whole DC restoring functionality into set_dc_state, and rename it to restore_dc_state.
---
dlls/gdi32/dc.c | 82 ++++++++++++++++++++++++++-------------------
dlls/gdi32/gdi_private.h | 2 +-
2 files changed, 48 insertions(+), 36 deletions(-)
diff --git a/dlls/gdi32/dc.c b/dlls/gdi32/dc.c
index 9f0c9f6..ae58479 100644
--- a/dlls/gdi32/dc.c
+++ b/dlls/gdi32/dc.c
@@ -443,27 +443,45 @@ INT save_dc_state( HDC hdc )
/***********************************************************************
- * set_dc_state (Not a Windows API)
+ * restore_dc_state
*/
-void set_dc_state( HDC hdc, HDC hdcs )
+BOOL restore_dc_state( HDC hdc, INT level )
{
+ HDC hdcs, first_dcs;
DC *dc, *dcs;
+ INT save_level;
+
+ if (!(dc = get_dc_ptr( hdc ))) return FALSE;
+
+ /* find the state level to restore */
+
+ if (level < 0) level = dc->saveLevel + level + 1;
+ first_dcs = dc->saved_dc;
+ for (hdcs = first_dcs, save_level = dc->saveLevel; save_level > level; save_level--)
+ {
+ if (!(dcs = get_dc_ptr( hdcs )))
+ {
+ release_dc_ptr( dc );
+ return FALSE;
+ }
+ hdcs = dcs->saved_dc;
+ release_dc_ptr( dcs );
+ }
+
+ /* restore the state */
- if (!(dc = get_dc_ptr( hdc ))) return;
if (!(dcs = get_dc_ptr( hdcs )))
{
release_dc_ptr( dc );
- return;
+ return FALSE;
}
- if (!(dcs->flags & DC_SAVED))
+ if (!PATH_AssignGdiPath( &dc->path, &dcs->path ))
{
- release_dc_ptr( dc );
release_dc_ptr( dcs );
- return;
+ release_dc_ptr( dc );
+ return FALSE;
}
- TRACE("%p %p\n", hdc, hdcs );
- update_dc( dc );
dc->flags = dcs->flags & ~DC_SAVED;
dc->layout = dcs->layout;
dc->hDevice = dcs->hDevice;
@@ -531,8 +549,24 @@ void set_dc_state( HDC hdc, HDC hdcs )
SetBkColor( hdc, dcs->backgroundColor);
SetTextColor( hdc, dcs->textColor);
GDISelectPalette( hdc, dcs->hPalette, FALSE );
- release_dc_ptr( dc );
+
+ dc->saved_dc = dcs->saved_dc;
+ dcs->saved_dc = 0;
+ dc->saveLevel = save_level - 1;
+
release_dc_ptr( dcs );
+
+ /* now destroy all the saved DCs */
+
+ while (first_dcs)
+ {
+ if (!(dcs = get_dc_ptr( first_dcs ))) break;
+ hdcs = dcs->saved_dc;
+ free_dc_ptr( dcs );
+ first_dcs = hdcs;
+ }
+ release_dc_ptr( dc );
+ return TRUE;
}
@@ -567,11 +601,12 @@ INT WINAPI SaveDC( HDC hdc )
*/
BOOL WINAPI RestoreDC( HDC hdc, INT level )
{
- DC * dc, * dcs;
+ DC *dc;
BOOL success;
TRACE("%p %d\n", hdc, level );
if (!(dc = get_dc_ptr( hdc ))) return FALSE;
+ update_dc( dc );
if(abs(level) > dc->saveLevel || level == 0)
{
@@ -579,8 +614,6 @@ BOOL WINAPI RestoreDC( HDC hdc, INT level )
return FALSE;
}
- update_dc( dc );
-
if(dc->funcs->pRestoreDC)
{
success = dc->funcs->pRestoreDC( dc->physDev, level );
@@ -591,28 +624,7 @@ BOOL WINAPI RestoreDC( HDC hdc, INT level )
return success;
}
- if (level < 0) level = dc->saveLevel + level + 1;
- success=TRUE;
- while (dc->saveLevel >= level)
- {
- HDC hdcs = dc->saved_dc;
- if (!(dcs = get_dc_ptr( hdcs )))
- {
- success = FALSE;
- break;
- }
- dc->saved_dc = dcs->saved_dc;
- dcs->saved_dc = 0;
- if (--dc->saveLevel < level)
- {
- set_dc_state( hdc, hdcs );
- if (!PATH_AssignGdiPath( &dc->path, &dcs->path ))
- /* FIXME: This might not be quite right, since we're
- * returning FALSE but still destroying the saved DC state */
- success=FALSE;
- }
- free_dc_ptr( dcs );
- }
+ success = restore_dc_state( hdc, level );
release_dc_ptr( dc );
return success;
}
diff --git a/dlls/gdi32/gdi_private.h b/dlls/gdi32/gdi_private.h
index c585eaf..da66ade 100644
--- a/dlls/gdi32/gdi_private.h
+++ b/dlls/gdi32/gdi_private.h
@@ -384,7 +384,7 @@ extern void update_dc( DC *dc ) DECLSPEC_HIDDEN;
extern void DC_InitDC( DC * dc ) DECLSPEC_HIDDEN;
extern void DC_UpdateXforms( DC * dc ) DECLSPEC_HIDDEN;
extern INT save_dc_state( HDC hdc ) DECLSPEC_HIDDEN;
-extern void set_dc_state( HDC hdc, HDC hdcs ) DECLSPEC_HIDDEN;
+extern BOOL restore_dc_state( HDC hdc, INT level ) DECLSPEC_HIDDEN;
/* dib.c */
extern int DIB_GetDIBWidthBytes( int width, int depth ) DECLSPEC_HIDDEN;
More information about the wine-cvs
mailing list