[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [54565] trunk/blender/intern/cycles/render : Fix #34252: cycles rendering 16bit PNG with too light colors.

Brecht Van Lommel brechtvanlommel at pandora.be
Thu Feb 14 22:40:30 CET 2013


Revision: 54565
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=54565
Author:   blendix
Date:     2013-02-14 21:40:29 +0000 (Thu, 14 Feb 2013)
Log Message:
-----------
Fix #34252: cycles rendering 16bit PNG with too light colors.

Modified Paths:
--------------
    trunk/blender/intern/cycles/render/image.cpp
    trunk/blender/intern/cycles/render/image.h
    trunk/blender/intern/cycles/render/nodes.cpp
    trunk/blender/intern/cycles/render/nodes.h

Modified: trunk/blender/intern/cycles/render/image.cpp
===================================================================
--- trunk/blender/intern/cycles/render/image.cpp	2013-02-14 21:40:28 UTC (rev 54564)
+++ trunk/blender/intern/cycles/render/image.cpp	2013-02-14 21:40:29 UTC (rev 54565)
@@ -85,9 +85,10 @@
 	return false;
 }
 
-bool ImageManager::is_float_image(const string& filename, void *builtin_data)
+bool ImageManager::is_float_image(const string& filename, void *builtin_data, bool& is_linear)
 {
 	bool is_float = false;
+	is_linear = false;
 
 	if(builtin_data) {
 		if(builtin_image_info_cb) {
@@ -95,6 +96,9 @@
 			builtin_image_info_cb(filename, builtin_data, is_float, width, height, channels);
 		}
 
+		if(is_float)
+			is_linear = true;
+
 		return is_float;
 	}
 
@@ -106,14 +110,30 @@
 		if(in->open(filename, spec)) {
 			/* check the main format, and channel formats;
 			 * if any take up more than one byte, we'll need a float texture slot */
-			if(spec.format.basesize() > 1)
+			if(spec.format.basesize() > 1) {
 				is_float = true;
+				is_linear = true;
+			}
 
 			for(size_t channel = 0; channel < spec.channelformats.size(); channel++) {
-				if(spec.channelformats[channel].basesize() > 1)
+				if(spec.channelformats[channel].basesize() > 1) {
 					is_float = true;
+					is_linear = true;
+				}
 			}
 
+			/* basic color space detection, not great but better than nothing
+			 * before we do OpenColorIO integration */
+			if(is_float) {
+				string colorspace = spec.get_string_attribute("oiio:ColorSpace");
+
+				is_linear = !(colorspace == "sRGB" ||
+				              colorspace == "GammaCorrected" ||
+							  strcmp(in->format_name(), "png") == 0);
+			}
+			else
+				is_linear = false;
+
 			in->close();
 		}
 
@@ -123,13 +143,13 @@
 	return is_float;
 }
 
-int ImageManager::add_image(const string& filename, void *builtin_data, bool animated, bool& is_float)
+int ImageManager::add_image(const string& filename, void *builtin_data, bool animated, bool& is_float, bool& is_linear)
 {
 	Image *img;
 	size_t slot;
 
 	/* load image info and find out if we need a float texture */
-	is_float = (pack_images)? false: is_float_image(filename, builtin_data);
+	is_float = (pack_images)? false: is_float_image(filename, builtin_data, is_linear);
 
 	if(is_float) {
 		/* find existing image */

Modified: trunk/blender/intern/cycles/render/image.h
===================================================================
--- trunk/blender/intern/cycles/render/image.h	2013-02-14 21:40:28 UTC (rev 54564)
+++ trunk/blender/intern/cycles/render/image.h	2013-02-14 21:40:29 UTC (rev 54565)
@@ -51,9 +51,9 @@
 	ImageManager();
 	~ImageManager();
 
-	int add_image(const string& filename, void *builtin_data, bool animated, bool& is_float);
+	int add_image(const string& filename, void *builtin_data, bool animated, bool& is_float, bool& is_linear);
 	void remove_image(const string& filename, void *builtin_data);
-	bool is_float_image(const string& filename, void *builtin_data);
+	bool is_float_image(const string& filename, void *builtin_data, bool& is_linear);
 
 	void device_update(Device *device, DeviceScene *dscene, Progress& progress);
 	void device_free(Device *device, DeviceScene *dscene);

Modified: trunk/blender/intern/cycles/render/nodes.cpp
===================================================================
--- trunk/blender/intern/cycles/render/nodes.cpp	2013-02-14 21:40:28 UTC (rev 54564)
+++ trunk/blender/intern/cycles/render/nodes.cpp	2013-02-14 21:40:29 UTC (rev 54565)
@@ -141,6 +141,7 @@
 	image_manager = NULL;
 	slot = -1;
 	is_float = -1;
+	is_linear = false;
 	filename = "";
 	builtin_data = NULL;
 	color_space = ustring("Color");
@@ -165,6 +166,7 @@
 	node->image_manager = NULL;
 	node->slot = -1;
 	node->is_float = -1;
+	node->is_linear = false;
 	return node;
 }
 
@@ -177,7 +179,7 @@
 	image_manager = compiler.image_manager;
 	if(is_float == -1) {
 		bool is_float_bool;
-		slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool);
+		slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool, is_linear);
 		is_float = (int)is_float_bool;
 	}
 
