diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-09-22 00:44:41 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2012-09-22 00:44:41 +0400 |
commit | f61ef65adb3949742d291dc38ad31266e6877384 (patch) | |
tree | bb1723987dcd0c3a282676d1950c96600c143a82 /source/blender/imbuf | |
parent | a1123252a3ad70345e1a85c220faa84526a063d2 (diff) |
Color Management: different fixes for byte buffers
- Color space of byte buffer for generated images haven't been
updated properly on change
- Byte buffers weren't handling data color spaces on display transform
properly
Diffstat (limited to 'source/blender/imbuf')
-rw-r--r-- | source/blender/imbuf/IMB_colormanagement.h | 1 | ||||
-rw-r--r-- | source/blender/imbuf/intern/colormanagement.c | 33 |
2 files changed, 25 insertions, 9 deletions
diff --git a/source/blender/imbuf/IMB_colormanagement.h b/source/blender/imbuf/IMB_colormanagement.h index d09007985b0..5d0ab5e57d4 100644 --- a/source/blender/imbuf/IMB_colormanagement.h +++ b/source/blender/imbuf/IMB_colormanagement.h @@ -62,6 +62,7 @@ void IMB_colormanagement_validate_settings(struct ColorManagedDisplaySettings *d struct ColorManagedViewSettings *view_settings); const char *IMB_colormanagement_role_colorspace_name_get(int role); +void IMB_colormanagement_assign_rect_colorspace(struct ImBuf *ibuf, const char *name); /* ** Color space transformation functions ** */ void IMB_colormanagement_transform(float *buffer, int width, int height, int channels, diff --git a/source/blender/imbuf/intern/colormanagement.c b/source/blender/imbuf/intern/colormanagement.c index de7d78897f8..50495d39252 100644 --- a/source/blender/imbuf/intern/colormanagement.c +++ b/source/blender/imbuf/intern/colormanagement.c @@ -847,16 +847,17 @@ void colormanage_imbuf_set_default_spaces(ImBuf *ibuf) void colormanage_imbuf_make_linear(ImBuf *ibuf, const char *from_colorspace) { + ColorSpace *colorspace = colormanage_colorspace_get_named(from_colorspace); + + if (colorspace->is_data) { + ibuf->colormanage_flag |= IMB_COLORMANAGE_IS_DATA; + return; + } + if (ibuf->rect_float) { - ColorSpace *colorspace = colormanage_colorspace_get_named(from_colorspace); const char *to_colorspace = global_role_scene_linear; int predivide = ibuf->flags & IB_cm_predivide; - if (colorspace->is_data) { - ibuf->colormanage_flag |= IMB_COLORMANAGE_IS_DATA; - return; - } - if (ibuf->rect) imb_freerectImBuf(ibuf); @@ -1038,6 +1039,17 @@ const char *IMB_colormanagement_role_colorspace_name_get(int role) return NULL; } +void IMB_colormanagement_assign_rect_colorspace(ImBuf *ibuf, const char *name) +{ + ColorSpace *colorspace = colormanage_colorspace_get_named(name); + ibuf->rect_colorspace = colorspace; + + if (colorspace->is_data) + ibuf->colormanage_flag |= IMB_COLORMANAGE_IS_DATA; + else + ibuf->colormanage_flag &= ~IMB_COLORMANAGE_IS_DATA; +} + /*********************** Threaded display buffer transform routines *************************/ typedef struct DisplayBufferThread { @@ -1132,6 +1144,7 @@ static void *display_buffer_apply_get_linear_buffer(DisplayBufferThread *handle) int buffer_size = channels * width * height; int predivide = handle->predivide; + int is_data = handle->is_data; linear_buffer = MEM_callocN(buffer_size * sizeof(float), "color conversion linear buffer"); @@ -1153,9 +1166,11 @@ static void *display_buffer_apply_get_linear_buffer(DisplayBufferThread *handle) *fp = (float)(*cp) / 255.0f; } - /* convert float buffer to scene linear space */ - IMB_colormanagement_transform(linear_buffer, width, height, channels, - from_colorspace, to_colorspace, predivide); + if (!is_data) { + /* convert float buffer to scene linear space */ + IMB_colormanagement_transform(linear_buffer, width, height, channels, + from_colorspace, to_colorspace, predivide); + } } else if (handle->float_colorspace) { /* currently float is non-linear only in sequencer, which is working |