Commit: 907be3632c60646eb6e53b7230423ad53efbac48
Author: Lukas Tönne
Date:   Fri Feb 21 10:29:08 2014 +0100
https://developer.blender.org/rB907be3632c60646eb6e53b7230423ad53efbac48

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.

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

M       source/blender/blenloader/intern/readfile.c

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

diff --git a/source/blender/blenloader/intern/readfile.c 
b/source/blender/blenloader/intern/readfile.c
index c14b34a..61df546 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);
                                        
        

@@ Diff output truncated at 10240 characters. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to