Fix T40714: cycles not loading CMYK jpeg files correctly.

This commit is contained in:
Brecht Van Lommel 2014-06-21 20:42:03 +02:00
parent 66421f2119
commit 177e1ec9b2
Notes: blender-bot 2023-02-14 10:28:18 +01:00
Referenced by issue #40714, CMYK rendering errors in Cycles
1 changed files with 32 additions and 2 deletions

View File

@ -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];