Mango request: added an input node to use track's position in compositor
[blender-staging.git] / source / blender / editors / space_node / drawnode.c
index 54f852f11222666bb85bfdd9309521a06bcd9019..1281e48045884933dd70d1ec7e5fc03c56ba6d87 100644 (file)
@@ -83,7 +83,7 @@
 
 #include "node_intern.h"
 
-// XXX interface.h
+/* XXX interface.h */
 extern void ui_dropshadow(rctf *rct, float radius, float aspect, float alpha, int select);
 
 /* ****************** SOCKET BUTTON DRAW FUNCTIONS ***************** */
@@ -141,7 +141,8 @@ static uiBlock *socket_component_menu(bContext *C, ARegion *ar, void *args_v)
        block = uiBeginBlock(C, ar, __func__, UI_EMBOSS);
        uiBlockSetFlag(block, UI_BLOCK_KEEP_OPEN);
        
-       layout = uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, args->x, args->y + 2, args->width, NODE_DY, UI_GetStyle()), 0);
+       layout = uiLayoutColumn(uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
+                                             args->x, args->y + 2, args->width, NODE_DY, UI_GetStyle()), FALSE);
        
        uiItemR(layout, &args->ptr, "default_value", UI_ITEM_R_EXPAND, "", ICON_NONE);
        
@@ -217,13 +218,17 @@ static void node_draw_output_default(const bContext *C, uiBlock *block,
        int ofs = 0;
        const char *ui_name = IFACE_(name);
        UI_ThemeColor(TH_TEXT);
-       slen = snode->aspect * UI_GetStringWidth(ui_name);
+       slen = (UI_GetStringWidth(ui_name) + NODE_MARGIN_X) * snode->aspect_sqrt;
        while (slen > node->width) {
                ofs++;
-               slen = snode->aspect * UI_GetStringWidth(ui_name + ofs);
+               slen = (UI_GetStringWidth(ui_name + ofs) + NODE_MARGIN_X) * snode->aspect_sqrt;
        }
-       uiDefBut(block, LABEL, 0, ui_name + ofs, (short)(sock->locx - 15.0f - slen), (short)(sock->locy - 9.0f),
-                (short)(node->width - NODE_DY), NODE_DY,  NULL, 0, 0, 0, 0, "");
+       uiDefBut(block, LABEL, 0, ui_name + ofs,
+                (int)(sock->locx - slen), (int)(sock->locy - 9.0f),
+                (short)(node->width - NODE_DY), (short)NODE_DY,
+                NULL, 0, 0, 0, 0, "");
+
+       (void)snode;
 }
 
 /* ****************** BASE DRAW FUNCTIONS FOR NEW OPERATOR NODES ***************** */
