[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