Revision: 50275
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=50275
Author:   nazgul
Date:     2012-08-30 13:40:31 +0000 (Thu, 30 Aug 2012)
Log Message:
-----------
Color management: make it behave closer to trunk

Avoid using tricks with ibuf->profile to check whether image buffer is
in sequencer or linear space. Assume the whole sequencer works in non
linear float space and do transformation to linear where it;s needed
only.

This removes confusion from the code, fixes wrong behavior of some
effects.

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/blenkernel/intern/seqeffects.c
    branches/soc-2011-tomato/source/blender/blenkernel/intern/sequencer.c
    branches/soc-2011-tomato/source/blender/imbuf/IMB_imbuf_types.h
    branches/soc-2011-tomato/source/blender/imbuf/intern/colormanagement.c
    branches/soc-2011-tomato/source/blender/render/intern/source/pipeline.c
    branches/soc-2011-tomato/source/blender/render/intern/source/render_result.c

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/seqeffects.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/seqeffects.c      
2012-08-30 13:18:33 UTC (rev 50274)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/seqeffects.c      
2012-08-30 13:40:31 UTC (rev 50275)
@@ -140,8 +140,6 @@
                IMB_rect_from_float(ibuf3);
        }
 
-       out->profile = IB_PROFILE_SRGB;
-
        return out;
 }
 

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/sequencer.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/sequencer.c       
2012-08-30 13:18:33 UTC (rev 50274)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/sequencer.c       
2012-08-30 13:40:31 UTC (rev 50275)
@@ -2461,7 +2461,8 @@
                                        imb_freerectImBuf(ibuf);
 
                                /* all sequencer color is done in SRGB space, 
linear gives odd crossfades */
-                               
IMB_colormanagement_imbuf_to_sequencer_space(ibuf, FALSE);
+                               if (ibuf->profile == IB_PROFILE_LINEAR_RGB)
+                                       
IMB_colormanagement_imbuf_to_sequencer_space(ibuf, FALSE);
 
                                copy_to_ibuf_still(context, seq, nr, ibuf);
 
@@ -2653,18 +2654,13 @@
        
        if (count == 1) {
                out = seq_render_strip(context, seq_arr[0], cfra);
+               out->colormanage_flags |= IMB_COLORMANAGE_NOLINEAR_FLOAT;
 
-               if (out) {
-                       /* put buffer back to linear space */
-                       IMB_colormanagement_imbuf_from_sequencer_space(out);
-               }
-
                BKE_sequencer_cache_put(context, seq_arr[0], cfra, 
SEQ_STRIPELEM_IBUF_COMP, out);
 
                return out;
        }
 
-
        for (i = count - 1; i >= 0; i--) {
                int early_out;
                Sequence *seq = seq_arr[i];
@@ -2738,10 +2734,7 @@
                BKE_sequencer_cache_put(context, seq_arr[i], cfra, 
SEQ_STRIPELEM_IBUF_COMP, out);
        }
 
-       if (out) {
-               /* put buffer back to linear space */
-               IMB_colormanagement_imbuf_from_sequencer_space(out);
-       }
+       out->colormanage_flags |= IMB_COLORMANAGE_NOLINEAR_FLOAT;
 
        return out;
 }

Modified: branches/soc-2011-tomato/source/blender/imbuf/IMB_imbuf_types.h
===================================================================
--- branches/soc-2011-tomato/source/blender/imbuf/IMB_imbuf_types.h     
2012-08-30 13:18:33 UTC (rev 50274)
+++ branches/soc-2011-tomato/source/blender/imbuf/IMB_imbuf_types.h     
2012-08-30 13:40:31 UTC (rev 50275)
@@ -128,6 +128,7 @@
        unsigned int   encodedbuffersize; /* Size of encodedbuffer */
 
        /* color management */
+       int colormanage_flags;
        unsigned int *display_buffer_flags;  /* array of per-display display 
buffers dirty flags */
        struct ColormanageCache *colormanage_cache;  /* cache used by color 
management */
 
@@ -258,4 +259,9 @@
 extern const char *imb_ext_movie[];
 extern const char *imb_ext_audio[];
 
+/* ImBuf->colormanage_flags */
+enum {
+       IMB_COLORMANAGE_NOLINEAR_FLOAT = (1 << 0)
+};
+
 #endif

Modified: branches/soc-2011-tomato/source/blender/imbuf/intern/colormanagement.c
===================================================================
--- branches/soc-2011-tomato/source/blender/imbuf/intern/colormanagement.c      
2012-08-30 13:18:33 UTC (rev 50274)
+++ branches/soc-2011-tomato/source/blender/imbuf/intern/colormanagement.c      
2012-08-30 13:40:31 UTC (rev 50275)
@@ -616,6 +616,8 @@
        int channels;
        int dither;
        int predivide;
+
+       int nolinear_float;
 } DisplayBufferThread;
 
 typedef struct DisplayBufferInitData {
@@ -659,6 +661,8 @@
        handle->channels = channels;
        handle->dither = dither;
        handle->predivide = predivide;
+
+       handle->nolinear_float = ibuf->colormanage_flags & 
IMB_COLORMANAGE_NOLINEAR_FLOAT;
 }
 
 static void display_buffer_apply_threaded(ImBuf *ibuf, float *buffer, unsigned 
char *byte_buffer,
@@ -703,6 +707,20 @@
                                           IB_PROFILE_LINEAR_RGB, 
IB_PROFILE_SRGB,
                                           predivide, width, height, width, 
width);
        }
