[Bf-blender-cvs] [5b02b24] free-refcount-ids: Free IDs: images & lamps.

Bastien Montagne noreply at git.blender.org
Wed Sep 30 20:27:08 CEST 2015


Commit: 5b02b2429aee6cc9a3bb773f4d0e8c0b35340230
Author: Bastien Montagne
Date:   Sun Sep 27 15:28:57 2015 +0200
Branches: free-refcount-ids
https://developer.blender.org/rB5b02b2429aee6cc9a3bb773f4d0e8c0b35340230

Free IDs: images & lamps.

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

M	source/blender/blenkernel/BKE_image.h
M	source/blender/blenkernel/BKE_lamp.h
M	source/blender/blenkernel/intern/image.c
M	source/blender/blenkernel/intern/lamp.c
M	source/blender/blenkernel/intern/library.c
M	source/blender/blenkernel/intern/material.c
M	source/blender/editors/render/render_preview.c

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

diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h
index 94afc8a..baea56a 100644
--- a/source/blender/blenkernel/BKE_image.h
+++ b/source/blender/blenkernel/BKE_image.h
@@ -59,7 +59,7 @@ void    BKE_image_free_packedfiles(struct Image *image);
 void    BKE_image_free_views(struct Image *image);
 void    BKE_image_free_buffers(struct Image *image);
 /* call from library */
-void    BKE_image_free(struct Image *image);
+void    BKE_image_free(struct Image *image, const bool do_id_user);
 
 typedef void (StampCallback)(void *data, const char *propname, char *propvalue, int len);
 
diff --git a/source/blender/blenkernel/BKE_lamp.h b/source/blender/blenkernel/BKE_lamp.h
index fb2c4da..5e20303 100644
--- a/source/blender/blenkernel/BKE_lamp.h
+++ b/source/blender/blenkernel/BKE_lamp.h
@@ -46,7 +46,8 @@ struct Lamp *BKE_lamp_add(struct Main *bmain, const char *name) ATTR_WARN_UNUSED
 struct Lamp *BKE_lamp_copy(struct Lamp *la) ATTR_WARN_UNUSED_RESULT;
 struct Lamp *localize_lamp(struct Lamp *la) ATTR_WARN_UNUSED_RESULT;
 void BKE_lamp_make_local(struct Lamp *la);
-void BKE_lamp_free(struct Lamp *la);
+void BKE_lamp_release_datablocks(struct Lamp *la);
+void BKE_lamp_free(struct Lamp *la, const bool do_id_user);
 
 void lamp_drivers_update(struct Scene *scene, struct Lamp *la, float ctime);
 
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 4a76c70..1c3c594 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -329,17 +329,39 @@ void BKE_image_free_buffers(Image *ima)
 	ima->ok = IMA_OK;
 }
 
-/* called by library too, do not free ima itself */
-void BKE_image_free(Image *ima)
+#if 0  /* Not needed currently. */
+/**
+ * Release all datablocks (ID) used by this image (datablocks are never freed, they are just unreferenced).
+ *
+ * \param ima The image which has to release its data.
+ */
+void BKE_image_release_datablocks(Image *ima)
+{
+}
+#endif
+
+/**
+ * Free (or release) any data used by this image (does not free the image itself).
+ *
+ * \param ima The image to free.
+ * \param do_id_user When \a true, ID datablocks used (referenced) by this image are 'released'
+ *                   (their user count is decreased).
+ */
+void BKE_image_free(Image *ima, const bool UNUSED(do_id_user))
 {
 	int a;
 
+#if 0
+	if (do_id_user) {
+		BKE_image_release_datablocks(ima);
+	}
+#endif
+
 	BKE_image_free_buffers(ima);
 
 	image_free_packedfiles(ima);
 
 	BKE_icon_id_delete(&ima->id);
-	ima->id.icon_id = 0;
 
 	BKE_previewimg_free(&ima->preview);
 
@@ -351,7 +373,10 @@ void BKE_image_free(Image *ima)
 	}
 
 	image_free_views(ima);
-	MEM_freeN(ima->stereo3d_format);
+	if (ima->stereo3d_format) {
+		MEM_freeN(ima->stereo3d_format);
+		ima->stereo3d_format = NULL;
+	}
 }
 
 /* only image block itself */
