numc++;
fillcolor = pencolor = color;
- if (ED_active(e)) {
+ if (ED_gui_state(e) & GUI_STATE_ACTIVE) {
pencolor = late_nnstring(e, E_activepencolor, DEFAULT_ACTIVEPENCOLOR);
fillcolor = late_nnstring(e, E_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
}
- else if (ED_selected(e)) {
+ else if (ED_gui_state(e) & GUI_STATE_SELECTED) {
pencolor = late_nnstring(e, E_selectedpencolor, DEFAULT_SELECTEDPENCOLOR);
fillcolor = late_nnstring(e, E_selectedfillcolor, DEFAULT_SELECTEDFILLCOLOR);
}
- else if (ED_deleted(e)) {
+ else if (ED_gui_state(e) & GUI_STATE_DELETED) {
pencolor = late_nnstring(e, E_deletedpencolor, DEFAULT_DELETEDPENCOLOR);
fillcolor = late_nnstring(e, E_deletedfillcolor, DEFAULT_DELETEDFILLCOLOR);
}
- else if (ED_visited(e)) {
+ else if (ED_gui_state(e) & GUI_STATE_VISITED) {
pencolor = late_nnstring(e, E_visitedpencolor, DEFAULT_VISITEDPENCOLOR);
fillcolor = late_nnstring(e, E_visitedfillcolor, DEFAULT_VISITEDFILLCOLOR);
}
- if (pencolor != color) {
- color = pencolor;
- gvrender_set_pencolor(job, color);
- gvrender_set_fillcolor(job, color);
- }
+ if (pencolor != color)
+ gvrender_set_pencolor(job, pencolor);
+ if (fillcolor != color)
+ gvrender_set_fillcolor(job, fillcolor);
+ color = pencolor;
/* if more than one color - then generate parallel beziers, one per color */
if (numc) {
/* calculate and save offset vector spline and initialize first offset spline */
colors = strdup(color);
for (cnum = 0, color = strtok(colors, ":"); color;
cnum++, color = strtok(0, ":")) {
- if (! ED_active(e) && ! ED_selected(e)) {
+ if (! (ED_gui_state(e) & (GUI_STATE_ACTIVE | GUI_STATE_SELECTED))) {
if (color[0]) {
gvrender_set_pencolor(job, color);
gvrender_set_fillcolor(job, color);
free(offspl.list);
free(tmpspl.list);
} else {
- if (! ED_active(e) && ! ED_selected(e)) {
+ if (! (ED_gui_state(e) & (GUI_STATE_ACTIVE | GUI_STATE_SELECTED))) {
if (color[0]) {
gvrender_set_pencolor(job, color);
gvrender_set_fillcolor(job, color);
int i, c, filled;
graph_t *sg;
point A[4];
- char *color, *str, **style;
+ char *color, *fillcolor, *pencolor, *str, **style;
node_t *n;
edge_t *e;
char *s, *url = NULL, *tooltip = NULL, *target = NULL;
break;
}
}
- if (GD_active(sg)) {
- color = late_nnstring(sg, G_activepencolor, DEFAULT_ACTIVEPENCOLOR);
- gvrender_set_pencolor(job, color);
- color = late_nnstring(sg, G_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
- gvrender_set_fillcolor(job, color);
+ fillcolor = pencolor = 0;
+ if (GD_gui_state(sg) & GUI_STATE_ACTIVE) {
+ pencolor = late_nnstring(sg, G_activepencolor, DEFAULT_ACTIVEPENCOLOR);
+ fillcolor = late_nnstring(sg, G_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
+ filled = TRUE;
}
- else if (GD_selected(sg)) {
- color = late_nnstring(sg, G_activepencolor, DEFAULT_SELECTEDPENCOLOR);
- gvrender_set_pencolor(job, color);
- color = late_nnstring(sg, G_activefillcolor, DEFAULT_SELECTEDFILLCOLOR);
- gvrender_set_fillcolor(job, color);
+ else if (GD_gui_state(sg) & GUI_STATE_SELECTED) {
+ pencolor = late_nnstring(sg, G_activepencolor, DEFAULT_SELECTEDPENCOLOR);
+ fillcolor = late_nnstring(sg, G_activefillcolor, DEFAULT_SELECTEDFILLCOLOR);
+ filled = TRUE;
}
- else if (GD_deleted(sg)) {
- color = late_nnstring(sg, G_deletedpencolor, DEFAULT_DELETEDPENCOLOR);
- gvrender_set_pencolor(job, color);
- color = late_nnstring(sg, G_deletedfillcolor, DEFAULT_DELETEDFILLCOLOR);
- gvrender_set_fillcolor(job, color);
+ else if (GD_gui_state(sg) & GUI_STATE_DELETED) {
+ pencolor = late_nnstring(sg, G_deletedpencolor, DEFAULT_DELETEDPENCOLOR);
+ fillcolor = late_nnstring(sg, G_deletedfillcolor, DEFAULT_DELETEDFILLCOLOR);
+ filled = TRUE;
}
- else if (GD_visited(sg)) {
- color = late_nnstring(sg, G_visitedpencolor, DEFAULT_VISITEDPENCOLOR);
- gvrender_set_pencolor(job, color);
- color = late_nnstring(sg, G_visitedfillcolor, DEFAULT_VISITEDFILLCOLOR);
- gvrender_set_fillcolor(job, color);
+ else if (GD_gui_state(sg) & GUI_STATE_VISITED) {
+ pencolor = late_nnstring(sg, G_visitedpencolor, DEFAULT_VISITEDPENCOLOR);
+ fillcolor = late_nnstring(sg, G_visitedfillcolor, DEFAULT_VISITEDFILLCOLOR);
+ filled = TRUE;
}
else {
if (((color = agget(sg, "pencolor")) != 0) && color[0])
- gvrender_set_pencolor(job, color);
- else if (((color = agget(sg, "color")) != 0) && color[0])
- gvrender_set_pencolor(job, color);
- /* bgcolor is supported for backward compatability */
- else if (((color = agget(sg, "bgcolor")) != 0) && color[0])
- gvrender_set_pencolor(job, color);
-
- color = 0;
- if (((color = agget(sg, "fillcolor")) != 0) && color[0])
- gvrender_set_fillcolor(job, color);
+ pencolor = color;
else if (((color = agget(sg, "color")) != 0) && color[0])
- gvrender_set_fillcolor(job, color);
+ fillcolor = pencolor = color;
/* bgcolor is supported for backward compatability */
else if (((color = agget(sg, "bgcolor")) != 0) && color[0]) {
+ fillcolor = pencolor = color;
filled = TRUE;
- gvrender_set_fillcolor(job, color);
- }
+ }
+ if (((color = agget(sg, "fillcolor")) != 0) && color[0])
+ fillcolor = color;
}
+ if (pencolor)
+ gvrender_set_pencolor(job, pencolor);
+ if (fillcolor)
+ gvrender_set_fillcolor(job, fillcolor);
A[0] = GD_bb(sg).LL;
A[2] = GD_bb(sg).UR;
A[1].x = A[2].x;
if (late_int(sg, G_peripheries, 1, 0)) {
gvrender_polygon(job, A, 4, filled);
} else if (filled) {
- gvrender_set_pencolor(job, str);
+ if (fillcolor && fillcolor != pencolor)
+ gvrender_set_pencolor(job, fillcolor);
gvrender_polygon(job, A, 4, filled);
}
xdemitState = EMIT_DRAW;
} else {
style = stylenode(job, n);
}
- if (ND_active(n)) {
+ if (ND_gui_state(n) & GUI_STATE_ACTIVE) {
color = late_nnstring(n, N_activepencolor, DEFAULT_ACTIVEPENCOLOR);
gvrender_set_pencolor(job, color);
color = late_nnstring(n, N_activefillcolor, DEFAULT_ACTIVEFILLCOLOR);
gvrender_set_fillcolor(job, color);
filled = TRUE;
}
- else if (ND_selected(n)) {
+ else if (ND_gui_state(n) & GUI_STATE_SELECTED) {
color = late_nnstring(n, N_selectedpencolor, DEFAULT_SELECTEDPENCOLOR);
gvrender_set_pencolor(job, color);
color = late_nnstring(n, N_selectedfillcolor, DEFAULT_SELECTEDFILLCOLOR);
gvrender_set_fillcolor(job, color);
filled = TRUE;
}
- else if (ND_deleted(n)) {
+ else if (ND_gui_state(n) & GUI_STATE_DELETED) {
color = late_nnstring(n, N_deletedpencolor, DEFAULT_DELETEDPENCOLOR);
gvrender_set_pencolor(job, color);
color = late_nnstring(n, N_deletedfillcolor, DEFAULT_DELETEDFILLCOLOR);
gvrender_set_fillcolor(job, color);
filled = TRUE;
}
- else if (ND_visited(n)) {
+ else if (ND_gui_state(n) & GUI_STATE_VISITED) {
color = late_nnstring(n, N_visitedpencolor, DEFAULT_VISITEDPENCOLOR);
gvrender_set_pencolor(job, color);
color = late_nnstring(n, N_visitedfillcolor, DEFAULT_VISITEDFILLCOLOR);
int size;
} elist;
+#define GUI_STATE_ACTIVE (1<<0)
+#define GUI_STATE_SELECTED (1<<1)
+#define GUI_STATE_VISITED (1<<2)
+#define GUI_STATE_DELETED (1<<3)
+
#define elist_fastapp(item,L) do {L.list[L.size++] = item; L.list[L.size] = NULL;} while(0)
#define elist_append(item,L) do {L.list = ALLOC(L.size + 2,L.list,edge_t*); L.list[L.size++] = item; L.list[L.size] = NULL;} while(0)
#define alloc_elist(n,L) do {L.size = 0; L.list = N_NEW(n + 1,edge_t*); } while (0)
textlabel_t *label; /* if the cluster has a title */
box bb; /* bounding box */
point border[4]; /* sizes of margins for graph labels */
+ unsigned char gui_state; /* Graph state for GUI ops */
bool has_labels;
bool has_images;
- bool active, selected, visited, deleted; /* Graph state for GUI ops */
unsigned char charset; /* input character set */
int rankdir;
int ht1, ht2; /* below and above extremal ranks */
} Agraphinfo_t;
-#define GD_active(g) (g)->u.active
#define GD_alg(g) (g)->u.alg
#define GD_bb(g) (g)->u.bb
#define GD_border(g) (g)->u.border
#define GD_clust(g) (g)->u.clust
#define GD_cluster_was_collapsed(g) (g)->u.cluster_was_collapsed
#define GD_comp(g) (g)->u.comp
-#define GD_deleted(g) (g)->u.deleted
#define GD_dist(g) (g)->u.dist
#define GD_drawing(g) (g)->u.drawing
#define GD_exact_ranksep(g) (g)->u.exact_ranksep
#define GD_expanded(g) (g)->u.expanded
#define GD_flags(g) (g)->u.flags
+#define GD_gui_state(g) (g)->u.gui_state
#define GD_gvc(g) (g)->u.gvc
#define GD_charset(g) (g)->u.charset
#define GD_has_labels(g) (g)->u.has_labels
#define GD_rankleader(g) (g)->u.rankleader
#define GD_ranksep(g) (g)->u.ranksep
#define GD_rn(g) (g)->u.rn
-#define GD_selected(g) (g)->u.selected
#define GD_set_type(g) (g)->u.set_type
#define GD_label_pos(g) (g)->u.label_pos
#define GD_showboxes(g) (g)->u.showboxes
#define GD_spring(g) (g)->u.spring
#define GD_sum_t(g) (g)->u.sum_t
#define GD_t(g) (g)->u.t
-#define GD_visited(g) (g)->u.visited
typedef struct Agnodeinfo_t {
shape_desc *shape;
textlabel_t *label;
void *alg;
char state;
+ unsigned char gui_state; /* Node state for GUI ops */
bool clustnode;
- bool active, selected, visited, deleted; /* Node state for GUI ops */
#ifndef DOT_ONLY
bool pinned;
#define ND_UF_parent(n) (n)->u.UF_parent
#define ND_UF_size(n) (n)->u.UF_size
-#define ND_active(n) (n)->u.active
#define ND_alg(n) (n)->u.alg
#define ND_bb(n) (n)->u.bb
#define ND_clust(n) (n)->u.clust
#define ND_coord_i(n) (n)->u.coord
-#define ND_deleted(n) (n)->u.deleted
#define ND_dist(n) (n)->u.dist
#define ND_flat_in(n) (n)->u.flat_in
#define ND_flat_out(n) (n)->u.flat_out
+#define ND_gui_state(n) (n)->u.gui_state
#define ND_has_port(n) (n)->u.has_port
#define ND_heapindex(n) (n)->u.heapindex
#define ND_height(n) (n)->u.height
#define ND_rw_i(n) (n)->u.rw
#define ND_save_in(n) (n)->u.save_in
#define ND_save_out(n) (n)->u.save_out
-#define ND_selected(n) (n)->u.selected
#define ND_shape(n) (n)->u.shape
#define ND_shape_info(n) (n)->u.shape_info
#define ND_showboxes(n) (n)->u.showboxes
#define ND_clustnode(n) (n)->u.clustnode
#define ND_tree_in(n) (n)->u.tree_in
#define ND_tree_out(n) (n)->u.tree_out
-#define ND_visited(n) (n)->u.visited
#define ND_weight_class(n) (n)->u.weight_class
#define ND_width(n) (n)->u.width
#define ND_xsize(n) (n)->u.xsize
char edge_type;
char adjacent; /* true for flat edge with adjacent nodes */
char label_ontop;
+ unsigned char gui_state; /* Edge state for GUI ops */
edge_t *to_orig; /* for dot's shapes.c */
void *alg;
- bool active, selected, visited, deleted; /* Edge state for GUI ops */
#ifndef DOT_ONLY
double factor;
} Agedgeinfo_t;
-#define ED_active(e) (e)->u.active
#define ED_alg(e) (e)->u.alg
#define ED_conc_opp_flag(e) (e)->u.conc_opp_flag
#define ED_count(e) (e)->u.count
#define ED_cutvalue(e) (e)->u.cutvalue
-#define ED_deleted(e) (e)->u.deleted
#define ED_dist(e) (e)->u.dist
#define ED_edge_type(e) (e)->u.edge_type
#define ED_adjacent(e) (e)->u.adjacent
#define ED_factor(e) (e)->u.factor
+#define ED_gui_state(e) (e)->u.gui_state
#define ED_head_label(e) (e)->u.head_label
#define ED_head_port(e) (e)->u.head_port
#define ED_label(e) (e)->u.label
#define ED_label_ontop(e) (e)->u.label_ontop
#define ED_minlen(e) (e)->u.minlen
#define ED_path(e) (e)->u.path
-#define ED_selected(e) (e)->u.selected
#define ED_showboxes(e) (e)->u.showboxes
#define ED_spl(e) (e)->u.spl
#define ED_tail_label(e) (e)->u.tail_label
#define ED_to_orig(e) (e)->u.to_orig
#define ED_to_virt(e) (e)->u.to_virt
#define ED_tree_index(e) (e)->u.tree_index
-#define ED_visited(e) (e)->u.visited
#define ED_weight(e) (e)->u.weight
#define ED_xpenalty(e) (e)->u.xpenalty
if (!job->selected_obj) {
job->selected_obj = g;
- GD_selected(g) = true;
+ GD_gui_state(g) |= GUI_STATE_SELECTED;
gv_graph_state(job, g);
}
emit_graph(job, g);
if (obj) {
switch (agobjkind(obj)) {
case AGGRAPH:
- GD_active((graph_t*)obj) = false;
+ GD_gui_state((graph_t*)obj) &= !GUI_STATE_ACTIVE;
break;
case AGNODE:
- ND_active((node_t*)obj) = false;
+ ND_gui_state((node_t*)obj) &= !GUI_STATE_ACTIVE;
break;
case AGEDGE:
- ED_active((edge_t*)obj) = false;
+ ED_gui_state((edge_t*)obj) &= !GUI_STATE_ACTIVE;
break;
}
}
switch (agobjkind(obj)) {
case AGGRAPH:
g = (graph_t*)obj;
- GD_active(g) = true;
+ GD_gui_state(g) |= GUI_STATE_ACTIVE;
a = agfindattr(g->root, s_tooltip);
if (a)
job->active_tooltip = strdup_and_subst_graph(agxget(g, a->index), g);
break;
case AGNODE:
n = (node_t*)obj;
- ND_active(n) = true;
+ ND_gui_state(n) |= GUI_STATE_ACTIVE;
a = agfindattr(n->graph->proto->n, s_tooltip);
if (a)
job->active_tooltip = strdup_and_subst_node(agxget(n, a->index), n);
break;
case AGEDGE:
e = (edge_t*)obj;
- ED_active(e) = true;
+ ED_gui_state(e) |= GUI_STATE_ACTIVE;
a = agfindattr(e->head->graph->proto->e, s_tooltip);
if (a)
job->active_tooltip = strdup_and_subst_edge(agxget(e, a->index), e);
if (obj) {
switch (agobjkind(obj)) {
case AGGRAPH:
- GD_visited((graph_t*)obj) = true;
- GD_selected((graph_t*)obj) = false;
+ GD_gui_state((graph_t*)obj) |= GUI_STATE_VISITED;
+ GD_gui_state((graph_t*)obj) &= !GUI_STATE_SELECTED;
break;
case AGNODE:
- ND_visited((node_t*)obj) = true;
- ND_selected((node_t*)obj) = false;
+ ND_gui_state((node_t*)obj) |= GUI_STATE_VISITED;
+ ND_gui_state((node_t*)obj) &= !GUI_STATE_SELECTED;
break;
case AGEDGE:
- ED_visited((edge_t*)obj) = true;
- ED_selected((edge_t*)obj) = false;
+ ED_gui_state((edge_t*)obj) |= GUI_STATE_VISITED;
+ ED_gui_state((edge_t*)obj) &= !GUI_STATE_SELECTED;
break;
}
}
if (obj) {
switch (agobjkind(obj)) {
case AGGRAPH:
- GD_selected((graph_t*)obj) = true;
+ GD_gui_state((graph_t*)obj) |= GUI_STATE_SELECTED;
gv_graph_state(job, (graph_t*)obj);
break;
case AGNODE:
- ND_selected((node_t*)obj) = true;
+ ND_gui_state((node_t*)obj) |= GUI_STATE_SELECTED;
gv_node_state(job, (node_t*)obj);
break;
case AGEDGE:
- ED_selected((edge_t*)obj) = true;
+ ED_gui_state((edge_t*)obj) |= GUI_STATE_SELECTED;
gv_edge_state(job, (edge_t*)obj);
break;
}