diff options
Diffstat (limited to 'source/blender/blenkernel/intern/image.c')
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 3d59b719ca0..288443db650 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -2773,6 +2773,7 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ int channels, layer, pass; ImBuf *ibuf; int from_render = (ima->render_slot == ima->last_render_slot); + bool byte_buffer_in_display_space = false; if (!(iuser && iuser->scene)) return NULL; @@ -2835,6 +2836,13 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ /* there's no combined pass, is in renderlayer itself */ if (pass == 0) { rectf = rl->rectf; + if (rectf == NULL) { + /* Happens when Save Buffers is enabled. + * Use display buffer stored in the render layer. + */ + rect = (unsigned int *) rl->display_buffer; + byte_buffer_in_display_space = true; + } } else { rpass = BLI_findlink(&rl->passes, pass - 1); @@ -2859,6 +2867,27 @@ static ImBuf *image_get_render_result(Image *ima, ImageUser *iuser, void **lock_ image_assign_ibuf(ima, ibuf, IMA_NO_INDEX, 0); } + /* Set color space settings for a byte buffer. + * + * This is mainly to make it so color management treats byte buffer + * from render result with Save Buffers enabled as final display buffer + * and doesnt' apply any color management on it. + * + * For other cases we need to be sure it stays to default byte buffer space. + */ + if (ibuf->rect != rect) { + if (byte_buffer_in_display_space) { + const char *colorspace = + IMB_colormanagement_get_display_colorspace_name(&iuser->scene->view_settings, + &iuser->scene->display_settings); + IMB_colormanagement_assign_rect_colorspace(ibuf, colorspace); + } + else { + const char *colorspace = IMB_colormanagement_role_colorspace_name_get(COLOR_ROLE_DEFAULT_BYTE); + IMB_colormanagement_assign_rect_colorspace(ibuf, colorspace); + } + } + /* invalidate color managed buffers if render result changed */ BLI_lock_thread(LOCK_COLORMANAGE); if (ibuf->x != rres.rectx || ibuf->y != rres.recty || ibuf->rect_float != rectf) { |