wolffd@0: # wolffd@0: # dotty_draw: drawing functions and data structures wolffd@0: # wolffd@0: dotty.protogt.drawgraph = function (gt, views) { wolffd@0: local gid, eid, nid, graph; wolffd@0: wolffd@0: graph = gt.graph; wolffd@0: gt.drawsgraph (gt, views, graph); wolffd@0: for (gid in graph.graphs) wolffd@0: gt.drawsgraph (gt, views, graph.graphs[gid]); wolffd@0: for (eid in graph.edges) wolffd@0: gt.drawedge (gt, views, graph.edges[eid]); wolffd@0: for (nid in graph.nodes) wolffd@0: gt.drawnode (gt, views, graph.nodes[nid]); wolffd@0: }; wolffd@0: dotty.protogt.redrawgraph = function (gt, views) { wolffd@0: local vid; wolffd@0: wolffd@0: for (vid in views) wolffd@0: clear (views[vid].canvas); wolffd@0: gt.drawgraph (gt, views); wolffd@0: }; wolffd@0: dotty.protogt.setviewsize = function (views, r) { wolffd@0: local vid, vt, w2v, scale, attr; wolffd@0: wolffd@0: for (vid in views) { wolffd@0: vt = views[vid]; wolffd@0: vt.wrect = copy (r); wolffd@0: if (r[1].x == 0 | r[1].y == 0) { wolffd@0: attr = getwidgetattr (vt.scroll, [0 = 'size';]); wolffd@0: vt.wrect[1] = copy (attr.size); wolffd@0: } wolffd@0: if (vt.type == 'birdseye') { wolffd@0: attr = getwidgetattr (vt.scroll, [0 = 'size';]); wolffd@0: scale.x = (vt.wrect[1].x - vt.wrect[0].x) / attr.size.x; wolffd@0: scale.y = (vt.wrect[1].y - vt.wrect[0].y) / attr.size.y; wolffd@0: if (scale.x > 1 & scale.x > scale.y) wolffd@0: vt.w2v = scale.x; wolffd@0: else if (scale.y > 1) wolffd@0: vt.w2v = scale.y; wolffd@0: else wolffd@0: vt.w2v = 1; wolffd@0: } wolffd@0: w2v = vt.w2v; wolffd@0: vt.vsize = [ wolffd@0: 'x' = toint ((vt.wrect[1].x - vt.wrect[0].x) / w2v); wolffd@0: 'y' = toint ((vt.wrect[1].y - vt.wrect[0].y) / w2v); wolffd@0: ]; wolffd@0: setwidgetattr (vt.canvas, [ wolffd@0: 'window' = vt.wrect; wolffd@0: 'viewport' = vt.vsize; wolffd@0: ]); wolffd@0: attr = getwidgetattr (vt.canvas, [0 = 'viewport';]); wolffd@0: vt.vsize = copy (attr.viewport); wolffd@0: } wolffd@0: }; wolffd@0: dotty.protogt.setviewscale = function (views, factor) { wolffd@0: local vid, vt, w2v, attr; wolffd@0: wolffd@0: for (vid in views) { wolffd@0: vt = views[vid]; wolffd@0: if ((w2v = vt.w2v * factor) < 0.01) { wolffd@0: dotty.message (0, 'cannot zoom any closer'); wolffd@0: return; wolffd@0: } wolffd@0: vt.w2v = w2v; wolffd@0: vt.vsize = [ wolffd@0: 'x' = (vt.wrect[1].x - vt.wrect[0].x) / w2v; wolffd@0: 'y' = (vt.wrect[1].y - vt.wrect[0].y) / w2v; wolffd@0: ]; wolffd@0: setwidgetattr (vt.canvas, ['viewport' = vt.vsize;]); wolffd@0: attr = getwidgetattr (vt.canvas, [0 = 'viewport';]); wolffd@0: vt.vsize = copy (attr.viewport); wolffd@0: } wolffd@0: }; wolffd@0: dotty.protogt.setviewcenter = function (views, center) { wolffd@0: local vid, vt, pos; wolffd@0: wolffd@0: for (vid in views) { wolffd@0: vt = views[vid]; wolffd@0: pos = [ wolffd@0: 'x' = center.x * vt.vsize.x / (vt.wrect[1].x - vt.wrect[0].x); wolffd@0: 'y' = ( wolffd@0: (vt.wrect[1].y - center.y) * vt.vsize.y / wolffd@0: (vt.wrect[1].y - vt.wrect[0].y) wolffd@0: ); wolffd@0: ]; wolffd@0: setwidgetattr (vt.scroll, ['childcenter' = pos;]); wolffd@0: } wolffd@0: }; wolffd@0: # wolffd@0: # draw graph components wolffd@0: # wolffd@0: dotty.protogt.drawsgraph = function (gt, views, sgraph) { wolffd@0: sgraph.draw = 1; wolffd@0: if (~sgraph.draws) wolffd@0: return; wolffd@0: gt.execalldraw (gt, views, null, sgraph.draws, [ wolffd@0: 'fontname' = sgraph.fontname; wolffd@0: 'fontsize' = sgraph.fontsize; wolffd@0: 'fontcolor' = sgraph.fontcolor; wolffd@0: 'drawcolor' = sgraph.drawcolor; wolffd@0: 'fillcolor' = sgraph.fillcolor; wolffd@0: ]); wolffd@0: }; wolffd@0: dotty.protogt.undrawsgraph = function (gt, views, sgraph) { wolffd@0: sgraph.drawn = 0; wolffd@0: if (~sgraph.draws) wolffd@0: return; wolffd@0: gt.execalldraw (gt, views, null, sgraph.draws, [ wolffd@0: 'fontname' = sgraph.fontname; wolffd@0: 'fontsize' = sgraph.fontsize; wolffd@0: 'fontcolor' = sgraph.fontcolor; wolffd@0: 'drawcolor' = 0; wolffd@0: 'fillcolor' = 0; wolffd@0: ]); wolffd@0: }; wolffd@0: dotty.protogt.drawnode = function (gt, views, node) { wolffd@0: local vid; wolffd@0: wolffd@0: node.drawn = 1; wolffd@0: if (~node.draws) wolffd@0: return; wolffd@0: gt.execalldraw (gt, views, node, node.draws, [ wolffd@0: 'fontname' = node.fontname; wolffd@0: 'fontsize' = node.fontsize; wolffd@0: 'fontcolor' = node.fontcolor; wolffd@0: 'drawcolor' = node.drawcolor; wolffd@0: 'fillcolor' = node.fillcolor; wolffd@0: ]); wolffd@0: for (vid in views) wolffd@0: setpick (views[vid].canvas, node, node.rect); wolffd@0: }; wolffd@0: dotty.protogt.undrawnode = function (gt, views, node) { wolffd@0: local vid; wolffd@0: wolffd@0: if (~node.drawn) wolffd@0: return; wolffd@0: node.drawn = 0; wolffd@0: if (~node.pos) wolffd@0: return; wolffd@0: gt.execalldraw (gt, views, node, node.draws, [ wolffd@0: 'nooverride' = 1; wolffd@0: 'fontname' = node.fontname; wolffd@0: 'fontsize' = node.fontsize; wolffd@0: 'fontcolor' = 0; wolffd@0: 'drawcolor' = 0; wolffd@0: 'fillcolor' = 0; wolffd@0: ]); wolffd@0: for (vid in views) wolffd@0: clearpick (views[vid].canvas, node); wolffd@0: }; wolffd@0: dotty.protogt.movenode = function (gt, node, pos) { wolffd@0: local dp, eid, edge; wolffd@0: wolffd@0: dp.x = pos.x - node.pos.x; wolffd@0: dp.y = pos.y - node.pos.y; wolffd@0: gt.undrawnode (gt, gt.views, node); wolffd@0: node.pos.x = pos.x; wolffd@0: node.pos.y = pos.y; wolffd@0: gt.movenodedraw (node.draws, dp); wolffd@0: for (eid in node.edges) { wolffd@0: edge = node.edges[eid]; wolffd@0: gt.undrawedge (gt, gt.views, edge); wolffd@0: gt.moveedgedraw (edge.draws, edge.tail.pos, edge.head.pos); wolffd@0: gt.drawedge (gt, gt.views, edge); wolffd@0: } wolffd@0: gt.drawnode (gt, gt.views, node); wolffd@0: }; wolffd@0: dotty.protogt.drawedge = function (gt, views, edge) { wolffd@0: local vid, canvas; wolffd@0: wolffd@0: edge.drawn = 1; wolffd@0: if (~edge.draws) wolffd@0: return; wolffd@0: gt.execalldraw (gt, views, edge, edge.draws, [ wolffd@0: 'fontname' = edge.fontname; wolffd@0: 'fontsize' = edge.fontsize; wolffd@0: 'fontcolor' = edge.fontcolor; wolffd@0: 'drawcolor' = edge.drawcolor; wolffd@0: 'fillcolor' = edge.fillcolor; wolffd@0: ]); wolffd@0: for (vid in views) { wolffd@0: canvas = views[vid].canvas; wolffd@0: if (gt.edgehandles == 0 | ~edge.draws.ep) wolffd@0: continue; wolffd@0: arc (canvas, edge, edge.draws.ep, ['x' = 5; 'y' = 5;], ['color' = 1;]); wolffd@0: } wolffd@0: }; wolffd@0: dotty.protogt.undrawedge = function (gt, views, edge) { wolffd@0: local vid, canvas; wolffd@0: wolffd@0: if (~edge.drawn) wolffd@0: return; wolffd@0: edge.drawn = 0; wolffd@0: if (~edge.draws) wolffd@0: return; wolffd@0: gt.execalldraw (gt, views, edge, edge.draws, [ wolffd@0: 'nooverride' = 1; wolffd@0: 'fontname' = edge.fontname; wolffd@0: 'fontsize' = edge.fontsize; wolffd@0: 'fontcolor' = 0; wolffd@0: 'drawcolor' = 0; wolffd@0: 'fillcolor' = 0; wolffd@0: ]); wolffd@0: for (vid in views) { wolffd@0: canvas = views[vid].canvas; wolffd@0: if (gt.edgehandles == 0 | ~edge.draws.ep) wolffd@0: continue; wolffd@0: arc (canvas, edge, edge.draws.ep, ['x' = 5; 'y' = 5;], ['color' = 0;]); wolffd@0: clearpick (canvas, edge); wolffd@0: } wolffd@0: }; wolffd@0: # wolffd@0: # draw directives wolffd@0: # wolffd@0: dotty.protogt.execalldraw = function (gt, views, obj, draws, gc) { wolffd@0: local vid, vt, did, draw, i, func; wolffd@0: wolffd@0: for (vid in views) { wolffd@0: vt = views[vid]; wolffd@0: for (did in draws) { wolffd@0: if (did == 'ep') wolffd@0: continue; wolffd@0: draw = draws[did]; wolffd@0: for (i = 0; draw[i]; i = i + 1) wolffd@0: if ((func = gt.drawfunc[draw[i].type])) wolffd@0: func (gt, vt.canvas, obj, draw[i], gc); wolffd@0: } wolffd@0: } wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.E = function (gt, canvas, obj, data, gc) { wolffd@0: arc (canvas, obj, data.c, data.s, [ wolffd@0: 'color' = gc.fillcolor; 'style' = gc.style; 'width' = gc.width; wolffd@0: 'fill' = 'on'; wolffd@0: ]); wolffd@0: arc (canvas, obj, data.c, data.s, [ wolffd@0: 'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width; wolffd@0: ]); wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.e = function (gt, canvas, obj, data, gc) { wolffd@0: arc (canvas, obj, data.c, data.s, [ wolffd@0: 'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width; wolffd@0: ]); wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.P = function (gt, canvas, obj, data, gc) { wolffd@0: polygon (canvas, obj, data.ps, [ wolffd@0: 'color' = gc.fillcolor; 'style' = gc.style; 'width' = gc.width; wolffd@0: 'fill' = 'on'; wolffd@0: ]); wolffd@0: polygon (canvas, obj, data.ps, [ wolffd@0: 'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width; wolffd@0: ]); wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.p = function (gt, canvas, obj, data, gc) { wolffd@0: polygon (canvas, obj, data.ps, [ wolffd@0: 'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width; wolffd@0: ]); wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.L = function (gt, canvas, obj, data, gc) { wolffd@0: polygon (canvas, obj, data.ps, [ wolffd@0: 'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width; wolffd@0: ]); wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.b = function (gt, canvas, obj, data, gc) { wolffd@0: splinegon (canvas, obj, data.ps, [ wolffd@0: 'color' = gc.fillcolor; 'style' = gc.style; 'width' = gc.width; wolffd@0: 'fill' = 'on'; wolffd@0: ]); wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.B = function (gt, canvas, obj, data, gc) { wolffd@0: splinegon (canvas, obj, data.ps, [ wolffd@0: 'color' = gc.drawcolor; 'style' = gc.style; 'width' = gc.width; wolffd@0: ]); wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.T = function (gt, canvas, obj, data, gc) { wolffd@0: text (canvas, obj, data.p, data.s, gc.fontname, gc.fontsize, data.j, [ wolffd@0: 'color' = gc.fontcolor; 'style' = gc.style; 'width' = gc.width; wolffd@0: ]); wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.C = function (gt, canvas, obj, data, gc) { wolffd@0: if (gc.nooverride ~= 1) wolffd@0: gc.fillcolor = data.fillcolor; wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.c = function (gt, canvas, obj, data, gc) { wolffd@0: if (gc.nooverride ~= 1) { wolffd@0: gc.drawcolor = data.drawcolor; wolffd@0: gc.fontcolor = data.drawcolor; wolffd@0: } wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.F = function (gt, canvas, obj, data, gc) { wolffd@0: gc.fontname = data.fn; wolffd@0: gc.fontsize = data.fs; wolffd@0: }; wolffd@0: dotty.protogt.drawfunc.S = function (gt, canvas, obj, data, gc) { wolffd@0: gc.style = data.style; wolffd@0: gc.width = data.width; wolffd@0: }; wolffd@0: dotty.protogt.movenodedraw = function (draws, dp) { wolffd@0: local did, draw, i, j; wolffd@0: wolffd@0: for (did in draws) { wolffd@0: if (did == 'ep') wolffd@0: continue; wolffd@0: draw = draws[did]; wolffd@0: for (i = 0; draw[i]; i = i + 1) { wolffd@0: if (draw[i].type == 'E' | draw[i].type == 'e') { wolffd@0: draw[i].c.x = draw[i].c.x + dp.x; wolffd@0: draw[i].c.y = draw[i].c.y + dp.y; wolffd@0: } else if (draw[i].type == 'P' | draw[i].type == 'p') { wolffd@0: for (j = 1; draw[i].ps[j]; j = j + 1) { wolffd@0: draw[i].ps[j].x = draw[i].ps[j].x + dp.x; wolffd@0: draw[i].ps[j].y = draw[i].ps[j].y + dp.y; wolffd@0: } wolffd@0: } else if (draw[i].type == 'L' | draw[i].type == 'B') { wolffd@0: for (j = 0; draw[i].ps[j]; j = j + 1) { wolffd@0: draw[i].ps[j].x = draw[i].ps[j].x + dp.x; wolffd@0: draw[i].ps[j].y = draw[i].ps[j].y + dp.y; wolffd@0: } wolffd@0: } else if (draw[i].type == 'T') { wolffd@0: draw[i].p.x = draw[i].p.x + dp.x; wolffd@0: draw[i].p.y = draw[i].p.y + dp.y; wolffd@0: } wolffd@0: } wolffd@0: } wolffd@0: }; wolffd@0: dotty.protogt.moveedgedraw = function (draws, tp, hp) { wolffd@0: local draws2, did; wolffd@0: wolffd@0: for (did in draws) wolffd@0: draws2[did] = draws[did]; wolffd@0: for (did in draws2) wolffd@0: remove (did, draws); wolffd@0: draws[0] = [ wolffd@0: 0 = [ wolffd@0: 'type' = 'L'; wolffd@0: 'n' = 2; wolffd@0: 'ps' = [ wolffd@0: 0 = copy (tp); wolffd@0: 1 = copy (hp); wolffd@0: ]; wolffd@0: ]; wolffd@0: 'ep' = ['x' = (tp.x + hp.x) / 2; 'y' = (tp.y + hp.y) / 2;]; wolffd@0: ]; wolffd@0: }; wolffd@0: dotty.protogt.simplenodedraw = function (node, c, s) { wolffd@0: local draws; wolffd@0: wolffd@0: if (node.attr.shape == 'ellipse') wolffd@0: draws[0] = [ wolffd@0: 0 = [ wolffd@0: 'type' = 'e'; wolffd@0: 'c' = copy (c); wolffd@0: 's' = ['x' = s.x / 2; 'y' = s.y / 2;]; wolffd@0: ]; wolffd@0: ]; wolffd@0: else wolffd@0: draws[0] = [ wolffd@0: 0 = [ wolffd@0: 'type' = 'p'; wolffd@0: 'n' = 5; wolffd@0: 'ps' = [ wolffd@0: 0 = ['x' = c.x - s.x / 2; 'y' = c.y - s.y / 2;]; wolffd@0: 1 = ['x' = c.x + s.x / 2; 'y' = c.y - s.y / 2;]; wolffd@0: 2 = ['x' = c.x + s.x / 2; 'y' = c.y + s.y / 2;]; wolffd@0: 3 = ['x' = c.x - s.x / 2; 'y' = c.y + s.y / 2;]; wolffd@0: 4 = ['x' = c.x - s.x / 2; 'y' = c.y - s.y / 2;]; wolffd@0: ]; wolffd@0: ]; wolffd@0: ]; wolffd@0: return draws; wolffd@0: }; wolffd@0: dotty.protogt.simpleedgedraw = function (edge, tp, hp) { wolffd@0: local draws; wolffd@0: wolffd@0: draws[0] = [ wolffd@0: 0 = [ wolffd@0: 'type' = 'L'; wolffd@0: 'n' = 2; wolffd@0: 'ps' = [ wolffd@0: 0 = copy (tp); wolffd@0: 1 = copy (hp); wolffd@0: ]; wolffd@0: ]; wolffd@0: 'ep' = ['x' = (tp.x + hp.x) / 2; 'y' = (tp.y + hp.y) / 2;]; wolffd@0: ]; wolffd@0: return draws; wolffd@0: }; wolffd@0: # wolffd@0: # utilities wolffd@0: # wolffd@0: dotty.protogt.getcolor = function (views, name) { wolffd@0: local vid, vt, color, t; wolffd@0: wolffd@0: for (vid in views) { wolffd@0: vt = views[vid]; wolffd@0: if (~(color >= 0)) { wolffd@0: if (~(vt.colors[name] >= 0)) wolffd@0: color = (vt.colors[name] = vt.colorn); wolffd@0: else { wolffd@0: color = vt.colors[name]; wolffd@0: break; wolffd@0: } wolffd@0: } else if (~(vt.colors[name] >= 0)) wolffd@0: vt.colors[name] = color; wolffd@0: else if (vt.colors[name] ~= color) wolffd@0: dotty.message (0, concat ('inconsistent color ids for ', name)); wolffd@0: if (setwidgetattr (vt.canvas, ['color' = [color = name;];]) ~= 1) { wolffd@0: t = split (name, ' '); wolffd@0: if (tablesize (t) ~= 3 | wolffd@0: setwidgetattr (vt.canvas, ['color' = [color = [ wolffd@0: 'h' = ston (t[0]); 's' = ston (t[1]); 'v' = ston (t[2]); wolffd@0: ];];]) ~= 1) { wolffd@0: dotty.message (0, concat ('unknown color ', name, ' using #1')); wolffd@0: return 1; wolffd@0: } wolffd@0: } wolffd@0: vt.colorn = color + 1; wolffd@0: } wolffd@0: return color; wolffd@0: }; wolffd@0: dotty.protogt.setbgcolor = function (views, name) { wolffd@0: local vid, vt, t; wolffd@0: wolffd@0: for (vid in views) { wolffd@0: vt = views[vid]; wolffd@0: if (setwidgetattr (vt.canvas, ['color' = [0 = name;];]) ~= 1) { wolffd@0: t = split (name, ' '); wolffd@0: if (tablesize (t) ~= 3 | wolffd@0: setwidgetattr (vt.canvas, ['color' = [0 = [ wolffd@0: 'h' = ston (t[0]); 's' = ston (t[1]); 'v' = ston (t[2]); wolffd@0: ];];]) ~= 1) { wolffd@0: dotty.message (0, concat ('unknown bgcolor ', name)); wolffd@0: return; wolffd@0: } wolffd@0: } wolffd@0: vt.colors['_bgcolor_'] = name; wolffd@0: } wolffd@0: }; wolffd@0: dotty.protogt.unpacksgraphattr = function (gt, sgraph) { wolffd@0: local attr; wolffd@0: wolffd@0: attr = sgraph.graphattr; wolffd@0: if (dotty.fontmap[attr.fontname]) wolffd@0: sgraph[dotty.keys.fname] = dotty.fontmap[attr.fontname]; wolffd@0: else wolffd@0: sgraph[dotty.keys.fname] = attr.fontname; wolffd@0: sgraph[dotty.keys.fsize] = ston (attr.fontsize); wolffd@0: sgraph[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor); wolffd@0: if (attr.color) wolffd@0: sgraph[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: sgraph[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black'); wolffd@0: if (attr.style == 'filled') { wolffd@0: if (attr.fillcolor) wolffd@0: sgraph[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.fillcolor); wolffd@0: else if (attr.color) wolffd@0: sgraph[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: sgraph[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey'); wolffd@0: } wolffd@0: }; wolffd@0: dotty.protogt.unpacknodeattr = function (gt, node) { wolffd@0: local attr; wolffd@0: wolffd@0: attr = node.attr; wolffd@0: if (dotty.fontmap[attr.fontname]) wolffd@0: node[dotty.keys.fname] = dotty.fontmap[attr.fontname]; wolffd@0: else wolffd@0: node[dotty.keys.fname] = attr.fontname; wolffd@0: node[dotty.keys.fsize] = ston (attr.fontsize); wolffd@0: node[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor); wolffd@0: if (attr.color) wolffd@0: node[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: node[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black'); wolffd@0: if (attr.style == 'filled') { wolffd@0: if (attr.fillcolor) wolffd@0: node[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.fillcolor); wolffd@0: else if (attr.color) wolffd@0: node[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: node[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey'); wolffd@0: } wolffd@0: }; wolffd@0: dotty.protogt.unpackedgeattr = function (gt, edge) { wolffd@0: local attr; wolffd@0: wolffd@0: attr = edge.attr; wolffd@0: if (dotty.fontmap[attr.fontname]) wolffd@0: edge[dotty.keys.fname] = dotty.fontmap[attr.fontname]; wolffd@0: else wolffd@0: edge[dotty.keys.fname] = attr.fontname; wolffd@0: edge[dotty.keys.fsize] = ston (attr.fontsize); wolffd@0: edge[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor); wolffd@0: if (attr.color) wolffd@0: edge[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: edge[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black'); wolffd@0: if (attr.style == 'filled') { wolffd@0: if (attr.fillcolor) wolffd@0: edge[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.fillcolor); wolffd@0: else if (attr.color) wolffd@0: edge[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: edge[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey'); wolffd@0: } wolffd@0: }; wolffd@0: dotty.protogt.unpackattr = function (gt) { wolffd@0: local gid, sgraph, nid, node, eid, edge, graph, attr; wolffd@0: wolffd@0: graph = gt.graph; wolffd@0: attr = graph.graphattr; wolffd@0: if (dotty.fontmap[attr.fontname]) wolffd@0: graph[dotty.keys.fname] = dotty.fontmap[attr.fontname]; wolffd@0: else wolffd@0: graph[dotty.keys.fname] = attr.fontname; wolffd@0: graph[dotty.keys.fsize] = ston (attr.fontsize); wolffd@0: graph[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor); wolffd@0: if (attr.color) wolffd@0: graph[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: graph[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black'); wolffd@0: if (attr.style == 'filled') { wolffd@0: if (attr.fillcolor) wolffd@0: graph[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.fillcolor); wolffd@0: else if (attr.color) wolffd@0: graph[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: graph[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey'); wolffd@0: } wolffd@0: if (attr.bgcolor & attr.bgcolor ~= '') wolffd@0: gt.setbgcolor (gt.views, attr.bgcolor); wolffd@0: for (gid in graph.graphdict) { wolffd@0: sgraph = graph.graphs[graph.graphdict[gid]]; wolffd@0: attr = sgraph.graphattr; wolffd@0: if (dotty.fontmap[attr.fontname]) wolffd@0: sgraph[dotty.keys.fname] = dotty.fontmap[attr.fontname]; wolffd@0: else wolffd@0: sgraph[dotty.keys.fname] = attr.fontname; wolffd@0: sgraph[dotty.keys.fsize] = ston (attr.fontsize); wolffd@0: sgraph[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor); wolffd@0: if (attr.color) wolffd@0: sgraph[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: sgraph[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black'); wolffd@0: if (attr.style == 'filled') { wolffd@0: if (attr.fillcolor) wolffd@0: sgraph[dotty.keys.bcolor] = gt.getcolor ( wolffd@0: gt.views, attr.fillcolor wolffd@0: ); wolffd@0: else if (attr.color) wolffd@0: sgraph[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: sgraph[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey'); wolffd@0: } wolffd@0: } wolffd@0: for (nid in graph.nodedict) { wolffd@0: node = graph.nodes[graph.nodedict[nid]]; wolffd@0: attr = node.attr; wolffd@0: if (dotty.fontmap[attr.fontname]) wolffd@0: node[dotty.keys.fname] = dotty.fontmap[attr.fontname]; wolffd@0: else wolffd@0: node[dotty.keys.fname] = attr.fontname; wolffd@0: node[dotty.keys.fsize] = ston (attr.fontsize); wolffd@0: node[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor); wolffd@0: if (attr.color) wolffd@0: node[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: node[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black'); wolffd@0: if (attr.style == 'filled') { wolffd@0: if (attr.fillcolor) wolffd@0: node[dotty.keys.bcolor] = gt.getcolor ( wolffd@0: gt.views, attr.fillcolor wolffd@0: ); wolffd@0: else if (attr.color) wolffd@0: node[dotty.keys.bcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: node[dotty.keys.bcolor] = gt.getcolor (gt.views, 'lightgrey'); wolffd@0: } wolffd@0: } wolffd@0: for (eid in graph.edges) { wolffd@0: edge = graph.edges[eid]; wolffd@0: attr = edge.attr; wolffd@0: if (dotty.fontmap[attr.fontname]) wolffd@0: edge[dotty.keys.fname] = dotty.fontmap[attr.fontname]; wolffd@0: else wolffd@0: edge[dotty.keys.fname] = attr.fontname; wolffd@0: edge[dotty.keys.fsize] = ston (attr.fontsize); wolffd@0: edge[dotty.keys.fcolor] = gt.getcolor (gt.views, attr.fontcolor); wolffd@0: if (attr.color) wolffd@0: edge[dotty.keys.dcolor] = gt.getcolor (gt.views, attr.color); wolffd@0: else wolffd@0: edge[dotty.keys.dcolor] = gt.getcolor (gt.views, 'black'); wolffd@0: } wolffd@0: };