[Bf-blender-cvs] [f05bad92bff] topbar: Fix small jumps of area rectangles and contents

Julian Eisel noreply at git.blender.org
Sat Oct 7 16:35:56 CEST 2017


Commit: f05bad92bffe54ca8d39cf7021f82683469d7553
Author: Julian Eisel
Date:   Sat Oct 7 16:31:19 2017 +0200
Branches: topbar
https://developer.blender.org/rBf05bad92bffe54ca8d39cf7021f82683469d7553

Fix small jumps of area rectangles and contents

Should also fix some glitches/jumping on HiDPI screens.

Most of this is related cleanup, actual fix is rather small (check
changes in screen_vertices_scale and WM_window_screen_pixels_y)

===================================================================

M	source/blender/editors/screen/area.c
M	source/blender/editors/screen/screen_edit.c
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/windowmanager/intern/wm_subwindow.c
M	source/blender/windowmanager/intern/wm_window.c

===================================================================

diff --git a/source/blender/editors/screen/area.c b/source/blender/editors/screen/area.c
index 7b8300f24f3..cdbe13a300d 100644
--- a/source/blender/editors/screen/area.c
+++ b/source/blender/editors/screen/area.c
@@ -1373,20 +1373,33 @@ static void region_rect_recursive(wmWindow *win, ScrArea *sa, ARegion *ar, rcti
 	region_rect_recursive(win, sa, ar->next, remainder, quad, add_azones);
 }
 
