Merge branch 'master' into blender2.8
[blender.git] / source / blender / editors / space_node / node_draw.c
index c1159cc..92c055e 100644 (file)
@@ -100,7 +100,7 @@ static bNodeTree *node_tree_from_ID(ID *id)
 {
        if (id) {
                short idtype = GS(id->name);
-       
+
                switch (idtype) {
                        case ID_NT:
                                return (bNodeTree *)id;
@@ -118,7 +118,7 @@ static bNodeTree *node_tree_from_ID(ID *id)
                                return ((FreestyleLineStyle *)id)->nodetree;
                }
        }
-       
+
        return NULL;
 }
 
@@ -137,7 +137,7 @@ void ED_node_tag_update_id(ID *id)
 
        if (ntree->type == NTREE_SHADER) {
                DEG_id_tag_update(id, 0);
-               
+
                if (GS(id->name) == ID_MA)
                        WM_main_add_notifier(NC_MATERIAL | ND_SHADING, id);
                else if (GS(id->name) == ID_LA)
@@ -191,7 +191,7 @@ static bool compare_nodes(const bNode *a, const bNode *b)
         */
        bool a_select = (a->flag & NODE_SELECT) != 0, b_select = (b->flag & NODE_SELECT) != 0;
        bool a_active = (a->flag & NODE_ACTIVE) != 0, b_active = (b->flag & NODE_ACTIVE) != 0;
-       
+
        /* if one is an ancestor of the other */
        /* XXX there might be a better sorting algorithm for stable topological sort, this is O(n^2) worst case */
        for (parent = a->parent; parent; parent = parent->parent) {
@@ -220,13 +220,13 @@ static bool compare_nodes(const bNode *a, const bNode *b)
                return 0;
        else if (!(a->flag & NODE_BACKGROUND) && (b->flag & NODE_BACKGROUND))
                return 1;
-       
+
        /* if one has a higher selection state (active > selected > nothing) */
        if (!b_active && a_active)
                return 1;
        else if (!b_select && (a_active || a_select))
                return 1;
-       
+
        return 0;
 }
 
@@ -239,11 +239,11 @@ void ED_node_sort(bNodeTree *ntree)
        bNode *first_a, *first_b, *node_a, *node_b, *tmp;
        int totnodes = BLI_listbase_count(&ntree->nodes);
        int k, a, b;
-       
+
        k = 1;
        while (k < totnodes) {
                first_a = first_b = ntree->nodes.first;
-               
+
                do {
                        /* setup first_b pointer */
                        for (b = 0; b < k && first_b; ++b) {
@@ -252,7 +252,7 @@ void ED_node_sort(bNodeTree *ntree)
                        /* all batches merged? */
                        if (first_b == NULL)
                                break;
-                       
+
                        /* merge batches */
                        node_a = first_a;
                        node_b = first_b;
@@ -281,7 +281,7 @@ void ED_node_sort(bNodeTree *ntree)
                        }
                        first_a = first_b;
                } while (first_b);
-               
+
                k = k << 1;
        }
 }
