2.5 Nodes:
[blender.git] / source / blender / editors / space_node / drawnode.c
index b8da42079c46381e3f12c49f2747923367b43fe2..403a8d1a5915a3f8c4f151bbba20dcc1f6f084e0 100644 (file)
@@ -89,6 +89,7 @@
 #include "UI_resources.h"
 
 #include "RE_pipeline.h"
+#include "IMB_imbuf.h"
 #include "IMB_imbuf_types.h"
 
 #include "node_intern.h"
@@ -147,16 +148,6 @@ static void node_ID_title_cb(bContext *C, void *node_v, void *unused_v)
        }
 }
 
-
-static void node_but_title_cb(bContext *C, void *node_v, void *but_v)
-{
-       // bNode *node= node_v;
-       // XXX uiBut *bt= but_v;
-       // XXX BLI_strncpy(node->name, bt->drawstr, NODE_MAXSTR);
-       
-       // allqueue(REDRAWNODE, 0);
-}
-
 #if 0
 /* XXX not used yet, make compiler happy :) */
 static void node_group_alone_cb(bContext *C, void *node_v, void *unused_v)
@@ -172,7 +163,7 @@ static void node_group_alone_cb(bContext *C, void *node_v, void *unused_v)
 
 static void node_buts_group(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
 
@@ -206,7 +197,7 @@ static void node_buts_group(uiLayout *layout, PointerRNA *ptr)
 
 static void node_buts_value(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
        bNodeSocket *sock= node->outputs.first;         /* first socket stores value */
@@ -218,7 +209,7 @@ static void node_buts_value(uiLayout *layout, PointerRNA *ptr)
 
 static void node_buts_rgb(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
        bNodeSocket *sock= node->outputs.first;         /* first socket stores value */
@@ -278,7 +269,7 @@ static void node_buts_time(uiLayout *layout, PointerRNA *ptr)
 
 static void node_buts_valtorgb(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
 
@@ -315,7 +306,7 @@ static void node_buts_curvecol(uiLayout *layout, PointerRNA *ptr)
 
 static void node_buts_normal(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
        bNodeSocket *sock= node->outputs.first;         /* first socket stores normal */
@@ -388,10 +379,7 @@ static void node_dynamic_update_cb(bContext *C, void *ntree_v, void *node_v)
 
 static void node_buts_texture(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
        bNode *node= ptr->data;
-       bNodeTree *ntree= ptr->id.data;
-       rctf *butr= &node->butr;
 
        short multi = (
                node->id &&
@@ -400,47 +388,19 @@ static void node_buts_texture(uiLayout *layout, PointerRNA *ptr)
                (node->type != TEX_NODE_TEXTURE)
        );
        
-       uiBut *bt;
-       char *strp;
-       short width = (short)(butr->xmax - butr->xmin);
-       
-       /* browse button texture */
-       uiBlockBeginAlign(block);
-       IDnames_to_pupstring(&strp, NULL, "", &(G.main->tex), NULL, NULL);
-       node->menunr= 0;
-       bt= uiDefButS(block, MENU, B_NODE_EXEC, strp, 
-                       butr->xmin, butr->ymin+(multi?30:0), 20, 19, 
-                                 &node->menunr, 0, 0, 0, 0, "Browse texture");
-       uiButSetFunc(bt, node_browse_tex_cb, ntree, node);
-       if(strp) MEM_freeN(strp);
-       
-       if(node->id) {
-               bt= uiDefBut(block, TEX, B_NOP, "TE:",
-                               butr->xmin+19, butr->ymin+(multi?30:0), butr->xmax-butr->xmin-19, 19, 
-                                        node->id->name+2, 0.0, 19.0, 0, 0, "Texture name");
-               uiButSetFunc(bt, node_ID_title_cb, node, NULL);
-       }
-       uiBlockEndAlign(block);
+       uiItemR(layout, "", 0, ptr, "texture", 0);
        
        if(multi) {
-               char *menustr = ntreeTexOutputMenu(((Tex*)node->id)->nodetree);
-               uiDefButS(block, MENU, B_MATPRV, menustr, butr->xmin, butr->ymin, width, 19, &node->custom1, 0, 0, 0, 0, "Which output to use, for multi-output textures");
-               free(menustr);
+               /* Number Drawing not optimal here, better have a list*/
+               uiItemR(layout, "", 0, ptr, "node_output", 0);
        }
 }
 
 static void node_buts_math(uiLayout *layout, PointerRNA *ptr)
 { 
-       uiBlock *block= uiLayoutFreeBlock(layout);
-       bNode *node= ptr->data;
-       rctf *butr= &node->butr;
-       uiBut *bt; 
-
-       bt=uiDefButS(block, MENU, B_NODE_EXEC,  "Add %x0|Subtract %x1|Multiply %x2|Divide %x3|Sine %x4|Cosine %x5|Tangent %x6|Arcsine %x7|Arccosine %x8|Arctangent %x9|Power %x10|Logarithm %x11|Minimum %x12|Maximum %x13|Round %x14|Less Than %x15|Greater Than %x16", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 0, 0, 0, ""); 
-       uiButSetFunc(bt, node_but_title_cb, node, bt); 
+       uiItemR(layout, "", 0, ptr, "operation", 0);
 }
 
-
 /* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */
 
 static void node_browse_text_cb(bContext *C, void *ntree_v, void *node_v)
@@ -543,7 +503,7 @@ static void node_texmap_cb(bContext *C, void *texmap_v, void *unused_v)
 
 static void node_shader_buts_material(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        bNodeTree *ntree= ptr->id.data;
        rctf *butr= &node->butr;
@@ -615,7 +575,7 @@ static void node_shader_buts_material(uiLayout *layout, PointerRNA *ptr)
 
 static void node_shader_buts_mapping(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
        TexMapping *texmap= node->storage;
@@ -663,18 +623,12 @@ static void node_shader_buts_mapping(uiLayout *layout, PointerRNA *ptr)
 
 static void node_shader_buts_vect_math(uiLayout *layout, PointerRNA *ptr)
 { 
-       uiBlock *block= uiLayoutFreeBlock(layout);
-       bNode *node= ptr->data;
-       rctf *butr= &node->butr;
-       uiBut *bt; 
-
-       bt=uiDefButS(block, MENU, B_NODE_EXEC,  "Add %x0|Subtract %x1|Average %x2|Dot Product %x3 |Cross Product %x4|Normalize %x5", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &node->custom1, 0, 0, 0, 0, ""); 
-       uiButSetFunc(bt, node_but_title_cb, node, bt); 
+       uiItemR(layout, "", 0, ptr, "operation", 0);
 }
 
 static void node_shader_buts_geometry(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
        uiBut *but;
@@ -693,7 +647,7 @@ static void node_shader_buts_geometry(uiLayout *layout, PointerRNA *ptr)
 
 static void node_shader_buts_dynamic(uiLayout *layout, PointerRNA *ptr)
 { 
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        bNodeTree *ntree= ptr->id.data;
        rctf *butr= &node->butr;
@@ -785,8 +739,6 @@ static void node_shader_set_butfunc(bNodeType *ntype)
 
 /* ****************** BUTTON CALLBACKS FOR COMPOSITE NODES ***************** */
 
-
-
 static void node_browse_image_cb(bContext *C, void *ntree_v, void *node_v)
 {
        bNodeTree *ntree= ntree_v;
@@ -866,7 +818,7 @@ static void image_layer_cb(bContext *C, void *ima_v, void *iuser_v)
 
 static void node_composit_buts_image(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        bNodeTree *ntree= ptr->id.data;
        rctf *butr= &node->butr;
@@ -1034,7 +986,7 @@ static void node_browse_scene_cb(bContext *C, void *ntree_v, void *node_v)
 
 static void node_composit_buts_renderlayers(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        bNodeTree *ntree= ptr->id.data;
        rctf *butr= &node->butr;
@@ -1076,35 +1028,7 @@ static void node_composit_buts_renderlayers(uiLayout *layout, PointerRNA *ptr)
        }
 }
 
-static void node_blur_relative_cb(bContext *C, void *node, void *poin2)
-{
-       bNode *nodev= node;
-       NodeBlurData *nbd= nodev->storage;
-       if(nbd->image_in_width != 0){
-               if(nbd->relative){ /* convert absolute values to relative */
-                       nbd->percentx= (float)(nbd->sizex)/nbd->image_in_width;
-                       nbd->percenty= (float)(nbd->sizey)/nbd->image_in_height;
-               }else{ /* convert relative values to absolute */
-                       nbd->sizex= (int)(nbd->percentx*nbd->image_in_width);
-                       nbd->sizey= (int)(nbd->percenty*nbd->image_in_height);
-               }
-       }
-       // allqueue(REDRAWNODE, 0);
-}
-static void node_blur_update_sizex_cb(bContext *C, void *node, void *poin2)
-{
-       bNode *nodev= node;
-       NodeBlurData *nbd= nodev->storage;
-
-       nbd->sizex= (int)(nbd->percentx*nbd->image_in_width);
-}
-static void node_blur_update_sizey_cb(bContext *C, void *node, void *poin2)
-{
-       bNode *nodev= node;
-       NodeBlurData *nbd= nodev->storage;
 
-       nbd->sizey= (int)(nbd->percenty*nbd->image_in_height);
-}
 static void node_composit_buts_blur(uiLayout *layout, PointerRNA *ptr)
 {
        uiLayout *col;
@@ -1389,7 +1313,6 @@ static void node_composit_buts_color_spill(uiLayout *layout, PointerRNA *ptr)
 
 static void node_composit_buts_chroma_matte(uiLayout *layout, PointerRNA *ptr)
 {
-
        uiLayout *col;
        
        col= uiLayoutColumn(layout, 0);
@@ -1400,26 +1323,6 @@ static void node_composit_buts_chroma_matte(uiLayout *layout, PointerRNA *ptr)
        uiItemR(col, NULL, 0, ptr, "lift", UI_ITEM_R_SLIDER);
        uiItemR(col, NULL, 0, ptr, "gain", UI_ITEM_R_SLIDER);
        uiItemR(col, NULL, 0, ptr, "shadow_adjust", UI_ITEM_R_SLIDER);
-
-//     uiBlock *block= uiLayoutFreeBlock(layout);
-//     bNode *node= ptr->data;
-//     rctf *butr= &node->butr;
-//     short dx=(butr->xmax-butr->xmin)/2;
-//     NodeChroma *c= node->storage;
-
-//     uiBlockBeginAlign(block);
-//
-//     uiDefButF(block, NUMSLI, B_NODE_EXEC, "Acceptance ", butr->xmin, butr->ymin+60, butr->xmax-butr->xmin, 20, &c->t1, 1.0f, 80.0f, 100, 0, "Tolerance for colors to be considered a keying color");
-//     uiDefButF(block, NUMSLI, B_NODE_EXEC, "Cutoff ", butr->xmin, butr->ymin+40, butr->xmax-butr->xmin, 20, &c->t2, 0.0f, 30.0f, 100, 0, "Colors below this will be considered as exact matches for keying color");
-//
-//     uiDefButF(block, NUMSLI, B_NODE_EXEC, "Lift ", butr->xmin, butr->ymin+20, dx, 20, &c->fsize, 0.0f, 1.0f, 100, 0, "Alpha Lift");
-//     uiDefButF(block, NUMSLI, B_NODE_EXEC, "Gain ", butr->xmin+dx, butr->ymin+20, dx, 20, &c->fstrength, 0.0f, 1.0f, 100, 0, "Alpha Gain");
-//
-//     uiDefButF(block, NUMSLI, B_NODE_EXEC, "Shadow Adjust ", butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20, &c->t3, 0.0f, 1.0f, 100, 0, "Adjusts the brightness of any shadows captured");
-//     uiBlockEndAlign(block);
-//
-//     if(c->t2 > c->t1)
-//             c->t2=c->t1;
 }
 
 static void node_composit_buts_color_matte(uiLayout *layout, PointerRNA *ptr)
@@ -1433,8 +1336,10 @@ static void node_composit_buts_color_matte(uiLayout *layout, PointerRNA *ptr)
 }
 
 static void node_composit_buts_channel_matte(uiLayout *layout, PointerRNA *ptr)
-{
-       uiBlock *block= uiLayoutFreeBlock(layout);
+{      
+       uiLayout *col, *row;
+       
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
        short sx= (butr->xmax-butr->xmin)/4;
@@ -1442,16 +1347,9 @@ static void node_composit_buts_channel_matte(uiLayout *layout, PointerRNA *ptr)
        NodeChroma *c=node->storage;
        char *c1, *c2, *c3;
 
-       /*color space selectors*/
-       uiBlockBeginAlign(block);
-       uiDefButS(block, ROW,B_NODE_EXEC,"RGB",
-               butr->xmin,butr->ymin+60,sx,20,&node->custom1,1,1, 0, 0, "RGB Color Space");
-       uiDefButS(block, ROW,B_NODE_EXEC,"HSV",
-               butr->xmin+sx,butr->ymin+60,sx,20,&node->custom1,1,2, 0, 0, "HSV Color Space");
-       uiDefButS(block, ROW,B_NODE_EXEC,"YUV",
-               butr->xmin+2*sx,butr->ymin+60,sx,20,&node->custom1,1,3, 0, 0, "YUV Color Space");
-       uiDefButS(block, ROW,B_NODE_EXEC,"YCC",
-               butr->xmin+3*sx,butr->ymin+60,sx,20,&node->custom1,1,4, 0, 0, "YCbCr Color Space");
+       /*color space selector*/
+       row= uiLayoutRow(layout, 0);
+       uiItemR(row, NULL, 0, ptr, "color_space", UI_ITEM_R_EXPAND);
 
        if (node->custom1==1) {
                c1="R"; c2="G"; c3="B";
@@ -1467,48 +1365,30 @@ static void node_composit_buts_channel_matte(uiLayout *layout, PointerRNA *ptr)
        }
 
        /*channel selector */
+       row= uiLayoutRow(layout, 0);
+       uiBlockBeginAlign(block);
        uiDefButS(block, ROW, B_NODE_EXEC, c1,
                butr->xmin,butr->ymin+40,cx,20,&node->custom2,1, 1, 0, 0, "Channel 1");
        uiDefButS(block, ROW, B_NODE_EXEC, c2,
                butr->xmin+cx,butr->ymin+40,cx,20,&node->custom2,1, 2, 0, 0, "Channel 2");
        uiDefButS(block, ROW, B_NODE_EXEC, c3,
                butr->xmin+cx+cx,butr->ymin+40,cx,20,&node->custom2, 1, 3, 0, 0, "Channel 3");
+       uiBlockEndAlign(block);
 
        /*tolerance sliders */
-       uiDefButF(block, NUMSLI, B_NODE_EXEC, "High ", 
-               butr->xmin, butr->ymin+20.0, butr->xmax-butr->xmin, 20,
-               &c->t1, 0.0f, 1.0f, 100, 0, "Values higher than this setting are 100% opaque");
-       uiDefButF(block, NUMSLI, B_NODE_EXEC, "Low ", 
-               butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
-               &c->t2, 0.0f, 1.0f, 100, 0, "Values lower than this setting are 100% keyed");
-       uiBlockEndAlign(block);
+       col =uiLayoutColumn(layout, 1);
+       uiItemR(col, NULL, 0, ptr, "high", UI_ITEM_R_SLIDER);
+       uiItemR(col, NULL, 0, ptr, "low", UI_ITEM_R_SLIDER);
 
-       /*keep t2 (low) less than t1 (high) */
-       if(c->t2 > c->t1) {
-               c->t2=c->t1;
-       }
 }
 
 static void node_composit_buts_luma_matte(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
-       bNode *node= ptr->data;
-       rctf *butr= &node->butr;
-       NodeChroma *c=node->storage;
-
-       /*tolerance sliders */
-       uiDefButF(block, NUMSLI, B_NODE_EXEC, "High ", 
-               butr->xmin, butr->ymin+20.0, butr->xmax-butr->xmin, 20,
-               &c->t1, 0.0f, 1.0f, 100, 0, "Values higher than this setting are 100% opaque");
-       uiDefButF(block, NUMSLI, B_NODE_EXEC, "Low ", 
-               butr->xmin, butr->ymin, butr->xmax-butr->xmin, 20,
-               &c->t2, 0.0f, 1.0f, 100, 0, "Values lower than this setting are 100% keyed");
-       uiBlockEndAlign(block);
-
-       /*keep t2 (low) less than t1 (high) */
-       if(c->t2 > c->t1) {
-               c->t2=c->t1;
-       }
+       uiLayout *col;
+       
+       col= uiLayoutColumn(layout, 1);
+       uiItemR(col, NULL, 0, ptr, "high", UI_ITEM_R_SLIDER);
+       uiItemR(col, NULL, 0, ptr, "low", UI_ITEM_R_SLIDER);
 }
 
 static void node_composit_buts_map_uv(uiLayout *layout, PointerRNA *ptr)
@@ -1518,7 +1398,7 @@ static void node_composit_buts_map_uv(uiLayout *layout, PointerRNA *ptr)
 
 static void node_composit_buts_id_mask(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
 
@@ -1528,6 +1408,7 @@ static void node_composit_buts_id_mask(uiLayout *layout, PointerRNA *ptr)
 }
 
 /* allocate sufficient! */
+/*
 static void node_imagetype_string(char *str)
 {
        str += sprintf(str, "Save Image as: %%t|");
@@ -1542,67 +1423,37 @@ static void node_imagetype_string(char *str)
        str += sprintf(str, "DPX %%x%d|", R_DPX);
        str += sprintf(str, "OpenEXR %%x%d", R_OPENEXR);
 }
+*/
 
-static void node_set_image_cb(bContext *C, void *ntree_v, void *node_v)
+/*static void node_set_image_cb(bContext *C, void *ntree_v, void *node_v)
 {
        bNodeTree *ntree= ntree_v;
        bNode *node= node_v;
        
        nodeSetActive(ntree, node);
 }
+*/
 
 static void node_composit_buts_file_output(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
-       bNode *node= ptr->data;
-       bNodeTree *ntree= ptr->id.data;
-       rctf *butr= &node->butr;
-       NodeImageFile *nif= node->storage;
-       uiBut *bt;
-       short x= (short)butr->xmin;
-       short y= (short)butr->ymin;
-       short w= (short)butr->xmax-butr->xmin;
-       char str[320];
-       
-       node_imagetype_string(str);
-       
-       uiBlockBeginAlign(block);
-       
-       bt = uiDefIconBut(block, BUT, B_NODE_SETIMAGE, ICON_FILESEL,
-                         x, y+60, 20, 20,
-                         0, 0, 0, 0, 0, "Open Fileselect to get Backbuf image");
-       uiButSetFunc(bt, node_set_image_cb, ntree, node);
-       
-       uiDefBut(block, TEX, B_NOP, "",
-                         20+x, y+60, w-20, 20, 
-                         nif->name, 0.0f, 240.0f, 0, 0, "");
-       
-       uiDefButS(block, MENU, B_NOP, str,
-                         x, y+40, w, 20, 
-                         &nif->imtype, 0.0f, 1.0f, 0, 0, "");
-       
-       if(nif->imtype==R_OPENEXR) {
-               uiDefButBitS(block, TOG, R_OPENEXR_HALF, B_REDR, "Half",        
-                                       x, y+20, w/2, 20, 
-                                       &nif->subimtype, 0, 0, 0, 0, "");
+       uiLayout *col, *row;
 
-               uiDefButS(block, MENU,B_NOP, "Codec %t|None %x0|Pxr24 (lossy) %x1|ZIP (lossless) %x2|PIZ (lossless) %x3|RLE (lossless) %x4",  
-                                       x+w/2, y+20, w/2, 20, 
-                                       &nif->codec, 0, 0, 0, 0, "");
+       col= uiLayoutColumn(layout, 0);
+       uiItemR(col, "", 0, ptr, "filename", 0);
+       uiItemR(col, "", 0, ptr, "image_type", 0);
+       
+       row= uiLayoutRow(layout, 0);
+       if (RNA_enum_get(ptr, "image_type")== R_OPENEXR) {
+               uiItemR(row, NULL, 0, ptr, "exr_half", 0);
+               uiItemR(row, "", 0, ptr, "exr_codec", 0);
        }
-       else {
-               uiDefButS(block, NUM, B_NOP, "Quality: ",
-                         x, y+20, w, 20, 
-                         &nif->quality, 10.0f, 100.0f, 10, 0, "");
+       else if (RNA_enum_get(ptr, "image_type")== R_JPEG90) {
+               uiItemR(row, NULL, 0, ptr, "quality", UI_ITEM_R_SLIDER);
        }
        
-       /* start frame, end frame */
-       uiDefButI(block, NUM, B_NODE_EXEC, "SFra: ", 
-                         x, y, w/2, 20, 
-                         &nif->sfra, 1, MAXFRAMEF, 10, 0, "");
-       uiDefButI(block, NUM, B_NODE_EXEC, "EFra: ", 
-                         x+w/2, y, w/2, 20, 
-                         &nif->efra, 1, MAXFRAMEF, 10, 0, "");
+       row= uiLayoutRow(layout, 1);
+       uiItemR(row, "Start", 0, ptr, "start_frame", 0);
+       uiItemR(row, "End", 0, ptr, "end_frame", 0);
 }
 
 static void node_scale_cb(bContext *C, void *node_v, void *unused_v)
@@ -1625,7 +1476,7 @@ static void node_scale_cb(bContext *C, void *node_v, void *unused_v)
 
 static void node_composit_buts_scale(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
        uiBut *bt= uiDefButS(block, MENU, B_NODE_EXEC, "Relative %x0|Absolute %x1|Scene Size % %x2|",
@@ -1798,43 +1649,15 @@ static void node_composit_set_butfunc(bNodeType *ntype)
 
 static void node_texture_buts_bricks(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
-       bNode *node= ptr->data;
-       rctf *butr= &node->butr;
-       short w = butr->xmax-butr->xmin;
-       short ofw = 32;
-       
-       uiBlockBeginAlign(block);
+       uiLayout *col;
        
-       /* Offset */
-       uiDefButF(
-               block, NUM, B_NODE_EXEC, "Offset",
-               butr->xmin, butr->ymin+20, w-ofw, 20,
-               &node->custom3,
-               0, 1, 0.25, 2,
-               "Offset amount" );
-       uiDefButS(
-               block, NUM, B_NODE_EXEC, "",
-               butr->xmin+w-ofw, butr->ymin+20, ofw, 20,
-               &node->custom1,
-               2, 99, 0, 0,
-               "Offset every N rows" );
-       
-       /* Squash */
-       uiDefButF(
-               block, NUM, B_NODE_EXEC, "Squash",
-               butr->xmin, butr->ymin+0, w-ofw, 20,
-               &node->custom4,
-               0, 99, 0.25, 2,
-               "Stretch amount" );
-       uiDefButS(
-               block, NUM, B_NODE_EXEC, "",
-               butr->xmin+w-ofw, butr->ymin+0, ofw, 20,
-               &node->custom2,
-               2, 99, 0, 0,
-               "Stretch every N rows" );
+       col= uiLayoutColumn(layout, 1);
+       uiItemR(col, "Offset", 0, ptr, "offset", 0);
+       uiItemR(col, "Frequency", 0, ptr, "offset_frequency", 0);
        
-       uiBlockEndAlign(block);
+       col= uiLayoutColumn(layout, 1);
+       uiItemR(col, "Squash", 0, ptr, "squash", 0);
+       uiItemR(col, "Frequency", 0, ptr, "squash_frequency", 0);
 }
 
 /* Copied from buttons_shading.c -- needs unifying */
@@ -1847,7 +1670,7 @@ static char* noisebasis_menu()
 
 static void node_texture_buts_proc(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        rctf *butr= &node->butr;
        Tex *tex = (Tex *)node->storage;
@@ -1926,7 +1749,7 @@ static void node_texture_buts_proc(uiLayout *layout, PointerRNA *ptr)
 
 static void node_texture_buts_image(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
+       uiBlock *block= uiLayoutAbsoluteBlock(layout);
        bNode *node= ptr->data;
        bNodeTree *ntree= ptr->id.data;
        rctf *butr= &node->butr;
@@ -1965,28 +1788,7 @@ static void node_texture_buts_image(uiLayout *layout, PointerRNA *ptr)
 
 static void node_texture_buts_output(uiLayout *layout, PointerRNA *ptr)
 {
-       uiBlock *block= uiLayoutFreeBlock(layout);
-       bNode *node= ptr->data;
-       rctf *butr= &node->butr;
-       uiBut *bt;
-       short width;
-       char *name = ((TexNodeOutput*)node->storage)->name;
-       
-       uiBlockBeginAlign(block);
-       
-       width = (short)(butr->xmax - butr->xmin);
-       
-       bt = uiDefBut(
-               block, TEX, B_NOP,
-               "Name:",
-               butr->xmin, butr->ymin,
-               width, 19, 
-               name, 0, 31,
-               0, 0, 
-               "Name this output"
-       );
-       
-       uiBlockEndAlign(block);
+       uiItemR(layout, "", 0, ptr, "output_name", 0);
 }
 
 /* only once called */
@@ -2106,12 +1908,13 @@ void node_rename_but(char *s)
 
 #endif
 
-void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode)
+void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage)
 {
        
        if((snode->flag & SNODE_BACKDRAW) && snode->treetype==NTREE_COMPOSIT) {
                Image *ima= BKE_image_verify_viewer(IMA_TYPE_COMPOSITE, "Viewer Node");
-               ImBuf *ibuf= BKE_image_get_ibuf(ima, NULL);
+               void *lock;
+               ImBuf *ibuf= BKE_image_acquire_ibuf(ima, NULL, &lock);
                if(ibuf) {
                        float x, y; 
                        
@@ -2126,13 +1929,21 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode)
                        x = (ar->winx-ibuf->x)/2 + snode->xof;
                        y = (ar->winy-ibuf->y)/2 + snode->yof;
                        
+                       if(!ibuf->rect) {
+                               if(color_manage)
+                                       ibuf->profile= IB_PROFILE_SRGB;
+                               else
+                                       ibuf->profile = IB_PROFILE_NONE;
+                               IMB_rect_from_float(ibuf);
+                       }
+
                        if(ibuf->rect)
                                glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_UNSIGNED_BYTE, ibuf->rect);
-                       else if(ibuf->channels==4)
-                               glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_RGBA, GL_FLOAT, ibuf->rect_float);
                        
                        wmPopMatrix();
                }
+
+               BKE_image_release_ibuf(ima, lock);
        }
 }