Fixed bug in normalition of YCbCr color space conversion (from 0..1 to
authorRobert Holcomb <bob_holcomb@hotmail.com>
Sun, 15 Aug 2010 22:08:49 +0000 (22:08 +0000)
committerRobert Holcomb <bob_holcomb@hotmail.com>
Sun, 15 Aug 2010 22:08:49 +0000 (22:08 +0000)
-1..1) to fix errors in keying.  Simplified chroma key to not take
despill into consideration (handled elsewhere).  Simplified user
interface for pieces not used.

source/blender/editors/space_node/drawnode.c
source/blender/nodes/intern/CMP_nodes/CMP_chromaMatte.c
source/blender/nodes/intern/CMP_nodes/CMP_sepcombHSVA.c

index a74b070e6cd1c29f036cf54c224813881a1b5f9e..f04cefc6d2b95feb672aaae8e88cfe9465b9ab6e 100644 (file)
@@ -823,9 +823,9 @@ static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *C, Point
        uiItemR(col, ptr, "cutoff", 0, NULL, 0);
        
        col= uiLayoutColumn(layout, 1);
-       uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, 0);
+   /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, 0);  Removed for now */
        uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, 0);
-       uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, 0);
+   /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, 0);  Removed for now*/
 }
 
 static void node_composit_buts_color_matte(uiLayout *layout, bContext *C, PointerRNA *ptr)
index b081880b87bff95226aa617a6c49b2a8ce3b73a5..b14109d1b5289fd39797e3d24316b3616ac08261 100644 (file)
@@ -44,20 +44,38 @@ static bNodeSocketType cmp_node_chroma_out[]={
 
 static void do_rgba_to_ycca_normalized(bNode *node, float *out, float *in)
 {
-       /*normalize to the range -1.0 to 1.0) */
-       rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
-       out[0]=((out[0])-16)/255.0;
-       out[1]=((out[1])-128)/255.0;
-       out[2]=((out[2])-128)/255.0;
+   rgb_to_ycc(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
+
+   //normalize to 0..1.0
+   out[0]=out[0]/255.0;
+   out[1]=out[1]/255.0;
+   out[2]=out[2]/255.0;
+
+   //rescale to -1.0..1.0
+   out[0]=(out[0]*2.0)-1.0;
+   out[1]=(out[1]*2.0)-1.0;
+   out[2]=(out[2]*2.0)-1.0;
+
+//     out[0]=((out[0])-16)/255.0;
+//     out[1]=((out[1])-128)/255.0;
+//     out[2]=((out[2])-128)/255.0;
        out[3]=in[3];
 }
 
 static void do_ycca_to_rgba_normalized(bNode *node, float *out, float *in)
 {
-       /*un-normalize the normalize from above */
-       in[0]=(in[0]*255.0)+16;
-       in[1]=(in[1]*255.0)+128;
-       in[2]=(in[2]*255.0)+128;
+   /*un-normalize the normalize from above */
+   in[0]=(in[0]+1.0)/2.0;
+   in[1]=(in[1]+1.0)/2.0;
+   in[2]=(in[2]+1.0)/2.0;
+
+   in[0]=(in[0]*255.0);
+   in[1]=(in[1]*255.0);
+   in[2]=(in[2]*255.0);
+
+//     in[0]=(in[0]*255.0)+16;
+//     in[1]=(in[1]*255.0)+128;
+//     in[2]=(in[2]*255.0)+128;
        ycc_to_rgb(in[0],in[1],in[2], &out[0], &out[1], &out[2], BLI_YCC_ITU_BT601);
        out[3]=in[3];
 }
@@ -65,47 +83,41 @@ static void do_ycca_to_rgba_normalized(bNode *node, float *out, float *in)
 static void do_chroma_key(bNode *node, float *out, float *in)
 {
        NodeChroma *c;
-       float x, z, alpha;
-       float theta, beta, angle;
-       float kfg, newY, newCb, newCr;
+   float x, z, kx, kz, alpha;
+   float theta, beta, angle, angle2;
+   float kfg, newY, newCb, newCr;
 
        c=node->storage;
 
-       /* Algorithm from book "Video Demistified" */
+   /* Algorithm from book "Video Demistified," does not include the spill reduction part */
 
        /* find theta, the angle that the color space should be rotated based on key*/
-       theta=atan2(c->key[2],c->key[1]);
+   theta=atan2(c->key[2], c->key[1]);
 
        /*rotate the cb and cr into x/z space */
-       x=in[1]*cos(theta)+in[2]*sin(theta);
-       z=in[2]*cos(theta)-in[1]*sin(theta);
+   x=in[1]*cos(theta)+in[2]*sin(theta);
+   z=in[2]*cos(theta)-in[1]*sin(theta);
 
-       /*if within the acceptance angle */
-       angle=c->t1*M_PI/180.0; /* convert to radians */
+   /*if within the acceptance angle */
+   angle=c->t1*M_PI/180.0; /* convert to radians */
        
-       /* if kfg is <0 then the pixel is outside of the key color */
-       kfg=x-(fabs(z)/tan(angle/2.0));
+   /* if kfg is <0 then the pixel is outside of the key color */
+   kfg=x-(fabs(z)/tan(angle/2.0));
 
-       if(kfg>0.0) {  /* found a pixel that is within key color */
+   out[0]=in[0];
+   out[1]=in[1];
+   out[2]=in[2];
 
-               newY=in[0]-(1-c->t3)*kfg;
-               newCb=in[1]-kfg*cos((double)theta);
-               newCr=in[2]-kfg*sin((double)theta);
-               alpha=(kfg+c->fsize)*(c->fstrength);
+   if(kfg>0.0) {  /* found a pixel that is within key color */
+      alpha=(1.0-kfg)*(c->fstrength);
 
-               beta=atan2(newCr,newCb);
-               beta=beta*180.0/M_PI; /* convert to degrees for compare*/
-
-               /* if beta is within the clippin angle */
-               if(fabs(beta)<(c->t2/2.0)) {
-                       newCb=0.0;
-                       newCr=0.0;
-                       alpha=0.0;
-               }
+      beta=atan2(z,x);
+      angle2=c->t2*M_PI/180.0;
 
-               out[0]=newY;
-               out[1]=newCb;
-               out[2]=newCr;
+      /* if beta is within the cutoff angle */
+      if(fabs(beta)<(angle2/2.0)) {
+         alpha=0.0;
+      }
 
                /* don't make something that was more transparent less transparent */
                if (alpha<in[3]) {
index d80dd9b0a4b7f3d2588a41ac381e2471b78d112d..0ac47c58ab3f559783f353e0be69192fd77bbf1b 100644 (file)
@@ -64,7 +64,7 @@ static void node_composit_exec_sephsva(void *data, bNode *node, bNodeStack **in,
        if(in[0]->data==NULL) {
                float h, s, v;
        
-               rgb_to_hsv(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &h, &s, &v);
+      rgb_to_hsv(in[0]->vec[0], in[0]->vec[1], in[0]->vec[2], &h, &s, &v);
                
                out[0]->vec[0] = h;
                out[1]->vec[0] = s;