diff options
author | Campbell Barton <ideasman42@gmail.com> | 2014-10-13 20:13:50 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2014-10-15 18:56:07 +0400 |
commit | cfba27d33cd9a4ee0b4dbf15593e062777aae855 (patch) | |
tree | 072693e02dadea2daf9d01a06de777b6615e1c1a /source | |
parent | 201abb4946a03fd1df5e7be2c766154a8f6fa198 (diff) |
Fix T42206: RenderLayers popup crashed when clicked while rendering
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/space_image/image_buttons.c | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/source/blender/editors/space_image/image_buttons.c b/source/blender/editors/space_image/image_buttons.c index 7e90008d8d2..04959791fb6 100644 --- a/source/blender/editors/space_image/image_buttons.c +++ b/source/blender/editors/space_image/image_buttons.c @@ -320,13 +320,21 @@ static void ui_imageuser_layer_menu(bContext *UNUSED(C), uiLayout *layout, void { void **rnd_data = rnd_pt; uiBlock *block = uiLayoutGetBlock(layout); - RenderResult *rr = rnd_data[0]; + Image *image = rnd_data[0]; ImageUser *iuser = rnd_data[1]; + Scene *scene = iuser->scene; + RenderResult *rr; RenderLayer *rl; RenderLayer rl_fake = {NULL}; const char *fake_name; int nr; + /* may have been freed since drawing */ + rr = BKE_image_acquire_renderresult(scene, image); + if (UNLIKELY(rr == NULL)) { + return; + } + uiBlockSetCurLayout(block, layout); uiLayoutColumn(layout, false); @@ -355,6 +363,8 @@ final: } BLI_assert(nr == -1); + + BKE_image_release_renderresult(scene, image); } static const char *ui_imageuser_pass_fake_name(RenderLayer *rl) @@ -369,17 +379,28 @@ static const char *ui_imageuser_pass_fake_name(RenderLayer *rl) static void ui_imageuser_pass_menu(bContext *UNUSED(C), uiLayout *layout, void *ptrpair_p) { - void **ptrpair = ptrpair_p; + void **rnd_data = ptrpair_p; uiBlock *block = uiLayoutGetBlock(layout); - // RenderResult *rr = ptrpair[0]; - ImageUser *iuser = ptrpair[1]; - /* rl==NULL means composite result */ - RenderLayer *rl = ptrpair[2]; + Image *image = rnd_data[0]; + ImageUser *iuser = rnd_data[1]; + /* (rpass_index == -1) means composite result */ + const int rpass_index = GET_INT_FROM_POINTER(rnd_data[2]); + Scene *scene = iuser->scene; + RenderResult *rr; + RenderLayer *rl; RenderPass rpass_fake = {NULL}; RenderPass *rpass; const char *fake_name; int nr; + /* may have been freed since drawing */ + rr = BKE_image_acquire_renderresult(scene, image); + if (UNLIKELY(rr == NULL)) { + return; + } + + rl = BLI_findlink(&rr->layers, rpass_index); + uiBlockSetCurLayout(block, layout); uiLayoutColumn(layout, false); @@ -410,6 +431,8 @@ final: } BLI_assert(nr == -1); + + BKE_image_release_renderresult(scene, image); } /* 5 layer button callbacks... */ @@ -509,7 +532,7 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image wmenu2 = (3 * w) / 5; wmenu3 = (3 * w) / 6; - rnd_pt[0] = rr; + rnd_pt[0] = image; rnd_pt[1] = iuser; rnd_pt[2] = NULL; @@ -524,11 +547,13 @@ static void uiblock_layer_pass_buttons(uiLayout *layout, RenderResult *rr, Image if (rr) { RenderPass *rpass; + int rpass_index; /* layer */ fake_name = ui_imageuser_layer_fake_name(rr); - rl = BLI_findlink(&rr->layers, iuser->layer - (fake_name ? 1 : 0)); - rnd_pt[2] = rl; + rpass_index = iuser->layer - (fake_name ? 1 : 0); + rl = BLI_findlink(&rr->layers, rpass_index); + rnd_pt[2] = SET_INT_IN_POINTER(rpass_index); display_name = rl ? rl->name : (fake_name ? fake_name : ""); but = uiDefMenuBut(block, ui_imageuser_layer_menu, rnd_pt, display_name, 0, 0, wmenu2, UI_UNIT_Y, TIP_("Select Layer")); |