@@ -300,9 +300,9 @@ static void node_uiblocks_init(const bContext *C, bNodeTree *ntree)
 {
        bNode *node;
        char uiblockstr[32];
-       
+
        /* add node uiBlocks in drawing order - prevents events going to overlapping nodes */
-       
+
        for (node = ntree->nodes.first; node; node = node->next) {
                /* ui block */
                BLI_snprintf(uiblockstr, sizeof(uiblockstr), "node buttons %p", (void *)node);
@@ -344,52 +344,52 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
        float locx, locy;
        float dy;
        int buty;
-       
+
        RNA_pointer_create(&ntree->id, &RNA_Node, node, &nodeptr);
-       
+
        /* get "global" coords */
        node_to_view(node, 0.0f, 0.0f, &locx, &locy);
        dy = locy;
-       
+
        /* header */
        dy -= NODE_DY;
-       
+
        /* little bit space in top */
        if (node->outputs.first)
                dy -= NODE_DYS / 2;
-       
+
        /* output sockets */
        bool add_output_space = false;
 
        for (nsock = node->outputs.first; nsock; nsock = nsock->next) {
                if (nodeSocketIsHidden(nsock))
                        continue;
-               
+
                RNA_pointer_create(&ntree->id, &RNA_NodeSocket, nsock, &sockptr);
-               
+
                layout = UI_block_layout(
                        node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
                        locx + NODE_DYS, dy, NODE_WIDTH(node) - NODE_DY, NODE_DY, 0, UI_style_get());
                /* context pointers for current node and socket */
                uiLayoutSetContextPointer(layout, "node", &nodeptr);
                uiLayoutSetContextPointer(layout, "socket", &sockptr);
-               
+
                /* align output buttons to the right */
                row = uiLayoutRow(layout, 1);
                uiLayoutSetAlignment(row, UI_LAYOUT_ALIGN_RIGHT);
-               
+
                nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(nsock->name));
-               
+
                UI_block_align_end(node->block);
                UI_block_layout_resolve(node->block, NULL, &buty);
-               
+
                /* ensure minimum socket height in case layout is empty */
                buty = min_ii(buty, dy - NODE_DY);
-               
+
                nsock->locx = locx + NODE_WIDTH(node);
                /* place the socket circle in the middle of the layout */
                nsock->locy = 0.5f * (dy + buty);
-               
+
                dy = buty;
                if (nsock->next)
                        dy -= NODE_SOCKDY;
@@ -407,28 +407,28 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
        /* preview rect? */
        if (node->flag & NODE_PREVIEW) {
                float aspect = 1.0f;
-               
-               if (node->preview_xsize && node->preview_ysize) 
+
+               if (node->preview_xsize && node->preview_ysize)
                        aspect = (float)node->preview_ysize / (float)node->preview_xsize;
-               
+
                dy -= NODE_DYS / 2;
                node->prvr.ymax = dy;
-               
+
                if (aspect <= 1.0f)
                        node->prvr.ymin = dy - aspect * (NODE_WIDTH(node) - NODE_DY);
                else {
                        /* width correction of image */
                        /* XXX huh? (ton) */
                        float dx = (NODE_WIDTH(node) - NODE_DYS) - (NODE_WIDTH(node) - NODE_DYS) / aspect;
-                       
+
                        node->prvr.ymin = dy - (NODE_WIDTH(node) - NODE_DY);
-                       
+
                        node->prvr.xmin += 0.5f * dx;
                        node->prvr.xmax -= 0.5f * dx;
                }
-               
+
                dy = node->prvr.ymin - NODE_DYS / 2;
-               
+
                /* make sure that maximums are bigger or equal to minimums */
                if (node->prvr.xmax < node->prvr.xmin) SWAP(float, node->prvr.xmax, node->prvr.xmin);
                if (node->prvr.ymax < node->prvr.ymin) SWAP(float, node->prvr.ymax, node->prvr.ymin);
@@ -443,18 +443,18 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
                node->butr.xmax = NODE_WIDTH(node) - 2 * NODE_DYS;
                node->butr.ymin = 0;
                node->butr.ymax = 0;
-               
-                       
+
+
                layout = UI_block_layout(
                        node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
                        locx + NODE_DYS, dy, node->butr.xmax, 0, 0, UI_style_get());
                uiLayoutSetContextPointer(layout, "node", &nodeptr);
-               
+
                node->typeinfo->draw_buttons(layout, (bContext *)C, &nodeptr);
-               
+
                UI_block_align_end(node->block);
                UI_block_layout_resolve(node->block, NULL, &buty);
-                       
+
                dy = buty - NODE_DYS / 2;
        }
 
@@ -462,35 +462,35 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
        for (nsock = node->inputs.first; nsock; nsock = nsock->next) {
                if (nodeSocketIsHidden(nsock))
                        continue;
-               
+
                RNA_pointer_create(&ntree->id, &RNA_NodeSocket, nsock, &sockptr);
-               
+
                layout = UI_block_layout(
                        node->block, UI_LAYOUT_VERTICAL, UI_LAYOUT_PANEL,
                        locx + NODE_DYS, dy, NODE_WIDTH(node) - NODE_DY, NODE_DY, 0, UI_style_get());
                /* context pointers for current node and socket */
                uiLayoutSetContextPointer(layout, "node", &nodeptr);
                uiLayoutSetContextPointer(layout, "socket", &sockptr);
-               
+
                row = uiLayoutRow(layout, 1);
-               
+
                nsock->typeinfo->draw((bContext *)C, row, &sockptr, &nodeptr, IFACE_(nsock->name));
-               
+
                UI_block_align_end(node->block);
                UI_block_layout_resolve(node->block, NULL, &buty);
-               
+
                /* ensure minimum socket height in case layout is empty */
                buty = min_ii(buty, dy - NODE_DY);
-               
+
                nsock->locx = locx;
                /* place the socket circle in the middle of the layout */
                nsock->locy = 0.5f * (dy + buty);
-               
+
                dy = buty;
                if (nsock->next)
                        dy -= NODE_SOCKDY;
        }
-       
+
        /* little bit space in end */
        if (node->inputs.first || (node->flag & (NODE_OPTIONS | NODE_PREVIEW)) == 0)
                dy -= NODE_DYS / 2;
@@ -499,7 +499,7 @@ static void node_update_basis(const bContext *C, bNodeTree *ntree, bNode *node)
        node->totr.xmax = locx + NODE_WIDTH(node);
        node->totr.ymax = locy;
        node->totr.ymin = min_ff(dy, locy - 2 * NODE_DY);
-       
+
        /* Set the block bounds to clip mouse events from underlying nodes.
         * Add a margin for sockets on each side.
         */
@@ -518,7 +518,7 @@ static void node_update_hidden(bNode *node)
        float locx, locy;
        float rad, drad, hiddenrad = HIDDEN_RAD;
        int totin = 0, totout = 0, tot;
-       
+
        /* get "global" coords */
        node_to_view(node, 0.0f, 0.0f, &locx, &locy);
 
@@ -529,20 +529,20 @@ static void node_update_hidden(bNode *node)
        for (nsock = node->outputs.first; nsock; nsock = nsock->next)
                if (!nodeSocketIsHidden(nsock))
                        totout++;
-       
+
        tot = MAX2(totin, totout);
        if (tot > 4) {
                hiddenrad += 5.0f * (float)(tot - 4);
        }
-       
+
        node->totr.xmin = locx;
        node->totr.xmax = locx + 3 * hiddenrad + node->miniwidth;
        node->totr.ymax = locy + (hiddenrad - 0.5f * NODE_DY);
        node->totr.ymin = node->totr.ymax - 2 * hiddenrad;
-       
+
        /* output sockets */
        rad = drad = (float)M_PI / (1.0f + (float)totout);
-       
+
        for (nsock = node->outputs.first; nsock; nsock = nsock->next) {
                if (!nodeSocketIsHidden(nsock)) {
                        nsock->locx = node->totr.xmax - hiddenrad + sinf(rad) * hiddenrad;
@@ -550,10 +550,10 @@ static void node_update_hidden(bNode *node)
                        rad += drad;
                }
        }
-       
+
        /* input sockets */
        rad = drad = -(float)M_PI / (1.0f + (float)totin);
-       
+
        for (nsock = node->inputs.first; nsock; nsock = nsock->next) {
                if (!nodeSocketIsHidden(nsock)) {
                        nsock->locx = node->totr.xmin + hiddenrad + sinf(rad) * hiddenrad;
@@ -632,10 +632,10 @@ static void node_socket_circle_draw(const bContext *C, bNodeTree *ntree, Pointer
 {
        PointerRNA ptr;
        float color[4];
-       
+
        RNA_pointer_create((ID *)ntree, &RNA_NodeSocket, sock, &ptr);
        sock->typeinfo->draw_color((bContext *)C, &ptr, &node_ptr, color);
-       
+
        immAttrib4fv(col, color);
        immVertex2f(pos, sock->locx, sock->locy);
 }
@@ -645,7 +645,7 @@ static void node_socket_circle_draw(const bContext *C, bNodeTree *ntree, Pointer
 static void node_draw_preview_background(float tile, rctf *rect)
 {
        float x, y;
-       
+
        Gwn_VertFormat *format = immVertexFormat();
        unsigned int pos = GWN_vertformat_attr_add(format, "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
 
@@ -655,7 +655,7 @@ static void node_draw_preview_background(float tile, rctf *rect)
        immUniformColor3ub(120, 120, 120);
        immRectf(pos, rect->xmin, rect->ymin, rect->xmax, rect->ymax);
        immUniformColor3ub(160, 160, 160);
-       
+
        for (y = rect->ymin; y < rect->ymax; y += tile * 2) {
                for (x = rect->xmin; x < rect->xmax; x += tile * 2) {
                        float tilex = tile, tiley = tile;
@@ -692,7 +692,7 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
        float yscale = yrect / ((float)preview->ysize);
        float scale;
        rctf draw_rect;
-       
+
        /* uniform scale and offset */
        draw_rect = *prv;
        if (xscale < yscale) {
@@ -707,16 +707,16 @@ static void node_draw_preview(bNodePreview *preview, rctf *prv)
                draw_rect.xmax -= offset;
                scale = yscale;
        }
-       
+
        node_draw_preview_background(BLI_rctf_size_x(prv) / 10.0f, &draw_rect);
-       
+
        glEnable(GL_BLEND);
        glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);  /* premul graphics */
-       
+
        IMMDrawPixelsTexState state = immDrawPixelsTexSetup(GPU_SHADER_2D_IMAGE_COLOR);
        immDrawPixelsTex(&state, draw_rect.xmin, draw_rect.ymin, preview->xsize, preview->ysize, GL_RGBA, GL_UNSIGNED_BYTE, GL_LINEAR, preview->rect,
                         scale, scale, NULL);
-       
+
        glDisable(GL_BLEND);
 
        unsigned int pos = GWN_vertformat_attr_add(immVertexFormat(), "pos", GWN_COMP_F32, 2, GWN_FETCH_FLOAT);
@@ -731,23 +731,23 @@ static void node_toggle_button_cb(struct bContext *C, void *node_argv, void *op_
 {
        bNode *node = (bNode *)node_argv;
        const char *opname = (const char *)op_argv;
-       
+
        /* select & activate only the button's node */
        node_select_single(C, node);
-       
+
        WM_operator_name_call(C, opname, WM_OP_INVOKE_DEFAULT, NULL);
 }
 
 void node_draw_shadow(SpaceNode *snode, bNode *node, float radius, float alpha)
 {
        rctf *rct = &node->totr;
-       
+
        UI_draw_roundbox_corner_set(UI_CNR_ALL);
        if (node->parent == NULL)
                ui_draw_dropshadow(rct, radius, snode->aspect, alpha, node->flag & SELECT);
        else {
                const float margin = 3.0f;
-               
+
                float color[4] = {0.0f, 0.0f, 0.0f, 0.33f};
                UI_draw_roundbox_aa(true, rct->xmin - margin, rct->ymin - margin,
                                    rct->xmax + margin, rct->ymax + margin, radius + margin, color);
@@ -802,7 +802,7 @@ void node_draw_sockets(View2D *v2d, const bContext *C, bNodeTree *ntree, bNode *
 
                node_socket_circle_draw(C, ntree, node_ptr, sock, pos, col);
        }
-       
+
        /* socket outputs */
        short selected_output_ct = 0;
        if (draw_outputs) {
@@ -878,17 +878,17 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
        float color[4];
        char showname[128]; /* 128 used below */
        View2D *v2d = &ar->v2d;
-       
+
        /* skip if out of view */
        if (BLI_rctf_isect(&node->totr, &v2d->cur, NULL) == false) {
                UI_block_end(C, node->block);
                node->block = NULL;
                return;
        }
-       
+
        /* shadow */
        node_draw_shadow(snode, node, BASIS_RAD, 1.0f);
-       
+
        if (node->flag & NODE_MUTED) {
                UI_GetThemeColorBlendShade4fv(color_id, TH_REDALERT, 0.5f, 0, color);
        }
@@ -907,10 +907,10 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
 
        UI_draw_roundbox_corner_set(UI_CNR_TOP_LEFT | UI_CNR_TOP_RIGHT);
        UI_draw_roundbox_aa(true, rct->xmin, rct->ymax - NODE_DY, rct->xmax, rct->ymax, BASIS_RAD, color);
-       
+
        /* show/hide icons */
        iconofs = rct->xmax - 0.35f * U.widget_unit;
-       
+
        /* preview */
        if (node->typeinfo->flag & NODE_PREVIEW) {
                uiBut *but;
@@ -937,7 +937,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
                UI_but_func_set(but, node_toggle_button_cb, node, (void *)"NODE_OT_group_edit");
                UI_block_emboss_set(node->block, UI_EMBOSS);
        }
-       
+
        /* title */
        if (node->flag & SELECT) {
                UI_GetThemeColor4fv(TH_SELECT, color);
@@ -945,7 +945,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
        else {
                UI_GetThemeColorBlendShade4fv(TH_SELECT, color_id, 0.4f, 10, color);
        }
-       
+
        /* open/close entirely? */
        {
                uiBut *but;
@@ -957,16 +957,16 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
                               but_size, but_size, NULL, 0, 0, 0, 0, "");
                UI_but_func_set(but, node_toggle_button_cb, node, (void *)"NODE_OT_hide_toggle");
                UI_block_emboss_set(node->block, UI_EMBOSS);
-               
+
                /* custom draw function for this button */
                UI_draw_icon_tri(rct->xmin + 0.5f * U.widget_unit, rct->ymax - NODE_DY / 2.0f, 'v', color);
        }
-       
+
        nodeLabel(ntree, node, showname, sizeof(showname));
-       
+
        //if (node->flag & NODE_MUTED)
        //      BLI_snprintf(showname, sizeof(showname), "[%s]", showname); /* XXX - don't print into self! */
-       
+
        uiDefBut(node->block, UI_BTYPE_LABEL, 0, showname,
                 (int)(rct->xmin + (NODE_MARGIN_X)), (int)(rct->ymax - NODE_DY),
                 (short)(iconofs - rct->xmin - 18.0f), (short)NODE_DY,
@@ -991,7 +991,7 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
                UI_draw_roundbox_corner_set(UI_CNR_ALL);
                UI_draw_roundbox_aa(false, rct->xmin, rct->ymin, rct->xmax, rct->ymax, BASIS_RAD, color);
        }
-       
+
        /* disable lines */
        if (node->flag & NODE_MUTED)
                node_draw_mute_line(v2d, snode, node);
@@ -1007,9 +1007,9 @@ static void node_draw_basis(const bContext *C, ARegion *ar, SpaceNode *snode, bN
                        }
                }
        }
-       
+
        UI_ThemeClearColor(color_id);
-               
+
        UI_block_end(C, node->block);
        UI_block_draw(C, node->block);
        node->block = NULL;
@@ -1027,7 +1027,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
        float scale;
 
        UI_view2d_scale_get(v2d, &scale, NULL);
-       
+
        /* shadow */
        node_draw_shadow(snode, node, hiddenrad, 1.0f);
 
@@ -1036,9 +1036,9 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
                UI_GetThemeColorBlendShade4fv(color_id, TH_REDALERT, 0.5f, 0, color);
        else
                UI_GetThemeColor4fv(color_id, color);
-       
+
        UI_draw_roundbox_aa(true, rct->xmin, rct->ymin, rct->xmax, rct->ymax, hiddenrad, color);
-       
+
        /* outline active and selected emphasis */
        if (node->flag & SELECT) {
                UI_GetThemeColorShadeAlpha4fv((node->flag & NODE_ACTIVE) ? TH_ACTIVE : TH_SELECT, 0, -40, color);
@@ -1064,7 +1064,7 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
        else {
                UI_GetThemeColorBlendShade4fv(TH_SELECT, color_id, 0.4f, 10, color);
        }
-       
+
        /* open entirely icon */
        {
                uiBut *but;
@@ -1076,11 +1076,11 @@ static void node_draw_hidden(const bContext *C, ARegion *ar, SpaceNode *snode, b
                               but_size, but_size, NULL, 0, 0, 0, 0, "");
                UI_but_func_set(but, node_toggle_button_cb, node, (void *)"NODE_OT_hide_toggle");
                UI_block_emboss_set(node->block, UI_EMBOSS);
-               
+
                /* custom draw function for this button */
                UI_draw_icon_tri(rct->xmin + 10.0f, centy, 'h', color);
        }
-       
+
        /* disable lines */
        if (node->flag & NODE_MUTED)
                node_draw_mute_line(&ar->v2d, snode, node);
@@ -1150,7 +1150,7 @@ void node_set_cursor(wmWindow *win, SpaceNode *snode, float cursor[2])
        bNode *node;
        bNodeSocket *sock;
        int wmcursor = CURSOR_STD;
-       
+
        if (ntree) {
                if (node_find_indicated_socket(snode, &node, &sock, cursor, SOCK_IN | SOCK_OUT)) {
                        /* pass */
@@ -1167,7 +1167,7 @@ void node_set_cursor(wmWindow *win, SpaceNode *snode, float cursor[2])
                        }
                }
        }
-       
+
        WM_cursor_set(win, wmcursor);
 }
 
@@ -1188,10 +1188,10 @@ static void node_update(const bContext *C, bNodeTree *ntree, bNode *node)
 void node_update_nodetree(const bContext *C, bNodeTree *ntree)
 {
        bNode *node;
-       
+
        /* make sure socket "used" tags are correct, for displaying value buttons */
        ntreeTagUsedSockets(ntree);
-       
+
        /* update nodes front to back, so children sizes get updated before parents */
        for (node = ntree->nodes.last; node; node = node->prev) {
                node_update(C, ntree, node);
@@ -1211,7 +1211,7 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT
        bNode *node;
        bNodeLink *link;
        int a;
-       
+
        if (ntree == NULL) return;      /* groups... */
 
 #ifdef USE_DRAW_TOT_UPDATE
@@ -1237,7 +1237,7 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT
                node->nr = a;        /* index of node in list, used for exec event code */
                node_draw(C, ar, snode, ntree, node, key);
        }
-       
+
        /* node lines */
        glEnable(GL_BLEND);
        nodelink_batch_start(snode);
@@ -1247,7 +1247,7 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT
        }
        nodelink_batch_end(snode);
        glDisable(GL_BLEND);
-       
+
        /* draw foreground nodes, last nodes in front */
        for (a = 0, node = ntree->nodes.first; node; node = node->next, a++) {
                bNodeInstanceKey key;
@@ -1264,9 +1264,9 @@ void node_draw_nodetree(const bContext *C, ARegion *ar, SpaceNode *snode, bNodeT
 static void draw_tree_path(SpaceNode *snode)
 {
        char info[256];
-       
+
        ED_node_tree_path_get_fixedbuf(snode, info, sizeof(info));
-       
+
        UI_FontThemeColor(BLF_default(), TH_TEXT_HI);
        BLF_draw_default(1.5f * UI_UNIT_X, 1.5f * UI_UNIT_Y, 0.0f, info, sizeof(info));
 }
@@ -1274,11 +1274,11 @@ static void draw_tree_path(SpaceNode *snode)
 static void snode_setup_v2d(SpaceNode *snode, ARegion *ar, const float center[2])
 {
        View2D *v2d = &ar->v2d;
-       
+
        /* shift view to node tree center */
        UI_view2d_center_set(v2d, center[0], center[1]);
        UI_view2d_view_ortho(v2d);
-       
+
        /* aspect+font, set each time */
        snode->aspect = BLI_rctf_size_x(&v2d->cur) / (float)ar->winx;
        // XXX snode->curfont = uiSetCurFont_ext(snode->aspect);
@@ -1309,7 +1309,7 @@ static void draw_group_overlay(const bContext *C, ARegion *ar)
        UI_draw_roundbox_corner_set(UI_CNR_NONE);
        UI_draw_roundbox_4fv(true, rect.xmin, rect.ymin, rect.xmax, rect.ymax, 0, color);
        glDisable(GL_BLEND);
-       
+
        /* set the block bounds to clip mouse events from underlying nodes */
        block = UI_block_begin(C, ar, "node tree bounds block", UI_EMBOSS);
        UI_block_bounds_set_explicit(block, rect.xmin, rect.ymin, rect.xmax, rect.ymax);
@@ -1328,21 +1328,21 @@ void drawnodespace(const bContext *C, ARegion *ar)
        glClear(GL_COLOR_BUFFER_BIT);
 
        UI_view2d_view_ortho(v2d);
-       
+
        /* XXX snode->cursor set in coordspace for placing new nodes, used for drawing noodles too */
        UI_view2d_region_to_view(&ar->v2d, win->eventstate->x - ar->winrct.xmin, win->eventstate->y - ar->winrct.ymin,
                                 &snode->cursor[0], &snode->cursor[1]);
        snode->cursor[0] /= UI_DPI_FAC;
        snode->cursor[1] /= UI_DPI_FAC;
-       
+
        ED_region_draw_cb_draw(C, ar, REGION_DRAW_PRE_VIEW);
 
        /* only set once */
        glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
-       
+
        /* nodes */
        snode_set_context(C);
-       
+
        /* draw parent node trees */
        if (snode->treepath.last) {
                static const int max_depth = 2;
@@ -1352,50 +1352,50 @@ void drawnodespace(const bContext *C, ARegion *ar)
                bNodeTree *ntree;
                bNodeLinkDrag *nldrag;
                LinkData *linkdata;
-               
+
                path = snode->treepath.last;
-               
+
                /* update tree path name (drawn in the bottom left) */
                ID *name_id = (path->nodetree && path->nodetree != snode->nodetree) ? &path->nodetree->id : snode->id;
 
                if (name_id && UNLIKELY(!STREQ(path->node_name, name_id->name + 2))) {
                        BLI_strncpy(path->node_name, name_id->name + 2, sizeof(path->node_name));
                }
-               
+
                /* current View2D center, will be set temporarily for parent node trees */
                UI_view2d_center_get(v2d, &center[0], &center[1]);
-               
+
                /* store new view center in path and current edittree */
                copy_v2_v2(path->view_center, center);
                if (snode->edittree)
                        copy_v2_v2(snode->edittree->view_center, center);
-               
+
                depth = 0;
                while (path->prev && depth < max_depth) {
                        path = path->prev;
                        ++depth;
                }
-               
+
                /* parent node trees in the background */
                for (curdepth = depth; curdepth > 0; path = path->next, --curdepth) {
                        ntree = path->nodetree;
                        if (ntree) {
                                snode_setup_v2d(snode, ar, path->view_center);
-                               
+
                                draw_nodetree(C, ar, ntree, path->parent_key);
-                               
+
                                draw_group_overlay(C, ar);
                        }
                }
-               
+
                /* top-level edit tree */
                ntree = path->nodetree;
                if (ntree) {
                        snode_setup_v2d(snode, ar, center);
-                       
+
                        /* grid, uses theme color based on node path depth */
                        UI_view2d_multi_grid_draw(v2d, (depth > 0 ? TH_NODE_GROUP : TH_BACK), ED_node_grid_size(), NODE_GRID_STEPS, 2);
-                       
+
                        /* backdrop */
                        draw_nodespace_back_pix(C, ar, snode, path->parent_key);
 
@@ -1416,7 +1416,7 @@ void drawnodespace(const bContext *C, ARegion *ar)
 
                        draw_nodetree(C, ar, ntree, path->parent_key);
                }
-               
+
                /* temporary links */
                glEnable(GL_BLEND);
                glEnable(GL_LINE_SMOOTH);
@@ -1426,7 +1426,7 @@ void drawnodespace(const bContext *C, ARegion *ar)
                }
                glDisable(GL_LINE_SMOOTH);
                glDisable(GL_BLEND);
-               
+
                if (snode->flag & SNODE_SHOW_GPENCIL) {
                        /* draw grease-pencil ('canvas' strokes) */
                        ED_gpencil_draw_view2d(C, true);
@@ -1435,16 +1435,16 @@ void drawnodespace(const bContext *C, ARegion *ar)
        else {
                /* default grid */
                UI_view2d_multi_grid_draw(v2d, TH_BACK, ED_node_grid_size(), NODE_GRID_STEPS, 2);
-               
+
                /* backdrop */
                draw_nodespace_back_pix(C, ar, snode, NODE_INSTANCE_KEY_NONE);
        }
-       
+
        ED_region_draw_cb_draw(C, ar, REGION_DRAW_POST_VIEW);
-       
+
        /* reset view matrix */
        UI_view2d_view_restore(C);
-       
+
        if (snode->treepath.last) {
                if (snode->flag & SNODE_SHOW_GPENCIL) {
                        /* draw grease-pencil (screen strokes, and also paintbuffer) */
@@ -1454,7 +1454,7 @@ void drawnodespace(const bContext *C, ARegion *ar)
 
        /* tree path info */
        draw_tree_path(snode);
-       
+
        /* scrollers */
        scrollers = UI_view2d_scrollers_calc(C, v2d, 10, V2D_GRID_CLAMP, V2D_ARG_DUMMY, V2D_ARG_DUMMY);
        UI_view2d_scrollers_draw(C, v2d, scrollers);