trim down on the storage and code for gui_state (active, selected, visited,
authorellson <devnull@localhost>
Tue, 18 Oct 2005 19:04:33 +0000 (19:04 +0000)
committerellson <devnull@localhost>
Tue, 18 Oct 2005 19:04:33 +0000 (19:04 +0000)
deleted)

lib/common/emit.c
lib/common/shapes.c
lib/common/types.h
lib/gvc/gvevent.c

index f5f407c9360e3bac2df1029604aa9d41f07562ae..b2b760a7f9eccf0408b2b1da457c649caa29db01 100644 (file)
@@ -775,27 +775,27 @@ void emit_edge_graphics(GVJ_t * job, edge_t * e)
                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 */
@@ -840,7 +840,7 @@ void emit_edge_graphics(GVJ_t * job, edge_t * e)
            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);
@@ -875,7 +875,7 @@ void emit_edge_graphics(GVJ_t * job, edge_t * e)
            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);
@@ -1368,7 +1368,7 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
     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;
@@ -1404,50 +1404,44 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
                    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;
@@ -1457,7 +1451,8 @@ void emit_clusters(GVJ_t * job, Agraph_t * g, int flags)
        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;
index 269eac2a1cbfeb9e819807c99e2166f6eedbe3bc..eca9ec9972600f33a6ce153b910c06cbc1601b1b 100644 (file)
@@ -1213,28 +1213,28 @@ static void poly_gencode(GVJ_t * job, node_t * n)
     } 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);
index 4d2af6372dbad07942da55acbc44d2ef001a6d02..3e4d4c1e7ae68d489c77ab4ed60e267bcf35d4cb 100644 (file)
@@ -303,6 +303,11 @@ extern "C" {
        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)
@@ -314,9 +319,9 @@ extern "C" {
        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 */
@@ -365,7 +370,6 @@ extern "C" {
 
     } 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
@@ -373,12 +377,12 @@ extern "C" {
 #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
@@ -411,14 +415,12 @@ extern "C" {
 #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;
@@ -430,8 +432,8 @@ extern "C" {
        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;
@@ -473,15 +475,14 @@ extern "C" {
 
 #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
@@ -514,7 +515,6 @@ extern "C" {
 #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
@@ -522,7 +522,6 @@ extern "C" {
 #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
@@ -535,9 +534,9 @@ extern "C" {
        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;
@@ -557,23 +556,21 @@ extern "C" {
 
     } 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
@@ -581,7 +578,6 @@ extern "C" {
 #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
 
index 56758adc00a4759183b8271dfcfddd0fb2d0743c..6415e42ba0185c5811d36b5e6f0507a3aeffeb8d 100644 (file)
@@ -171,7 +171,7 @@ static void gvevent_refresh(GVJ_t * job)
 
     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);
@@ -226,13 +226,13 @@ static void gvevent_leave_obj(GVJ_t * job)
     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;
         }
     }
@@ -256,21 +256,21 @@ static void gvevent_enter_obj(GVJ_t * job)
         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);
@@ -322,16 +322,16 @@ static void gvevent_select_current_obj(GVJ_t * job)
     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;
         }
     }
@@ -345,15 +345,15 @@ static void gvevent_select_current_obj(GVJ_t * job)
     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;
         }