Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2010-05-19 20:23:09 +0400
committerCampbell Barton <ideasman42@gmail.com>2010-05-19 20:23:09 +0400
commit7f575ddf89626d8c0b5a185db228d89053244033 (patch)
treefcc15e22b6855a3e648b0dcfe29ac61760efbfe6 /source/blender/imbuf
parent67a8b3d3e54685e3ad0e19d5ce5fd4c8900de2b2 (diff)
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.
Diffstat (limited to 'source/blender/imbuf')
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp82
1 files changed, 21 insertions, 61 deletions
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index bc8cf8aa795..fd505115994 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -462,8 +462,8 @@ void IMB_exr_begin_write(void *handle, char *filename, int width, int height, in
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);
}
@@ -471,22 +471,9 @@ void IMB_exr_begin_write(void *handle, char *filename, int width, int height, in
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 @@ void IMB_exrtile_begin_write(void *handle, char *filename, int mipmap, int width
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 @@ int IMB_exr_begin_read(void *handle, char *filename, int *width, int *height)
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 @@ void IMB_exrtile_write_channels(void *handle, int partx, int party, int level)
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 @@ void IMB_exr_write_channels(void *handle)
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 @@ void IMB_exr_read_channels(void *handle)
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);
}