[Bf-blender-cvs] [f44680b3607] topbar: Make global areas use properly managed screen-verts and screen-edges

Julian Eisel noreply at git.blender.org
Thu Apr 19 15:24:35 CEST 2018


Commit: f44680b360765ff7a47fb1e29e2e9268d3ab9bbb
Author: Julian Eisel
Date:   Thu Apr 19 15:20:49 2018 +0200
Branches: topbar
https://developer.blender.org/rBf44680b360765ff7a47fb1e29e2e9268d3ab9bbb

Make global areas use properly managed screen-verts and screen-edges

* Added functions for ScrAreaMap to avoid code duplication
* Fixed loading files without top-bar not adding top-bar at all

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

M	source/blender/blenkernel/BKE_screen.h
M	source/blender/blenkernel/intern/screen.c
M	source/blender/blenloader/intern/readfile.c
M	source/blender/blenloader/intern/writefile.c
M	source/blender/editors/include/ED_screen.h
M	source/blender/editors/screen/screen_edit.c
M	source/blender/makesdna/DNA_screen_types.h
M	source/blender/makesdna/DNA_windowmanager_types.h
M	source/blender/windowmanager/intern/wm.c
M	source/blender/windowmanager/intern/wm_window.c

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

diff --git a/source/blender/blenkernel/BKE_screen.h b/source/blender/blenkernel/BKE_screen.h
index b8a43b1b960..2a25120ba8d 100644
--- a/source/blender/blenkernel/BKE_screen.h
+++ b/source/blender/blenkernel/BKE_screen.h
@@ -58,6 +58,7 @@ struct wmWindowManager;
 struct WorkSpace;
 struct GPUFXSettings;
 struct wmMsgBus;
+struct ScrAreaMap;
 
 #include "BLI_compiler_attrs.h"
 
@@ -335,6 +336,7 @@ float BKE_screen_view3d_zoom_from_fac(float zoomfac);
 
 /* screen */
 void BKE_screen_free(struct bScreen *sc); 
+void BKE_screen_area_map_free(struct ScrAreaMap *area_map) ATTR_NONNULL();
 unsigned int BKE_screen_visible_layers(struct bScreen *screen, struct Scene *scene);
 
 struct ScrEdge *BKE_screen_find_edge(struct bScreen *sc, struct ScrVert *v1, struct ScrVert *v2);
diff --git a/source/blender/blenkernel/intern/screen.c b/source/blender/blenkernel/intern/screen.c
index 8283655503c..1ca2dc0a991 100644
--- a/source/blender/blenkernel/intern/screen.c
+++ b/source/blender/blenkernel/intern/screen.c
@@ -404,10 +404,21 @@ void BKE_screen_area_free(ScrArea *sa)
 	BLI_freelistN(&sa->actionzones);
 }
 
+void BKE_screen_area_map_free(ScrAreaMap *area_map)
+{
+	for (ScrArea *area = area_map->areabase.first, *area_next; area; area = area_next) {
+		area_next = area->next;
+		BKE_screen_area_free(area);
+	}
+
+	BLI_freelistN(&area_map->vertbase);
+	BLI_freelistN(&area_map->edgebase);
+	BLI_freelistN(&area_map->areabase);
+}
+
 /** Free (or release) any data used by this screen (does not free the screen itself). */
 void BKE_screen_free(bScreen *sc)
 {
-	ScrArea *sa, *san;
 	ARegion *ar;
 
 	/* No animdata here. */
@@ -416,18 +427,11 @@ void BKE_screen_free(bScreen *sc)
 		BKE_area_region_free(NULL, ar);
 
 	BLI_freelistN(&sc->regionbase);
-	
-	for (sa = sc->areabase.first; sa; sa = san) {
-		san = sa->next;
-		BKE_screen_area_free(sa);
-	}
-	
-	BLI_freelistN(&sc->vertbase);
-	BLI_freelistN(&sc->edgebase);
-	BLI_freelistN(&sc->areabase);
+
+	BKE_screen_area_map_free(AREAMAP_FROM_SCREEN(sc));
 
 	BKE_previewimg_free(&sc->preview);
-	
+
 	/* Region and timer are freed by the window manager. */
 	MEM_SAFE_FREE(sc->tool_tip);
 }
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 119a8418677..bbcd8e31b45 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -6893,6 +6893,34 @@ static void lib_link_area(FileData *fd, ID *parent_id, ScrArea *area)
 	}
 }
 
+/**
+ * \return false on error.
+ */
+static bool direct_link_area_map(FileData *fd, ScrAreaMap *area_map)
+{
+	link_list(fd, &area_map->vertbase);
+	link_list(fd, &area_map->edgebase);
+	link_list(fd, &area_map->areabase);
+	for (ScrArea *area = area_map->areabase.first; area; area = area->next) {
+		direct_link_area(fd, area);
+	}
+
+	/* edges */
+	for (ScrEdge *se = area_map->edgebase.first; se; se = se->next) {
+		se->v1 = newdataadr(fd, se->v1);
+		se->v2 = newdataadr(fd, se->v2);
+		BKE_screen_sort_scrvert(&se->v1, &se->v2);
+
+		if (se->v1 == NULL) {
+			BLI_remlink(&area_map->edgebase, se);
+
+			return false;
+		}
+	}
+
+	return true;
+}
+
 /* ************ READ WM ***************** */
 
 static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
