[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41148] trunk/blender/source/blender/imbuf /intern/openexr/openexr_api.cpp: reverting 41124, maybe better solution is to enforce linear space in generated float images

Antony Riakiotakis kalast at gmail.com
Thu Oct 20 14:15:42 CEST 2011


Revision: 41148
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41148
Author:   psy-fi
Date:     2011-10-20 12:15:39 +0000 (Thu, 20 Oct 2011)
Log Message:
-----------
reverting 41124, maybe better solution is to enforce linear space in generated float images

Modified Paths:
--------------
    trunk/blender/source/blender/imbuf/intern/openexr/openexr_api.cpp

Modified: trunk/blender/source/blender/imbuf/intern/openexr/openexr_api.cpp
===================================================================
--- trunk/blender/source/blender/imbuf/intern/openexr/openexr_api.cpp	2011-10-20 11:18:57 UTC (rev 41147)
+++ trunk/blender/source/blender/imbuf/intern/openexr/openexr_api.cpp	2011-10-20 12:15:39 UTC (rev 41148)
@@ -342,55 +342,27 @@
 		
 		FrameBuffer frameBuffer;			
 		OutputFile *file = new OutputFile(name, header);			
-		int xstride = sizeof(float) * 4;
-		int ystride = xstride*width;
-		float *init_to = new float [4 * width*height * sizeof(float)];
-		float *from, *to = init_to;
+		int xstride = sizeof(float) * channels;
+		int ystride = - xstride*width;
+		float *rect[4] = {NULL, NULL, NULL, NULL};
 
-		frameBuffer.insert ("R", Slice (FLOAT,  (char *)init_to, xstride, ystride));
-		frameBuffer.insert ("G", Slice (FLOAT,  (char *)(init_to + 1), xstride, ystride));
-		frameBuffer.insert ("B", Slice (FLOAT,  (char *)(init_to + 2), xstride, ystride));
+		/* last scanline, stride negative */
+		rect[0]= ibuf->rect_float + channels*(height-1)*width;
+		rect[1]= rect[0]+1;
+		rect[2]= rect[0]+2;
+		rect[3]= (channels >= 4)? rect[0]+3:rect[0]; /* red as alpha, is this needed since alpha isnt written? */
+
+		frameBuffer.insert ("R", Slice (FLOAT,  (char *)rect[0], xstride, ystride));
+		frameBuffer.insert ("G", Slice (FLOAT,  (char *)rect[1], xstride, ystride));
+		frameBuffer.insert ("B", Slice (FLOAT,  (char *)rect[2], xstride, ystride));
 		if (ibuf->depth==32 && channels >= 4)
-			frameBuffer.insert ("A", Slice (FLOAT,  (char *)(init_to + 3), xstride, ystride));
+			frameBuffer.insert ("A", Slice (FLOAT,  (char *)rect[3], xstride, ystride));
 		if (write_zbuf)
 			frameBuffer.insert ("Z", Slice (FLOAT, (char *) (ibuf->zbuf_float + (height-1)*width),
 											sizeof(float), sizeof(float) * -width));
-
-		if(ibuf->profile == IB_PROFILE_LINEAR_RGB) {
-			for (int i = ibuf->y-1; i >= 0; i--)
-			{
-				from= ibuf->rect_float + channels*i*width;
-
-				for (int j = ibuf->x; j > 0; j--)
-				{
-					to[0] = from[0];
-					to[1] = from[1];
-					to[2] = from[2];
-					to[3] = (channels >= 4)? from[3]: 1.0f;
-					to+= 4; from += 4;
-				}
-			}
-		}
-		else {
-			for (int i = ibuf->y-1; i >= 0; i--)
-			{
-				from= ibuf->rect_float + channels*i*width;
-
-				for (int j = ibuf->x; j > 0; j--)
-				{
-					to[0] = srgb_to_linearrgb(from[0]);
-					to[1] = srgb_to_linearrgb(from[1]);
-					to[2] = srgb_to_linearrgb(from[2]);
-					to[3] = (channels >= 4)? from[3]: 1.0f;
-					to+= 4; from += 4;
-				}
-			}
-		}
-
 		file->setFrameBuffer (frameBuffer);				  
 		file->writePixels (height);					  
 		delete file;
-		delete [] init_to;
 	}
 	catch (const std::exception &exc)
 	{




More information about the Bf-blender-cvs mailing list