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
path: root/source
diff options
context:
space:
mode:
authorAntony Riakiotakis <kalast@gmail.com>2011-10-20 16:15:39 +0400
committerAntony Riakiotakis <kalast@gmail.com>2011-10-20 16:15:39 +0400
commita828845f27557242d59eb881ca2d5a43c8915636 (patch)
tree98b5286e87fae988e8e8e15d0aefd4c4164b2d12 /source
parent2f92b5bc3fa11609e07ba7bc0859275ee3ccf12b (diff)
reverting 41124, maybe better solution is to enforce linear space in generated float images
Diffstat (limited to 'source')
-rw-r--r--source/blender/imbuf/intern/openexr/openexr_api.cpp56
1 files changed, 14 insertions, 42 deletions
diff --git a/source/blender/imbuf/intern/openexr/openexr_api.cpp b/source/blender/imbuf/intern/openexr/openexr_api.cpp
index aa7defb2f39..e064d7f760d 100644
--- a/source/blender/imbuf/intern/openexr/openexr_api.cpp
+++ b/source/blender/imbuf/intern/openexr/openexr_api.cpp
@@ -342,55 +342,27 @@ static int imb_save_openexr_float(struct ImBuf *ibuf, const char *name, int flag
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;
-
- 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));
+ int xstride = sizeof(float) * channels;
+ int ystride = - xstride*width;
+ float *rect[4] = {NULL, NULL, NULL, NULL};
+
+ /* 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)
{