@@ -6909,10 +6937,7 @@ static void direct_link_windowmanager(FileData *fd, wmWindowManager *wm)
 		/* we need to restore a pointer to this later when reading workspaces, so store in global oldnew-map */
 		oldnewmap_insert(fd->globmap, hook, win->workspace_hook, 0);
 
-		link_list(fd, &win->global_areas.areabase);
-		for (ScrArea *area = win->global_areas.areabase.first; area; area = area->next) {
-			direct_link_area(fd, area);
-		}
+		direct_link_area_map(fd, &win->global_areas);
 
 		win->ghostwin = NULL;
 		win->gwnctx = NULL;
@@ -7443,14 +7468,8 @@ void blo_do_versions_view3d_split_250(View3D *v3d, ListBase *regions)
 
 static bool direct_link_screen(FileData *fd, bScreen *sc)
 {
-	ScrArea *sa;
-	ScrVert *sv;
-	ScrEdge *se;
 	bool wrong_id = false;
 	
-	link_list(fd, &(sc->vertbase));
-	link_list(fd, &(sc->edgebase));
-	link_list(fd, &(sc->areabase));
 	sc->regionbase.first = sc->regionbase.last= NULL;
 	sc->context = NULL;
 	sc->active_region = NULL;
@@ -7458,28 +7477,10 @@ static bool direct_link_screen(FileData *fd, bScreen *sc)
 
 	sc->preview = direct_link_preview_image(fd, sc->preview);
 
-	/* edges */
-	for (se = sc->edgebase.first; se; se = se->next) {
-		se->v1 = newdataadr(fd, se->v1);
-		se->v2 = newdataadr(fd, se->v2);
-		if ((intptr_t)se->v1 > (intptr_t)se->v2) {
-			sv = se->v1;
-			se->v1 = se->v2;
-			se->v2 = sv;
-		}
-		
-		if (se->v1 == NULL) {
-			printf("Error reading Screen %s... removing it.\n", sc->id.name+2);
-			BLI_remlink(&sc->edgebase, se);
-			wrong_id = true;
-		}
+	if (!direct_link_area_map(fd, AREAMAP_FROM_SCREEN(sc))) {
+		wrong_id = true;
 	}
-	
-	/* areas */
-	for (sa = sc->areabase.first; sa; sa = sa->next) {
-		direct_link_area(fd, sa);
-	}
-	
+
 	return wrong_id;
 }
 
diff --git a/source/blender/blenloader/intern/writefile.c b/source/blender/blenloader/intern/writefile.c
index 75a602ac428..11edb6b4bdf 100644
--- a/source/blender/blenloader/intern/writefile.c
+++ b/source/blender/blenloader/intern/writefile.c
@@ -2939,16 +2939,12 @@ static void write_area_regions(WriteData *wd, ScrArea *area)
 	}
 }
 
-static void write_global_areas(WriteData *wd, ListBase *areas)
+static void write_area_map(WriteData *wd, ScrAreaMap *area_map)
 {
-	for (ScrArea *area = areas->first; area; area = area->next) {
+	writelist(wd, DATA, ScrVert, &area_map->vertbase);
+	writelist(wd, DATA, ScrEdge, &area_map->edgebase);
+	for (ScrArea *area = area_map->areabase.first; area; area = area->next) {
 		writestruct(wd, DATA, ScrArea, 1, area);
-
-		writestruct(wd, DATA, ScrVert, 1, area->v1);
-		writestruct(wd, DATA, ScrVert, 1, area->v2);
-		writestruct(wd, DATA, ScrVert, 1, area->v3);
-		writestruct(wd, DATA, ScrVert, 1, area->v4);
-
 		write_area_regions(wd, area);
 	}
 }
@@ -2967,7 +2963,9 @@ static void write_windowmanager(WriteData *wd, wmWindowManager *wm)
 		writestruct(wd, DATA, WorkSpaceInstanceHook, 1, win->workspace_hook);
 		writestruct(wd, DATA, Stereo3dFormat, 1, win->stereo3d_format);
 
-		write_global_areas(wd, &win->global_areas.areabase);
+#ifdef WITH_TOPAR_WRITING
+		write_area_map(wd, &win->global_areas);
+#endif
 
 		/* data is written, clear deprecated data again */
 		win->screen = NULL;
@@ -2984,19 +2982,7 @@ static void write_screen(WriteData *wd, bScreen *sc)
 	write_previews(wd, sc->preview);
 
 	/* direct data */
-	for (ScrVert *sv = sc->vertbase.first; sv; sv = sv->next) {
-		writestruct(wd, DATA, ScrVert, 1, sv);
-	}
-
-	for (ScrEdge *se = sc->edgebase.first; se; se = se->next) {
-		writestruct(wd, DATA, ScrEdge, 1, se);
-	}
-
-	for (ScrArea *sa = sc->areabase.first; sa; sa = sa->next) {
-		writestruct(wd, DATA, ScrArea, 1, sa);
-
-		write_area_regions(wd, sa);
-	}
+	write_area_map(wd, AREAMAP_FROM_SCREEN(sc));
 }
 
 static void write_bone(WriteData *wd, Bone *bone)
