[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [49172] branches/soc-2011-tomato/source/ blender: Color management: fix memory corruption when using border rendering

Sergey Sharybin sergey.vfx at gmail.com
Tue Jul 24 13:49:22 CEST 2012


Revision: 49172
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=49172
Author:   nazgul
Date:     2012-07-24 11:49:21 +0000 (Tue, 24 Jul 2012)
Log Message:
-----------
Color management: fix memory corruption when using border rendering

Image's get render result function used to modify ImBuf directly,
without making needed invalidates to color management cache when
it's needed.

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/blenkernel/intern/image.c
    branches/soc-2011-tomato/source/blender/imbuf/intern/colormanagement.c

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/image.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/image.c	2012-07-24 10:28:29 UTC (rev 49171)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/image.c	2012-07-24 11:49:21 UTC (rev 49172)
@@ -2560,6 +2560,13 @@
 		image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0);
 	}
 
+	/* invalidate color managed buffers if render result changed */
+	BLI_lock_thread(LOCK_COLORMANAGE);
+	if (ibuf->x != rres.rectx || ibuf->y != rres.recty || ibuf->rect_float != rectf) {
+		IMB_display_buffer_invalidate(ibuf);
+	}
+	BLI_unlock_thread(LOCK_COLORMANAGE);
+
 	ibuf->x = rres.rectx;
 	ibuf->y = rres.recty;
 

Modified: branches/soc-2011-tomato/source/blender/imbuf/intern/colormanagement.c
===================================================================
--- branches/soc-2011-tomato/source/blender/imbuf/intern/colormanagement.c	2012-07-24 10:28:29 UTC (rev 49171)
+++ branches/soc-2011-tomato/source/blender/imbuf/intern/colormanagement.c	2012-07-24 11:49:21 UTC (rev 49172)
@@ -316,6 +316,10 @@
 	if (cache_ibuf) {
 		ColormnaageCacheData *cache_data;
 
+		BLI_assert(cache_ibuf->x == ibuf->x &&
+		           cache_ibuf->y == ibuf->y &&
+		           cache_ibuf->channels == ibuf->channels);
+
 		/* only buffers with different color space conversions are being stored
 		 * in cache separately. buffer which were used only different exposure/gamma
 		 * are re-suing the same cached buffer
@@ -1822,7 +1826,6 @@
 
 	int *display_buffer_flags;
 
-	int buffer_width = ibuf->x;
 	int channels = ibuf->channels;
 	int predivide = ibuf->flags & IB_cm_predivide;
 	int dither = ibuf->dither;
@@ -1859,12 +1862,19 @@
 				void *cache_handle;
 				int view_index = view + 1; /* views in configuration are 1-based */
 				float exposure, gamma;
+				int buffer_width;
 
 				view_settings.view = view_index;
 
 				BLI_lock_thread(LOCK_COLORMANAGE);
 				display_buffer = colormanage_cache_get_cache_data(ibuf, &view_settings, &display_settings,
 				                                                  &cache_handle, &exposure, &gamma);
+
+				/* in some rare cases buffer's dimension could be changing directly from
+				 * different thread
+				 * this i.e. happens when image editor acquires render result
+				 */
+				buffer_width = ibuf->x;
 				BLI_unlock_thread(LOCK_COLORMANAGE);
 
 				if (display_buffer) {




More information about the Bf-blender-cvs mailing list