Merging r49681 through r49707 from trunk into soc-2011-tomato
[blender.git] / source / blender / editors / render / render_internal.c
index 97fd80fc946968e5c6e5284601efa1d5fb7b33f1..87d2c79d28faefbebb70b8a501e19dc66304a863 100644 (file)
@@ -61,6 +61,7 @@
 #include "ED_object.h"
 
 #include "RE_pipeline.h"
+#include "IMB_colormanagement.h"
 #include "IMB_imbuf.h"
 #include "IMB_imbuf_types.h"
 
@@ -150,6 +151,9 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat
        IMB_buffer_byte_from_float(rectc, rectf,
                                   4, ibuf->dither, IB_PROFILE_SRGB, profile_from, predivide,
                                   xmax, ymax, ibuf->x, rr->rectx);
+
+       IMB_partial_display_buffer_update(ibuf, rectf, rr->rectx, rxmin, rymin,
+                                         rxmin, rymin, rxmin + xmax, rymin + ymax);
 }
 
 /* ****************************** render invoking ***************** */
@@ -170,7 +174,7 @@ static void screen_render_scene_layer_set(wmOperator *op, Main *mainp, Scene **s
                if (scn) {
                        /* camera switch wont have updated */
                        scn->r.cfra = (*scene)->r.cfra;
-                       scene_camera_switch_update(scn);
+                       BKE_scene_camera_switch_update(scn);
 
                        *scene = scn;
                }
@@ -221,10 +225,10 @@ static int screen_render_exec(bContext *C, wmOperator *op)
        BKE_image_backup_render(scene, ima);
 
        /* cleanup sequencer caches before starting user triggered render.
-       * otherwise, invalidated cache entries can make their way into
-       * the output rendering. We can't put that into RE_BlenderFrame,
-       * since sequence rendering can call that recursively... (peter) */
-       seq_stripelem_cache_cleanup();
+        * otherwise, invalidated cache entries can make their way into
+        * the output rendering. We can't put that into RE_BlenderFrame,
+        * since sequence rendering can call that recursively... (peter) */
+       BKE_sequencer_cache_cleanup();
 
        RE_SetReports(re, op->reports);
 
@@ -236,7 +240,7 @@ static int screen_render_exec(bContext *C, wmOperator *op)
        RE_SetReports(re, NULL);
 
        // no redraw needed, we leave state as we entered it
-       ED_update_for_newframe(mainp, scene, CTX_wm_screen(C), 1);
+       ED_update_for_newframe(mainp, scene, 1);
 
        WM_event_add_notifier(C, NC_SCENE | ND_RENDER_RESULT, scene);
 
@@ -288,11 +292,12 @@ static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str)
        else if (scene->r.scemode & R_SINGLE_LAYER)
                spos += sprintf(spos, "Single Layer | ");
 
+       spos += sprintf(spos, "Frame:%d ", (scene->r.cfra));
+
        if (rs->statstr) {
-               spos += sprintf(spos, "%s ", rs->statstr);
+               spos += sprintf(spos, "%s ", rs->statstr);
        }
        else {
-               spos += sprintf(spos, "Fra:%d  ", (scene->r.cfra));
                if (rs->totvert) spos += sprintf(spos, "Ve:%d ", rs->totvert);
                if (rs->totface) spos += sprintf(spos, "Fa:%d ", rs->totface);
                if (rs->tothalo) spos += sprintf(spos, "Ha:%d ", rs->tothalo);
@@ -317,8 +322,8 @@ static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str)
 
        /* very weak... but 512 characters is quite safe */
        if (spos >= str + IMA_MAX_RENDER_TEXT)
-               if (G.f & G_DEBUG)
-                       printf("WARNING! renderwin text beyond limit \n");
+               if (G.debug & G_DEBUG)
+                       printf("WARNING! renderwin text beyond limit\n");
 
 }
 
@@ -340,7 +345,7 @@ static void image_renderinfo_cb(void *rjv, RenderStats *rs)
        RE_ReleaseResult(rj->re);
 
        /* make jobs timer to send notifier */
