From 907be3632c60646eb6e53b7230423ad53efbac48 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lukas=20T=C3=B6nne?= Date: Fri, 21 Feb 2014 10:29:08 +0100 Subject: Replace the int argument for user count mode when restoring pointers on undo with a nicer enum. This is more transparent about what happens with the user count. Also added comments to make certain the meaning of these values is easily understandable. --- source/blender/blenloader/intern/readfile.c | 75 ++++++++++++++++------------- 1 file changed, 41 insertions(+), 34 deletions(-) (limited to 'source/blender/blenloader') diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c index c14b34af0fe..61df5468057 100644 --- a/source/blender/blenloader/intern/readfile.c +++ b/source/blender/blenloader/intern/readfile.c @@ -5796,16 +5796,23 @@ static void lib_link_screen(FileData *fd, Main *main) } } -static bool restore_pointer(ID *id, ID *newid, int user) +/* how to handle user count on pointer restore */ +typedef enum ePointerUserMode { + USER_IGNORE, /* ignore user count */ + USER_ONE, /* ensure at least one user (fake also counts) */ + USER_REAL /* ensure at least one real user (fake user ignored) */ +} ePointerUserMode; + +static bool restore_pointer(ID *id, ID *newid, ePointerUserMode user) { if (strcmp(newid->name + 2, id->name + 2) == 0) { if (newid->lib == id->lib) { - if (user == 1) { + if (user == USER_ONE) { if (newid->us == 0) { newid->us++; } } - else if (user == 2) { + else if (user == USER_REAL) { id_us_ensure_real(newid); } return true; @@ -5822,7 +5829,7 @@ static bool restore_pointer(ID *id, ID *newid, int user) * - 1: ensure a user * - 2: ensure a real user (even if a fake one is set) */ -static void *restore_pointer_by_name(Main *mainp, ID *id, int user) +static void *restore_pointer_by_name(Main *mainp, ID *id, ePointerUserMode user) { if (id) { ListBase *lb = which_libbase(mainp, GS(id->name)); @@ -5845,7 +5852,7 @@ static void lib_link_seq_clipboard_pt_restore(ID *id, Main *newmain) if (id) { /* clipboard must ensure this */ BLI_assert(id->newid != NULL); - id->newid = restore_pointer_by_name(newmain, (ID *)id->newid, 1); + id->newid = restore_pointer_by_name(newmain, (ID *)id->newid, USER_ONE); } } static int lib_link_seq_clipboard_cb(Sequence *seq, void *arg_pt) @@ -5879,7 +5886,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc /* first windowmanager */ for (wm = newmain->wm.first; wm; wm = wm->id.next) { for (win= wm->windows.first; win; win= win->next) { - win->screen = restore_pointer_by_name(newmain, (ID *)win->screen, 1); + win->screen = restore_pointer_by_name(newmain, (ID *)win->screen, USER_ONE); if (win->screen == NULL) win->screen = curscreen; @@ -5892,7 +5899,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc for (sc = newmain->screen.first; sc; sc = sc->id.next) { Scene *oldscene = sc->scene; - sc->scene= restore_pointer_by_name(newmain, (ID *)sc->scene, 1); + sc->scene= restore_pointer_by_name(newmain, (ID *)sc->scene, USER_ONE); if (sc->scene == NULL) sc->scene = curscene; @@ -5911,14 +5918,14 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc if (v3d->scenelock) v3d->camera = NULL; /* always get from scene */ else - v3d->camera = restore_pointer_by_name(newmain, (ID *)v3d->camera, 1); + v3d->camera = restore_pointer_by_name(newmain, (ID *)v3d->camera, USER_ONE); if (v3d->camera == NULL) v3d->camera = sc->scene->camera; - v3d->ob_centre = restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, 1); + v3d->ob_centre = restore_pointer_by_name(newmain, (ID *)v3d->ob_centre, USER_ONE); for (bgpic= v3d->bgpicbase.first; bgpic; bgpic= bgpic->next) { - bgpic->ima = restore_pointer_by_name(newmain, (ID *)bgpic->ima, 1); - bgpic->clip = restore_pointer_by_name(newmain, (ID *)bgpic->clip, 1); + bgpic->ima = restore_pointer_by_name(newmain, (ID *)bgpic->ima, USER_ONE); + bgpic->clip = restore_pointer_by_name(newmain, (ID *)bgpic->clip, USER_ONE); } if (v3d->localvd) { /*Base *base;*/ @@ -5960,10 +5967,10 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc bDopeSheet *ads = sipo->ads; if (ads) { - ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, 1); + ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, USER_ONE); if (ads->filter_grp) - ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0); + ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, USER_IGNORE); } /* force recalc of list of channels (i.e. includes calculating F-Curve colors) @@ -5973,7 +5980,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc } else if (sl->spacetype == SPACE_BUTS) { SpaceButs *sbuts = (SpaceButs *)sl; - sbuts->pinid = restore_pointer_by_name(newmain, sbuts->pinid, 0); + sbuts->pinid = restore_pointer_by_name(newmain, sbuts->pinid, USER_IGNORE); //XXX if (sbuts->ri) sbuts->ri->curtile = 0; } else if (sl->spacetype == SPACE_FILE) { @@ -5983,11 +5990,11 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc else if (sl->spacetype == SPACE_ACTION) { SpaceAction *saction = (SpaceAction *)sl; - saction->action = restore_pointer_by_name(newmain, (ID *)saction->action, 1); - saction->ads.source = restore_pointer_by_name(newmain, (ID *)saction->ads.source, 1); + saction->action = restore_pointer_by_name(newmain, (ID *)saction->action, USER_ONE); + saction->ads.source = restore_pointer_by_name(newmain, (ID *)saction->ads.source, USER_ONE); if (saction->ads.filter_grp) - saction->ads.filter_grp = restore_pointer_by_name(newmain, (ID *)saction->ads.filter_grp, 0); + saction->ads.filter_grp = restore_pointer_by_name(newmain, (ID *)saction->ads.filter_grp, USER_IGNORE); /* force recalc of list of channels, potentially updating the active action @@ -5998,7 +6005,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc else if (sl->spacetype == SPACE_IMAGE) { SpaceImage *sima = (SpaceImage *)sl; - sima->image = restore_pointer_by_name(newmain, (ID *)sima->image, 2); + sima->image = restore_pointer_by_name(newmain, (ID *)sima->image, USER_REAL); /* this will be freed, not worth attempting to find same scene, * since it gets initialized later */ @@ -6013,8 +6020,8 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc /* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data * so assume that here we're doing for undo only... */ - sima->gpd = restore_pointer_by_name(newmain, (ID *)sima->gpd, 1); - sima->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sima->mask_info.mask, 2); + sima->gpd = restore_pointer_by_name(newmain, (ID *)sima->gpd, USER_ONE); + sima->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sima->mask_info.mask, USER_REAL); } else if (sl->spacetype == SPACE_SEQ) { SpaceSeq *sseq = (SpaceSeq *)sl; @@ -6022,29 +6029,29 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc /* NOTE: pre-2.5, this was local data not lib data, but now we need this as lib data * so assume that here we're doing for undo only... */ - sseq->gpd = restore_pointer_by_name(newmain, (ID *)sseq->gpd, 1); + sseq->gpd = restore_pointer_by_name(newmain, (ID *)sseq->gpd, USER_ONE); } else if (sl->spacetype == SPACE_NLA) { SpaceNla *snla = (SpaceNla *)sl; bDopeSheet *ads = snla->ads; if (ads) { - ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, 1); + ads->source = restore_pointer_by_name(newmain, (ID *)ads->source, USER_ONE); if (ads->filter_grp) - ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, 0); + ads->filter_grp = restore_pointer_by_name(newmain, (ID *)ads->filter_grp, USER_IGNORE); } } else if (sl->spacetype == SPACE_TEXT) { SpaceText *st = (SpaceText *)sl; - st->text = restore_pointer_by_name(newmain, (ID *)st->text, 1); + st->text = restore_pointer_by_name(newmain, (ID *)st->text, USER_ONE); if (st->text == NULL) st->text = newmain->text.first; } else if (sl->spacetype == SPACE_SCRIPT) { SpaceScript *scpt = (SpaceScript *)sl; - scpt->script = restore_pointer_by_name(newmain, (ID *)scpt->script, 1); + scpt->script = restore_pointer_by_name(newmain, (ID *)scpt->script, USER_ONE); /*sc->script = NULL; - 2.45 set to null, better re-run the script */ if (scpt->script) { @@ -6054,7 +6061,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc else if (sl->spacetype == SPACE_OUTLINER) { SpaceOops *so= (SpaceOops *)sl; - so->search_tse.id = restore_pointer_by_name(newmain, so->search_tse.id, 0); + so->search_tse.id = restore_pointer_by_name(newmain, so->search_tse.id, USER_IGNORE); if (so->treestore) { TreeStoreElem *tselem; @@ -6062,7 +6069,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc BLI_mempool_iternew(so->treestore, &iter); while ((tselem = BLI_mempool_iterstep(&iter))) { - tselem->id = restore_pointer_by_name(newmain, tselem->id, 0); + tselem->id = restore_pointer_by_name(newmain, tselem->id, USER_IGNORE); } if (so->treehash) { /* rebuild hash table, because it depends on ids too */ @@ -6076,14 +6083,14 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc bNodeTree *ntree; /* node tree can be stored locally in id too, link this first */ - snode->id = restore_pointer_by_name(newmain, snode->id, 1); - snode->from = restore_pointer_by_name(newmain, snode->from, 0); + snode->id = restore_pointer_by_name(newmain, snode->id, USER_ONE); + snode->from = restore_pointer_by_name(newmain, snode->from, USER_IGNORE); ntree = nodetree_from_id(snode->id); if (ntree) snode->nodetree = ntree; else - snode->nodetree = restore_pointer_by_name(newmain, (ID*)snode->nodetree, 2); + snode->nodetree = restore_pointer_by_name(newmain, (ID*)snode->nodetree, USER_REAL); for (path = snode->treepath.first; path; path = path->next) { if (path == snode->treepath.first) { @@ -6091,7 +6098,7 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc path->nodetree = snode->nodetree; } else - path->nodetree= restore_pointer_by_name(newmain, (ID*)path->nodetree, 2); + path->nodetree= restore_pointer_by_name(newmain, (ID*)path->nodetree, USER_REAL); if (!path->nodetree) break; @@ -6117,15 +6124,15 @@ void blo_lib_link_screen_restore(Main *newmain, bScreen *curscreen, Scene *cursc else if (sl->spacetype == SPACE_CLIP) { SpaceClip *sclip = (SpaceClip *)sl; - sclip->clip = restore_pointer_by_name(newmain, (ID *)sclip->clip, 2); - sclip->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sclip->mask_info.mask, 2); + sclip->clip = restore_pointer_by_name(newmain, (ID *)sclip->clip, USER_REAL); + sclip->mask_info.mask = restore_pointer_by_name(newmain, (ID *)sclip->mask_info.mask, USER_REAL); sclip->scopes.ok = 0; } else if (sl->spacetype == SPACE_LOGIC) { SpaceLogic *slogic = (SpaceLogic *)sl; - slogic->gpd = restore_pointer_by_name(newmain, (ID *)slogic->gpd, 1); + slogic->gpd = restore_pointer_by_name(newmain, (ID *)slogic->gpd, USER_ONE); } } } -- cgit v1.2.3