[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