-       *(rj->do_update) = 1;
+       *(rj->do_update) = TRUE;
 
 }
 
@@ -352,7 +357,7 @@ static void render_progress_update(void *rjv, float progress)
                *rj->progress = progress;
 
                /* make jobs timer to send notifier */
-               *(rj->do_update) = 1;
+               *(rj->do_update) = TRUE;
        }
 }
 
@@ -372,7 +377,7 @@ static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrec
                image_buffer_rect_update(rj->scene, rr, ibuf, renrect);
 
                /* make jobs timer to send notifier */
-               *(rj->do_update) = 1;
+               *(rj->do_update) = TRUE;
        }
        BKE_image_release_ibuf(ima, lock);
 }
@@ -407,8 +412,12 @@ static void render_endjob(void *rjv)
                free_main(rj->main);
 
        /* else the frame will not update for the original value */
-       if (!(rj->scene->r.scemode & R_NO_FRAME_UPDATE))
-               ED_update_for_newframe(G.main, rj->scene, rj->win->screen, 1);
+       if (!(rj->scene->r.scemode & R_NO_FRAME_UPDATE)) {
+               /* possible this fails of loading new file while rendering */
+               if (G.main->wm.first) {
+                       ED_update_for_newframe(G.main, rj->scene, 1);
+               }
+       }
        
        /* XXX above function sets all tags in nodes */
        ntreeCompositClearTags(rj->scene->nodetree);
@@ -447,10 +456,12 @@ static void render_drawlock(void *UNUSED(rjv), int lock)
 }
 
 /* catch esc */
-static int screen_render_modal(bContext *C, wmOperator *UNUSED(op), wmEvent *event)
+static int screen_render_modal(bContext *C, wmOperator *op, wmEvent *event)
 {
+       Scene *scene = (Scene *) op->customdata;
+
        /* no running blender, remove handler and pass through */
-       if (0 == WM_jobs_test(CTX_wm_manager(C), CTX_data_scene(C))) {
+       if (0 == WM_jobs_test(CTX_wm_manager(C), scene)) {
                return OPERATOR_FINISHED | OPERATOR_PASS_THROUGH;
        }
 
@@ -470,7 +481,6 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
        Main *mainp;
        Scene *scene = CTX_data_scene(C);
        SceneRenderLayer *srl = NULL;
-       bScreen *screen = CTX_wm_screen(C);
        View3D *v3d = CTX_wm_view3d(C);
        Render *re;
        wmJob *steve;
@@ -507,7 +517,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
                mainp = CTX_data_main(C);
 
        /* cancel animation playback */
-       if (screen->animtimer)
+       if (ED_screen_animation_playing(CTX_wm_manager(C)))
                ED_screen_animation_play(C, 0, 0);
        
        /* handle UI stuff */
@@ -517,10 +527,10 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
        multires_force_render_update(CTX_data_active_object(C));
 
        /* cleanup sequencer caches before starting user triggered render.
-       * otherwise, invalidated cache entries can make their way into
-       * the output rendering. We can't put that into RE_BlenderFrame,
-       * since sequence rendering can call that recursively... (peter) */
-       seq_stripelem_cache_cleanup();
+        * otherwise, invalidated cache entries can make their way into
+        * the output rendering. We can't put that into RE_BlenderFrame,
+        * since sequence rendering can call that recursively... (peter) */
+       BKE_sequencer_cache_cleanup();
 
        /* get editmode results */
        ED_object_exit_editmode(C, 0);  /* 0 = does not exit editmode */
@@ -580,6 +590,12 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
        rj->re = re;
        G.afbreek = 0;
 
+       /* store actual owner of job, so modal operator could check for it,
+        * the reason of this is that active scene could change when rendering
+        * several layers from composistor [#31800]
+        */
+       op->customdata = scene;
+
        WM_jobs_start(CTX_wm_manager(C), steve);
 
        WM_cursor_wait(0);