Curve tool was not threadsafe... it was storing premultiplied curves in
authorTon Roosendaal <ton@blender.org>
Thu, 2 Feb 2006 14:37:25 +0000 (14:37 +0000)
committerTon Roosendaal <ton@blender.org>
Thu, 2 Feb 2006 14:37:25 +0000 (14:37 +0000)
a function (static vars) itself, causing mixups of curve data on usage.

source/blender/blenkernel/intern/colortools.c
source/blender/makesdna/DNA_color_types.h

index ce0db15603f5e700da1c6a0d8cfaf38c4b3a1427..63b36a422623d50078a1bdf6a6d354b2c5211d8e 100644 (file)
 
 #include "BLI_blenlib.h"
 #include "BLI_arithb.h"
+#include "BLI_threads.h"
 
 #include "IMB_imbuf.h"
 #include "IMB_imbuf_types.h"
 
+/* NOTE: uses threadsafe malloc/calloc/free, for use in compositor */
+
 /* ********************************* color curve ********************* */
 
 /* ***************** operations on full struct ************* */
@@ -292,7 +295,7 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr)
        cuma->maxtable= clipr->xmax;
        
        /* hrmf... we now rely on blender ipo beziers, these are more advanced */
-       bezt= MEM_callocN(cuma->totpoint*sizeof(BezTriple), "beztarr");
+       bezt= MEM_callocT(cuma->totpoint*sizeof(BezTriple), "beztarr");
        
        for(a=0; a<cuma->totpoint; a++) {
                cuma->mintable= MIN2(cuma->mintable, cmp[a].x);
@@ -353,9 +356,9 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr)
        }       
        /* make the bezier curve */
        if(cuma->table)
-               MEM_freeN(cuma->table);
+               MEM_freeT(cuma->table);
        totpoint= (cuma->totpoint-1)*CM_RESOL;
-       fp= allpoints= MEM_mallocN(totpoint*2*sizeof(float), "table");
+       fp= allpoints= MEM_mallocT(totpoint*2*sizeof(float), "table");
        
        for(a=0; a<cuma->totpoint-1; a++, fp += 2*CM_RESOL) {
                correct_bezpart(bezt[a].vec[1], bezt[a].vec[2], bezt[a+1].vec[0], bezt[a+1].vec[1]);
@@ -363,14 +366,14 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr)
                forward_diff_bezier(bezt[a].vec[1][1], bezt[a].vec[2][1], bezt[a+1].vec[0][1], bezt[a+1].vec[1][1], fp+1, CM_RESOL-1, 2);
        }
        
-       MEM_freeN(bezt);
+       MEM_freeT(bezt);
        
        range= CM_TABLEDIV*(cuma->maxtable - cuma->mintable);
        cuma->range= 1.0f/range;
        
        /* now make a table with CM_TABLE equal x distances */
        fp= allpoints;
-       cmp= MEM_callocN((CM_TABLE+1)*sizeof(CurveMapPoint), "dist table");
+       cmp= MEM_callocT((CM_TABLE+1)*sizeof(CurveMapPoint), "dist table");
        cmp[0].x= cuma->mintable;
        cmp[0].y= allpoints[1];
        
@@ -397,20 +400,20 @@ static void curvemap_make_table(CurveMap *cuma, rctf *clipr)
        cmp[CM_TABLE].x= cuma->maxtable;
        cmp[CM_TABLE].y= allpoints[2*totpoint-1];
        
-       MEM_freeN(allpoints);
+       MEM_freeT(allpoints);
        cuma->table= cmp;
 }
 
 /* call when you do images etc, needs restore too. also verifies tables */
 void curvemapping_premultiply(CurveMapping *cumap, int restore)
 {
-       static CurveMapPoint *table[3]= {NULL, NULL, NULL};
        int a;
        
        if(restore) {
                for(a=0; a<3; a++) {
-                       MEM_freeN(cumap->cm[a].table);
-                       cumap->cm[a].table= table[a];
+                       MEM_freeT(cumap->cm[a].table);
+                       cumap->cm[a].table= cumap->cm[a].premultable;
+                       cumap->cm[a].premultable= NULL;
                }
        }
        else {
@@ -418,8 +421,9 @@ void curvemapping_premultiply(CurveMapping *cumap, int restore)
                for(a=0; a<3; a++) {
                        if(cumap->cm[a].table==NULL)
                                curvemap_make_table(cumap->cm+a, &cumap->clipr);
-                       table[a]= cumap->cm[a].table;
-                       cumap->cm[a].table= MEM_dupallocN(cumap->cm[a].table);
+                       cumap->cm[a].premultable= cumap->cm[a].table;
+                       cumap->cm[a].table= MEM_mallocT((CM_TABLE+1)*sizeof(CurveMapPoint), "premul table");
+                       memcpy(cumap->cm[a].table, cumap->cm[a].premultable, (CM_TABLE+1)*sizeof(CurveMapPoint));
                }
                
                if(cumap->cm[3].table==NULL)
index 5f48daa09317503fa70923d6ae5ec20b62942fa7..b969d11d7ce81c4939af7affc6bbc46a05e3feba 100644 (file)
@@ -55,7 +55,7 @@ typedef struct CurveMap {
        float mintable, maxtable;               /* the x-axis range for the table */
        CurveMapPoint *curve;                   /* actual curve */
        CurveMapPoint *table;                   /* display and evaluate table */
-       
+       CurveMapPoint *premultable;             /* for RGB curves, premulled table */
 } CurveMap;
 
 typedef struct CurveMapping {