Fix image filepath changes not refreshing all image users.
This commit is contained in:
@@ -411,13 +411,6 @@ static bool rewrite_path_alloc(char **path, BPathVisitor visit_cb, const char *a
|
||||
}
|
||||
}
|
||||
|
||||
/* fix the image user "ok" tag after updating paths, so ImBufs get loaded */
|
||||
static void bpath_traverse_image_user_cb(Image *ima, ImageUser *iuser, void *customdata)
|
||||
{
|
||||
if (ima == customdata)
|
||||
iuser->ok = 1;
|
||||
}
|
||||
|
||||
/* Run visitor function 'visit' on all paths contained in 'id'. */
|
||||
void BKE_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int flag, void *bpath_user_data)
|
||||
{
|
||||
@@ -441,7 +434,6 @@ void BKE_bpath_traverse_id(Main *bmain, ID *id, BPathVisitor visit_cb, const int
|
||||
!BKE_image_is_dirty(ima))
|
||||
{
|
||||
BKE_image_signal(bmain, ima, NULL, IMA_SIGNAL_RELOAD);
|
||||
BKE_image_walk_all_users(bmain, ima, bpath_traverse_image_user_cb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2775,6 +2775,19 @@ static void image_tag_frame_recalc(Image *ima, ImageUser *iuser, void *customdat
|
||||
|
||||
if (ima == changed_image && BKE_image_is_animated(ima)) {
|
||||
iuser->flag |= IMA_NEED_FRAME_RECALC;
|
||||
iuser->ok = 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void image_tag_reload(Image *ima, ImageUser *iuser, void *customdata)
|
||||
{
|
||||
Image *changed_image = customdata;
|
||||
|
||||
if (ima == changed_image) {
|
||||
iuser->ok = 1;
|
||||
if (iuser->scene) {
|
||||
image_update_views_format(ima, iuser);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2847,9 +2860,9 @@ void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
|
||||
BKE_image_free_buffers(ima);
|
||||
|
||||
ima->ok = 1;
|
||||
if (iuser)
|
||||
iuser->ok = 1;
|
||||
|
||||
if (iuser) {
|
||||
image_tag_frame_recalc(ima, iuser, ima);
|
||||
}
|
||||
BKE_image_walk_all_users(bmain, ima, image_tag_frame_recalc);
|
||||
|
||||
break;
|
||||
@@ -2886,12 +2899,9 @@ void BKE_image_signal(Main *bmain, Image *ima, ImageUser *iuser, int signal)
|
||||
BKE_image_free_buffers(ima);
|
||||
|
||||
if (iuser) {
|
||||
iuser->ok = 1;
|
||||
if (iuser->scene) {
|
||||
image_update_views_format(ima, iuser);
|
||||
}
|
||||
image_tag_reload(ima, iuser, ima);
|
||||
}
|
||||
|
||||
BKE_image_walk_all_users(bmain, ima, image_tag_reload);
|
||||
break;
|
||||
case IMA_SIGNAL_USER_NEW_IMAGE:
|
||||
if (iuser) {
|
||||
|
||||
@@ -2346,7 +2346,6 @@ static int image_reload_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
/* XXX unpackImage frees image buffers */
|
||||
ED_preview_kill_jobs(CTX_wm_manager(C), CTX_data_main(C));
|
||||
|
||||
// XXX other users?
|
||||
BKE_image_signal(bmain, ima, (sima) ? &sima->iuser : NULL, IMA_SIGNAL_RELOAD);
|
||||
DEG_id_tag_update(&ima->id, 0);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user