diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-06-21 22:42:03 +0400 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2014-06-22 00:21:03 +0400 |
commit | 177e1ec9b22af557d669089da6063ca34479c9d2 (patch) | |
tree | 4f6f2d0fd8123546355171bf5fbe8bf9acedd418 /intern | |
parent | 66421f211928af40d81c67c0ed6e3269ff884e9d (diff) |
Fix T40714: cycles not loading CMYK jpeg files correctly.
Diffstat (limited to 'intern')
-rw-r--r-- | intern/cycles/render/image.cpp | 34 |
1 files changed, 32 insertions, 2 deletions
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp index f45131051da..30d07fe0a7f 100644 --- a/intern/cycles/render/image.cpp +++ b/intern/cycles/render/image.cpp @@ -351,6 +351,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) /* read RGBA pixels */ uchar *pixels = (uchar*)tex_img.resize(width, height, depth); + bool cmyk = false; if(in) { if(depth <= 1) { @@ -366,6 +367,8 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) in->read_image(TypeDesc::UINT8, (uchar*)pixels); } + cmyk = strcmp(in->format_name(), "jpeg") == 0 && components == 4; + in->close(); delete in; } @@ -373,7 +376,17 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) builtin_image_pixels_cb(img->filename, img->builtin_data, pixels); } - if(components == 2) { + if(cmyk) { + /* CMYK */ + for(int i = width*height*depth-1; i >= 0; i--) { + pixels[i*4+2] = (pixels[i*4+2]*pixels[i*4+3])/255; + pixels[i*4+1] = (pixels[i*4+1]*pixels[i*4+3])/255; + pixels[i*4+0] = (pixels[i*4+0]*pixels[i*4+3])/255; + pixels[i*4+3] = 255; + } + } + else if(components == 2) { + /* grayscale + alpha */ for(int i = width*height*depth-1; i >= 0; i--) { pixels[i*4+3] = pixels[i*2+1]; pixels[i*4+2] = pixels[i*2+0]; @@ -382,6 +395,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) } } else if(components == 3) { + /* RGB */ for(int i = width*height*depth-1; i >= 0; i--) { pixels[i*4+3] = 255; pixels[i*4+2] = pixels[i*3+2]; @@ -390,6 +404,7 @@ bool ImageManager::file_load_image(Image *img, device_vector<uchar4>& tex_img) } } else if(components == 1) { + /* grayscale */ for(int i = width*height*depth-1; i >= 0; i--) { pixels[i*4+3] = 255; pixels[i*4+2] = pixels[i]; @@ -458,6 +473,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ /* read RGBA pixels */ float *pixels = (float*)tex_img.resize(width, height, depth); + bool cmyk = false; if(in) { float *readpixels = pixels; @@ -492,6 +508,8 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ tmppixels.clear(); } + cmyk = strcmp(in->format_name(), "jpeg") == 0 && components == 4; + in->close(); delete in; } @@ -499,7 +517,17 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ builtin_image_float_pixels_cb(img->filename, img->builtin_data, pixels); } - if(components == 2) { + if(cmyk) { + /* CMYK */ + for(int i = width*height*depth-1; i >= 0; i--) { + pixels[i*4+3] = 255; + pixels[i*4+2] = (pixels[i*4+2]*pixels[i*4+3])/255; + pixels[i*4+1] = (pixels[i*4+1]*pixels[i*4+3])/255; + pixels[i*4+0] = (pixels[i*4+0]*pixels[i*4+3])/255; + } + } + else if(components == 2) { + /* grayscale + alpha */ for(int i = width*height*depth-1; i >= 0; i--) { pixels[i*4+3] = pixels[i*2+1]; pixels[i*4+2] = pixels[i*2+0]; @@ -508,6 +536,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ } } else if(components == 3) { + /* RGB */ for(int i = width*height*depth-1; i >= 0; i--) { pixels[i*4+3] = 1.0f; pixels[i*4+2] = pixels[i*3+2]; @@ -516,6 +545,7 @@ bool ImageManager::file_load_float_image(Image *img, device_vector<float4>& tex_ } } else if(components == 1) { + /* grayscale */ for(int i = width*height*depth-1; i >= 0; i--) { pixels[i*4+3] = 1.0f; pixels[i*4+2] = pixels[i]; |