-static void area_calc_totrct(ScrArea *sa, int sizex, int sizey)
+static void area_calc_totrct(ScrArea *sa, int window_size_x, int window_size_y)
 {
-	short rt = (short) U.pixelsize;
+	short px = (short)U.pixelsize;
+
+	sa->totrct.xmin = sa->v1->vec.x;
+	sa->totrct.xmax = sa->v4->vec.x;
+	sa->totrct.ymin = sa->v1->vec.y;
+	sa->totrct.ymax = sa->v2->vec.y;
+
+	/* scale down totrct by 1 pixel on all sides not matching window borders */
+	if (sa->totrct.xmin > 0) {
+		sa->totrct.xmin += px;
+	}
+	if (sa->totrct.xmax < (window_size_x - 1)) {
+		sa->totrct.xmax -= px;
+	}
+	if (sa->totrct.ymin > 0) {
+		sa->totrct.ymin += px;
+	}
+	if (sa->totrct.ymax < (window_size_y - 1)) {
+		sa->totrct.ymax -= px;
+	}
+	BLI_assert(sa->totrct.xmin >= 0);
+	BLI_assert(sa->totrct.xmax >= 0);
+	BLI_assert(sa->totrct.ymin >= 0);
+	BLI_assert(sa->totrct.ymax >= 0);
 
-	if (sa->v1->vec.x > 0) sa->totrct.xmin = sa->v1->vec.x + rt;
-	else sa->totrct.xmin = sa->v1->vec.x;
-	if (sa->v4->vec.x < sizex - 1) sa->totrct.xmax = sa->v4->vec.x - rt;
-	else sa->totrct.xmax = sa->v4->vec.x;
-	
-	if (sa->v1->vec.y > 0) sa->totrct.ymin = sa->v1->vec.y + rt;
-	else sa->totrct.ymin = sa->v1->vec.y;
-	if (sa->v2->vec.y < sizey - 1) sa->totrct.ymax = sa->v2->vec.y - rt;
-	else sa->totrct.ymax = sa->v2->vec.y;
-	
 	/* for speedup */
 	sa->winx = BLI_rcti_size_x(&sa->totrct) + 1;
 	sa->winy = BLI_rcti_size_y(&sa->totrct) + 1;
@@ -1509,8 +1522,8 @@ void screen_area_update_region_sizes(wmWindowManager *wm, wmWindow *win, ScrArea
 void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
 {
 	const bScreen *screen = WM_window_get_active_screen(win);
-	const int screen_size_x = WM_window_screen_pixels_x(win);
-	const int screen_size_y = WM_window_screen_pixels_y(win);
+	const int window_size_x = WM_window_pixels_x(win);
+	const int window_size_y = WM_window_pixels_y(win);
 	ARegion *ar;
 	rcti rect;
 	
@@ -1526,7 +1539,7 @@ void ED_area_initialize(wmWindowManager *wm, wmWindow *win, ScrArea *sa)
 		ar->type = BKE_regiontype_from_id(sa->type, ar->regiontype);
 
 	/* area sizes */
-	area_calc_totrct(sa, screen_size_x, screen_size_y);
+	area_calc_totrct(sa, window_size_x, window_size_y);
 
 	/* clear all azones, add the area triange widgets */
 	area_azone_initialize(win, screen, sa);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 4331ec2bb07..a552fb4c108 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -508,8 +508,13 @@ void select_connected_scredge(bScreen *sc, ScrEdge *edge)
 	}
 }
 
-/* test if screen vertices should be scaled */
-static void screen_test_scale(const wmWindow *win, bScreen *sc, int winsize_x, int winsize_y)
+/**
+ * Test if screen vertices should be scaled and do if needed.
+ */
+static void screen_vertices_scale(
+        const wmWindow *win, bScreen *sc,
+        int window_size_x, int window_size_y,
+        int screen_size_x, int screen_size_y)
 {
 	/* clamp Y size of header sized areas when expanding windows
 	 * avoids annoying empty space around file menu */
@@ -545,7 +550,7 @@ static void screen_test_scale(const wmWindow *win, bScreen *sc, int winsize_x, i
 #define TEMP_TOP 2
 
 	/* if the window's Y axis grows, clamp header sized areas */
-	if (winsize_y_prev < winsize_y) {  /* growing? */
+	if (winsize_y_prev < screen_size_y) {  /* growing? */
 		const int headery_margin_max = headery_init + 4;
 		for (sa = sc->areabase.first; sa; sa = sa->next) {
 			ARegion *ar = BKE_area_find_region_type(sa, RGN_TYPE_HEADER);
@@ -568,9 +573,9 @@ static void screen_test_scale(const wmWindow *win, bScreen *sc, int winsize_x, i
 #endif
 
 
-	if (winsize_x_prev != winsize_x || winsize_y_prev != winsize_y) {
-		facx = ((float)winsize_x - 1) / ((float)winsize_x_prev - 1);
-		facy = ((float)winsize_y - 1) / ((float)winsize_y_prev - 1);
+	if (winsize_x_prev != screen_size_x || winsize_y_prev != screen_size_y) {
+		facx = ((float)screen_size_x - 1) / ((float)winsize_x_prev - 1);
+		facy = ((float)screen_size_y - 1) / ((float)winsize_y_prev - 1);
 		
 		/* make sure it fits! */
 		for (sv = sc->vertbase.first; sv; sv = sv->next) {
@@ -581,20 +586,20 @@ static void screen_test_scale(const wmWindow *win, bScreen *sc, int winsize_x, i
 			//sv->vec.x += AREAGRID - 1;
 			//sv->vec.x -=  (sv->vec.x % AREAGRID);
 
-			CLAMP(sv->vec.x, 0, winsize_x - 1);
+			CLAMP(sv->vec.x, 0, screen_size_x - 1);
 			
 			tempf = ((float)sv->vec.y) * facy;
 			sv->vec.y = (short)(tempf + 0.5f);
 			//sv->vec.y += AREAGRID - 1;
 			//sv->vec.y -=  (sv->vec.y % AREAGRID);
 
-			CLAMP(sv->vec.y, 0, winsize_y - 1);
+			CLAMP(sv->vec.y, 0, screen_size_y - 1);
 		}
 	}
 
 
 #ifdef USE_HEADER_SIZE_CLAMP
-	if (winsize_y_prev < winsize_y) {  /* growing? */
+	if (winsize_y_prev < screen_size_y) {  /* growing? */
 		for (sa = sc->areabase.first; sa; sa = sa->next) {
 			ScrEdge *se = NULL;
 
@@ -654,7 +659,7 @@ static void screen_test_scale(const wmWindow *win, bScreen *sc, int winsize_x, i
 		/* adjust headery if verts are along the edge of window */
 		if (sa->v1->vec.y > 0)
 			headery += U.pixelsize;
-		if (sa->v2->vec.y < winsize_y - 1)
+		if (sa->v2->vec.y < screen_size_y - 1)
 			headery += U.pixelsize;
 		
 		if (sa->v2->vec.y - sa->v1->vec.y + 1 < headery) {
@@ -679,16 +684,15 @@ static void screen_test_scale(const wmWindow *win, bScreen *sc, int winsize_x, i
 		}
 	}
 
-	/* Global areas have a fixed size that only changes with the DPI. Here we ensure that exactly this size is set. */
+	/* Global areas have a fixed size that only changes with the DPI. Here we ensure that exactly this size is set.
+	 * TODO Assumes global area to be top-aligned. Should be made more generic */
 	for (ScrArea *area = win->global_areas.first; area; area = area->next) {
-		short px = (short)U.pixelsize;
-
 		/* width */
 		area->v1->vec.x = area->v2->vec.x = 0;
-		area->v3->vec.x = area->v4->vec.x = win->sizex;
+		area->v3->vec.x = area->v4->vec.x = window_size_x;
 		/* height */
-		area->v1->vec.y = area->v4->vec.y = win->sizey - ED_area_global_size_y(win, area);
-		area->v2->vec.y = area->v3->vec.y = win->sizey - px;
+		area->v1->vec.y = area->v4->vec.y = window_size_y - ED_area_global_size_y(win, area) - U.pixelsize;
+		area->v2->vec.y = area->v3->vec.y = window_size_y;
 	}
 }
 
@@ -778,7 +782,7 @@ void ED_screen_refresh(wmWindowManager *wm, wmWindow *win)
 		WM_window_set_dpi(win);
 		screen_refresh_headersizes();
 
-		screen_test_scale(win, screen, screen_size_x, screen_size_y);
+		screen_vertices_scale(win, screen, window_size_x, window_size_y, screen_size_x, screen_size_y);
 
 		if (screen->mainwin == 0) {
 			screen->mainwin = wm_subwindow_open(win, &window_rect, false);
@@ -831,11 +835,13 @@ void ED_screen_ensure_updated(wmWindowManager *wm, wmWindow *win, bScreen *scree
 		ED_screen_refresh(wm, win);
 	}
 	else {
+		const int window_size_x = WM_window_pixels_x(win);
+		const int window_size_y = WM_window_pixels_y(win);
 		const int screen_size_x = WM_window_screen_pixels_x(win);
 		const int screen_size_y = WM_window_screen_pixels_y(win);
 		bool has_updated = false;
 
-		screen_test_scale(win, screen, screen_size_x, screen_size_y);
+		screen_vertices_scale(win, screen, window_size_x, window_size_y, screen_size_x, screen_size_y);
 
 		ED_screen_areas_iter(win, screen, area) {
 			if (area->flag & AREA_FLAG_REGION_SIZE_UPDATE) {
diff --git a/source/blender/makesdna/DNA_screen_types.h b/source/blender/makesdna/DNA_screen_types.h
index 127966340f2..54cd4082d9d 100644
--- a/source/blender/makesdna/DNA_screen_types.h
+++ b/source/blender/makesdna/DNA_screen_types.h
@@ -70,7 +70,8 @@ typedef struct bScreen {
 	char skip_handling;					/* set to delay screen handling after switching back from maximized area */
 	char scrubbing;						/* set when scrubbing to avoid some costly updates */
 	char pad[6];
-	
+
+	/* XXX mainwin is actually entire window content now, including global bars. Should be moved out of bScreen. */
 	short mainwin;						/* screensize subwindow, for screenedges and global menus */
 	short subwinactive;					/* active subwindow */
 
diff --git a/source/blender/windowmanager/intern/wm_subwindow.c b/source/blender/windowmanager/intern/wm_subwindow.c
index d80486998bd..57085d4f4bd 100644
--- a/source/blender/windowmanager/intern/wm_subwindow.c
+++ b/source/blender/windowmanager/intern/wm_subwindow.c
@@ -245,8 +245,8 @@ void wm_subwindow_position(wmWindow *win, int swinid, const rcti *winrct, bool a
 	wmSubWindow *swin = swin_from_swinid(win, swinid);
 	
 	if (swin) {
-		const int screen_size_x = WM_window_pixels_x(win);
-		const int screen_size_y = WM_window_pixels_y(win);
+		const int window_size_x = WM_window_pixels_x(win);
+		const int window_size_y = WM_window_pixels_y(win);
 
 		int width, height;
 		
@@ -265,10 +265,10 @@ void wm_subwindow_position(wmWindow *win, int swinid, const rcti *winrct, bool a
 		 * fixed it). - zr  (2001!)
 		 */
 		
-		if (swin->winrct.xmax > screen_size_x)
-			swin->winrct.xmax = screen_size_x;
-		if (swin->winrct.ymax > screen_size_y)
-			swin->winrct.ymax = screen_size_y;
+		if (swin->winrct.xmax > window_size_x)
+			swin->winrct.xmax = window_size_x;
+		if (swin->winrct.ymax > window_size_y)
+			swin->winrct.ymax = window_size_y;
 		
 		if (activate) {
 			/* extra service */
diff --git a/source/blender/windowmanager/intern/wm_window.c b/source/blender/windowmanager/intern/wm_window.c
index d82c3f4cf97..978e247b701 100644
--- a/source/blender/windowmanager/intern/wm_window.c
+++ b/source/blender/windowmanager/intern/wm_window.c
@@ -1934,7 +1934,7 @@ int WM_window_screen_pixels_y(const wmWindow *win)
 	short screen_size_y = WM_window_pixels_y(win);
 
 	for (ScrArea *sa = win->global_areas.first; sa; sa = sa->next) {
-		screen_size_y -= sa->winy;
+		screen_size_y 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list