forked from bartvdbraak/blender
Fix T40714: cycles not loading CMYK jpeg files correctly.
This commit is contained in:
parent
66421f2119
commit
177e1ec9b2
@ -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];
|
||||
|
Loading…
Reference in New Issue
Block a user