[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [18700] branches/blender2.5/blender/source /blender/blenkernel: 2.5

Ton Roosendaal ton at blender.org
Tue Jan 27 20:32:44 CET 2009


Revision: 18700
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=18700
Author:   ton
Date:     2009-01-27 20:32:44 +0100 (Tue, 27 Jan 2009)

Log Message:
-----------
2.5

Added support in threaded compositor to copy the viewer
image safely away, prevents crashing especially for
people using blender -E or redrawing viewer while it
composites.

(Note; reloading images in nodes, render result, and
probably other cases have to be checked still)

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_image.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/image.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/node.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_image.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_image.h	2009-01-27 18:36:58 UTC (rev 18699)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_image.h	2009-01-27 19:32:44 UTC (rev 18700)
@@ -148,6 +148,12 @@
 /* prints memory statistics for images */
 void BKE_image_print_memlist(void);
 
+/* empty image block, of similar type and filename */
+struct Image *BKE_image_copy(struct Image *ima);
+
+/* merge source into dest, and free source */
+void BKE_image_merge(struct Image *dest, struct Image *source);
+
 #ifdef __cplusplus
 }
 #endif

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/image.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/image.c	2009-01-27 18:36:58 UTC (rev 18699)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/image.c	2009-01-27 19:32:44 UTC (rev 18700)
@@ -91,6 +91,7 @@
 /* quick lookup: supports 1 million frames, thousand passes */
 #define IMA_MAKE_INDEX(frame, index)	((frame)<<10)+index
 #define IMA_INDEX_FRAME(index)			(index>>10)
+#define IMA_INDEX_PASS(index)			(index & ~1023)
 
 /* ******** IMAGE PROCESSING ************* */
 
@@ -332,6 +333,33 @@
 	}
 }
 
+/* empty image block, of similar type and filename */
+Image *BKE_image_copy(Image *ima)
+{
+	Image *new= image_alloc(ima->id.name+2, ima->source, ima->type);
+
+	BLI_strncpy(new->name, ima->name, sizeof(ima->name));
+	
+	new->gen_x= ima->gen_x;
+	new->gen_y= ima->gen_y;
+	new->gen_type= ima->gen_type;
+	
+	return new;
+}
+
+void BKE_image_merge(Image *dest, Image *source)
+{
+	ImBuf *ibuf;
+	
+	while((ibuf= source->ibufs.first)) {
+		BLI_remlink(&source->ibufs, ibuf);
+		image_assign_ibuf(dest, ibuf, IMA_INDEX_PASS(ibuf->index), IMA_INDEX_FRAME(ibuf->index));
+	}
+	
+	free_libblock(&G.main->image, source);
+}
+
+
 /* checks if image was already loaded, then returns same image */
 /* otherwise creates new. */
 /* does not load ibuf itself */

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/node.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/node.c	2009-01-27 18:36:58 UTC (rev 18699)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/node.c	2009-01-27 19:32:44 UTC (rev 18700)
@@ -2487,6 +2487,12 @@
 		/* ensure new user input gets handled ok */
 		node->need_exec= 0;
 		
+		if(ELEM(node->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+			if(node->id && (node->flag & NODE_DO_OUTPUT)) {
+				node->new_node->id= (ID *)BKE_image_copy((Image *)node->id);
+			}
+		}
+		
 		for(sock= node->outputs.first; sock; sock= sock->next) {
 			
 			sock->new_sock->ns.data= sock->ns.data;
@@ -2555,6 +2561,12 @@
 				lnode->preview= NULL;
 			}
 			
+			if(ELEM(lnode->type, CMP_NODE_VIEWER, CMP_NODE_SPLITVIEWER)) {
+				if(lnode->id && (lnode->flag & NODE_DO_OUTPUT)) {
+					BKE_image_merge((Image *)lnode->new_node->id, (Image *)lnode->id);
+				}
+			}
+			
 			for(lsock= lnode->outputs.first; lsock; lsock= lsock->next) {
 				if(outsocket_exists(lnode->new_node, lsock->new_sock)) {
 					lsock->new_sock->ns.data= lsock->ns.data;





More information about the Bf-blender-cvs mailing list