static void rna_MovieClipUser_proxy_render_settings_update(Main *UNUSED(bmain), Scene *UNUSED(scene), PointerRNA *ptr) { ID *id = (ID *) ptr->id.data; MovieClipUser *user = (MovieClipUser *) ptr->data; /* when changing render settings of space clip user * clear cache for clip, so all the memory is available * for new render settings */ if (GS(id->name) == ID_SCR) { bScreen *screen = (bScreen *) id; ScrArea *area; SpaceLink *sl; for (area = screen->areabase.first; area; area = area->next) { for (sl = area->spacedata.first; sl; sl = sl->next) { if (sl->spacetype == SPACE_CLIP) { SpaceClip *sc = (SpaceClip *) sl; if (&sc->user == user) { MovieClip *clip = ED_space_clip_get_clip(sc); if (clip && (clip->flag & MCLIP_USE_PROXY)) BKE_movieclip_clear_cache(clip); break; } } } } } }
void ED_space_clip_set_clip(bContext *C, bScreen *screen, SpaceClip *sc, MovieClip *clip) { MovieClip *old_clip; bool old_clip_visible = false; if (!screen && C) screen = CTX_wm_screen(C); old_clip = sc->clip; sc->clip = clip; id_us_ensure_real((ID *)sc->clip); if (screen && sc->view == SC_VIEW_CLIP) { ScrArea *area; SpaceLink *sl; for (area = screen->areabase.first; area; area = area->next) { for (sl = area->spacedata.first; sl; sl = sl->next) { if (sl->spacetype == SPACE_CLIP) { SpaceClip *cur_sc = (SpaceClip *) sl; if (cur_sc != sc) { if (cur_sc->view == SC_VIEW_CLIP) { if (cur_sc->clip == old_clip) old_clip_visible = true; } else { if (cur_sc->clip == old_clip || cur_sc->clip == NULL) { cur_sc->clip = clip; } } } } } } } /* If clip is no longer visible on screen, free memory used by it's cache */ if (old_clip && old_clip != clip && !old_clip_visible) { BKE_movieclip_clear_cache(old_clip); } if (C) WM_event_add_notifier(C, NC_MOVIECLIP | NA_SELECTED, sc->clip); }