rename RNA_property_is_set() --> RNA_struct_property_is_set() in preperation to add...
[blender.git] / source / blender / editors / render / render_internal.c
index cc1c88430151ca8282947f74df8ddd1d20eb13f3..e35df2177612d92f1d346e9329790ff61481155f 100644 (file)
 /* called inside thread! */
 void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volatile rcti *renrect)
 {
-       float x1, y1, *rectf= NULL;
+       float *rectf= NULL;
        int ymin, ymax, xmin, xmax;
-       int rymin, rxmin, do_color_management;
-       char *rectc;
+       int rymin, rxmin, predivide, profile_from;
+       unsigned char *rectc;
 
        /* if renrect argument, we only refresh scanlines */
        if(renrect) {
@@ -136,50 +136,20 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat
                imb_addrectImBuf(ibuf);
        
        rectf+= 4*(rr->rectx*ymin + xmin);
-       rectc= (char *)(ibuf->rect + ibuf->x*rymin + rxmin);
+       rectc= (unsigned char*)(ibuf->rect + ibuf->x*rymin + rxmin);
 
-       do_color_management = (scene && (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT));
-       
-       /* XXX make nice consistent functions for this */
-       for(y1= 0; y1<ymax; y1++) {
-               float *rf= rectf;
-               float srgb[3];
-               char *rc= rectc;
-               const float dither = ibuf->dither / 255.0f;
-
-               /* XXX temp. because crop offset */
-               if(rectc >= (char *)(ibuf->rect)) {
-                       for(x1= 0; x1<xmax; x1++, rf += 4, rc+=4) {
-                               /* color management */
-                               if(do_color_management) {
-                                       srgb[0]= linearrgb_to_srgb(rf[0]);
-                                       srgb[1]= linearrgb_to_srgb(rf[1]);
-                                       srgb[2]= linearrgb_to_srgb(rf[2]);
-                               }
-                               else {
-                                       copy_v3_v3(srgb, rf);
-                               }
-
-                               /* dither */
-                               if(dither != 0.0f) {
-                                       const float d = (BLI_frand()-0.5f)*dither;
-
-                                       srgb[0] += d;
-                                       srgb[1] += d;
-                                       srgb[2] += d;
-                               }
-
-                               /* write */
-                               rc[0]= FTOCHAR(srgb[0]);
-                               rc[1]= FTOCHAR(srgb[1]);
-                               rc[2]= FTOCHAR(srgb[2]);
-                               rc[3]= FTOCHAR(rf[3]);
-                       }
-               }
-
-               rectf += 4*rr->rectx;
-               rectc += 4*ibuf->x;
+       if(scene && (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT)) {
+               profile_from= IB_PROFILE_LINEAR_RGB;
+               predivide= (scene->r.color_mgt_flag & R_COLOR_MANAGEMENT_PREDIVIDE);
+       }
+       else {
+               profile_from= IB_PROFILE_SRGB;
+               predivide= 0;
        }
+
+       IMB_buffer_byte_from_float(rectc, rectf,
+               4, ibuf->dither, IB_PROFILE_SRGB, profile_from, predivide,
+               xmax, ymax, ibuf->x, rr->rectx);
 }
 
 /* ****************************** render invoking ***************** */
@@ -190,7 +160,7 @@ void image_buffer_rect_update(Scene *scene, RenderResult *rr, ImBuf *ibuf, volat
 static void screen_render_scene_layer_set(wmOperator *op, Main *mainp, Scene **scene, SceneRenderLayer **srl)
 {
        /* single layer re-render */
-       if(RNA_property_is_set(op->ptr, "scene")) {
+       if(RNA_struct_property_is_set(op->ptr, "scene")) {
                Scene *scn;
                char scene_name[MAX_ID_NAME-2];
 
@@ -206,7 +176,7 @@ static void screen_render_scene_layer_set(wmOperator *op, Main *mainp, Scene **s
                }
        }
 
-       if(RNA_property_is_set(op->ptr, "layer")) {
+       if(RNA_struct_property_is_set(op->ptr, "layer")) {
                SceneRenderLayer *rl;
                char rl_name[RE_MAXNAME];
 
@@ -235,7 +205,7 @@ static int screen_render_exec(bContext *C, wmOperator *op)
        /* custom scene and single layer re-render */
        screen_render_scene_layer_set(op, mainp, &scene, &srl);
 
-       if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+       if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.im_format.imtype)) {
                BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected");
                return OPERATOR_CANCELLED;
        }
@@ -322,10 +292,13 @@ static void make_renderinfo_string(RenderStats *rs, Scene *scene, char *str)
                spos+= sprintf(spos, "%s ", rs->statstr);
        }
        else {
-               spos+= sprintf(spos, "Fra:%d  Ve:%d Fa:%d ", (scene->r.cfra), rs->totvert, rs->totface);
+               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);
                if(rs->totstrand) spos+= sprintf(spos, "St:%d ", rs->totstrand);
-               spos+= sprintf(spos, "La:%d Mem:%.2fM (%.2fM, peak %.2fM) ", rs->totlamp, megs_used_memory, mmap_used_memory, megs_peak_memory);
+               if(rs->totlamp) spos+= sprintf(spos, "La:%d ", rs->totlamp);
+               spos+= sprintf(spos, "Mem:%.2fM (%.2fM, peak %.2fM) ", megs_used_memory, mmap_used_memory, megs_peak_memory);
 
                if(rs->curfield)
                        spos+= sprintf(spos, "Field %d ", rs->curfield);
@@ -375,8 +348,12 @@ static void render_progress_update(void *rjv, float progress)
 {
        RenderJob *rj= rjv;
        
-       if(rj->progress)
+       if(rj->progress && *rj->progress != progress) {
                *rj->progress = progress;
+
+               /* make jobs timer to send notifier */
+               *(rj->do_update)= 1;
+       }
 }
 
 static void image_rect_update(void *rjv, RenderResult *rr, volatile rcti *renrect)
@@ -513,7 +490,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
                return OPERATOR_CANCELLED;
        }
 
-       if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.imtype)) {
+       if(!is_animation && is_write_still && BKE_imtype_is_movie(scene->r.im_format.imtype)) {
                BKE_report(op->reports, RPT_ERROR, "Can't write a single file with an animation format selected");
                return OPERATOR_CANCELLED;
        }       
@@ -560,7 +537,7 @@ static int screen_render_invoke(bContext *C, wmOperator *op, wmEvent *event)
        /* custom scene and single layer re-render */
        screen_render_scene_layer_set(op, mainp, &scene, &srl);
 
-       if(RNA_property_is_set(op->ptr, "layer"))
+       if(RNA_struct_property_is_set(op->ptr, "layer"))
                jobflag |= WM_JOB_SUSPEND;
 
        /* job custom data */