[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [26504] trunk/blender/source/blender/ windowmanager/intern/wm_draw.c: Fix automatic draw method detection not clearing things properly

Brecht Van Lommel brecht at blender.org
Mon Feb 1 11:39:48 CET 2010


Revision: 26504
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=26504
Author:   blendix
Date:     2010-02-01 11:39:36 +0100 (Mon, 01 Feb 2010)

Log Message:
-----------
Fix automatic draw method detection not clearing things properly
on e.g. resizing windows.

Modified Paths:
--------------
    trunk/blender/source/blender/windowmanager/intern/wm_draw.c

Modified: trunk/blender/source/blender/windowmanager/intern/wm_draw.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_draw.c	2010-02-01 10:14:22 UTC (rev 26503)
+++ trunk/blender/source/blender/windowmanager/intern/wm_draw.c	2010-02-01 10:39:36 UTC (rev 26504)
@@ -665,10 +665,27 @@
 	return 0;
 }
 
+static int wm_automatic_draw_method(wmWindow *win)
+{
+	if(win->drawmethod == USER_DRAW_AUTOMATIC) {
+		/* ATI opensource driver is known to be very slow at this */
+		if(GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_UNIX, GPU_DRIVER_OPENSOURCE))
+			return USER_DRAW_OVERLAP;
+		/* Windows software driver darkens color on each redraw */
+		else if(GPU_type_matches(GPU_DEVICE_SOFTWARE, GPU_OS_WIN, GPU_DRIVER_SOFTWARE))
+			return USER_DRAW_OVERLAP_FLIP;
+		else
+			return USER_DRAW_TRIPLE;
+	}
+	else
+		return win->drawmethod;
+}
+
 void wm_draw_update(bContext *C)
 {
 	wmWindowManager *wm= CTX_wm_manager(C);
 	wmWindow *win;
+	int drawmethod;
 	
 	for(win= wm->windows.first; win; win= win->next) {
 		if(win->drawmethod != U.wmdrawmethod) {
@@ -686,25 +703,17 @@
 			if(win->screen->do_refresh)
 				ED_screen_refresh(wm, win);
 
+			drawmethod= wm_automatic_draw_method(win);
+
 			if(win->drawfail)
 				wm_method_draw_overlap_all(C, win, 0);
-			else if(win->drawmethod == USER_DRAW_AUTOMATIC) {
-				/* ATI opensource driver is known to be very slow at this,
-				   Windows software driver darkens color on each redraw */
-				if(GPU_type_matches(GPU_DEVICE_ATI, GPU_OS_UNIX, GPU_DRIVER_OPENSOURCE))
-					wm_method_draw_overlap_all(C, win, 0);
-				else if(GPU_type_matches(GPU_DEVICE_SOFTWARE, GPU_OS_WIN, GPU_DRIVER_SOFTWARE))
-					wm_method_draw_overlap_all(C, win, 1);
-				else
-					wm_method_draw_triple(C, win);
-			}
-			else if(win->drawmethod == USER_DRAW_FULL)
+			else if(drawmethod == USER_DRAW_FULL)
 				wm_method_draw_full(C, win);
-			else if(win->drawmethod == USER_DRAW_OVERLAP)
+			else if(drawmethod == USER_DRAW_OVERLAP)
 				wm_method_draw_overlap_all(C, win, 0);
-			else if(win->drawmethod == USER_DRAW_OVERLAP_FLIP)
+			else if(drawmethod == USER_DRAW_OVERLAP_FLIP)
 				wm_method_draw_overlap_all(C, win, 1);
-			else // if(win->drawmethod == USER_DRAW_TRIPLE)
+			else // if(drawmethod == USER_DRAW_TRIPLE)
 				wm_method_draw_triple(C, win);
 
 			win->screen->do_draw_gesture= 0;
@@ -723,8 +732,9 @@
 	bScreen *screen= win->screen;
 	ScrArea *sa;
 	ARegion *ar;
+	int drawmethod= wm_automatic_draw_method(win);
 
-	if(win->drawmethod == USER_DRAW_TRIPLE)
+	if(drawmethod == USER_DRAW_TRIPLE)
 		wm_draw_triple_free(win);
 
 	/* clear screen swap flags */
@@ -739,7 +749,9 @@
 
 void wm_draw_region_clear(wmWindow *win, ARegion *ar)
 {
-	if(win->drawmethod == USER_DRAW_OVERLAP)
+	int drawmethod= wm_automatic_draw_method(win);
+
+	if(drawmethod == USER_DRAW_OVERLAP)
 		wm_flush_regions_down(win->screen, &ar->winrct);
 
 	win->screen->do_draw= 1;





More information about the Bf-blender-cvs mailing list