diff --git a/source/blender/editors/include/ED_screen.h b/source/blender/editors/include/ED_screen.h
index 71d2847bb6c..1194b17d33a 100644
--- a/source/blender/editors/include/ED_screen.h
+++ b/source/blender/editors/include/ED_screen.h
@@ -143,7 +143,7 @@ int     ED_region_global_size_y(void);
 	     area_name = (area_name == (win)->global_areas.areabase.last) ? (screen)->areabase.first : area_name->next)
 
 /* screens */
-void    ED_screens_initialize(struct wmWindowManager *wm);
+void    ED_screens_initialize(const struct bContext *C, struct wmWindowManager *wm);
 void    ED_screen_draw_edges(struct wmWindow *win);
 void    ED_screen_draw_join_shape(struct ScrArea *sa1, struct ScrArea *sa2);
 void    ED_screen_draw_split_preview(struct ScrArea *sa, const int dir, const float fac);
diff --git a/source/blender/editors/screen/screen_edit.c b/source/blender/editors/screen/screen_edit.c
index 3b5bd54344d..97d58f3f434 100644
--- a/source/blender/editors/screen/screen_edit.c
+++ b/source/blender/editors/screen/screen_edit.c
@@ -76,17 +76,21 @@
 
 /* ******************* screen vert, edge, area managing *********************** */
 
-static ScrVert *screen_addvert(bScreen *sc, short x, short y)
+static ScrVert *screen_addvert_ex(ScrAreaMap *area_map, short x, short y)
 {
 	ScrVert *sv = MEM_callocN(sizeof(ScrVert), "addscrvert");
 	sv->vec.x = x;
 	sv->vec.y = y;
 	
-	BLI_addtail(&sc->vertbase, sv);
+	BLI_addtail(&area_map->vertbase, sv);
 	return sv;
 }
+static ScrVert *screen_addvert(bScreen *sc, short x, short y)
+{
+	return screen_addvert_ex(AREAMAP_FROM_SCREEN(sc), x, y);
+}
 
-static ScrEdge *screen_addedge(bScreen *sc, ScrVert *v1, ScrVert *v2)
+static ScrEdge *screen_addedge_ex(ScrAreaMap *area_map, ScrVert *v1, ScrVert *v2)
 {
 	ScrEdge *se = MEM_callocN(sizeof(ScrEdge), "addscredge");
 
@@ -94,10 +98,13 @@ static ScrEdge *screen_addedge(bScreen *sc, ScrVert *v1, ScrVert *v2)
 	se->v1 = v1;
 	se->v2 = v2;
 
-	BLI_addtail(&sc->edgebase, se);
+	BLI_addtail(&area_map->edgebase, se);
 	return se;
 }
-
+static ScrEdge *screen_addedge(bScreen *sc, ScrVert *v1, ScrVert *v2)
+{
+	return screen_addedge_ex(AREAMAP_FROM_SCREEN(sc), v1, v2);
+}
 
 bool scredge_is_horizontal(ScrEdge *se)
 {
@@ -143,20 +150,32 @@ ScrEdge *screen_find_active_scredge(const bScreen *sc,
 
 
 /* adds no space data */
-static ScrArea *screen_addarea(bScreen *sc, ScrVert *v1, ScrVert *v2, ScrVert *v3, ScrVert *v4, short headertype, short spacetype)
+static ScrArea *screen_addarea_ex(
+        ScrAreaMap *area_map,
+        ScrVert *bottom_left, ScrVert *top_left, ScrVert *top_right, ScrVert *bottom_right,
+        short headertype, short spacetype)
 {
 	ScrArea *sa = MEM_callocN(sizeof(ScrArea), "addscrarea");
-	sa->v1 = v1;
-	sa->v2 = v2;
-	sa->v3 = v3;
-	sa->v4 = v4;
+
+	sa->v1 = bottom_left;
+	sa->v2 = top_left;
+	sa->v3 = top_right;
+	sa->v4 = bottom_right;
 	sa->headertype = headertype;
 	sa->spacetype = sa->butspacetype = spacetype;
-	
-	BLI_addtail(&sc->areabase, sa);
-	
+
+	BLI_addtail(&area_map->areabase, sa);
+
 	return sa;
 }
+static ScrArea *screen_addarea(
+        bScreen *sc,
+        ScrVert *left_bottom, ScrVert *left_top, ScrVert *right_top, ScrVe

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list