+       else if (handle->nolinear_float) {
+               /* currently float is non-linear only in sequencer, which is 
working
+                * in it's own color space even to handle float buffers, so we 
need to ensure
+                * float buffer is in linear space before applying all the view 
transformations
+                */
+
+               const char *from_colorspace = global_role_sequencer;
+               const char *to_colorspace = global_role_scene_linear;
+
+               memcpy(linear_buffer, handle->buffer, buffer_size * 
sizeof(float));
+
+               IMB_colormanagement_colorspace_transform(linear_buffer, width, 
height, channels,
+                                                        from_colorspace, 
to_colorspace);
+       }
        else {
                /* some processors would want to modify float original buffer
                 * before converting it into display byte buffer, so we need to
@@ -1060,9 +1078,6 @@
 
                IMB_colormanagement_colorspace_transform(ibuf->rect_float, 
ibuf->x, ibuf->y, ibuf->channels,
                                                         from_colorspace, 
to_colorspace);
-
-               /* buffer in now in scene linear space */
-               ibuf->profile = IB_PROFILE_LINEAR_RGB;
        }
 #else
        (void) ibuf;
@@ -1118,13 +1133,13 @@
        if (global_role_sequencer[0]) {
                IMB_colormanagement_imbuf_to_role(ibuf, COLOR_ROLE_SEQUENCER);
 
-               ibuf->profile = IB_PROFILE_SRGB;
+               ibuf->profile = IB_PROFILE_NONE;
        }
        else
 #endif
        {
                /* if no sequencer's working space defined fallback to legacy 
sRGB space */
-               IMB_convert_profile(ibuf, IB_PROFILE_SRGB);
+               IMB_convert_profile(ibuf, IB_PROFILE_NONE);
        }
 }
 
@@ -1135,10 +1150,8 @@
 
 #ifdef WITH_OCIO
        if (global_role_sequencer[0]) {
-               if (ibuf->profile == IB_PROFILE_SRGB) {
-                       IMB_colormanagement_imbuf_from_role(ibuf, 
COLOR_ROLE_SEQUENCER);
-                       ibuf->profile = IB_PROFILE_LINEAR_RGB;
-               }
+               IMB_colormanagement_imbuf_from_role(ibuf, COLOR_ROLE_SEQUENCER);
+               ibuf->profile = IB_PROFILE_LINEAR_RGB;
        }
        else
 #endif

Modified: 
branches/soc-2011-tomato/source/blender/render/intern/source/pipeline.c
===================================================================
--- branches/soc-2011-tomato/source/blender/render/intern/source/pipeline.c     
2012-08-30 13:18:33 UTC (rev 50274)
+++ branches/soc-2011-tomato/source/blender/render/intern/source/pipeline.c     
2012-08-30 13:40:31 UTC (rev 50275)
@@ -1648,7 +1648,7 @@
 static void do_render_seq(Render *re)
 {
        static int recurs_depth = 0;
-       struct ImBuf *ibuf;
+       struct ImBuf *ibuf, *out;
        RenderResult *rr; /* don't assign re->result here as it might change 
during give_ibuf_seq */
        int cfra = re->r.cfra;
        SeqRenderData context;
@@ -1675,8 +1675,12 @@
                                              100);
        }
 
-       ibuf = BKE_sequencer_give_ibuf(context, cfra, 0);
+       out = BKE_sequencer_give_ibuf(context, cfra, 0);
 
+       ibuf = IMB_dupImBuf(out);
+       IMB_freeImBuf(out);
+       IMB_colormanagement_imbuf_from_sequencer_space(ibuf);
+
        recurs_depth--;
 
        rr = re->result;

Modified: 
branches/soc-2011-tomato/source/blender/render/intern/source/render_result.c
===================================================================
--- 
branches/soc-2011-tomato/source/blender/render/intern/source/render_result.c    
    2012-08-30 13:18:33 UTC (rev 50274)
+++ 
branches/soc-2011-tomato/source/blender/render/intern/source/render_result.c    
    2012-08-30 13:40:31 UTC (rev 50275)
@@ -1089,22 +1089,14 @@
        return ibuf;
 }
 
-void render_result_rect_from_ibuf(RenderResult *rr, RenderData *rd, ImBuf 
*ibuf)
+void render_result_rect_from_ibuf(RenderResult *rr, RenderData *UNUSED(rd), 
ImBuf *ibuf)
 {
        if (ibuf->rect_float) {
-               /* color management: when off ensure rectf is non-lin, since 
thats what the internal
-                * render engine delivers */
-               int profile_to = (rd->color_mgt_flag & R_COLOR_MANAGEMENT) ? 
IB_PROFILE_LINEAR_RGB : IB_PROFILE_SRGB;
-               int profile_from = (ibuf->profile == IB_PROFILE_LINEAR_RGB) ? 
IB_PROFILE_LINEAR_RGB : IB_PROFILE_SRGB;
-               int predivide = (rd->color_mgt_flag & 
R_COLOR_MANAGEMENT_PREDIVIDE);
-
                if (!rr->rectf)
                        rr->rectf = MEM_mallocN(4 * sizeof(float) * rr->rectx * 
rr->recty, "render_seq rectf");
                
-               IMB_buffer_float_from_float(rr->rectf, ibuf->rect_float,
-                                           4, profile_to, profile_from, 
predivide,
-                                           rr->rectx, rr->recty, rr->rectx, 
rr->rectx);
-               
+               memcpy(rr->rectf, ibuf->rect_float, 4 * sizeof(float) * 
rr->rectx * rr->recty);
+
                /* TSK! Since sequence render doesn't free the *rr render 
result, the old rect32
                 * can hang around when sequence render has rendered a 32 bits 
one before */
                if (rr->rect32) {

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to