[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