Revision: 41479
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41479
Author:   psy-fi
Date:     2011-11-02 22:44:32 +0000 (Wed, 02 Nov 2011)
Log Message:
-----------
Correct incorrect memory free and crash reported by troubled. Thanks a lot!

Modified Paths:
--------------
    branches/soc-2011-onion-uv-tools/source/blender/gpu/intern/gpu_draw.c

Modified: branches/soc-2011-onion-uv-tools/source/blender/gpu/intern/gpu_draw.c
===================================================================
--- branches/soc-2011-onion-uv-tools/source/blender/gpu/intern/gpu_draw.c       
2011-11-02 22:00:22 UTC (rev 41478)
+++ branches/soc-2011-onion-uv-tools/source/blender/gpu/intern/gpu_draw.c       
2011-11-02 22:44:32 UTC (rev 41479)
@@ -433,7 +433,7 @@
        float *color_corrected_frect = NULL;
        short texwindx, texwindy, texwinsx, texwinsy;
        /*flag to determine whether high resolution format is used*/
-       int useHighPrecisionTex = FALSE;
+       int useHighPrecisionTex = FALSE, doColorConversion = FALSE;
 
        /* initialize tile mode and number of repeats */
        GTS.ima = ima;
@@ -490,12 +490,16 @@
                        a high precision format only if it is available*/
                        useHighPrecisionTex = TRUE;
                }
+               if(ibuf->profile == IB_PROFILE_LINEAR_RGB){
+                       doColorConversion = TRUE;
+               }
+
                if(ibuf->rect==NULL){
                        IMB_rect_from_float(ibuf);
                }
 
        }
-               
+
        /* currently, tpage refresh is used by ima sequences */
        if(ima->tpageflag & IMA_TPAGE_REFRESH) {
                GPU_free_image(ima);
@@ -530,7 +534,7 @@
 
                        if(useHighPrecisionTex){
                                /* We may also need a color corrected float 
image. Dithering will not apply since it's high precision */
-                               if(ibuf->profile == IB_PROFILE_LINEAR_RGB){
+                               if(doColorConversion){
                                        color_corrected_frect = 
MEM_mallocN(ibuf->x*ibuf->y*sizeof(float)*4, "floar_buf_col_cor");
                                        
IMB_float_color_corrected_from_float_rect(ibuf, color_corrected_frect);
                                        frect= color_corrected_frect + 
texwinsy*ibuf->x + texwinsx;
@@ -552,8 +556,8 @@
                        rect= ibuf->rect;
                        if(useHighPrecisionTex){
                                /* We may also need a color corrected float 
image. Dithering will not apply since it's high precision */
-                               if(ibuf->profile == IB_PROFILE_LINEAR_RGB){
-                                       frect = color_corrected_frect = 
MEM_mallocN(ibuf->x*ibuf->y*sizeof(float)*4, "floar_buf_col_cor");
+                               if(doColorConversion){
+                                       frect = color_corrected_frect = 
MEM_mallocN(ibuf->x*ibuf->y*sizeof(*color_corrected_frect)*4, 
"floar_buf_col_cor");
                                        
IMB_float_color_corrected_from_float_rect(ibuf, color_corrected_frect);
                                }else{
                                        frect= ibuf->rect_float;
@@ -606,9 +610,11 @@
                
                if(useHighPrecisionTex)
                {
-                       fscalerect= MEM_mallocN(rectw*recth*sizeof(float)*4, 
"fscalerect");
+                       fscalerect= 
MEM_mallocN(rectw*recth*sizeof(*fscalerect)*4, "fscalerect");
                        gluScaleImage(GL_RGBA, tpx, tpy, GL_FLOAT, frect, 
rectw, recth, GL_FLOAT, fscalerect);
-                       MEM_freeN(frect);
+                       /* Or frect will refer to ibuf->rect_float. We don't 
want to free that */
+                       if(doColorConversion)
+                               MEM_freeN(frect);
                        frect = fscalerect;
                        fscalerect = NULL;
                }
@@ -652,7 +658,7 @@
        if (tilerect)
                MEM_freeN(tilerect);
        if (ftilerect)
-                       MEM_freeN(ftilerect);
+               MEM_freeN(ftilerect);
        if (scalerect)
                MEM_freeN(scalerect);
        if (fscalerect)

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

Reply via email to