@@ -292,21 +297,24 @@ static void node_buts_rgb(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr
        prop = RNA_struct_find_property(ptr, "outputs");
        RNA_property_collection_lookup_int(ptr, prop, 0, &sockptr);
        
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiTemplateColorWheel(col, &sockptr, "default_value", 1, 0, 0, 0);
        uiItemR(col, &sockptr, "default_value", 0, "", ICON_NONE);
 }
 
 static void node_buts_mix_rgb(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 {      
-       uiLayout *row;
+       uiLayout *row, *col;
 
        bNodeTree *ntree = (bNodeTree *)ptr->id.data;
 
-       row = uiLayoutRow(layout, 1);
+       col = uiLayoutColumn(layout, FALSE);
+       row = uiLayoutRow(col, TRUE);
        uiItemR(row, ptr, "blend_type", 0, "", ICON_NONE);
        if (ntree->type == NTREE_COMPOSIT)
                uiItemR(row, ptr, "use_alpha", 0, "", ICON_IMAGE_RGB_ALPHA);
+
+       uiItemR(col, ptr, "use_clamp", 0, NULL, ICON_NONE);
 }
 
 static void node_buts_time(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -326,7 +334,7 @@ static void node_buts_time(uiLayout *layout, bContext *UNUSED(C), PointerRNA *pt
 
        uiTemplateCurveMapping(layout, ptr, "curve", 's', 0, 0);
 
-       row = uiLayoutRow(layout, 1);
+       row = uiLayoutRow(layout, TRUE);
        uiItemR(row, ptr, "frame_start", 0, IFACE_("Sta"), ICON_NONE);
        uiItemR(row, ptr, "frame_end", 0, IFACE_("End"), ICON_NONE);
 }
@@ -341,25 +349,30 @@ static void node_buts_curvevec(uiLayout *layout, bContext *UNUSED(C), PointerRNA
        uiTemplateCurveMapping(layout, ptr, "mapping", 'v', 0, 0);
 }
 
-static float *_sample_col = NULL;    // bad bad, 2.5 will do better?
-#if 0
-static void node_curvemap_sample(float *col)
+static float _sample_col[4];  /* bad bad, 2.5 will do better?... no it won't... */
+#define SAMPLE_FLT_ISNONE FLT_MAX
+void ED_node_sample_set(const float col[4])
 {
-       _sample_col = col;
+       if (col) {
+               copy_v4_v4(_sample_col, col);
+       }
+       else {
+               copy_v4_fl(_sample_col, SAMPLE_FLT_ISNONE);
+       }
 }
-#endif
 
 static void node_buts_curvecol(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 {
        bNode *node = ptr->data;
        CurveMapping *cumap = node->storage;
 
-       if (_sample_col) {
+       if (_sample_col[0] != SAMPLE_FLT_ISNONE) {
                cumap->flag |= CUMA_DRAW_SAMPLE;
                copy_v3_v3(cumap->sample, _sample_col);
        }
-       else 
+       else {
                cumap->flag &= ~CUMA_DRAW_SAMPLE;
+       }
 
        uiTemplateCurveMapping(layout, ptr, "mapping", 'c', 0, 0);
 }
@@ -383,12 +396,12 @@ static void node_buts_normal(uiLayout *layout, bContext *UNUSED(C), PointerRNA *
        uiBut *bt;
        
        bt = uiDefButF(block, BUT_NORMAL, B_NODE_EXEC, "",
-                      (short)butr->xmin, (short)butr->xmin,
-                      butr->xmax - butr->xmin, butr->xmax - butr->xmin,
+                      (int)butr->xmin, (int)butr->xmin,
+                      (short)(butr->xmax - butr->xmin), (short)(butr->xmax - butr->xmin),
                       nor, 0.0f, 1.0f, 0, 0, "");
        uiButSetFunc(bt, node_normal_cb, ntree, node);
 }
-#if 0 // not used in 2.5x yet
+#if 0 /* not used in 2.5x yet */
 static void node_browse_tex_cb(bContext *C, void *ntree_v, void *node_v)
 {
        Main *bmain = CTX_data_main(C);
@@ -443,6 +456,7 @@ static void node_buts_texture(uiLayout *layout, bContext *UNUSED(C), PointerRNA
 static void node_buts_math(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 { 
        uiItemR(layout, ptr, "operation", 0, "", ICON_NONE);
+       uiItemR(layout, ptr, "use_clamp", 0, NULL, ICON_NONE);
 }
 
 static int node_resize_area_default(bNode *node, int x, int y)
@@ -641,7 +655,8 @@ static void update_group_output_cb(bContext *UNUSED(C), void *UNUSED(snode_v), v
        ntreeUpdateTree(ngroup);
 }
 
-static void draw_group_socket_name(SpaceNode *snode, bNode *gnode, bNodeSocket *sock, int in_out, float xoffset, float yoffset)
+static void draw_group_socket_name(SpaceNode *snode, bNode *gnode, bNodeSocket *sock,
+                                   int in_out, float xoffset, float yoffset)
 {
        bNodeTree *ngroup = (bNodeTree *)gnode->id;
        uiBut *bt;
@@ -663,7 +678,8 @@ static void draw_group_socket_name(SpaceNode *snode, bNode *gnode, bNodeSocket *
        }
 }
 
-static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *ntree, bNode *gnode, bNodeSocket *sock, bNodeSocket *gsock, int index, int in_out)
+static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *ntree, bNode *gnode,
+                              bNodeSocket *sock, bNodeSocket *gsock, int index, int in_out)
 {
        bNodeTree *ngroup = (bNodeTree *)gnode->id;
        bNodeSocketType *stype = ntreeGetSocketType(gsock ? gsock->type : sock->type);
@@ -713,12 +729,14 @@ static void draw_group_socket(const bContext *C, SpaceNode *snode, bNodeTree *nt
                if (gsock) {
                        draw_group_socket_name(snode, gnode, gsock, in_out, offset, 0);
                        if (stype->buttonfunc)
-                               stype->buttonfunc(C, gnode->block, ngroup, NULL, gsock, "", gsock->locx + offset, gsock->locy - NODE_DY, colw);
+                               stype->buttonfunc(C, gnode->block, ngroup, NULL, gsock, "",
+                                                 gsock->locx + offset, gsock->locy - NODE_DY, colw);
                }
                else {
                        draw_group_socket_name(snode, gnode, sock, in_out, offset, 0);
                        if (stype->buttonfunc)
-                               stype->buttonfunc(C, gnode->block, ngroup, NULL, sock, "", sock->locx + offset, sock->locy - NODE_DY, colw);
+                               stype->buttonfunc(C, gnode->block, ngroup, NULL, sock, "",
+                                                 sock->locx + offset, sock->locy - NODE_DY, colw);
                }
        }
        else {
@@ -772,8 +790,9 @@ static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bN
                uiLayout *layout;
                PointerRNA ptr;
                rctf rect = gnode->totr;
-               float node_group_frame = U.dpi * NODE_GROUP_FRAME / 72;
-               float group_header = 26 * U.dpi / 72;
+               const float dpi_fac = U.dpi / 72.0f;
+               float node_group_frame = NODE_GROUP_FRAME * dpi_fac;
+               float group_header = 26 * dpi_fac;
                
                int index;
                
@@ -781,7 +800,9 @@ static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bN
                glEnable(GL_BLEND);
                uiSetRoundBox(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
                UI_ThemeColorShadeAlpha(TH_NODE_GROUP, 0, -70);
-               uiDrawBox(GL_POLYGON, rect.xmin - node_group_frame, rect.ymax, rect.xmax + node_group_frame, rect.ymax + group_header, BASIS_RAD);
+               uiDrawBox(GL_POLYGON,
+                         rect.xmin - node_group_frame, rect.ymax,
+                         rect.xmax + node_group_frame, rect.ymax + group_header, BASIS_RAD);
                
                /* backdrop body */
                UI_ThemeColorShadeAlpha(TH_BACK, -8, -70);
@@ -816,14 +837,17 @@ static void node_draw_group(const bContext *C, ARegion *ar, SpaceNode *snode, bN
                uiSetRoundBox(UI_CNR_ALL);
                glColor4ub(200, 200, 200, 140);
                glEnable(GL_LINE_SMOOTH);
-               uiDrawBox(GL_LINE_LOOP, rect.xmin - node_group_frame, rect.ymin, rect.xmax + node_group_frame, rect.ymax + group_header, BASIS_RAD);
+               uiDrawBox(GL_LINE_LOOP,
+                         rect.xmin - node_group_frame, rect.ymin,
+                         rect.xmax + node_group_frame, rect.ymax + group_header, BASIS_RAD);
                glDisable(GL_LINE_SMOOTH);
                glDisable(GL_BLEND);
                
                /* backdrop title */
                UI_ThemeColor(TH_TEXT_HI);
        
-               layout = uiBlockLayout(gnode->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, (short)(rect.xmin + 15), (short)(rect.ymax + group_header),
+               layout = uiBlockLayout(gnode->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
+                                      (int)(rect.xmin + NODE_MARGIN_X), (int)(rect.ymax + (group_header - (2.5f * dpi_fac))),
                                       MIN2((int)(rect.xmax - rect.xmin - 18.0f), node_group_frame + 20), group_header, UI_GetStyle());
                RNA_pointer_create(&ntree->id, &RNA_Node, gnode, &ptr);
                uiTemplateIDBrowse(layout, (bContext *)C, &ptr, "node_tree", NULL, NULL, NULL);
@@ -942,7 +966,7 @@ static void node_update_frame(const bContext *UNUSED(C), bNodeTree *ntree, bNode
        node->totr = rect;
 }
 
-static void node_draw_frame_label(bNode *node)
+static void node_draw_frame_label(bNode *node, const float aspect)
 {
        /* XXX font id is crap design */
        const int fontid = blf_mono_font;
@@ -953,9 +977,13 @@ static void node_draw_frame_label(bNode *node)
        /* XXX a bit hacky, should use separate align values for x and y */
        float width, ascender;
        float x, y;
+       const int font_size = data->label_size / aspect;
        
        BLI_strncpy(label, nodeLabel(node), sizeof(label));
-       BLF_size(fontid, data->label_size, U.dpi);
+
+       BLF_enable(fontid, BLF_ASPECT);
+       BLF_aspect(fontid, aspect, aspect, 1.0f);
+       BLF_size(fontid, MIN2(24, font_size), U.dpi); /* clamp otherwise it can suck up a LOT of memory */
        
        /* title color */
        UI_ThemeColorBlendShade(TH_TEXT, color_id, 0.8f, 10);
@@ -963,11 +991,14 @@ static void node_draw_frame_label(bNode *node)
        width = BLF_width(fontid, label);
        ascender = BLF_ascender(fontid);
        
+       /* 'x' doesn't need aspect correction */
        x = 0.5f * (rct->xmin + rct->xmax) - 0.5f * width;
-       y = rct->ymax - NODE_DYS - ascender;
+       y = rct->ymax - NODE_DYS - (ascender * aspect);
        
        BLF_position(fontid, x, y, 0);
        BLF_draw(fontid, label, BLF_DRAW_STR_DUMMY_MAX);
+
+       BLF_disable(fontid, BLF_ASPECT);
 }
 
 static void node_draw_frame(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeTree *UNUSED(ntree), bNode *node)
@@ -978,7 +1009,7 @@ static void node_draw_frame(const bContext *C, ARegion *ar, SpaceNode *snode, bN
        float alpha;
        
        UI_GetThemeColor4ubv(TH_NODE_FRAME, color);
-       alpha = (float)(color[3])/255.0f;
+       alpha = (float)(color[3]) / 255.0f;
        
        /* skip if out of view */
        if (node->totr.xmax < ar->v2d.cur.xmin || node->totr.xmin > ar->v2d.cur.xmax ||
@@ -1012,14 +1043,16 @@ static void node_draw_frame(const bContext *C, ARegion *ar, SpaceNode *snode, bN
                else
                        UI_ThemeColorShadeAlpha(TH_SELECT, 0, -40);
                uiSetRoundBox(UI_CNR_ALL);
-               uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD);
+               uiDrawBox(GL_LINE_LOOP,
+                         rct->xmin, rct->ymin,
+                         rct->xmax, rct->ymax, BASIS_RAD);
                
                glDisable(GL_LINE_SMOOTH);
                glDisable(GL_BLEND);
        }
        
        /* label */
-       node_draw_frame_label(node);
+       node_draw_frame_label(node, snode->aspect);
        
        UI_ThemeClearColor(color_id);
                
@@ -1058,7 +1091,7 @@ static void node_buts_frame_details(uiLayout *layout, bContext *UNUSED(C), Point
 }
 
 
-#define NODE_REROUTE_SIZE      8.0f
+#define NODE_REROUTE_SIZE   8.0f
 
 static void node_update_reroute(const bContext *UNUSED(C), bNodeTree *UNUSED(ntree), bNode *node)
 {
@@ -1070,36 +1103,36 @@ static void node_update_reroute(const bContext *UNUSED(C), bNodeTree *UNUSED(ntr
        nodeToView(node, 0.0f, 0.0f, &locx, &locy);
        
        /* reroute node has exactly one input and one output, both in the same place */
-       nsock= node->outputs.first;
-       nsock->locx= locx;
-       nsock->locy= locy;
+       nsock = node->outputs.first;
+       nsock->locx = locx;
+       nsock->locy = locy;
 
-       nsock= node->inputs.first;
-       nsock->locx= locx;
-       nsock->locy= locy;
-       
-       node->width = size*2;
-       node->totr.xmin= locx - size;
-       node->totr.xmax= locx + size;
-       node->totr.ymax= locy + size;
-       node->totr.ymin= locy - size;
+       nsock = node->inputs.first;
+       nsock->locx = locx;
+       nsock->locy = locy;
+
+       node->width = size * 2;
+       node->totr.xmin = locx - size;
+       node->totr.xmax = locx + size;
+       node->totr.ymax = locy + size;
+       node->totr.ymin = locy - size;
 }
 
 static void node_draw_reroute(const bContext *C, ARegion *ar, SpaceNode *UNUSED(snode),  bNodeTree *ntree, bNode *node)
 {
        bNodeSocket *sock;
-       #if 0   /* UNUSED */
-       rctf *rct= &node->totr;
+#if 0   /* UNUSED */
+       rctf *rct = &node->totr;
        float size = NODE_REROUTE_SIZE;
-       #endif
-       float socket_size= NODE_SOCKSIZE;
+#endif
+       float socket_size = NODE_SOCKSIZE;
 
        /* skip if out of view */
        if (node->totr.xmax < ar->v2d.cur.xmin || node->totr.xmin > ar->v2d.cur.xmax ||
-                       node->totr.ymax < ar->v2d.cur.ymin || node->totr.ymin > ar->v2d.cur.ymax) {
+           node->totr.ymax < ar->v2d.cur.ymin || node->totr.ymin > ar->v2d.cur.ymax) {
 
                uiEndBlock(C, node->block);
-               node->block= NULL;
+               node->block = NULL;
                return;
        }
 
@@ -1118,12 +1151,12 @@ static void node_draw_reroute(const bContext *C, ARegion *ar, SpaceNode *UNUSED(
        if (node->flag & (NODE_ACTIVE | SELECT)) {
                glEnable(GL_BLEND);
                glEnable(GL_LINE_SMOOTH);
-                       /* using different shades of TH_TEXT_HI for the empasis, like triangle */
-                       if (node->flag & NODE_ACTIVE)
-                               UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40);
-                       else
-                               UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120);
-                       uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, size);
+               /* using different shades of TH_TEXT_HI for the empasis, like triangle */
+               if (node->flag & NODE_ACTIVE)
+                       UI_ThemeColorShadeAlpha(TH_TEXT_HI, 0, -40);
+               else
+                       UI_ThemeColorShadeAlpha(TH_TEXT_HI, -20, -120);
+               uiDrawBox(GL_LINE_LOOP, rct->xmin, rct->ymin, rct->xmax, rct->ymax, size);
 
                glDisable(GL_LINE_SMOOTH);
                glDisable(GL_BLEND);
@@ -1133,13 +1166,13 @@ static void node_draw_reroute(const bContext *C, ARegion *ar, SpaceNode *UNUSED(
        /* only draw input socket. as they all are placed on the same position.
         * highlight also if node itself is selected, since we don't display the node body separately!
         */
-       for (sock= node->inputs.first; sock; sock= sock->next) {
+       for (sock = node->inputs.first; sock; sock = sock->next) {
                node_socket_circle_draw(ntree, sock, socket_size, (sock->flag & SELECT) || (node->flag & SELECT));
        }
 
        uiEndBlock(C, node->block);
        uiDrawBlock(C, node->block);
-       node->block= NULL;
+       node->block = NULL;
 }
 
 /* Special tweak area for reroute node.
@@ -1148,12 +1181,12 @@ static void node_draw_reroute(const bContext *C, ARegion *ar, SpaceNode *UNUSED(
 static int node_tweak_area_reroute(bNode *node, int x, int y)
 {
        /* square of tweak radius */
-       static const float tweak_radius_sq = 576;       /* 24*24 */
+       static const float tweak_radius_sq = 576;  /* 24 * 24 */
        
        bNodeSocket *sock = node->inputs.first;
        float dx = sock->locx - x;
        float dy = sock->locy - y;
-       return (dx*dx + dy*dy <= tweak_radius_sq);
+       return (dx * dx + dy * dy <= tweak_radius_sq);
 }
 
 static void node_common_set_butfunc(bNodeType *ntype)
@@ -1181,16 +1214,17 @@ static void node_common_set_butfunc(bNodeType *ntype)
                        ntype->resize_area_func = node_resize_area_frame;
                        break;
                case NODE_REROUTE:
-                       ntype->drawfunc= node_draw_reroute;
-                       ntype->drawupdatefunc= node_update_reroute;
-                       ntype->tweak_area_func= node_tweak_area_reroute;
+                       ntype->drawfunc = node_draw_reroute;
+                       ntype->drawupdatefunc = node_update_reroute;
+                       ntype->tweak_area_func = node_tweak_area_reroute;
                        break;
        }
 }
 
 /* ****************** BUTTON CALLBACKS FOR SHADER NODES ***************** */
 
-static void node_buts_image_user(uiLayout *layout, bContext *C, PointerRNA *imaptr, PointerRNA *iuserptr)
+static void node_buts_image_user(uiLayout *layout, bContext *C, PointerRNA *ptr,
+                                 PointerRNA *imaptr, PointerRNA *iuserptr)
 {
        uiLayout *col;
        int source;
@@ -1198,7 +1232,7 @@ static void node_buts_image_user(uiLayout *layout, bContext *C, PointerRNA *imap
        if (!imaptr->data)
                return;
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        
        uiItemR(col, imaptr, "source", 0, "", ICON_NONE);
        
@@ -1209,25 +1243,24 @@ static void node_buts_image_user(uiLayout *layout, bContext *C, PointerRNA *imap
                Scene *scene = CTX_data_scene(C);
                ImageUser *iuser = iuserptr->data;
                char numstr[32];
-               const int framenr = BKE_image_user_frame_get(iuser, CFRA, 0);
+               const int framenr = BKE_image_user_frame_get(iuser, CFRA, 0, NULL);
                BLI_snprintf(numstr, sizeof(numstr), IFACE_("Frame: %d"), framenr);
                uiItemL(layout, numstr, ICON_NONE);
        }
 
        if (ELEM(source, IMA_SRC_SEQUENCE, IMA_SRC_MOVIE)) {
-               col = uiLayoutColumn(layout, 1);
-               uiItemR(col, iuserptr, "frame_duration", 0, NULL, ICON_NONE);
-               uiItemR(col, iuserptr, "frame_start", 0, NULL, ICON_NONE);
-               uiItemR(col, iuserptr, "frame_offset", 0, NULL, ICON_NONE);
-               uiItemR(col, iuserptr, "use_cyclic", 0, NULL, ICON_NONE);
-               uiItemR(col, iuserptr, "use_auto_refresh", UI_ITEM_R_ICON_ONLY, NULL, ICON_NONE);
+               col = uiLayoutColumn(layout, TRUE);
+               uiItemR(col, ptr, "frame_duration", 0, NULL, ICON_NONE);
+               uiItemR(col, ptr, "frame_start", 0, NULL, ICON_NONE);
+               uiItemR(col, ptr, "frame_offset", 0, NULL, ICON_NONE);
+               uiItemR(col, ptr, "use_cyclic", 0, NULL, ICON_NONE);
+               uiItemR(col, ptr, "use_auto_refresh", UI_ITEM_R_ICON_ONLY, NULL, ICON_NONE);
        }
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
 
        if (RNA_enum_get(imaptr, "type") == IMA_TYPE_MULTILAYER)
-               uiItemR(col, iuserptr, "layer", 0, NULL, ICON_NONE);
-
+               uiItemR(col, ptr, "layer", 0, NULL, ICON_NONE);
 }
 
 static void node_shader_buts_material(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -1239,7 +1272,7 @@ static void node_shader_buts_material(uiLayout *layout, bContext *C, PointerRNA
        
        if (!node->id) return;
        
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemR(col, ptr, "use_diffuse", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "use_specular", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "invert_normal", 0, NULL, ICON_NONE);
@@ -1250,22 +1283,22 @@ static void node_shader_buts_mapping(uiLayout *layout, bContext *UNUSED(C), Poin
        uiLayout *row;
        
        uiItemL(layout, IFACE_("Location:"), ICON_NONE);
-       row = uiLayoutRow(layout, 1);
+       row = uiLayoutRow(layout, TRUE);
        uiItemR(row, ptr, "translation", 0, "", ICON_NONE);
        
        uiItemL(layout, IFACE_("Rotation:"), ICON_NONE);
-       row = uiLayoutRow(layout, 1);
+       row = uiLayoutRow(layout, TRUE);
        uiItemR(row, ptr, "rotation", 0, "", ICON_NONE);
        
        uiItemL(layout, IFACE_("Scale:"), ICON_NONE);
-       row = uiLayoutRow(layout, 1);
+       row = uiLayoutRow(layout, TRUE);
        uiItemR(row, ptr, "scale", 0, "", ICON_NONE);
        
-       row = uiLayoutRow(layout, 1);
+       row = uiLayoutRow(layout, TRUE);
        uiItemR(row, ptr, "use_min", 0, "Min", ICON_NONE);
        uiItemR(row, ptr, "min", 0, "", ICON_NONE);
        
-       row = uiLayoutRow(layout, 1);
+       row = uiLayoutRow(layout, TRUE);
        uiItemR(row, ptr, "use_max", 0, "Max", ICON_NONE);
        uiItemR(row, ptr, "max", 0, "", ICON_NONE);
 }
@@ -1280,7 +1313,7 @@ static void node_shader_buts_geometry(uiLayout *layout, bContext *C, PointerRNA
        PointerRNA obptr = CTX_data_pointer_get(C, "active_object");
        uiLayout *col;
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
 
        if (obptr.data && RNA_enum_get(&obptr, "type") == OB_MESH) {
                PointerRNA dataptr = RNA_pointer_get(&obptr, "data");
@@ -1307,7 +1340,10 @@ static void node_shader_buts_tex_image(uiLayout *layout, bContext *C, PointerRNA
        uiTemplateID(layout, C, ptr, "image", NULL, "IMAGE_OT_open", NULL);
        uiItemR(layout, ptr, "color_space", 0, "", ICON_NONE);
 
-       node_buts_image_user(layout, C, &imaptr, &iuserptr);
+       /* note: image user properties used directly here, unlike compositor image node,
+        * which redefines them in the node struct RNA to get proper updates.
+        */
+       node_buts_image_user(layout, C, &iuserptr, &imaptr, &iuserptr);
 }
 
 static void node_shader_buts_tex_environment(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -1319,7 +1355,7 @@ static void node_shader_buts_tex_environment(uiLayout *layout, bContext *C, Poin
        uiItemR(layout, ptr, "color_space", 0, "", ICON_NONE);
        uiItemR(layout, ptr, "projection", 0, "", ICON_NONE);
 
-       node_buts_image_user(layout, C, &imaptr, &iuserptr);
+       node_buts_image_user(layout, C, ptr, &imaptr, &iuserptr);
 }
 
 static void node_shader_buts_tex_sky(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
@@ -1452,7 +1488,7 @@ static void node_composit_buts_image(uiLayout *layout, bContext *C, PointerRNA *
        imaptr = RNA_pointer_get(ptr, "image");
        RNA_pointer_create((ID *)ptr->id.data, &RNA_ImageUser, node->storage, &iuserptr);
        
-       node_buts_image_user(layout, C, &imaptr, &iuserptr);
+       node_buts_image_user(layout, C, ptr, &imaptr, &iuserptr);
 }
 
 static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, PointerRNA *ptr)
@@ -1472,8 +1508,8 @@ static void node_composit_buts_renderlayers(uiLayout *layout, bContext *C, Point
        
        if (!node->id) return;
 
-       col = uiLayoutColumn(layout, 0);
-       row = uiLayoutRow(col, 0);
+       col = uiLayoutColumn(layout, FALSE);
+       row = uiLayoutRow(col, FALSE);
        uiItemR(row, ptr, "layer", 0, "", ICON_NONE);
        
        prop = RNA_struct_find_property(ptr, "layer");
@@ -1495,7 +1531,7 @@ static void node_composit_buts_blur(uiLayout *layout, bContext *UNUSED(C), Point
 {
        uiLayout *col, *row;
        
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        
        uiItemR(col, ptr, "filter_type", 0, "", ICON_NONE);
        if (RNA_enum_get(ptr, "filter_type") != R_FILTER_FAST_GAUSS) {
@@ -1507,15 +1543,15 @@ static void node_composit_buts_blur(uiLayout *layout, bContext *UNUSED(C), Point
        
        if (RNA_boolean_get(ptr, "use_relative")) {
                uiItemL(col, IFACE_("Aspect Correction"), 0);
-               row = uiLayoutRow(layout, 1);
+               row = uiLayoutRow(layout, TRUE);
                uiItemR(row, ptr, "aspect_correction", UI_ITEM_R_EXPAND, NULL, 0);
                
-               col = uiLayoutColumn(layout, 1);
+               col = uiLayoutColumn(layout, TRUE);
                uiItemR(col, ptr, "factor_x", 0, IFACE_("X"), ICON_NONE);
                uiItemR(col, ptr, "factor_y", 0, IFACE_("Y"), ICON_NONE);
        }
        else {
-               col = uiLayoutColumn(layout, 1);
+               col = uiLayoutColumn(layout, TRUE);
                uiItemR(col, ptr, "size_x", 0, IFACE_("X"), ICON_NONE);
                uiItemR(col, ptr, "size_y", 0, IFACE_("Y"), ICON_NONE);
        }
@@ -1528,14 +1564,14 @@ static void node_composit_buts_dblur(uiLayout *layout, bContext *UNUSED(C), Poin
        uiItemR(layout, ptr, "iterations", 0, NULL, ICON_NONE);
        uiItemR(layout, ptr, "use_wrap", 0, NULL, ICON_NONE);
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemL(col, IFACE_("Center:"), ICON_NONE);
        uiItemR(col, ptr, "center_x", 0, IFACE_("X"), ICON_NONE);
        uiItemR(col, ptr, "center_y", 0, IFACE_("Y"), ICON_NONE);
        
        uiItemS(layout);
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "distance", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "angle", 0, NULL, ICON_NONE);
        
@@ -1549,7 +1585,7 @@ static void node_composit_buts_bilateralblur(uiLayout *layout, bContext *UNUSED(
 {      
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "iterations", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "sigma_color", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "sigma_space", 0, NULL, ICON_NONE);
@@ -1559,29 +1595,26 @@ static void node_composit_buts_defocus(uiLayout *layout, bContext *UNUSED(C), Po
 {
        uiLayout *sub, *col;
        
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemL(col, IFACE_("Bokeh Type:"), ICON_NONE);
        uiItemR(col, ptr, "bokeh", 0, "", ICON_NONE);
        uiItemR(col, ptr, "angle", 0, NULL, ICON_NONE);
 
        uiItemR(layout, ptr, "use_gamma_correction", 0, NULL, ICON_NONE);
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_zbuffer") == TRUE);
        uiItemR(col, ptr, "f_stop", 0, NULL, ICON_NONE);
 
        uiItemR(layout, ptr, "blur_max", 0, NULL, ICON_NONE);
        uiItemR(layout, ptr, "threshold", 0, NULL, ICON_NONE);
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemR(col, ptr, "use_preview", 0, NULL, ICON_NONE);
-       sub = uiLayoutColumn(col, 0);
-       uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_preview"));
-       uiItemR(sub, ptr, "samples", 0, NULL, ICON_NONE);
        
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemR(col, ptr, "use_zbuffer", 0, NULL, ICON_NONE);
-       sub = uiLayoutColumn(col, 0);
+       sub = uiLayoutColumn(col, FALSE);
        uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_zbuffer") == FALSE);
        uiItemR(sub, ptr, "z_scale", 0, NULL, ICON_NONE);
 }
@@ -1621,7 +1654,7 @@ static void node_composit_buts_tonemap(uiLayout *layout, bContext *UNUSED(C), Po
 {      
        uiLayout *col;
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemR(col, ptr, "tonemap_type", 0, "", ICON_NONE);
        if (RNA_enum_get(ptr, "tonemap_type") == 0) {
                uiItemR(col, ptr, "key", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
@@ -1640,10 +1673,10 @@ static void node_composit_buts_lensdist(uiLayout *layout, bContext *UNUSED(C), P
 {
        uiLayout *col;
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemR(col, ptr, "use_projector", 0, NULL, ICON_NONE);
 
-       col = uiLayoutColumn(col, 0);
+       col = uiLayoutColumn(col, FALSE);
        uiLayoutSetActive(col, RNA_boolean_get(ptr, "use_projector") == FALSE);
        uiItemR(col, ptr, "use_jitter", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "use_fit", 0, NULL, ICON_NONE);
@@ -1653,11 +1686,11 @@ static void node_composit_buts_vecblur(uiLayout *layout, bContext *UNUSED(C), Po
 {
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemR(col, ptr, "samples", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "factor", 0, IFACE_("Blur"), ICON_NONE);
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemL(col, IFACE_("Speed:"), ICON_NONE);
        uiItemR(col, ptr, "speed_min", 0, IFACE_("Min"), ICON_NONE);
        uiItemR(col, ptr, "speed_max", 0, IFACE_("Max"), ICON_NONE);
@@ -1682,7 +1715,7 @@ static void node_composit_buts_crop(uiLayout *layout, bContext *UNUSED(C), Point
        uiItemR(layout, ptr, "use_crop_size", 0, NULL, ICON_NONE);
        uiItemR(layout, ptr, "relative", 0, NULL, ICON_NONE);
 
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        if (RNA_boolean_get(ptr, "relative")) {
                uiItemR(col, ptr, "rel_min_x", 0, IFACE_("Left"), ICON_NONE);
                uiItemR(col, ptr, "rel_max_x", 0, IFACE_("Right"), ICON_NONE);
@@ -1701,8 +1734,8 @@ static void node_composit_buts_splitviewer(uiLayout *layout, bContext *UNUSED(C)
 {
        uiLayout *row, *col;
        
-       col = uiLayoutColumn(layout, 0);
-       row = uiLayoutRow(col, 0);
+       col = uiLayoutColumn(layout, FALSE);
+       row = uiLayoutRow(col, FALSE);
        uiItemR(row, ptr, "axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
        uiItemR(col, ptr, "factor", 0, NULL, ICON_NONE);
 }
@@ -1711,7 +1744,7 @@ static void node_composit_buts_double_edge_mask(uiLayout *layout, bContext *UNUS
 {
        uiLayout *col;
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
 
        uiItemL(col, IFACE_("Inner Edge:"), ICON_NONE);
        uiItemR(col, ptr, "inner_mode", 0, "", ICON_NONE);
@@ -1723,19 +1756,19 @@ static void node_composit_buts_map_value(uiLayout *layout, bContext *UNUSED(C),
 {
        uiLayout *sub, *col;
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "offset", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "size", 0, NULL, ICON_NONE);
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "use_min", 0, NULL, ICON_NONE);
-       sub = uiLayoutColumn(col, 0);
+       sub = uiLayoutColumn(col, FALSE);
        uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_min"));
        uiItemR(sub, ptr, "min", 0, "", ICON_NONE);
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "use_max", 0, NULL, ICON_NONE);
-       sub = uiLayoutColumn(col, 0);
+       sub = uiLayoutColumn(col, FALSE);
        uiLayoutSetActive(sub, RNA_boolean_get(ptr, "use_max"));
        uiItemR(sub, ptr, "max", 0, "", ICON_NONE);
 }
@@ -1744,7 +1777,7 @@ static void node_composit_buts_alphaover(uiLayout *layout, bContext *UNUSED(C),
 {      
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "use_premultiply", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "premul", 0, NULL, ICON_NONE);
 }
@@ -1753,7 +1786,7 @@ static void node_composit_buts_zcombine(uiLayout *layout, bContext *UNUSED(C), P
 {      
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "use_alpha", 0, NULL, ICON_NONE);
 }
 
@@ -1762,7 +1795,7 @@ static void node_composit_buts_hue_sat(uiLayout *layout, bContext *UNUSED(C), Po
 {
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
@@ -1772,8 +1805,13 @@ static void node_composit_buts_dilateerode(uiLayout *layout, bContext *UNUSED(C)
 {
        uiItemR(layout, ptr, "type", 0, NULL, ICON_NONE);
        uiItemR(layout, ptr, "distance", 0, NULL, ICON_NONE);
-       if (RNA_enum_get(ptr, "type") == CMP_NODE_DILATEERODE_DISTANCE_THRESH) {
-               uiItemR(layout, ptr, "edge", 0, NULL, ICON_NONE);
+       switch (RNA_enum_get(ptr, "type")) {
+               case CMP_NODE_DILATEERODE_DISTANCE_THRESH:
+                       uiItemR(layout, ptr, "edge", 0, NULL, ICON_NONE);
+                       break;
+               case CMP_NODE_DILATEERODE_DISTANCE_FEATHER:
+                       uiItemR(layout, ptr, "falloff", 0, NULL, ICON_NONE);
+                       break;
        }
 }
 
@@ -1781,7 +1819,7 @@ static void node_composit_buts_diff_matte(uiLayout *layout, bContext *UNUSED(C),
 {
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        uiItemR(col, ptr, "falloff", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
 }
@@ -1790,10 +1828,10 @@ static void node_composit_buts_distance_matte(uiLayout *layout, bContext *UNUSED
 {
        uiLayout *col, *row;
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
    
        uiItemL(layout, IFACE_("Color Space:"), ICON_NONE);
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
 
        uiItemR(col, ptr, "tolerance", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
@@ -1805,15 +1843,15 @@ static void node_composit_buts_color_spill(uiLayout *layout, bContext *UNUSED(C)
        uiLayout *row, *col;
        
        uiItemL(layout, IFACE_("Despill Channel:"), ICON_NONE);
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemR(row, ptr, "channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NONE);
 
        if (RNA_enum_get(ptr, "limit_method") == 0) {
                uiItemL(col, IFACE_("Limiting Channel:"), ICON_NONE);
-               row = uiLayoutRow(col, 0);
+               row = uiLayoutRow(col, FALSE);
                uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
        }
 
@@ -1830,11 +1868,11 @@ static void node_composit_buts_chroma_matte(uiLayout *layout, bContext *UNUSED(C
 {
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemR(col, ptr, "tolerance", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "threshold", 0, NULL, ICON_NONE);
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        /*uiItemR(col, ptr, "lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE);  Removed for now */
        uiItemR(col, ptr, "gain", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        /*uiItemR(col, ptr, "shadow_adjust", UI_ITEM_R_SLIDER, NULL, ICON_NONE);  Removed for now*/
@@ -1844,7 +1882,7 @@ static void node_composit_buts_color_matte(uiLayout *layout, bContext *UNUSED(C)
 {
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "color_hue", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        uiItemR(col, ptr, "color_saturation", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        uiItemR(col, ptr, "color_value", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
@@ -1855,20 +1893,20 @@ static void node_composit_buts_channel_matte(uiLayout *layout, bContext *UNUSED(
        uiLayout *col, *row;
 
        uiItemL(layout, IFACE_("Color Space:"), ICON_NONE);
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemR(row, ptr, "color_space", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemL(col, IFACE_("Key Channel:"), ICON_NONE);
-       row = uiLayoutRow(col, 0);
+       row = uiLayoutRow(col, FALSE);
        uiItemR(row, ptr, "matte_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
 
        uiItemR(col, ptr, "limit_method", 0, NULL, ICON_NONE);
        if (RNA_enum_get(ptr, "limit_method") == 0) {
                uiItemL(col, IFACE_("Limiting Channel:"), ICON_NONE);
-               row = uiLayoutRow(col, 0);
+               row = uiLayoutRow(col, FALSE);
                uiItemR(row, ptr, "limit_channel", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
        }
 
@@ -1880,7 +1918,7 @@ static void node_composit_buts_luma_matte(uiLayout *layout, bContext *UNUSED(C),
 {
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "limit_max", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        uiItemR(col, ptr, "limit_min", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
 }
@@ -1893,7 +1931,7 @@ static void node_composit_buts_map_uv(uiLayout *layout, bContext *UNUSED(C), Poi
 static void node_composit_buts_id_mask(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 {
        uiItemR(layout, ptr, "index", 0, NULL, ICON_NONE);
-       uiItemR(layout, ptr, "use_smooth_mask", 0, NULL, ICON_NONE);
+       uiItemR(layout, ptr, "use_antialiasing", 0, NULL, ICON_NONE);
 }
 
 /* draw function for file output node sockets, displays only sub-path and format, no value button */
@@ -1908,7 +1946,7 @@ static void node_draw_input_file_output(const bContext *C, uiBlock *block,
        RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr);
        
        layout = uiBlockLayout(block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL, x, y + NODE_DY, width, 20, UI_GetStyle());
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        
        imfptr = RNA_pointer_get(&nodeptr, "format");
        imtype = RNA_enum_get(&imfptr, "file_format");
@@ -1930,7 +1968,8 @@ static void node_draw_input_file_output(const bContext *C, uiBlock *block,
                        imfptr = RNA_pointer_get(&inputptr, "format");
                
                imtype_prop = RNA_struct_find_property(&imfptr, "file_format");
-               RNA_property_enum_name((bContext *)C, &imfptr, imtype_prop, RNA_property_enum_get(&imfptr, imtype_prop), &imtype_name);
+               RNA_property_enum_name((bContext *)C, &imfptr, imtype_prop,
+                                      RNA_property_enum_get(&imfptr, imtype_prop), &imtype_name);
                uiBlockSetEmboss(block, UI_EMBOSSP);
                uiItemL(row, imtype_name, 0);
                uiBlockSetEmboss(block, UI_EMBOSSN);
@@ -1968,48 +2007,54 @@ static void node_composit_buts_file_output_details(uiLayout *layout, bContext *C
        /* using different collection properties if multilayer format is enabled */
        if (multilayer) {
                uiTemplateList(layout, C, ptr, "layer_slots", ptr, "active_input_index", NULL, 0, 0, 0);
-               RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, "layer_slots"), active_index, &active_input_ptr);
+               RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, "layer_slots"),
+                                                  active_index, &active_input_ptr);
        }
        else {
                uiTemplateList(layout, C, ptr, "file_slots", ptr, "active_input_index", NULL, 0, 0, 0);
-               RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, "file_slots"), active_index, &active_input_ptr);
+               RNA_property_collection_lookup_int(ptr, RNA_struct_find_property(ptr, "file_slots"),
+                                                  active_index, &active_input_ptr);
        }
        /* XXX collection lookup does not return the ID part of the pointer, setting this manually here */
        active_input_ptr.id.data = ptr->id.data;
        
-       row = uiLayoutRow(layout, 1);
-       op_ptr = uiItemFullO(row, "NODE_OT_output_file_move_active_socket", "", ICON_TRIA_UP, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+       row = uiLayoutRow(layout, TRUE);
+       op_ptr = uiItemFullO(row, "NODE_OT_output_file_move_active_socket", "",
+                            ICON_TRIA_UP, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS);
        RNA_enum_set(&op_ptr, "direction", 1);
-       op_ptr = uiItemFullO(row, "NODE_OT_output_file_move_active_socket", "", ICON_TRIA_DOWN, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS);
+       op_ptr = uiItemFullO(row, "NODE_OT_output_file_move_active_socket", "",
+                            ICON_TRIA_DOWN, NULL, WM_OP_INVOKE_DEFAULT, UI_ITEM_O_RETURN_PROPS);
        RNA_enum_set(&op_ptr, "direction", 2);
        
        if (active_input_ptr.data) {
                if (multilayer) {
                        uiLayout *row, *col;
-                       col = uiLayoutColumn(layout, 1);
+                       col = uiLayoutColumn(layout, TRUE);
                        
                        uiItemL(col, IFACE_("Layer:"), 0);
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &active_input_ptr, "name", 0, "", 0);
-                       uiItemFullO(row, "NODE_OT_output_file_remove_active_socket", "", ICON_X, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_R_ICON_ONLY);
+                       uiItemFullO(row, "NODE_OT_output_file_remove_active_socket", "",
+                                   ICON_X, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_R_ICON_ONLY);
                }
                else {
                        uiLayout *row, *col;
-                       col = uiLayoutColumn(layout, 1);
+                       col = uiLayoutColumn(layout, TRUE);
                        
                        uiItemL(col, IFACE_("File Path:"), 0);
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &active_input_ptr, "path", 0, "", 0);
-                       uiItemFullO(row, "NODE_OT_output_file_remove_active_socket", "", ICON_X, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_R_ICON_ONLY);
+                       uiItemFullO(row, "NODE_OT_output_file_remove_active_socket", "",
+                                   ICON_X, NULL, WM_OP_EXEC_DEFAULT, UI_ITEM_R_ICON_ONLY);
                        
                        /* format details for individual files */
                        imfptr = RNA_pointer_get(&active_input_ptr, "format");
                        
-                       col = uiLayoutColumn(layout, 1);
+                       col = uiLayoutColumn(layout, TRUE);
                        uiItemL(col, IFACE_("Format:"), 0);
                        uiItemR(col, &active_input_ptr, "use_node_format", 0, NULL, 0);
                        
-                       col = uiLayoutColumn(layout, 0);
+                       col = uiLayoutColumn(layout, FALSE);
                        uiLayoutSetActive(col, RNA_boolean_get(&active_input_ptr, "use_node_format") == FALSE);
                        uiTemplateImageSettings(col, &imfptr);
                }
@@ -2038,7 +2083,7 @@ static void node_composit_buts_invert(uiLayout *layout, bContext *UNUSED(C), Poi
 {
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
        uiItemR(col, ptr, "invert_rgb", 0, NULL, ICON_NONE);
        uiItemR(col, ptr, "invert_alpha", 0, NULL, ICON_NONE);
 }
@@ -2061,39 +2106,39 @@ static void node_composit_buts_colorbalance(uiLayout *layout, bContext *UNUSED(C
        
        if (RNA_enum_get(ptr, "correction_method") == 0) {
        
-               split = uiLayoutSplit(layout, 0, 0);
-               col = uiLayoutColumn(split, 0);
+               split = uiLayoutSplit(layout, 0.0f, FALSE);
+               col = uiLayoutColumn(split, FALSE);
                uiTemplateColorWheel(col, ptr, "lift", 1, 1, 0, 1);
-               row = uiLayoutRow(col, 0);
+               row = uiLayoutRow(col, FALSE);
                uiItemR(row, ptr, "lift", 0, NULL, ICON_NONE);
                
-               col = uiLayoutColumn(split, 0);
+               col = uiLayoutColumn(split, FALSE);
                uiTemplateColorWheel(col, ptr, "gamma", 1, 1, 1, 1);
-               row = uiLayoutRow(col, 0);
+               row = uiLayoutRow(col, FALSE);
                uiItemR(row, ptr, "gamma", 0, NULL, ICON_NONE);
                
-               col = uiLayoutColumn(split, 0);
+               col = uiLayoutColumn(split, FALSE);
                uiTemplateColorWheel(col, ptr, "gain", 1, 1, 1, 1);
-               row = uiLayoutRow(col, 0);
+               row = uiLayoutRow(col, FALSE);
                uiItemR(row, ptr, "gain", 0, NULL, ICON_NONE);
 
        }
        else {
                
-               split = uiLayoutSplit(layout, 0, 0);
-               col = uiLayoutColumn(split, 0);
+               split = uiLayoutSplit(layout, 0.0f, FALSE);
+               col = uiLayoutColumn(split, FALSE);
                uiTemplateColorWheel(col, ptr, "offset", 1, 1, 0, 1);
-               row = uiLayoutRow(col, 0);
+               row = uiLayoutRow(col, FALSE);
                uiItemR(row, ptr, "offset", 0, NULL, ICON_NONE);
                
-               col = uiLayoutColumn(split, 0);
+               col = uiLayoutColumn(split, FALSE);
                uiTemplateColorWheel(col, ptr, "power", 1, 1, 0, 1);
-               row = uiLayoutRow(col, 0);
+               row = uiLayoutRow(col, FALSE);
                uiItemR(row, ptr, "power", 0, NULL, ICON_NONE);
                
-               col = uiLayoutColumn(split, 0);
+               col = uiLayoutColumn(split, FALSE);
                uiTemplateColorWheel(col, ptr, "slope", 1, 1, 0, 1);
-               row = uiLayoutRow(col, 0);
+               row = uiLayoutRow(col, FALSE);
                uiItemR(row, ptr, "slope", 0, NULL, ICON_NONE);
        }
 
@@ -2128,6 +2173,17 @@ static void node_composit_buts_colorbalance_but(uiLayout *layout, bContext *UNUS
 
 static void node_composit_buts_huecorrect(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 {
+       bNode *node = ptr->data;
+       CurveMapping *cumap = node->storage;
+
+       if (_sample_col[0] != SAMPLE_FLT_ISNONE) {
+               cumap->flag |= CUMA_DRAW_SAMPLE;
+               copy_v3_v3(cumap->sample, _sample_col);
+       }
+       else {
+               cumap->flag &= ~CUMA_DRAW_SAMPLE;
+       }
+
        uiTemplateCurveMapping(layout, ptr, "mapping", 'h', 0, 0);
 }
 
@@ -2174,12 +2230,12 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE
 {
        uiLayout *row;
        
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemR(row, ptr, "red", 0, NULL, ICON_NONE);
        uiItemR(row, ptr, "green", 0, NULL, ICON_NONE);
        uiItemR(row, ptr, "blue", 0, NULL, ICON_NONE);
 
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemL(row, "", 0);
        uiItemL(row, IFACE_("Saturation"), 0);
        uiItemL(row, IFACE_("Contrast"), 0);
@@ -2187,7 +2243,7 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE
        uiItemL(row, IFACE_("Gain"), 0);
        uiItemL(row, IFACE_("Lift"), 0);
 
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemL(row, IFACE_("Master"), 0);
        uiItemR(row, ptr, "master_saturation", UI_ITEM_R_SLIDER, "", ICON_NONE);
        uiItemR(row, ptr, "master_contrast", UI_ITEM_R_SLIDER, "", ICON_NONE);
@@ -2195,7 +2251,7 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE
        uiItemR(row, ptr, "master_gain", UI_ITEM_R_SLIDER, "", ICON_NONE);
        uiItemR(row, ptr, "master_lift", UI_ITEM_R_SLIDER, "", ICON_NONE);
 
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemL(row, IFACE_("Highlights"), 0);
        uiItemR(row, ptr, "highlights_saturation", UI_ITEM_R_SLIDER, "", ICON_NONE);
        uiItemR(row, ptr, "highlights_contrast", UI_ITEM_R_SLIDER, "", ICON_NONE);
@@ -2203,7 +2259,7 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE
        uiItemR(row, ptr, "highlights_gain", UI_ITEM_R_SLIDER, "", ICON_NONE);
        uiItemR(row, ptr, "highlights_lift", UI_ITEM_R_SLIDER, "", ICON_NONE);
 
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemL(row, IFACE_("Midtones"), 0);
        uiItemR(row, ptr, "midtones_saturation", UI_ITEM_R_SLIDER, "", ICON_NONE);
        uiItemR(row, ptr, "midtones_contrast", UI_ITEM_R_SLIDER, "", ICON_NONE);
@@ -2211,7 +2267,7 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE
        uiItemR(row, ptr, "midtones_gain", UI_ITEM_R_SLIDER, "", ICON_NONE);
        uiItemR(row, ptr, "midtones_lift", UI_ITEM_R_SLIDER, "", ICON_NONE);
 
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemL(row, IFACE_("Shadows"), 0);
        uiItemR(row, ptr, "shadows_saturation", UI_ITEM_R_SLIDER, "", ICON_NONE);
        uiItemR(row, ptr, "shadows_contrast", UI_ITEM_R_SLIDER, "", ICON_NONE);
@@ -2219,7 +2275,7 @@ static void node_composit_buts_colorcorrection(uiLayout *layout, bContext *UNUSE
        uiItemR(row, ptr, "shadows_gain", UI_ITEM_R_SLIDER, "", ICON_NONE);
        uiItemR(row, ptr, "shadows_lift", UI_ITEM_R_SLIDER, "", ICON_NONE);
 
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemR(row, ptr, "midtones_start", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        uiItemR(row, ptr, "midtones_end", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
 }
@@ -2228,7 +2284,7 @@ static void node_composit_buts_colorcorrection_but(uiLayout *layout, bContext *U
 {
        uiLayout *row;
        
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemR(row, ptr, "red", 0, NULL, ICON_NONE);
        uiItemR(row, ptr, "green", 0, NULL, ICON_NONE);
        uiItemR(row, ptr, "blue", 0, NULL, ICON_NONE);
@@ -2263,7 +2319,7 @@ static void node_composit_buts_colorcorrection_but(uiLayout *layout, bContext *U
        uiItemR(row, ptr, "midtones_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        uiItemR(row, ptr, "shadows_lift", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
 
-       row = uiLayoutRow(layout, 0);
+       row = uiLayoutRow(layout, FALSE);
        uiItemR(row, ptr, "midtones_start", 0, NULL, ICON_NONE);
        uiItemR(row, ptr, "midtones_end", 0, NULL, ICON_NONE);
 }
@@ -2277,11 +2333,11 @@ static void node_composit_buts_boxmask(uiLayout *layout, bContext *UNUSED(C), Po
 {
        uiLayout *row;
        
-       row = uiLayoutRow(layout, 1);
+       row = uiLayoutRow(layout, TRUE);
        uiItemR(row, ptr, "x", 0, NULL, ICON_NONE);
        uiItemR(row, ptr, "y", 0, NULL, ICON_NONE);
        
-       row = uiLayoutRow(layout, 1);
+       row = uiLayoutRow(layout, TRUE);
        uiItemR(row, ptr, "width", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        uiItemR(row, ptr, "height", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
 
@@ -2404,10 +2460,10 @@ void node_composit_backdrop_ellipsemask(SpaceNode *snode, ImBuf *backdrop, bNode
 static void node_composit_buts_ellipsemask(uiLayout *layout, bContext *UNUSED(C), PointerRNA *ptr)
 {
        uiLayout *row;
-       row = uiLayoutRow(layout, 1);
+       row = uiLayoutRow(layout, TRUE);
        uiItemR(row, ptr, "x", 0, NULL, ICON_NONE);
        uiItemR(row, ptr, "y", 0, NULL, ICON_NONE);
-       row = uiLayoutRow(layout, 1);
+       row = uiLayoutRow(layout, TRUE);
        uiItemR(row, ptr, "width", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
        uiItemR(row, ptr, "height", UI_ITEM_R_SLIDER, NULL, ICON_NONE);
 
@@ -2421,7 +2477,7 @@ static void node_composit_buts_viewer_but(uiLayout *layout, bContext *UNUSED(C),
        
        uiItemR(layout, ptr, "tile_order", 0, NULL, ICON_NONE);
        if (RNA_enum_get(ptr, "tile_order") == 0) {
-               col = uiLayoutColumn(layout, 1);
+               col = uiLayoutColumn(layout, TRUE);
                uiItemR(col, ptr, "center_x", 0, NULL, ICON_NONE);
                uiItemR(col, ptr, "center_y", 0, NULL, ICON_NONE);
        }
@@ -2430,13 +2486,14 @@ static void node_composit_buts_viewer_but(uiLayout *layout, bContext *UNUSED(C),
 static void node_composit_buts_mask(uiLayout *layout, bContext *C, PointerRNA *ptr)
 {
        uiTemplateID(layout, C, ptr, "mask", NULL, NULL, NULL);
-       uiItemR(layout, ptr, "smooth_mask", 0, NULL, ICON_NONE);
+       uiItemR(layout, ptr, "use_antialiasing", 0, NULL, ICON_NONE);
+       uiItemR(layout, ptr, "use_feather", 0, NULL, ICON_NONE);
 
 }
 
 static void node_composit_buts_keyingscreen(uiLayout *layout, bContext *C, PointerRNA *ptr)
 {
-       bNode *node= ptr->data;
+       bNode *node = ptr->data;
 
        uiTemplateID(layout, C, ptr, "clip", NULL, NULL, NULL);
 
@@ -2447,7 +2504,7 @@ static void node_composit_buts_keyingscreen(uiLayout *layout, bContext *C, Point
 
                RNA_pointer_create(&clip->id, &RNA_MovieTracking, &clip->tracking, &tracking_ptr);
 
-               col = uiLayoutColumn(layout, 1);
+               col = uiLayoutColumn(layout, TRUE);
                uiItemPointerR(col, ptr, "tracking_object", &tracking_ptr, "objects", "", ICON_OBJECT_DATA);
        }
 }
@@ -2464,6 +2521,8 @@ static void node_composit_buts_keying(uiLayout *layout, bContext *UNUSED(C), Poi
        uiItemR(layout, ptr, "clip_black", 0, NULL, ICON_NONE);
        uiItemR(layout, ptr, "clip_white", 0, NULL, ICON_NONE);
        uiItemR(layout, ptr, "dilate_distance", 0, NULL, ICON_NONE);
+       uiItemR(layout, ptr, "feather_falloff", 0, NULL, ICON_NONE);
+       uiItemR(layout, ptr, "feather_distance", 0, NULL, ICON_NONE);
        uiItemR(layout, ptr, "blur_post", 0, NULL, ICON_NONE);
 }
 
@@ -2497,6 +2556,8 @@ static void node_composit_buts_trackpos(uiLayout *layout, bContext *C, PointerRN
                else {
                        uiItemR(layout, ptr, "track_name", 0, "", ICON_ANIM_DATA);
                }
+
+               uiItemR(layout, ptr, "use_relative", 0, NULL, ICON_NONE);
        }
 }
 
@@ -2690,7 +2751,7 @@ static void node_composit_set_butfunc(bNodeType *ntype)
                        ntype->uibackdropfunc = node_composit_backdrop_viewer;
                        break;
                case CMP_NODE_MASK:
-                       ntype->uifunc= node_composit_buts_mask;
+                       ntype->uifunc = node_composit_buts_mask;
                        break;
                case CMP_NODE_KEYINGSCREEN:
                        ntype->uifunc = node_composit_buts_keyingscreen;
@@ -2712,11 +2773,11 @@ static void node_texture_buts_bricks(uiLayout *layout, bContext *UNUSED(C), Poin
 {
        uiLayout *col;
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "offset", 0, IFACE_("Offset"), ICON_NONE);
        uiItemR(col, ptr, "offset_frequency", 0, IFACE_("Frequency"), ICON_NONE);
        
-       col = uiLayoutColumn(layout, 1);
+       col = uiLayoutColumn(layout, TRUE);
        uiItemR(col, ptr, "squash", 0, IFACE_("Squash"), ICON_NONE);
        uiItemR(col, ptr, "squash_frequency", 0, IFACE_("Frequency"), ICON_NONE);
 }
@@ -2731,23 +2792,23 @@ static void node_texture_buts_proc(uiLayout *layout, bContext *UNUSED(C), Pointe
        
        RNA_pointer_create(id, &RNA_Texture, tex, &tex_ptr);
 
-       col = uiLayoutColumn(layout, 0);
+       col = uiLayoutColumn(layout, FALSE);
 
        switch (tex->type) {
                case TEX_BLEND:
                        uiItemR(col, &tex_ptr, "progression", 0, "", ICON_NONE);
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &tex_ptr, "use_flip_axis", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
                        break;
 
                case TEX_MARBLE:
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &tex_ptr, "marble_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &tex_ptr, "noise_basis", 0, "", ICON_NONE);
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &tex_ptr, "noise_basis_2", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
                        break;
 
@@ -2756,9 +2817,9 @@ static void node_texture_buts_proc(uiLayout *layout, bContext *UNUSED(C), Pointe
                        break;
 
                case TEX_STUCCI:
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &tex_ptr, "stucci_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
                        uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NONE);
                        break;
@@ -2766,18 +2827,18 @@ static void node_texture_buts_proc(uiLayout *layout, bContext *UNUSED(C), Pointe
                case TEX_WOOD:
                        uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NONE);
                        uiItemR(col, &tex_ptr, "wood_type", 0, "", ICON_NONE);
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &tex_ptr, "noise_basis_2", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
-                       row = uiLayoutRow(col, 0);
-                       uiLayoutSetActive(row, !(RNA_enum_get(&tex_ptr, "wood_type") == TEX_BAND || RNA_enum_get(&tex_ptr, "wood_type") == TEX_RING));
+                       row = uiLayoutRow(col, FALSE);
+                       uiLayoutSetActive(row, !(ELEM(tex->stype, TEX_BAND, TEX_RING)));
                        uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
                        break;
                        
                case TEX_CLOUDS:
                        uiItemR(col, &tex_ptr, "noise_basis", 0, "", ICON_NONE);
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &tex_ptr, "cloud_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
-                       row = uiLayoutRow(col, 0);
+                       row = uiLayoutRow(col, FALSE);
                        uiItemR(row, &tex_ptr, "noise_type", UI_ITEM_R_EXPAND, NULL, ICON_NONE);
                        uiItemR(col, &tex_ptr, "noise_depth", UI_ITEM_R_EXPAND, IFACE_("Depth"), ICON_NONE);
                        break;
@@ -2965,15 +3026,38 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage)
                        }
 
                        if (ibuf->rect) {
-                               if (snode->flag & SNODE_SHOW_ALPHA) {
+                               if (snode->flag & (SNODE_SHOW_R | SNODE_SHOW_G | SNODE_SHOW_B)) {
+                                       int ofs;
+
+#ifdef __BIG_ENDIAN__
+                                       if      (snode->flag & SNODE_SHOW_R) ofs = 2;
+                                       else if (snode->flag & SNODE_SHOW_G) ofs = 1;
+                                       else                                 ofs = 0;
+#else
+                                       if      (snode->flag & SNODE_SHOW_R) ofs = 1;
+                                       else if (snode->flag & SNODE_SHOW_G) ofs = 2;
+                                       else                                 ofs = 3;
+#endif
+
                                        glPixelZoom(snode->zoom, snode->zoom);
                                        /* swap bytes, so alpha is most significant one, then just draw it as luminance int */
-                                       if (ENDIAN_ORDER == B_ENDIAN)
-                                               glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);
-                                       
+
+                                       glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_LUMINANCE, GL_UNSIGNED_INT,
+                                                         ((unsigned char *)ibuf->rect) + ofs);
+
+                                       glPixelZoom(1.0f, 1.0f);
+                               }
+                               else if (snode->flag & SNODE_SHOW_ALPHA) {
+                                       glPixelZoom(snode->zoom, snode->zoom);
+                                       /* swap bytes, so alpha is most significant one, then just draw it as luminance int */
+#ifdef __BIG_ENDIAN__
+                                       glPixelStorei(GL_UNPACK_SWAP_BYTES, 1);
+#endif
                                        glaDrawPixelsSafe(x, y, ibuf->x, ibuf->y, ibuf->x, GL_LUMINANCE, GL_UNSIGNED_INT, ibuf->rect);
-                                       
+
+#ifdef __BIG_ENDIAN__
                                        glPixelStorei(GL_UNPACK_SWAP_BYTES, 0);
+#endif
                                        glPixelZoom(1.0f, 1.0f);
                                }
                                else if (snode->flag & SNODE_USE_ALPHA) {
@@ -2995,7 +3079,7 @@ void draw_nodespace_back_pix(ARegion *ar, SpaceNode *snode, int color_manage)
                                }
                        }
 
-                       /// @note draw selected info on backdrop
+                       /** @note draw selected info on backdrop */
                        if (snode->edittree) {
                                bNode *node = snode->edittree->nodes.first;
                                while (node) {
@@ -3103,37 +3187,46 @@ int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, floa
        deltay = vec[3][1] - vec[0][1];
        /* check direction later, for top sockets */
        if (fromreroute) {
-               if (ABS(deltax)>ABS(deltay)) {
-                       vec[1][1]= vec[0][1];
-                       vec[1][0]= vec[0][0]+(deltax>0?dist:-dist);
-               } else {
-                       vec[1][0]= vec[0][0];
-                       vec[1][1]= vec[0][1]+(deltay>0?dist:-dist);
+               if (ABS(deltax) > ABS(deltay)) {
+                       vec[1][1] = vec[0][1];
+                       vec[1][0] = vec[0][0] + (deltax > 0 ? dist : -dist);
                }
-       } else {
+               else {
+                       vec[1][0] = vec[0][0];
+                       vec[1][1] = vec[0][1] + (deltay > 0 ? dist : -dist);
+               }
+       }
+       else {
                vec[1][0] = vec[0][0] + dist;
                vec[1][1] = vec[0][1];
        }
        if (toreroute) {
-               if (ABS(deltax)>ABS(deltay)) {
-                       vec[2][1]= vec[3][1];
-                       vec[2][0]= vec[3][0]+ (deltax>0?-dist:dist);
-               } else {
-                       vec[2][0]= vec[3][0];
-                       vec[2][1]= vec[3][1]+(deltay>0?-dist:dist);
+               if (ABS(deltax) > ABS(deltay)) {
+                       vec[2][1] = vec[3][1];
+                       vec[2][0] = vec[3][0] + (deltax > 0 ? -dist : dist);
+               }
+               else {
+                       vec[2][0] = vec[3][0];
+                       vec[2][1] = vec[3][1] + (deltay > 0 ? -dist : dist);
                }
 
-       } else {
+       }
+       else {
                vec[2][0] = vec[3][0] - dist;
                vec[2][1] = vec[3][1];
        }
-       if (v2d && MIN4(vec[0][0], vec[1][0], vec[2][0], vec[3][0]) > v2d->cur.xmax) ;  /* clipped */
-       else if (v2d && MAX4(vec[0][0], vec[1][0], vec[2][0], vec[3][0]) < v2d->cur.xmin) ;  /* clipped */
+       if (v2d && MIN4(vec[0][0], vec[1][0], vec[2][0], vec[3][0]) > v2d->cur.xmax) {
+               /* clipped */
+       }
+       else if (v2d && MAX4(vec[0][0], vec[1][0], vec[2][0], vec[3][0]) < v2d->cur.xmin) {
+               /* clipped */
+       }
        else {
-               
                /* always do all three, to prevent data hanging around */
-               BKE_curve_forward_diff_bezier(vec[0][0], vec[1][0], vec[2][0], vec[3][0], coord_array[0], resol, sizeof(float) * 2);
-               BKE_curve_forward_diff_bezier(vec[0][1], vec[1][1], vec[2][1], vec[3][1], coord_array[0] + 1, resol, sizeof(float) * 2);
+               BKE_curve_forward_diff_bezier(vec[0][0], vec[1][0], vec[2][0], vec[3][0],
+                                             coord_array[0] + 0, resol, sizeof(float) * 2);
+               BKE_curve_forward_diff_bezier(vec[0][1], vec[1][1], vec[2][1], vec[3][1],
+                                             coord_array[0] + 1, resol, sizeof(float) * 2);
                
                return 1;
        }
@@ -3141,9 +3234,10 @@ int node_link_bezier_points(View2D *v2d, SpaceNode *snode, bNodeLink *link, floa
 }
 
 #define LINK_RESOL  24
-#define LINK_ARROW     12      /* position of arrow on the link, LINK_RESOL/2 */
+#define LINK_ARROW  12  /* position of arrow on the link, LINK_RESOL/2 */
 #define ARROW_SIZE 7
-void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3)
+void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link,
+                           int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3)
 {
        float coord_array[LINK_RESOL + 1][2];
        
@@ -3161,19 +3255,20 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int t
                
                glEnable(GL_LINE_SMOOTH);
                
-               drawarrow = (link->tonode && (link->tonode->type == NODE_REROUTE)) && (link->fromnode && (link->fromnode->type == NODE_REROUTE));
+               drawarrow = ((link->tonode && (link->tonode->type == NODE_REROUTE)) &&
+                            (link->fromnode && (link->fromnode->type == NODE_REROUTE)));
+
                if (drawarrow) {
-                       // draw arrow in line segment LINK_ARROW
-                       float dx, dy, len;
-                       dx = coord_array[LINK_ARROW][0]-coord_array[LINK_ARROW-1][0];
-                       dy = coord_array[LINK_ARROW][1]-coord_array[LINK_ARROW-1][1];
-                       len = sqrtf(dx*dx+dy*dy);
-                       dx = dx /len*ARROW_SIZE;
-                       dy = dy /len*ARROW_SIZE;
-                       arrow1[0] = coord_array[LINK_ARROW][0]-dx+dy;
-                       arrow1[1] = coord_array[LINK_ARROW][1]-dy-dx;
-                       arrow2[0] = coord_array[LINK_ARROW][0]-dx-dy;
-                       arrow2[1] = coord_array[LINK_ARROW][1]-dy+dx;
+                       /* draw arrow in line segment LINK_ARROW */
+                       float d_xy[2], len;
+
+                       sub_v2_v2v2(d_xy, coord_array[LINK_ARROW], coord_array[LINK_ARROW - 1]);
+                       len = len_v2(d_xy);
+                       mul_v2_fl(d_xy, 1.0f / (len * ARROW_SIZE));
+                       arrow1[0] = coord_array[LINK_ARROW][0] - d_xy[0] + d_xy[1];
+                       arrow1[1] = coord_array[LINK_ARROW][1] - d_xy[1] - d_xy[0];
+                       arrow2[0] = coord_array[LINK_ARROW][0] - d_xy[0] - d_xy[1];
+                       arrow2[1] = coord_array[LINK_ARROW][1] - d_xy[1] + d_xy[0];
                        arrow[0] = coord_array[LINK_ARROW][0];
                        arrow[1] = coord_array[LINK_ARROW][1];
                }
@@ -3239,6 +3334,7 @@ void node_draw_link_bezier(View2D *v2d, SpaceNode *snode, bNodeLink *link, int t
        }
 }
 
+#if 0 /* not used in 2.5x yet */
 static void node_link_straight_points(View2D *UNUSED(v2d), SpaceNode *snode, bNodeLink *link, float coord_array[][2])
 {
        if (link->fromsock) {
@@ -3261,7 +3357,8 @@ static void node_link_straight_points(View2D *UNUSED(v2d), SpaceNode *snode, bNo
        }
 }
 
-void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3)
+void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link,
+                             int th_col1, int do_shaded, int th_col2, int do_triple, int th_col3)
 {
        float coord_array[2][2];
        float linew;
@@ -3296,11 +3393,13 @@ void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int
                for (i = 0; i < LINK_RESOL - 1; ++i) {
                        float t = (float)i / (float)(LINK_RESOL - 1);
                        UI_ThemeColorBlend(th_col1, th_col2, t);
-                       glVertex2f((1.0f - t) * coord_array[0][0] + t * coord_array[1][0], (1.0f - t) * coord_array[0][1] + t * coord_array[1][1]);
+                       glVertex2f((1.0f - t) * coord_array[0][0] + t * coord_array[1][0],
+                                  (1.0f - t) * coord_array[0][1] + t * coord_array[1][1]);
                        
                        t = (float)(i + 1) / (float)(LINK_RESOL - 1);
                        UI_ThemeColorBlend(th_col1, th_col2, t);
-                       glVertex2f((1.0f - t) * coord_array[0][0] + t * coord_array[1][0], (1.0f - t) * coord_array[0][1] + t * coord_array[1][1]);
+                       glVertex2f((1.0f - t) * coord_array[0][0] + t * coord_array[1][0],
+                                  (1.0f - t) * coord_array[0][1] + t * coord_array[1][1]);
                }
                glEnd();
        }
@@ -3308,7 +3407,8 @@ void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int
                glBegin(GL_LINE_STRIP);
                for (i = 0; i < LINK_RESOL; ++i) {
                        float t = (float)i / (float)(LINK_RESOL - 1);
-                       glVertex2f((1.0f - t) * coord_array[0][0] + t * coord_array[1][0], (1.0f - t) * coord_array[0][1] + t * coord_array[1][1]);
+                       glVertex2f((1.0f - t) * coord_array[0][0] + t * coord_array[1][0],
+                                  (1.0f - t) * coord_array[0][1] + t * coord_array[1][1]);
                }
                glEnd();
        }
@@ -3318,6 +3418,7 @@ void node_draw_link_straight(View2D *v2d, SpaceNode *snode, bNodeLink *link, int
        /* restore previuos linewidth */
        glLineWidth(linew);
 }
+#endif
 
 /* note; this is used for fake links in groups too */
 void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
@@ -3334,40 +3435,62 @@ void node_draw_link(View2D *v2d, SpaceNode *snode, bNodeLink *link)
                do_triple = TRUE;
        }
        else {
+               int cycle = 0;
+               
                /* going to give issues once... */
                if (link->tosock->flag & SOCK_UNAVAIL)
                        return;
                if (link->fromsock->flag & SOCK_UNAVAIL)
                        return;
                
-               /* a bit ugly... but thats how we detect the internal group links */
-               if (!link->fromnode || !link->tonode) {
-                       UI_ThemeColorBlend(TH_BACK, TH_WIRE, 0.5f);
-                       do_shaded = FALSE;
-               }
-               else {
-                       /* check cyclic */
-                       if ((link->fromnode->level >= link->tonode->level && link->tonode->level != 0xFFF) && (link->flag & NODE_LINK_VALID)) {
-                               /* special indicated link, on drop-node */
-                               if (link->flag & NODE_LINKFLAG_HILITE) {
-                                       th_col1 = th_col2 = TH_ACTIVE;
-                               }
-                               else {
-                                       /* regular link */
-                                       if (link->fromnode->flag & SELECT)
-                                               th_col1 = TH_EDGE_SELECT;
-                                       if (link->tonode->flag & SELECT)
-                                               th_col2 = TH_EDGE_SELECT;
-                               }
-                               do_shaded = TRUE;
-                               do_triple = TRUE;
-                       }                               
+               /* check cyclic */
+               if (link->fromnode && link->tonode)
+                       cycle = (link->fromnode->level < link->tonode->level || link->tonode->level == 0xFFF);
+               if (!cycle && (link->flag & NODE_LINK_VALID)) {
+                       /* special indicated link, on drop-node */
+                       if (link->flag & NODE_LINKFLAG_HILITE) {
+                               th_col1 = th_col2 = TH_ACTIVE;
+                       }
                        else {
-                               th_col1 = TH_REDALERT;
+                               /* regular link */
+                               if (link->fromnode && link->fromnode->flag & SELECT)
+                                       th_col1 = TH_EDGE_SELECT;
+                               if (link->tonode && link->tonode->flag & SELECT)
+                                       th_col2 = TH_EDGE_SELECT;
                        }
+                       do_shaded = TRUE;
+                       do_triple = TRUE;
+               }                               
+               else {
+                       th_col1 = TH_REDALERT;
                }
        }
        
        node_draw_link_bezier(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
 //     node_draw_link_straight(v2d, snode, link, th_col1, do_shaded, th_col2, do_triple, th_col3);
 }
+
+void drawnodesnap(View2D *v2d, const float cent[2], float size, NodeBorder border)
+{
+       glBegin(GL_LINES);
+       
+       if (border & (NODE_LEFT | NODE_RIGHT)) {
+               glVertex2f(cent[0], v2d->cur.ymin);
+               glVertex2f(cent[0], v2d->cur.ymax);
+       }
+       else {
+               glVertex2f(cent[0], cent[1] - size);
+               glVertex2f(cent[0], cent[1] + size);
+       }
+       
+       if (border & (NODE_TOP | NODE_BOTTOM)) {
+               glVertex2f(v2d->cur.xmin, cent[1]);
+               glVertex2f(v2d->cur.xmax, cent[1]);
+       }
+       else {
+               glVertex2f(cent[0] - size, cent[1]);
+               glVertex2f(cent[0] + size, cent[1]);
+       }
+       
+       glEnd();
+}