[Bf-blender-cvs] [b63872c] free-refcount-ids: Free IDs: MovieClip & Mask.

Bastien Montagne noreply at git.blender.org
Thu Oct 1 17:44:27 CEST 2015


Commit: b63872cd5e199614b65aed3df2168e4c41cb0f3b
Author: Bastien Montagne
Date:   Thu Oct 1 17:38:04 2015 +0200
Branches: free-refcount-ids
https://developer.blender.org/rBb63872cd5e199614b65aed3df2168e4c41cb0f3b

Free IDs: MovieClip & Mask.

Mask freeing was doing really bad (as in, not consistent with other ID freeing code) things (unlinking, and even not freeing animdata!).

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

M	source/blender/blenkernel/BKE_mask.h
M	source/blender/blenkernel/BKE_movieclip.h
M	source/blender/blenkernel/intern/library.c
M	source/blender/blenkernel/intern/mask.c
M	source/blender/blenkernel/intern/movieclip.c
M	source/blender/blenkernel/intern/sequencer.c
M	source/blender/compositor/operations/COM_MaskOperation.cpp
M	source/blender/makesrna/intern/rna_main_api.c

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

diff --git a/source/blender/blenkernel/BKE_mask.h b/source/blender/blenkernel/BKE_mask.h
index 2f85db4..cc74869 100644
--- a/source/blender/blenkernel/BKE_mask.h
+++ b/source/blender/blenkernel/BKE_mask.h
@@ -123,8 +123,8 @@ struct Mask *BKE_mask_new(struct Main *bmain, const char *name);
 struct Mask *BKE_mask_copy_nolib(struct Mask *mask);
 struct Mask *BKE_mask_copy(struct Mask *mask);
 
-void BKE_mask_free_nolib(struct Mask *mask);
-void BKE_mask_free(struct Main *bmain, struct Mask *mask);
+void BKE_mask_free(struct Mask *mask, const bool do_id_user);
+void BKE_mask_unlink(struct Main *bmain, struct Mask *mask);
 
 void BKE_mask_coord_from_frame(float r_co[2], const float co[2], const float frame_size[2]);
 void BKE_mask_coord_from_movieclip(struct MovieClip *clip, struct MovieClipUser *user, float r_co[2], const float co[2]);
diff --git a/source/blender/blenkernel/BKE_movieclip.h b/source/blender/blenkernel/BKE_movieclip.h
index 7d76752..35d1e7e 100644
--- a/source/blender/blenkernel/BKE_movieclip.h
+++ b/source/blender/blenkernel/BKE_movieclip.h
@@ -39,7 +39,8 @@ struct MovieClipScopes;
 struct MovieClipUser;
 struct MovieDistortion;
 
-void BKE_movieclip_free(struct MovieClip *clip);
+void BKE_movieclip_release_datablocks(struct MovieClip *clip);
+void BKE_movieclip_free(struct MovieClip *clip, const bool do_id_user);
 void BKE_movieclip_unlink(struct Main *bmain, struct MovieClip *clip);
 
 struct MovieClip *BKE_movieclip_file_add(struct Main *bmain, const char *name);
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index 43fe5f4..2f640e1 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -1031,10 +1031,10 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
 			BKE_gpencil_free((bGPdata *)id, do_id_user);
 			break;
 		case ID_MC:
-			BKE_movieclip_free((MovieClip *)id);
+			BKE_movieclip_free((MovieClip *)id, do_id_user);
 			break;
 		case ID_MSK:
-			BKE_mask_free(bmain, (Mask *)id);
+			BKE_mask_free((Mask *)id, do_id_user);
 			break;
 		case ID_LS:
 			BKE_linestyle_free((FreestyleLineStyle *)id, do_id_user);
diff --git a/source/blender/blenkernel/intern/mask.c b/source/blender/blenkernel/intern/mask.c
index 141597e..accacb8 100644
--- a/source/blender/blenkernel/intern/mask.c
+++ b/source/blender/blenkernel/intern/mask.c
@@ -1016,13 +1016,15 @@ void BKE_mask_layer_free_list(ListBase *masklayers)
 	}
 }
 
-/** free for temp copy, but don't manage unlinking from other pointers */
-void BKE_mask_free_nolib(Mask *mask)
+void BKE_mask_free(Mask *mask, const bool UNUSED(do_id_user))
 {
+	BKE_animdata_free((ID *)mask);
+
+	/* free mask data */
 	BKE_mask_layer_free_list(&mask->masklayers);
 }
 