diff --git a/source/blender/blenkernel/intern/lamp.c b/source/blender/blenkernel/intern/lamp.c
index 44e35c6..f413879 100644
--- a/source/blender/blenkernel/intern/lamp.c
+++ b/source/blender/blenkernel/intern/lamp.c
@@ -210,30 +210,66 @@ void BKE_lamp_make_local(Lamp *la)
 	}
 }
 
-void BKE_lamp_free(Lamp *la)
+/**
+ * Release all datablocks (ID) used by this lamp (datablocks are never freed, they are just unreferenced).
+ *
+ * \param la The lamp which has to release its data.
+ */
+void BKE_lamp_release_datablocks(Lamp *la)
 {
 	MTex *mtex;
 	int a;
 
+	if (la == NULL)
+		return;
+
 	for (a = 0; a < MAX_MTEX; a++) {
 		mtex = la->mtex[a];
-		if (mtex && mtex->tex) mtex->tex->id.us--;
-		if (mtex) MEM_freeN(mtex);
+		if (mtex && mtex->tex) {
+			mtex->tex->id.us--;
+			mtex->tex = 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_lamp_free(Lamp *la, const bool do_id_user)
+{
+	MTex *mtex;
+	int a;
+
+	if (do_id_user) {
+		BKE_lamp_release_datablocks(la);
+	}
+
+	for (a = 0; a < MAX_MTEX; a++) {
+		mtex = la->mtex[a];
+		if (mtex) {
+			MEM_freeN(mtex);
+			la->mtex[a] = NULL;
+		}
 	}
 	
 	BKE_animdata_free((ID *)la);
 
 	curvemapping_free(la->curfalloff);
+	la->curfalloff = NULL;
 
 	/* is no lib link block, but lamp extension */
 	if (la->nodetree) {
-		ntreeFreeTree(la->nodetree);
+		ntreeFreeTree_ex(la->nodetree, do_id_user);
 		MEM_freeN(la->nodetree);
+		la->nodetree = NULL;
 	}
 	
 	BKE_previewimg_free(&la->preview);
 	BKE_icon_id_delete(&la->id);
-	la->id.icon_id = 0;
 }
 
 /* Calculate all drivers for lamps, see material_drivers_update for why this is a bad hack */
diff --git a/source/blender/blenkernel/intern/library.c b/source/blender/blenkernel/intern/library.c
index a83b1e0..06aebae 100644
--- a/source/blender/blenkernel/intern/library.c
+++ b/source/blender/blenkernel/intern/library.c
@@ -967,13 +967,13 @@ void BKE_libblock_free_ex(Main *bmain, void *idv, bool do_id_user)
 			BKE_texture_free((Tex *)id, do_id_user);
 			break;
 		case ID_IM:
-			BKE_image_free((Image *)id);
+			BKE_image_free((Image *)id, do_id_user);
 			break;
 		case ID_LT:
 			BKE_lattice_free((Lattice *)id);
 			break;
 		case ID_LA:
-			BKE_lamp_free((Lamp *)id);
+			BKE_lamp_free((Lamp *)id, do_id_user);
 			break;
 		case ID_CA:
 			BKE_camera_free((Camera *) id);
diff --git a/source/blender/blenkernel/intern/material.c b/source/blender/blenkernel/intern/material.c
index d6654fb..b189dbd 100644
--- a/source/blender/blenkernel/intern/material.c
+++ b/source/blender/blenkernel/intern/material.c
@@ -146,6 +146,7 @@ void BKE_material_free(Material *ma, const bool do_id_user)
 	if (ma->nodetree) {
 		ntreeFreeTree_ex(ma->nodetree, do_id_user);
 		MEM_freeN(ma->nodetree);
+		ma->nodetree = NULL;
 	}
 
 	if (ma->texpaintslot) {
diff --git a/source/blender/editors/render/render_preview.c b/source/blender/editors/render/render_preview.c
index 8a31bc0..e0394ab 100644
--- a/source/blender/editors/render/render_preview.c
+++ b/source/blender/editors/render/render_preview.c
@@ -876,7 +876,7 @@ static void shader_preview_free(void *customdata)
 		
 		/* get rid of copied lamp */
 		BLI_remlink(&pr_main->lamp, sp->lampcopy);
-		BKE_lamp_free(sp->lampcopy);
+		BKE_lamp_free(sp->lampcopy, false);
 		
 		properties = IDP_GetProperties((ID *)sp->lampcopy, false);
 		if (properties) {




More information about the Bf-blender-cvs mailing list