[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [43870] trunk/blender/source/blender/ blenloader/intern/readfile.c: Fix #30028: VSE Paste Strip Crash

Sergey Sharybin sergey.vfx at gmail.com
Fri Feb 3 14:08:58 CET 2012


Revision: 43870
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=43870
Author:   nazgul
Date:     2012-02-03 13:08:44 +0000 (Fri, 03 Feb 2012)
Log Message:
-----------
Fix #30028: VSE Paste Strip Crash

Crash was caused by invalidation of ID pointers stored in sequencer clipboard
when using undo (undo leads to changes in IDs addresses in memory).

Restore pointers stored in clipboard in the same way as IDs are restoring
for user interface.

Modified Paths:
--------------
    trunk/blender/source/blender/blenloader/intern/readfile.c

Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c	2012-02-03 04:58:55 UTC (rev 43869)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c	2012-02-03 13:08:44 UTC (rev 43870)
@@ -5309,6 +5309,30 @@
 	return NULL;
 }
 
+static int lib_link_seq_clipboard_cb(Sequence *seq, void *arg_pt)
+{
+	Main *newmain = (Main *)arg_pt;
+
+	if(seq->sound) {
+		seq->sound = restore_pointer_by_name(newmain, (ID *)seq->sound, 0);
+		seq->sound->id.us++;
+	}
+
+	if(seq->scene)
+		seq->scene = restore_pointer_by_name(newmain, (ID *)seq->scene, 1);
+
+	if(seq->scene_camera)
+		seq->scene_camera = restore_pointer_by_name(newmain, (ID *)seq->scene_camera, 1);
+
+	return 1;
+}
+
+static void lib_link_clipboard_restore(Main *newmain)
+{
+	/* update IDs stored in sequencer clipboard */
+	seqbase_recursive_apply(&seqbase_clipboard, lib_link_seq_clipboard_cb, newmain);
+}
+
 /* called from kernel/blender.c */
 /* used to link a file (without UI) to the current UI */
 /* note that it assumes the old pointers in UI are still valid, so old Main is not freed */
@@ -5516,6 +5540,9 @@
 			sa= sa->next;
 		}
 	}
+
+	/* update IDs stored in all possible clipboards */
+	lib_link_clipboard_restore(newmain);
 }
 
 static void direct_link_region(FileData *fd, ARegion *ar, int spacetype)




More information about the Bf-blender-cvs mailing list