@@ -189,7 +191,7 @@
 	if(slot != -1) {
 		compiler.stack_assign(vector_in);
 
-		int srgb = (is_float || color_space != "Color")? 0: 1;
+		int srgb = (is_linear || color_space != "Color")? 0: 1;
 		int vector_offset = vector_in->stack_offset;
 
 		if(!tex_mapping.skip()) {
@@ -238,10 +240,10 @@
 	tex_mapping.compile(compiler);
 
 	if(is_float == -1)
-		is_float = (int)image_manager->is_float_image(filename, NULL);
+		is_float = (int)image_manager->is_float_image(filename, NULL, is_linear);
 
 	compiler.parameter("filename", filename.c_str());
-	if(is_float || color_space != "Color")
+	if(is_linear || color_space != "Color")
 		compiler.parameter("color_space", "Linear");
 	else
 		compiler.parameter("color_space", "sRGB");
@@ -271,6 +273,7 @@
 	image_manager = NULL;
 	slot = -1;
 	is_float = -1;
+	is_linear = false;
 	filename = "";
 	builtin_data = NULL;
 	color_space = ustring("Color");
@@ -294,6 +297,7 @@
 	node->image_manager = NULL;
 	node->slot = -1;
 	node->is_float = -1;
+	node->is_linear = false;
 	return node;
 }
 
@@ -306,7 +310,7 @@
 	image_manager = compiler.image_manager;
 	if(slot == -1) {
 		bool is_float_bool;
-		slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool);
+		slot = image_manager->add_image(filename, builtin_data, animated, is_float_bool, is_linear);
 		is_float = (int)is_float_bool;
 	}
 
@@ -318,7 +322,7 @@
 	if(slot != -1) {
 		compiler.stack_assign(vector_in);
 
-		int srgb = (is_float || color_space != "Color")? 0: 1;
+		int srgb = (is_linear || color_space != "Color")? 0: 1;
 		int vector_offset = vector_in->stack_offset;
 
 		if(!tex_mapping.skip()) {
@@ -356,11 +360,11 @@
 	tex_mapping.compile(compiler);
 
 	if(is_float == -1)
-		is_float = (int)image_manager->is_float_image(filename, NULL);
+		is_float = (int)image_manager->is_float_image(filename, NULL, is_linear);
 
 	compiler.parameter("filename", filename.c_str());
 	compiler.parameter("projection", projection);
-	if(is_float || color_space != "Color")
+	if(is_linear || color_space != "Color")
 		compiler.parameter("color_space", "Linear");
 	else
 		compiler.parameter("color_space", "sRGB");

Modified: trunk/blender/intern/cycles/render/nodes.h
===================================================================
--- trunk/blender/intern/cycles/render/nodes.h	2013-02-14 21:40:28 UTC (rev 54564)
+++ trunk/blender/intern/cycles/render/nodes.h	2013-02-14 21:40:29 UTC (rev 54565)
@@ -69,6 +69,7 @@
 	ImageManager *image_manager;
 	int slot;
 	int is_float;
+	bool is_linear;
 	string filename;
 	void *builtin_data;
 	ustring color_space;
@@ -89,6 +90,7 @@
 	ImageManager *image_manager;
 	int slot;
 	int is_float;
+	bool is_linear;
 	string filename;
 	void *builtin_data;
 	ustring color_space;




More information about the Bf-blender-cvs mailing list