-void BKE_mask_free(Main *bmain, Mask *mask)
+void BKE_mask_unlink(Main *bmain, Mask *mask)
 {
 	bScreen *scr;
 	ScrArea *area;
@@ -1073,9 +1075,6 @@ void BKE_mask_free(Main *bmain, Mask *mask)
 	FOREACH_NODETREE(bmain, ntree, id) {
 		BKE_node_tree_unlink_id((ID *)mask, ntree);
 	} FOREACH_NODETREE_END
-
-	/* free mask data */
-	BKE_mask_layer_free_list(&mask->masklayers);
 }
 
 void BKE_mask_coord_from_frame(float r_co[2], const float co[2], const float frame_size[2])
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c
index 7a8c4ad..06e1036 100644
--- a/source/blender/blenkernel/intern/movieclip.c
+++ b/source/blender/blenkernel/intern/movieclip.c
@@ -44,6 +44,7 @@
 #include "MEM_guardedalloc.h"
 
 #include "DNA_constraint_types.h"
+#include "DNA_gpencil_types.h"
 #include "DNA_screen_types.h"
 #include "DNA_space_types.h"
 #include "DNA_movieclip_types.h"
@@ -1402,8 +1403,32 @@ void BKE_movieclip_build_proxy_frame_for_ibuf(MovieClip *clip, ImBuf *ibuf, stru
 	}
 }
 
-void BKE_movieclip_free(MovieClip *clip)
+/**
+ * Release all datablocks (ID) used by this clip (datablocks are never freed, they are just unreferenced).
+ *
+ * \param clip The clip which has to release its data.
+ */
+void BKE_movieclip_release_datablocks(MovieClip *clip)
+{
+	if (clip->gpd) {
+		id_us_min(&clip->gpd->id);
+		clip->gpd = NULL;
+	}
+}
+
+/**
+ * Free (or release) any data used by this lamp (does not free the lamp itself).
+ *
+ * \param la The lamp to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this lamp are 'released'
+ *                   (their user count is decreased).
+ */
+void BKE_movieclip_free(MovieClip *clip, const bool do_id_user)
 {
+	if (do_id_user) {
+		BKE_movieclip_release_datablocks(clip);
+	}
+
 	free_buffers(clip);
 
 	BKE_tracking_free(&clip->tracking);
diff --git a/source/blender/blenkernel/intern/sequencer.c b/source/blender/blenkernel/intern/sequencer.c
index daabacb..f7ec7d4 100644
--- a/source/blender/blenkernel/intern/sequencer.c
+++ b/source/blender/blenkernel/intern/sequencer.c
@@ -3022,7 +3022,7 @@ static ImBuf *seq_render_mask(const SeqRenderData *context, Mask *mask, float nr
 
 		BKE_maskrasterize_handle_init(mr_handle, mask_temp, context->rectx, context->recty, true, true, true);
 
-		BKE_mask_free_nolib(mask_temp);
+		BKE_mask_free(mask_temp, false);
 		MEM_freeN(mask_temp);
 
 		BKE_maskrasterize_buffer(mr_handle, context->rectx, context->recty, maskbuf);
diff --git a/source/blender/compositor/operations/COM_MaskOperation.cpp b/source/blender/compositor/operations/COM_MaskOperation.cpp
index 220b4e9..5202134 100644
--- a/source/blender/compositor/operations/COM_MaskOperation.cpp
+++ b/source/blender/compositor/operations/COM_MaskOperation.cpp
@@ -94,7 +94,7 @@ void MaskOperation::initExecution()
 				frame_iter += frame_step;
 			}
 
-			BKE_mask_free_nolib(mask_temp);
+			BKE_mask_free(mask_temp, false);
 			MEM_freeN(mask_temp);
 		}
 	}
diff --git a/source/blender/makesrna/intern/rna_main_api.c b/source/blender/makesrna/intern/rna_main_api.c
index 6e9f61a..fcac879 100644
--- a/source/blender/makesrna/intern/rna_main_api.c
+++ b/source/blender/makesrna/intern/rna_main_api.c
@@ -709,7 +709,7 @@ static Mask *rna_Main_mask_new(Main *bmain, const char *name)
 static void rna_Main_masks_remove(Main *bmain, PointerRNA *mask_ptr)
 {
 	Mask *mask = mask_ptr->data;
-	BKE_mask_free(bmain, mask);
+	BKE_mask_unlink(bmain, mask);
 	BKE_libblock_free(bmain, mask);
 	RNA_POINTER_INVALIDATE(mask_ptr);
 }




More information about the Bf-blender-cvs mailing list