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;


_______________________________________________
Bf-blender-cvs mailing list
Bf-blender-cvs@blender.org
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to