[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28864] trunk/blender/source/blender/imbuf /intern/openexr/openexr_api.cpp: revert 28807, fix for [#21385] Multilayer OpenEXR files import into other compositors upside down

Campbell Barton ideasman42 at gmail.com
Wed May 19 18:23:10 CEST 2010


Revision: 28864
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28864
Author:   campbellbarton
Date:     2010-05-19 18:23:09 +0200 (Wed, 19 May 2010)

Log Message:
-----------
revert 28807, fix for [#21385] Multilayer OpenEXR files import into other compositors upside down

looks like a threading problem:
 Easy to redo, 1024x436, FSA, 4 threads.

With 1 thread it runs ok, need to look into this further but no time now so reverting.

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	2010-05-19 16:19:17 UTC (rev 28863)
+++ trunk/blender/source/blender/imbuf/intern/openexr/openexr_api.cpp	2010-05-19 16:23:09 UTC (rev 28864)
@@ -462,31 +462,18 @@
 	openexr_header_compression(&header, compress);
 	// openexr_header_metadata(&header, ibuf); // no imbuf. cant write
 	/* header.lineOrder() = DECREASING_Y; this crashes in windows for file read! */
-
-	header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.52.5"));
 	
+	header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.43 and newer"));
+	
 	data->ofile = new OutputFile(filename, header);
 }
 
 void IMB_exrtile_begin_write(void *handle, char *filename, int mipmap, int width, int height, int tilex, int tiley)
 {
 	ExrHandle *data= (ExrHandle *)handle;
-	Header *header;
+	Header header (width, height);
 	ExrChannel *echan;
 	
-	/* open exr specify tiles must allign with top left frame coord but blender
-	render with tiles alligned to the bottom left. We work around this by saving
-	the whole area covered by the tyles (the data window) and defining a display
-	window that cover only the rendered area */
-
-	int ntx = ceil((float)width/tilex);
-	int nty = ceil((float)height/tiley);
-	Box2i dispw(V2i(0,0), V2i(width-1, height-1));
-	Box2i dataw(V2i( width -(ntx*tilex) , height -(nty*tiley) ), V2i(ntx*tilex-1, height-1));
-	V2f swc(0.0f, 0.0f);
-	header = new Header(dispw, dataw, 1.0, swc, 1, RANDOM_Y, RLE_COMPRESSION);
-
-
 	data->tilex= tilex;
 	data->tiley= tiley;
 	data->width= width;
@@ -494,17 +481,15 @@
 	data->mipmap= mipmap;
 	
 	for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next)
-		header->channels().insert (echan->name, Channel (FLOAT));
+		header.channels().insert (echan->name, Channel (FLOAT));
 	
-	header->setTileDescription (TileDescription (tilex, tiley, (mipmap)? MIPMAP_LEVELS: ONE_LEVEL));
-	header->lineOrder() = RANDOM_Y;
-	header->compression() = RLE_COMPRESSION;
+	header.setTileDescription (TileDescription (tilex, tiley, (mipmap)? MIPMAP_LEVELS: ONE_LEVEL));
+	header.lineOrder() = RANDOM_Y;
+	header.compression() = RLE_COMPRESSION;
 	
-	header->insert ("BlenderMultiChannel", StringAttribute ("Blender V2.52.5"));
-
-	data->tofile = new TiledOutputFile(filename, *header);
-
-	delete header;
+	header.insert ("BlenderMultiChannel", StringAttribute ("Blender V2.43"));
+	
+	data->tofile = new TiledOutputFile(filename, header);
 }
 
 /* read from file */
@@ -515,7 +500,7 @@
 	if(BLI_exists(filename) && BLI_filepathsize(filename)>32) {	/* 32 is arbitrary, but zero length files crashes exr */
 		data->ifile = new InputFile(filename);
 		if(data->ifile) {
-			Box2i dw = data->ifile->header().displayWindow();
+			Box2i dw = data->ifile->header().dataWindow();
 			data->width= *width  = dw.max.x - dw.min.x + 1;
 			data->height= *height = dw.max.y - dw.min.y + 1;
 			
@@ -569,32 +554,19 @@
 	ExrHandle *data= (ExrHandle *)handle;
 	FrameBuffer frameBuffer;
 	ExrChannel *echan;
-	float *rect;
-	int xs, ys;
-	int x, y;
 	
 	for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) {
+		float *rect= echan->rect - echan->xstride*partx - echan->ystride*party;
 
-		/* coordinates for relative tile coordinates, starting from top of tile,
-		   striding left->right, top->bottom */
-		rect= echan->rect + (data->tiley-1)*echan->ystride;
-		xs = echan->xstride*sizeof(float);
-		ys = -echan->ystride*sizeof(float);
-		
 		frameBuffer.insert (echan->name, Slice (FLOAT,  (char *)rect, 
-							xs, ys,			//xStride, yStride
-							1, 1, 0.0,		// xSampling, ySampling, fillValue
-							true, true) );	// xTileCoords, yTileCoords  (use relative tile coords)
+							echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
 	}
 	
 	data->tofile->setFrameBuffer (frameBuffer);
 
-	x = partx/data->tilex;
-	/* flip tile grid vertically to conform to EXR coordinate system */
-	y = ceil((float)data->height/data->tiley) - (party/data->tiley) - 1;
-
 	try {
-		data->tofile->writeTile (x, y, level);
+		// printf("write tile %d %d\n", partx/data->tilex, party/data->tiley);
+		data->tofile->writeTile (partx/data->tilex, party/data->tiley, level);
 	}
 	catch (const std::exception &exc) {
 		std::cerr << "OpenEXR-writeTile: ERROR: " << exc.what() << std::endl;
@@ -608,12 +580,9 @@
 	ExrChannel *echan;
 	
 	if(data->channels.first) {
-		for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) {
-			float *rect = echan->rect + echan->xstride*(data->height-1)*data->width;
-			
-			frameBuffer.insert (echan->name, Slice (FLOAT,  (char *)rect, 
-									echan->xstride*sizeof(float), -echan->ystride*sizeof(float)));
-		}
+		for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next)
+			frameBuffer.insert (echan->name, Slice (FLOAT,  (char *)echan->rect, 
+													echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
 		
 		data->ofile->setFrameBuffer (frameBuffer);
 		try {
@@ -633,21 +602,12 @@
 	ExrHandle *data= (ExrHandle *)handle;
 	FrameBuffer frameBuffer;
 	ExrChannel *echan;
-
-	/* check if exr was save with previous version of blender which flipped images */
-	const StringAttribute *ta = data->ifile->header().findTypedAttribute <StringAttribute> ("BlenderMultiChannel");
-	short flip = (ta && strncmp(ta->value().c_str(), "Blender V2.43", 13)==0); /* 'Blender V2.43 and newer' is covered too */
-
+	
 	for(echan= (ExrChannel *)data->channels.first; echan; echan= echan->next) {
 		/* no datawindow correction needed */
-		if(echan->rect) {
-			if(flip)
-				frameBuffer.insert (echan->name, Slice (FLOAT,  (char *)echan->rect,
+		if(echan->rect)
+			frameBuffer.insert (echan->name, Slice (FLOAT,  (char *)echan->rect, 
 												echan->xstride*sizeof(float), echan->ystride*sizeof(float)));
-			else
-				frameBuffer.insert (echan->name, Slice (FLOAT,  (char *)(echan->rect + echan->xstride*(data->height-1)*data->width),
-												echan->xstride*sizeof(float), -echan->ystride*sizeof(float)));
-		}
 		else 
 			printf("warning, channel with no rect set %s\n", echan->name);
 	}





More information about the Bf-blender-cvs mailing list