From 6271c72cafa576faf4c98e326fbed4aeccf7ab12 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Mon, 19 May 2014 16:23:37 +0200 Subject: Fix T39764: cycles not rendering EXR image textures with 5 channels (RGBA + Z). --- intern/cycles/render/image.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'intern/cycles/render') diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index 4e61464920d..77cd6d5e79d 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -448,7 +448,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector& tex_ builtin_image_info_cb(img->filename, img->builtin_data, is_float, width, height, depth, components); } - if(!(components >= 1 && components <= 4)) { + if(components < 1 || width == 0 || height == 0) { if(in) { in->close(); delete in; @@ -460,17 +460,36 @@ bool ImageManager::file_load_float_image(Image *img, device_vector& tex_ float *pixels = (float*)tex_img.resize(width, height, depth); if(in) { + float *readpixels = pixels; + vector tmppixels; + + if(components > 4) { + tmppixels.resize(width*height*components); + readpixels = &tmppixels[0]; + } + if(depth <= 1) { int scanlinesize = width*components*sizeof(float); in->read_image(TypeDesc::FLOAT, - (uchar*)pixels + (height-1)*scanlinesize, + (uchar*)readpixels + (height-1)*scanlinesize, AutoStride, -scanlinesize, AutoStride); } else { - in->read_image(TypeDesc::FLOAT, (uchar*)pixels); + in->read_image(TypeDesc::FLOAT, (uchar*)readpixels); + } + + if(components > 4) { + for(int i = width*height-1; i >= 0; i--) { + pixels[i*4+3] = tmppixels[i*components+3]; + pixels[i*4+2] = tmppixels[i*components+2]; + pixels[i*4+1] = tmppixels[i*components+1]; + pixels[i*4+0] = tmppixels[i*components+0]; + } + + tmppixels.clear(); } in->close(); -- cgit v1.2.3