Merging r48862 through r48868 from trunk into soc-2011-tomato
[blender.git] / source / blender / blenloader / intern / readfile.c
index bfa73c5f7dddcb01900df1c509eb2900bd0d0222..b7df636f9cb8f0ce6d58114d50ecea904a333805 100644 (file)
@@ -1090,6 +1090,10 @@ void blo_freefiledata(FileData *fd)
                        oldnewmap_free(fd->imamap);
                if (fd->movieclipmap)
                        oldnewmap_free(fd->movieclipmap);
+#ifdef USE_MANGO_MASK_CACHE_HACK
+               if (fd->maskmap)
+                       oldnewmap_free(fd->maskmap);
+#endif
                if (fd->libmap && !(fd->flags & FD_FLAGS_NOT_MY_LIBMAP))
                        oldnewmap_free(fd->libmap);
                if (fd->bheadmap)
@@ -1174,6 +1178,15 @@ static void *newmclipadr(FileData *fd, void *adr)              /* used to restor
        return NULL;
 }
 
+#ifdef USE_MANGO_MASK_CACHE_HACK
+static void *newmaskadr(FileData *fd, void *adr)              /* used to restore mask data after undo */
+{
+       if (fd->maskmap && adr)
+               return oldnewmap_lookup_and_inc(fd->maskmap, adr);
+       return NULL;
+}
+#endif
+
 
 static void *newlibadr(FileData *fd, void *lib, void *adr)             /* only lib data */
 {
@@ -1369,6 +1382,38 @@ void blo_end_movieclip_pointer_map(FileData *fd, Main *oldmain)
        }
 }
 
+#ifdef USE_MANGO_MASK_CACHE_HACK
+void blo_make_mask_pointer_map(FileData *fd, Main *oldmain)
+{
+       Mask *mask;
+
+       fd->maskmap = oldnewmap_new();
+
+       for (mask = oldmain->mask.first; mask; mask = mask->id.next) {
+               if (mask->raster_cache)
+                       oldnewmap_insert(fd->maskmap, mask->raster_cache, mask->raster_cache, 0);
+       }
+}
+
+/* set old main mask caches to zero if it has been restored */
+/* this works because freeing old main only happens after this call */
+void blo_end_mask_pointer_map(FileData *fd, Main *oldmain)
+{
+       OldNew *entry = fd->maskmap->entries;
+       Mask *mask;
+       int i;
+
+       /* used entries were restored, so we put them to zero */
+       for (i = 0; i < fd->maskmap->nentries; i++, entry++) {
+               if (entry->nr > 0)
+                       entry->newp = NULL;
+       }
+
+       for (mask = oldmain->mask.first; mask; mask = mask->id.next) {
+               mask->raster_cache = newmclipadr(fd, mask->raster_cache);
+       }
+}
+#endif
 
 /* undo file support: add all library pointers in lookup */
 void blo_add_library_pointer_map(ListBase *mainlist, FileData *fd)
@@ -6256,6 +6301,11 @@ static void direct_link_mask(FileData *fd, Mask *mask)
 {
        MaskLayer *masklay;
 
+#ifdef USE_MANGO_MASK_CACHE_HACK
+       if (fd->maskmap) mask->raster_cache = newmaskadr(fd, mask->raster_cache);
+       else mask->raster_cache = NULL;
+#endif
+
        mask->adt = newdataadr(fd, mask->adt);
 
        link_list(fd, &mask->masklayers);
@@ -8047,7 +8097,7 @@ BlendFileData *blo_read_file_internal(FileData *fd, const char *filepath)
        fix_relpaths_library(fd->relabase, bfd->main); /* make all relative paths, relative to the open blend file */
        
        link_global(fd, bfd);   /* as last */
-       
+
        return bfd;
 }