Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/editors/render/render_view.c')
-rw-r--r--source/blender/editors/render/render_view.c521
1 files changed, 261 insertions, 260 deletions
diff --git a/source/blender/editors/render/render_view.c b/source/blender/editors/render/render_view.c
index 1d7022c5263..258e98977c7 100644
--- a/source/blender/editors/render/render_view.c
+++ b/source/blender/editors/render/render_view.c
@@ -49,77 +49,77 @@
/*********************** utilities for finding areas *************************/
/* returns biggest area that is not uv/image editor. Note that it uses buttons */
-/* window as the last possible alternative. */
+/* window as the last possible alternative. */
/* would use BKE_screen_find_big_area(...) but this is too specific */
static ScrArea *biggest_non_image_area(bContext *C)
{
- bScreen *sc = CTX_wm_screen(C);
- ScrArea *sa, *big = NULL;
- int size, maxsize = 0, bwmaxsize = 0;
- short foundwin = 0;
-
- for (sa = sc->areabase.first; sa; sa = sa->next) {
- if (sa->winx > 30 && sa->winy > 30) {
- size = sa->winx * sa->winy;
- if (!sa->full && sa->spacetype == SPACE_PROPERTIES) {
- if (foundwin == 0 && size > bwmaxsize) {
- bwmaxsize = size;
- big = sa;
- }
- }
- else if (sa->spacetype != SPACE_IMAGE && size > maxsize) {
- maxsize = size;
- big = sa;
- foundwin = 1;
- }
- }
- }
-
- return big;
+ bScreen *sc = CTX_wm_screen(C);
+ ScrArea *sa, *big = NULL;
+ int size, maxsize = 0, bwmaxsize = 0;
+ short foundwin = 0;
+
+ for (sa = sc->areabase.first; sa; sa = sa->next) {
+ if (sa->winx > 30 && sa->winy > 30) {
+ size = sa->winx * sa->winy;
+ if (!sa->full && sa->spacetype == SPACE_PROPERTIES) {
+ if (foundwin == 0 && size > bwmaxsize) {
+ bwmaxsize = size;
+ big = sa;
+ }
+ }
+ else if (sa->spacetype != SPACE_IMAGE && size > maxsize) {
+ maxsize = size;
+ big = sa;
+ foundwin = 1;
+ }
+ }
+ }
+
+ return big;
}
static ScrArea *find_area_showing_r_result(bContext *C, Scene *scene, wmWindow **win)
{
- wmWindowManager *wm = CTX_wm_manager(C);
- ScrArea *sa = NULL;
- SpaceImage *sima;
-
- /* find an imagewindow showing render result */
- for (*win = wm->windows.first; *win; *win = (*win)->next) {
- if (WM_window_get_active_scene(*win) == scene) {
- const bScreen *screen = WM_window_get_active_screen(*win);
-
- for (sa = screen->areabase.first; sa; sa = sa->next) {
- if (sa->spacetype == SPACE_IMAGE) {
- sima = sa->spacedata.first;
- if (sima->image && sima->image->type == IMA_TYPE_R_RESULT)
- break;
- }
- }
- if (sa)
- break;
- }
- }
-
- return sa;
+ wmWindowManager *wm = CTX_wm_manager(C);
+ ScrArea *sa = NULL;
+ SpaceImage *sima;
+
+ /* find an imagewindow showing render result */
+ for (*win = wm->windows.first; *win; *win = (*win)->next) {
+ if (WM_window_get_active_scene(*win) == scene) {
+ const bScreen *screen = WM_window_get_active_screen(*win);
+
+ for (sa = screen->areabase.first; sa; sa = sa->next) {
+ if (sa->spacetype == SPACE_IMAGE) {
+ sima = sa->spacedata.first;
+ if (sima->image && sima->image->type == IMA_TYPE_R_RESULT)
+ break;
+ }
+ }
+ if (sa)
+ break;
+ }
+ }
+
+ return sa;
}
static ScrArea *find_area_image_empty(bContext *C)
{
- bScreen *sc = CTX_wm_screen(C);
- ScrArea *sa;
- SpaceImage *sima;
-
- /* find an imagewindow showing render result */
- for (sa = sc->areabase.first; sa; sa = sa->next) {
- if (sa->spacetype == SPACE_IMAGE) {
- sima = sa->spacedata.first;
- if (!sima->image)
- break;
- }
- }
-
- return sa;
+ bScreen *sc = CTX_wm_screen(C);
+ ScrArea *sa;
+ SpaceImage *sima;
+
+ /* find an imagewindow showing render result */
+ for (sa = sc->areabase.first; sa; sa = sa->next) {
+ if (sa->spacetype == SPACE_IMAGE) {
+ sima = sa->spacedata.first;
+ if (!sima->image)
+ break;
+ }
+ }
+
+ return sa;
}
/********************** open image editor for render *************************/
@@ -127,224 +127,225 @@ static ScrArea *find_area_image_empty(bContext *C)
/* new window uses x,y to set position */
ScrArea *render_view_open(bContext *C, int mx, int my, ReportList *reports)
{
- Main *bmain = CTX_data_main(C);
- Scene *scene = CTX_data_scene(C);
- wmWindow *win = NULL;
- ScrArea *sa = NULL;
- SpaceImage *sima;
- bool area_was_image = false;
-
- if (scene->r.displaymode == R_OUTPUT_NONE)
- return NULL;
-
- if (scene->r.displaymode == R_OUTPUT_WINDOW) {
- int sizex = 30 * UI_DPI_FAC + (scene->r.xsch * scene->r.size) / 100;
- int sizey = 60 * UI_DPI_FAC + (scene->r.ysch * scene->r.size) / 100;
-
- /* arbitrary... miniature image window views don't make much sense */
- if (sizex < 320) sizex = 320;
- if (sizey < 256) sizey = 256;
-
- /* changes context! */
- if (WM_window_open_temp(C, mx, my, sizex, sizey, WM_WINDOW_RENDER) == NULL) {
- BKE_report(reports, RPT_ERROR, "Failed to open window!");
- return NULL;
- }
-
- sa = CTX_wm_area(C);
- }
- else if (scene->r.displaymode == R_OUTPUT_SCREEN) {
- sa = CTX_wm_area(C);
-
- /* if the active screen is already in fullscreen mode, skip this and
- * unset the area, so that the fullscreen area is just changed later */
- if (sa && sa->full) {
- sa = NULL;
- }
- else {
- if (sa && sa->spacetype == SPACE_IMAGE)
- area_was_image = true;
-
- /* this function returns with changed context */
- sa = ED_screen_full_newspace(C, sa, SPACE_IMAGE);
- }
- }
-
- if (!sa) {
- sa = find_area_showing_r_result(C, scene, &win);
- if (sa == NULL)
- sa = find_area_image_empty(C);
-
- /* if area found in other window, we make that one show in front */
- if (win && win != CTX_wm_window(C))
- wm_window_raise(win);
-
- if (sa == NULL) {
- /* find largest open non-image area */
- sa = biggest_non_image_area(C);
- if (sa) {
- ED_area_newspace(C, sa, SPACE_IMAGE, true);
- sima = sa->spacedata.first;
-
- /* makes ESC go back to prev space */
- sima->flag |= SI_PREVSPACE;
-
- /* we already had a fullscreen here -> mark new space as a stacked fullscreen */
- if (sa->full) {
- sa->flag |= (AREA_FLAG_STACKED_FULLSCREEN | AREA_FLAG_TEMP_TYPE);
- }
- }
- else {
- /* use any area of decent size */
- sa = BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_TYPE_ANY, 0);
- if (sa->spacetype != SPACE_IMAGE) {
- // XXX newspace(sa, SPACE_IMAGE);
- sima = sa->spacedata.first;
-
- /* makes ESC go back to prev space */
- sima->flag |= SI_PREVSPACE;
- }
- }
- }
- }
- sima = sa->spacedata.first;
-
- /* get the correct image, and scale it */
- sima->image = BKE_image_verify_viewer(bmain, IMA_TYPE_R_RESULT, "Render Result");
-
-
- /* if we're rendering to full screen, set appropriate hints on image editor
- * so it can restore properly on pressing esc */
- if (sa->full) {
- sima->flag |= SI_FULLWINDOW;
-
- /* Tell the image editor to revert to previous space in space list on close
- * _only_ if it wasn't already an image editor when the render was invoked */
- if (area_was_image == 0)
- sima->flag |= SI_PREVSPACE;
- else {
- /* Leave it alone so the image editor will just go back from
- * full screen to the original tiled setup */
- }
- }
-
- return sa;
+ Main *bmain = CTX_data_main(C);
+ Scene *scene = CTX_data_scene(C);
+ wmWindow *win = NULL;
+ ScrArea *sa = NULL;
+ SpaceImage *sima;
+ bool area_was_image = false;
+
+ if (scene->r.displaymode == R_OUTPUT_NONE)
+ return NULL;
+
+ if (scene->r.displaymode == R_OUTPUT_WINDOW) {
+ int sizex = 30 * UI_DPI_FAC + (scene->r.xsch * scene->r.size) / 100;
+ int sizey = 60 * UI_DPI_FAC + (scene->r.ysch * scene->r.size) / 100;
+
+ /* arbitrary... miniature image window views don't make much sense */
+ if (sizex < 320)
+ sizex = 320;
+ if (sizey < 256)
+ sizey = 256;
+
+ /* changes context! */
+ if (WM_window_open_temp(C, mx, my, sizex, sizey, WM_WINDOW_RENDER) == NULL) {
+ BKE_report(reports, RPT_ERROR, "Failed to open window!");
+ return NULL;
+ }
+
+ sa = CTX_wm_area(C);
+ }
+ else if (scene->r.displaymode == R_OUTPUT_SCREEN) {
+ sa = CTX_wm_area(C);
+
+ /* if the active screen is already in fullscreen mode, skip this and
+ * unset the area, so that the fullscreen area is just changed later */
+ if (sa && sa->full) {
+ sa = NULL;
+ }
+ else {
+ if (sa && sa->spacetype == SPACE_IMAGE)
+ area_was_image = true;
+
+ /* this function returns with changed context */
+ sa = ED_screen_full_newspace(C, sa, SPACE_IMAGE);
+ }
+ }
+
+ if (!sa) {
+ sa = find_area_showing_r_result(C, scene, &win);
+ if (sa == NULL)
+ sa = find_area_image_empty(C);
+
+ /* if area found in other window, we make that one show in front */
+ if (win && win != CTX_wm_window(C))
+ wm_window_raise(win);
+
+ if (sa == NULL) {
+ /* find largest open non-image area */
+ sa = biggest_non_image_area(C);
+ if (sa) {
+ ED_area_newspace(C, sa, SPACE_IMAGE, true);
+ sima = sa->spacedata.first;
+
+ /* makes ESC go back to prev space */
+ sima->flag |= SI_PREVSPACE;
+
+ /* we already had a fullscreen here -> mark new space as a stacked fullscreen */
+ if (sa->full) {
+ sa->flag |= (AREA_FLAG_STACKED_FULLSCREEN | AREA_FLAG_TEMP_TYPE);
+ }
+ }
+ else {
+ /* use any area of decent size */
+ sa = BKE_screen_find_big_area(CTX_wm_screen(C), SPACE_TYPE_ANY, 0);
+ if (sa->spacetype != SPACE_IMAGE) {
+ // XXX newspace(sa, SPACE_IMAGE);
+ sima = sa->spacedata.first;
+
+ /* makes ESC go back to prev space */
+ sima->flag |= SI_PREVSPACE;
+ }
+ }
+ }
+ }
+ sima = sa->spacedata.first;
+
+ /* get the correct image, and scale it */
+ sima->image = BKE_image_verify_viewer(bmain, IMA_TYPE_R_RESULT, "Render Result");
+
+ /* if we're rendering to full screen, set appropriate hints on image editor
+ * so it can restore properly on pressing esc */
+ if (sa->full) {
+ sima->flag |= SI_FULLWINDOW;
+
+ /* Tell the image editor to revert to previous space in space list on close
+ * _only_ if it wasn't already an image editor when the render was invoked */
+ if (area_was_image == 0)
+ sima->flag |= SI_PREVSPACE;
+ else {
+ /* Leave it alone so the image editor will just go back from
+ * full screen to the original tiled setup */
+ }
+ }
+
+ return sa;
}
/*************************** cancel render viewer **********************/
static int render_view_cancel_exec(bContext *C, wmOperator *UNUSED(op))
{
- wmWindow *win = CTX_wm_window(C);
- ScrArea *sa = CTX_wm_area(C);
- SpaceImage *sima = sa->spacedata.first;
-
- /* ensure image editor fullscreen and area fullscreen states are in sync */
- if ((sima->flag & SI_FULLWINDOW) && !sa->full) {
- sima->flag &= ~SI_FULLWINDOW;
- }
-
- /* test if we have a temp screen in front */
- if (WM_window_is_temp_screen(win)) {
- wm_window_lower(win);
- return OPERATOR_FINISHED;
- }
- /* determine if render already shows */
- else if (sima->flag & SI_PREVSPACE) {
- sima->flag &= ~SI_PREVSPACE;
-
- if (sima->flag & SI_FULLWINDOW) {
- sima->flag &= ~SI_FULLWINDOW;
- ED_screen_full_prevspace(C, sa);
- }
- else {
- ED_area_prevspace(C, sa);
- }
-
- return OPERATOR_FINISHED;
- }
- else if (sima->flag & SI_FULLWINDOW) {
- sima->flag &= ~SI_FULLWINDOW;
- ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED);
- return OPERATOR_FINISHED;
- }
-
- return OPERATOR_PASS_THROUGH;
+ wmWindow *win = CTX_wm_window(C);
+ ScrArea *sa = CTX_wm_area(C);
+ SpaceImage *sima = sa->spacedata.first;
+
+ /* ensure image editor fullscreen and area fullscreen states are in sync */
+ if ((sima->flag & SI_FULLWINDOW) && !sa->full) {
+ sima->flag &= ~SI_FULLWINDOW;
+ }
+
+ /* test if we have a temp screen in front */
+ if (WM_window_is_temp_screen(win)) {
+ wm_window_lower(win);
+ return OPERATOR_FINISHED;
+ }
+ /* determine if render already shows */
+ else if (sima->flag & SI_PREVSPACE) {
+ sima->flag &= ~SI_PREVSPACE;
+
+ if (sima->flag & SI_FULLWINDOW) {
+ sima->flag &= ~SI_FULLWINDOW;
+ ED_screen_full_prevspace(C, sa);
+ }
+ else {
+ ED_area_prevspace(C, sa);
+ }
+
+ return OPERATOR_FINISHED;
+ }
+ else if (sima->flag & SI_FULLWINDOW) {
+ sima->flag &= ~SI_FULLWINDOW;
+ ED_screen_state_toggle(C, win, sa, SCREENMAXIMIZED);
+ return OPERATOR_FINISHED;
+ }
+
+ return OPERATOR_PASS_THROUGH;
}
void RENDER_OT_view_cancel(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Cancel Render View";
- ot->description = "Cancel show render view";
- ot->idname = "RENDER_OT_view_cancel";
-
- /* api callbacks */
- ot->exec = render_view_cancel_exec;
- ot->poll = ED_operator_image_active;
+ /* identifiers */
+ ot->name = "Cancel Render View";
+ ot->description = "Cancel show render view";
+ ot->idname = "RENDER_OT_view_cancel";
+
+ /* api callbacks */
+ ot->exec = render_view_cancel_exec;
+ ot->poll = ED_operator_image_active;
}
/************************* show render viewer *****************/
static int render_view_show_invoke(bContext *C, wmOperator *op, const wmEvent *event)
{
- wmWindow *wincur = CTX_wm_window(C);
-
- /* test if we have currently a temp screen active */
- if (WM_window_is_temp_screen(wincur)) {
- wm_window_lower(wincur);
- }
- else {
- wmWindow *win, *winshow;
- ScrArea *sa = find_area_showing_r_result(C, CTX_data_scene(C), &winshow);
-
- /* is there another window on current scene showing result? */
- for (win = CTX_wm_manager(C)->windows.first; win; win = win->next) {
- const bScreen *sc = WM_window_get_active_screen(win);
-
- if ((WM_window_is_temp_screen(win) && ((ScrArea *)sc->areabase.first)->spacetype == SPACE_IMAGE) ||
- (win == winshow && winshow != wincur))
- {
- wm_window_raise(win);
- return OPERATOR_FINISHED;
- }
- }
-
- /* determine if render already shows */
- if (sa) {
- /* but don't close it when rendering */
- if (G.is_rendering == false) {
- SpaceImage *sima = sa->spacedata.first;
-
- if (sima->flag & SI_PREVSPACE) {
- sima->flag &= ~SI_PREVSPACE;
-
- if (sima->flag & SI_FULLWINDOW) {
- sima->flag &= ~SI_FULLWINDOW;
- ED_screen_full_prevspace(C, sa);
- }
- else {
- ED_area_prevspace(C, sa);
- }
- }
- }
- }
- else {
- render_view_open(C, event->x, event->y, op->reports);
- }
- }
-
- return OPERATOR_FINISHED;
+ wmWindow *wincur = CTX_wm_window(C);
+
+ /* test if we have currently a temp screen active */
+ if (WM_window_is_temp_screen(wincur)) {
+ wm_window_lower(wincur);
+ }
+ else {
+ wmWindow *win, *winshow;
+ ScrArea *sa = find_area_showing_r_result(C, CTX_data_scene(C), &winshow);
+
+ /* is there another window on current scene showing result? */
+ for (win = CTX_wm_manager(C)->windows.first; win; win = win->next) {
+ const bScreen *sc = WM_window_get_active_screen(win);
+
+ if ((WM_window_is_temp_screen(win) &&
+ ((ScrArea *)sc->areabase.first)->spacetype == SPACE_IMAGE) ||
+ (win == winshow && winshow != wincur)) {
+ wm_window_raise(win);
+ return OPERATOR_FINISHED;
+ }
+ }
+
+ /* determine if render already shows */
+ if (sa) {
+ /* but don't close it when rendering */
+ if (G.is_rendering == false) {
+ SpaceImage *sima = sa->spacedata.first;
+
+ if (sima->flag & SI_PREVSPACE) {
+ sima->flag &= ~SI_PREVSPACE;
+
+ if (sima->flag & SI_FULLWINDOW) {
+ sima->flag &= ~SI_FULLWINDOW;
+ ED_screen_full_prevspace(C, sa);
+ }
+ else {
+ ED_area_prevspace(C, sa);
+ }
+ }
+ }
+ }
+ else {
+ render_view_open(C, event->x, event->y, op->reports);
+ }
+ }
+
+ return OPERATOR_FINISHED;
}
void RENDER_OT_view_show(struct wmOperatorType *ot)
{
- /* identifiers */
- ot->name = "Show/Hide Render View";
- ot->description = "Toggle show render view";
- ot->idname = "RENDER_OT_view_show";
-
- /* api callbacks */
- ot->invoke = render_view_show_invoke;
- ot->poll = ED_operator_screenactive;
+ /* identifiers */
+ ot->name = "Show/Hide Render View";
+ ot->description = "Toggle show render view";
+ ot->idname = "RENDER_OT_view_show";
+
+ /* api callbacks */
+ ot->invoke = render_view_show_invoke;
+ ot->poll = ED_operator_screenactive;
}