[Bf-blender-cvs] [177e1ec] master: Fix T40714: cycles not loading CMYK jpeg files correctly.
Brecht Van Lommel
noreply at git.blender.org
Sat Jun 21 22:25:01 CEST 2014
Commit: 177e1ec9b22af557d669089da6063ca34479c9d2
Author: Brecht Van Lommel
Date: Sat Jun 21 20:42:03 2014 +0200
https://developer.blender.org/rB177e1ec9b22af557d669089da6063ca34479c9d2
Fix T40714: cycles not loading CMYK jpeg files correctly.
===================================================================
M intern/cycles/render/image.cpp
===================================================================
diff --git a/intern/cycles/render/image.cpp b/intern/cycles/render/image.cpp
index f451310..30d07fe 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];
More information about the Bf-blender-cvs
mailing list