return assigned;
}
+static void
+layerPagePrefix (GVJ_t* job, agxbuf* xb)
+{
+ char buf[128]; /* large enough for 2 decimal 64-bit ints and "page_," */
+ if (job->layerNum > 1) {
+ agxbput (xb, job->gvc->layerIDs[job->layerNum]);
+ agxbputc (xb, '_');
+ }
+ if ((job->pagesArrayElem.x > 0) || (job->pagesArrayElem.x > 0)) {
+ sprintf (buf, "page%d,%d_", job->pagesArrayElem.x, job->pagesArrayElem.y);
+ agxbput (xb, buf);
+ }
+}
+
/* genObjId:
* Use id of root graph if any, plus kind and internal id of object
*/
char* gid = GD_drawing(root)->id;
long idnum;
char* pfx;
- char buf[30]; /* large enough for decimal 64-bit int */
+ char buf[64]; /* large enough for a decimal 64-bit int */
+
+ layerPagePrefix (job, xb);
id = agget(obj, "id");
- if (id && *id)
- return id;
+ if (id && (*id != '\0')) {
+ agxbput (xb, id);
+ return agxbuse(xb);
+ }
+
+ if ((obj != root) && gid) {
+ agxbput (xb, gid);
+ agxbputc (xb, '_');
+ }
switch (agobjkind(obj)) {
#ifndef WITH_CGRAPH
case AGRAPH:
idnum = AGSEQ(obj);
#endif
- pfx = "graph";
+ if (root == obj)
+ pfx = "graph";
+ else
+ pfx = "clust";
break;
case AGNODE:
idnum = AGSEQ((Agnode_t*)obj);
break;
}
- if (gid) {
- agxbput (xb, gid);
- agxbputc (xb, '_');
- }
agxbput (xb, pfx);
sprintf (buf, "%ld", idnum);
agxbput (xb, buf);
pop_obj_state(job);
}
+#define NotFirstPage(j) (((j)->layerNum>1)||((j)->pagesArrayElem.x > 0)||((j)->pagesArrayElem.x > 0))
+
static void emit_page(GVJ_t * job, graph_t * g)
{
obj_state_t *obj = job->obj;
int nump = 0, flags = job->flags;
textlabel_t *lab;
pointf *p = NULL;
+ char* saveid;
+ unsigned char buf[SMALLBUF];
+ agxbuf xb;
+
+ /* For the first page, we can use the values generated in emit_begin_graph.
+ * For multiple pages, we need to generate a new id.
+ */
+ if (NotFirstPage(job)) {
+ agxbinit(&xb, SMALLBUF, buf);
+ saveid = obj->id;
+ layerPagePrefix (job, &xb);
+ agxbput (&xb, saveid);
+ obj->id = agxbuse(&xb);
+ }
+ else
+ saveid = NULL;
setColorScheme (agget (g, "colorscheme"));
setup_page(job, g);
emit_map_rect(job, job->clip);
gvrender_begin_anchor(job, obj->url, obj->tooltip, obj->target, obj->id);
}
- if (numPhysicalLayers(job) == 1)
+ /* if (numPhysicalLayers(job) == 1) */
emit_background(job, g);
if (GD_label(g))
emit_label(job, EMIT_GLABEL, GD_label(g));
gvrender_end_anchor(job);
emit_view(job,g,flags);
gvrender_end_page(job);
+ if (saveid) {
+ agxbfree(&xb);
+ obj->id = saveid;
+ }
}
void emit_graph(GVJ_t * job, graph_t * g)
static char *sdasharray = "5,2";
/* SVG dot array */
static char *sdotarray = "1,5";
-static int gradId;
-static int anchorId;
#ifndef HAVE_STRCASECMP
extern int strcasecmp(const char *s1, const char *s2);
{
gvputs(job, "<g");
if (id) {
- gvprintf(job, " id=\"a%d_", anchorId++);
+ gvputs(job, " id=\"a_");
gvputs(job, xml_string(id));
gvputs(job, "\"");
}
{
pointf G[2];
float angle;
+ static int gradId;
int id = gradId++;
obj_state_t *obj = job->obj;
pointf G[2];
float angle;
int ifx, ify;
- int id = gradId++;
+ static int rgradId;
+ int id = rgradId++;
obj_state_t *obj = job->obj;
angle = obj->gradient_angle * M_PI / 180; //angle of gradient line