From: ellson Date: Thu, 13 Jul 2006 18:09:42 +0000 (+0000) Subject: fix bug when tooltips are mapped without urls X-Git-Tag: LAST_LIBGRAPH~32^2~6072 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=0e11d3a59345e8c218b446fe62eda21fe3f38b88;p=graphviz fix bug when tooltips are mapped without urls --- diff --git a/lib/gvc/gvrender.c b/lib/gvc/gvrender.c index 7df77e0b8..584832156 100644 --- a/lib/gvc/gvrender.c +++ b/lib/gvc/gvrender.c @@ -369,6 +369,7 @@ static void gvrender_resolve_color(gvrender_features_t * features, void gvrender_begin_graph(GVJ_t * job, graph_t * g) { GVC_t *gvc = job->gvc; + int flags = job->flags; obj_state_t *obj; gvrender_engine_t *gvre = job->render.engine; textlabel_t *lab; @@ -380,31 +381,44 @@ void gvrender_begin_graph(GVJ_t * job, graph_t * g) obj = push_obj_state(job); obj->g = g; - if ((job->flags & GVRENDER_DOES_LABELS) && ((lab = GD_label(g)))) { + if ((flags & GVRENDER_DOES_LABELS) && ((lab = GD_label(g)))) { if (lab->html) doHTMLlabel(lab->u.html, lab->p, (void *) g); obj->label = lab->text; } - if ((job->flags & GVRENDER_DOES_MAPS) - && (((s = agget(g, "href")) && s[0]) || ((s = agget(g, "URL")) && s[0]))) { + if ((flags & GVRENDER_DOES_MAPS) + && (((s = agget(g, "href")) && s[0]) + || ((s = agget(g, "URL")) && s[0]))) { obj->url = strdup_and_subst_graph(s, g); } + if (flags & GVRENDER_DOES_TOOLTIPS) { + if ((s = agget(g, "tooltip")) && s[0]) { + obj->tooltip = strdup_and_subst_graph(s, g); + obj->explicit_tooltip = true; + } + else if (obj->url && obj->label) { + obj->tooltip = strdup(obj->label); + } + } + if ((flags & GVRENDER_DOES_TARGETS) && ((s = agget(g, "target")) && s[0])) { + obj->target = strdup_and_subst_graph(s, g); + } job->compscale.x = job->scale.x = job->zoom * job->dpi.x / POINTS_PER_INCH; job->compscale.y = job->scale.y = job->zoom * job->dpi.y / POINTS_PER_INCH; job->compscale.y *= (job->flags & GVRENDER_Y_GOES_DOWN) ? -1. : 1.; if (job->rotation) { - job->clip.UR.x = job->focus.x + sy + EPSILON; - job->clip.UR.y = job->focus.y + sx + EPSILON; - job->clip.LL.x = job->focus.x - sy - EPSILON; - job->clip.LL.y = job->focus.y - sx - EPSILON; + job->clip.UR.x = job->focus.x + sy + EPSILON; + job->clip.UR.y = job->focus.y + sx + EPSILON; + job->clip.LL.x = job->focus.x - sy - EPSILON; + job->clip.LL.y = job->focus.y - sx - EPSILON; job->offset.x = -job->focus.y * job->compscale.x + job->width * 3 / 2; job->offset.y = -job->focus.x * job->compscale.y + job->height / 2.; } else { - job->clip.UR.x = job->focus.x + sx + EPSILON; - job->clip.UR.y = job->focus.y + sy + EPSILON; - job->clip.LL.x = job->focus.x - sx - EPSILON; - job->clip.LL.y = job->focus.y - sy - EPSILON; + job->clip.UR.x = job->focus.x + sx + EPSILON; + job->clip.UR.y = job->focus.y + sy + EPSILON; + job->clip.LL.x = job->focus.x - sx - EPSILON; + job->clip.LL.y = job->focus.y - sy - EPSILON; job->offset.x = -job->focus.x * job->compscale.x + job->width / 2.; job->offset.y = -job->focus.y * job->compscale.y + job->height / 2.; } @@ -437,7 +451,7 @@ void gvrender_begin_graph(GVJ_t * job, graph_t * g) #ifdef WITH_CODEGENS else { codegen_t *cg = job->codegen; - + if (cg && cg->begin_graph) cg->begin_graph(gvc, g, job->canvasBox, gvc->pb); } @@ -470,7 +484,8 @@ void gvrender_begin_page(GVJ_t * job) int nump = 0, flags = job->flags; pointf *p = NULL; - if (flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS)) { + if ((flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS)) + && (obj->url || obj->explicit_tooltip)) { if (flags & (GVRENDER_DOES_MAP_RECTANGLE | GVRENDER_DOES_MAP_POLYGON)) { if (flags & GVRENDER_DOES_MAP_RECTANGLE) { obj->url_map_shape = MAP_RECTANGLE; @@ -598,8 +613,15 @@ void gvrender_begin_cluster(GVJ_t * job, graph_t * sg) if ((flags & GVRENDER_DOES_TARGETS) && ((s = agget(sg, "target")) && s[0])) obj->target = strdup_and_subst_graph(s, sg); - if ((flags & GVRENDER_DOES_TOOLTIPS) && ((s = agget(sg, "tooltip")) && s[0])) - obj->tooltip = strdup_and_subst_graph(s, sg); + if (flags & GVRENDER_DOES_TOOLTIPS) { + if ((s = agget(sg, "tooltip")) && s[0]) { + obj->tooltip = strdup_and_subst_graph(s, sg); + obj->explicit_tooltip = true; + } + else if (obj->label) { + obj->tooltip = strdup(obj->label); + } + } if (flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS)) { if (flags & (GVRENDER_DOES_MAP_RECTANGLE | GVRENDER_DOES_MAP_POLYGON)) { @@ -816,15 +838,19 @@ void gvrender_begin_node(GVJ_t * job, node_t * n) obj->url = strdup_and_subst_node(s, n); } if (flags & GVRENDER_DOES_TOOLTIPS) { - if ((s = agget(n, "tooltip")) && s[0]) + if ((s = agget(n, "tooltip")) && s[0]) { obj->tooltip = strdup_and_subst_node(s, n); - else + obj->explicit_tooltip = true; + } + else { obj->tooltip = strdup(ND_label(n)->text); + } } if ((flags & GVRENDER_DOES_TARGETS) && ((s = agget(n, "target")) && s[0])) { obj->target = strdup_and_subst_node(s, n); } - if (flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS)) { + if ((flags & (GVRENDER_DOES_MAPS | GVRENDER_DOES_TOOLTIPS)) + && (obj->url || obj->explicit_tooltip)) { /* checking shape of node */ shape = shapeOf(n); diff --git a/plugin/core/gvrender_core_map.c b/plugin/core/gvrender_core_map.c index 64412c8a9..495a5fe81 100644 --- a/plugin/core/gvrender_core_map.c +++ b/plugin/core/gvrender_core_map.c @@ -36,6 +36,9 @@ static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, in static point *A; static int size_A; + if (!AF || !nump) + return; + if (size_A < nump) { size_A = nump + 10; A = realloc(A, size_A * sizeof(point)); @@ -43,7 +46,7 @@ static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, in for (i = 0; i < nump; i++) PF2P(AF[i], A[i]); - if (job->render.id == FORMAT_IMAP) { + if (job->render.id == FORMAT_IMAP && url && url[0]) { switch (map_shape) { case MAP_RECTANGLE: /* Y_GOES_DOWN so need UL to LR */ @@ -65,7 +68,7 @@ static void map_output_shape (GVJ_t *job, map_shape_t map_shape, pointf * AF, in break; } - } else if (job->render.id == FORMAT_ISMAP) { + } else if (job->render.id == FORMAT_ISMAP && url && url[0]) { switch (map_shape) { case MAP_RECTANGLE: /* Y_GOES_DOWN so need UL to LR */ @@ -163,13 +166,11 @@ static void map_end_page(GVJ_t * job) switch (job->render.id) { case FORMAT_CMAP: - if (obj->url && obj->url[0] && obj->url_map_p) - map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n, + map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n, obj->url, obj->tooltip, obj->target); break; case FORMAT_CMAPX: - if (obj->url && obj->url[0] && obj->url_map_p) - map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n, + map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n, obj->url, obj->tooltip, obj->target); fprintf(job->output_file, "\n"); break; @@ -184,8 +185,7 @@ static void map_begin_cluster(GVJ_t * job) fprintf(job->output_file, "%% %s\n", obj->sg->name); - if (obj->url && obj->url[0] && obj->url_map_p) - map_output_shape(job, obj->url_map_shape, obj->url_map_p, obj->url_map_n, + map_output_shape(job, obj->url_map_shape, obj->url_map_p, obj->url_map_n, obj->url, obj->tooltip, obj->target); } @@ -193,8 +193,7 @@ static void map_begin_node(GVJ_t * job) { obj_state_t *obj = job->obj; - if (obj->url && obj->url[0] && obj->url_map_p) - map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n, + map_output_shape(job, obj->url_map_shape, obj->url_map_p,obj->url_map_n, obj->url, obj->tooltip, obj->target); } @@ -204,30 +203,21 @@ map_begin_edge(GVJ_t * job) obj_state_t *obj = job->obj; int i, j = 0; - if (obj->url && obj->url[0] && obj->url_map_p) - map_output_shape(job, obj->url_map_shape, obj->url_map_p, obj->url_map_n, + map_output_shape(job, obj->url_map_shape, obj->url_map_p, obj->url_map_n, obj->url, obj->tooltip, obj->target); - - if (obj->tailurl && obj->tailurl[0] && obj->tailurl_map_p) - map_output_shape(job, MAP_RECTANGLE, obj->tailurl_map_p, 2, + map_output_shape(job, MAP_RECTANGLE, obj->tailurl_map_p, 2, obj->tailurl, obj->tailtooltip, obj->tailtarget); - if (obj->headurl && obj->headurl[0] && obj->headurl_map_p) - map_output_shape(job, MAP_RECTANGLE, obj->headurl_map_p, 2, + map_output_shape(job, MAP_RECTANGLE, obj->headurl_map_p, 2, obj->headurl, obj->headtooltip, obj->headtarget); - - if (obj->url && obj->url[0] && obj->tailendurl_map_p) - map_output_shape(job, MAP_RECTANGLE, obj->tailendurl_map_p,2, + map_output_shape(job, MAP_RECTANGLE, obj->tailendurl_map_p,2, obj->url, obj->tooltip, obj->target); - if (obj->url && obj->url[0] && obj->headendurl_map_p) - map_output_shape(job, MAP_RECTANGLE, obj->headendurl_map_p, 2, + map_output_shape(job, MAP_RECTANGLE, obj->headendurl_map_p, 2, obj->url, obj->tooltip, obj->target); - - if (obj->url && obj->url[0]) { - for (i = 0; i < obj->url_bsplinemap_poly_n; i++) { - map_output_shape(job, MAP_POLYGON, obj->url_bsplinemap_p+j, obj->url_bsplinemap_n[i], - obj->url, obj->tooltip, obj->target); - j += obj->url_bsplinemap_n[i]; - } + for (i = 0; i < obj->url_bsplinemap_poly_n; i++) { + map_output_shape(job, MAP_POLYGON, + obj->url_bsplinemap_p+j, obj->url_bsplinemap_n[i], + obj->url, obj->tooltip, obj->target); + j += obj->url_bsplinemap_n[i]; } }