/* gvLayout: * Selects layout based on engine and binds it to gvc; * does the layout and sets the graph's bbox. * Return 0 on success. */ int gvLayout(GVC_t *gvc, graph_t *g, const char *engine) { char buf[256]; int rc; rc = gvlayout_select(gvc, engine); if (rc == NO_SUPPORT) { agerr (AGERR, "Layout type: \"%s\" not recognized. Use one of:%s\n", engine, gvplugin_list(gvc, API_layout, engine)); return -1; } if (gvLayoutJobs(gvc, g) == -1) return -1; /* set bb attribute for basic layout. * doesn't yet include margins, scaling or page sizes because * those depend on the renderer being used. */ if (GD_drawing(g)->landscape) sprintf(buf, "%d %d %d %d", ROUND(GD_bb(g).LL.y), ROUND(GD_bb(g).LL.x), ROUND(GD_bb(g).UR.y), ROUND(GD_bb(g).UR.x)); else sprintf(buf, "%d %d %d %d", ROUND(GD_bb(g).LL.x), ROUND(GD_bb(g).LL.y), ROUND(GD_bb(g).UR.x), ROUND(GD_bb(g).UR.y)); agsafeset(g, "bb", buf, ""); return 0; }
/* Render layout in a specified format to an open FILE */ int gvRender(GVC_t *gvc, graph_t *g, const char *format, FILE *out) { int rc; GVJ_t *job; g = g->root; /* create a job for the required format */ rc = gvjobs_output_langname(gvc, format); job = gvc->job; if (rc == NO_SUPPORT) { agerr (AGERR, "Format: \"%s\" not recognized. Use one of:%s\n", format, gvplugin_list(gvc, API_device, format)); return -1; } job->output_lang = gvrender_select(job, job->output_langname); if (!LAYOUT_DONE(g) && !(job->flags & LAYOUT_NOT_REQUIRED)) { agerrorf( "Layout was not done\n"); return -1; } job->output_file = out; if (out == NULL) job->flags |= OUTPUT_NOT_REQUIRED; rc = gvRenderJobs(gvc, g); gvrender_end_job(job); gvjobs_delete(gvc); return rc; }
/* Render layout in a specified format to an external context */ int gvRenderContext(GVC_t *gvc, graph_t *g, const char *format, void *context) { int rc; GVJ_t *job; g = g->root; /* create a job for the required format */ rc = gvjobs_output_langname(gvc, format); job = gvc->job; if (rc == NO_SUPPORT) { agerr(AGERR, "Format: \"%s\" not recognized. Use one of:%s\n", format, gvplugin_list(gvc, API_device, format)); return -1; } job->output_lang = gvrender_select(job, job->output_langname); if (!GD_drawing(g) && !(job->flags & LAYOUT_NOT_REQUIRED)) { fprintf(stderr, "Layout was not done\n"); return -1; } job->context = context; job->external_context = TRUE; gvRenderJobs(gvc, g); gvrender_end_job(job); gvdevice_finalize(job); gvjobs_delete(gvc); return 0; }
void tcldot_layout(GVC_t *gvc, Agraph_t * g, char *engine) { char buf[256]; Agsym_t *a; int rc; gvFreeLayout(gvc, g); /* in case previously drawn */ /* support old behaviors if engine isn't specified*/ if (!engine || *engine == '\0') { if (agisdirected(g)) rc = gvlayout_select(gvc, "dot"); else rc = gvlayout_select(gvc, "neato"); } else { if (strcasecmp(engine, "nop") == 0) { Nop = 2; PSinputscale = POINTS_PER_INCH; rc = gvlayout_select(gvc, "neato"); } else { rc = gvlayout_select(gvc, engine); } if (rc == NO_SUPPORT) rc = gvlayout_select(gvc, "dot"); } if (rc == NO_SUPPORT) { fprintf(stderr, "Layout type: \"%s\" not recognized. Use one of:%s\n", engine, gvplugin_list(gvc, API_layout, engine)); return; } gvLayoutJobs(gvc, g); /* set bb attribute for basic layout. * doesn't yet include margins, scaling or page sizes because * those depend on the renderer being used. */ if (GD_drawing(g)->landscape) sprintf(buf, "%d %d %d %d", ROUND(GD_bb(g).LL.y), ROUND(GD_bb(g).LL.x), ROUND(GD_bb(g).UR.y), ROUND(GD_bb(g).UR.x)); else sprintf(buf, "%d %d %d %d", ROUND(GD_bb(g).LL.x), ROUND(GD_bb(g).LL.y), ROUND(GD_bb(g).UR.x), ROUND(GD_bb(g).UR.y)); if (!(a = agattr(g, AGRAPH, "bb", NULL))) a = agattr(g, AGRAPH, "bb", ""); agxset(g, a, buf); }
/* Render layout in a specified format to a malloc'ed string */ int gvRenderData(GVC_t *gvc, graph_t *g, const char *format, char **result, unsigned int *length) { int rc; GVJ_t *job; g = g->root; /* create a job for the required format */ rc = gvjobs_output_langname(gvc, format); job = gvc->job; if (rc == NO_SUPPORT) { agerr(AGERR, "Format: \"%s\" not recognized. Use one of:%s\n", format, gvplugin_list(gvc, API_device, format)); return -1; } job->output_lang = gvrender_select(job, job->output_langname); if (!LAYOUT_DONE(g) && !(job->flags & LAYOUT_NOT_REQUIRED)) { agerrorf( "Layout was not done\n"); return -1; } /* page size on Linux, Mac OS X and Windows */ #define OUTPUT_DATA_INITIAL_ALLOCATION 4096 if(!result || !(*result = malloc(OUTPUT_DATA_INITIAL_ALLOCATION))) { agerr(AGERR, "failure malloc'ing for result string"); return -1; } job->output_data = *result; job->output_data_allocated = OUTPUT_DATA_INITIAL_ALLOCATION; job->output_data_position = 0; rc = gvRenderJobs(gvc, g); gvrender_end_job(job); if (rc == 0) { *result = job->output_data; *length = job->output_data_position; } gvjobs_delete(gvc); return rc; }
/* dotneato_args_initialize" * Scan argv[] for allowed flags. * Return 0 on success; v+1 if calling function should call exit(v). * If -c is set, config file is created and we exit. */ int dotneato_args_initialize(GVC_t * gvc, int argc, char **argv) { char c, *rest, *layout; const char *val; int i, v, nfiles; unsigned char buf[SMALLBUF]; agxbuf xb; int Kflag = 0; /* establish if we are running in a CGI environment */ HTTPServerEnVar = getenv("SERVER_NAME"); /* establish Gvfilepath, if any */ Gvfilepath = getenv("GV_FILE_PATH"); gvc->common.cmdname = dotneato_basename(argv[0]); if (gvc->common.verbose) { fprintf(stderr, "%s - %s version %s (%s)\n", gvc->common.cmdname, gvc->common.info[0], gvc->common.info[1], gvc->common.info[2]); } /* configure for available plugins */ /* needs to know if "dot -c" is set (gvc->common.config) */ /* must happen before trying to select any plugins */ if (gvc->common.config) { gvconfig(gvc, gvc->common.config); exit (0); } /* feed the globals */ Verbose = gvc->common.verbose; CmdName = gvc->common.cmdname; nfiles = 0; for (i = 1; i < argc; i++) if (argv[i] && argv[i][0] != '-') nfiles++; gvc->input_filenames = N_NEW(nfiles + 1, char *); nfiles = 0; agxbinit(&xb, SMALLBUF, buf); for (i = 1; i < argc; i++) { if (argv[i] && argv[i][0] == '-') { rest = &(argv[i][2]); switch (c = argv[i][1]) { case 'G': if (*rest) global_def(&xb, rest, AGRAPH, agattr); else { fprintf(stderr, "Missing argument for -G flag\n"); return (dotneato_usage(1)); } break; case 'N': if (*rest) global_def(&xb, rest, AGNODE,agattr); else { fprintf(stderr, "Missing argument for -N flag\n"); return (dotneato_usage(1)); } break; case 'E': if (*rest) global_def(&xb, rest, AGEDGE,agattr); else { fprintf(stderr, "Missing argument for -E flag\n"); return (dotneato_usage(1)); } break; case 'T': val = getFlagOpt(argc, argv, &i); if (!val) { fprintf(stderr, "Missing argument for -T flag\n"); return (dotneato_usage(1)); } v = gvjobs_output_langname(gvc, val); if (!v) { fprintf(stderr, "Format: \"%s\" not recognized. Use one of:%s\n", val, gvplugin_list(gvc, API_device, val)); if (GvExitOnUsage) exit(1); return(2); } break; case 'K': val = getFlagOpt(argc, argv, &i); if (!val) { fprintf(stderr, "Missing argument for -K flag\n"); return (dotneato_usage(1)); } v = gvlayout_select(gvc, val); if (v == NO_SUPPORT) { fprintf(stderr, "There is no layout engine support for \"%s\"\n", val); if (streq(val, "dot")) { fprintf(stderr, "Perhaps \"dot -c\" needs to be run (with installer's privileges) to register the plugins?\n"); } else { fprintf(stderr, "Use one of:%s\n", gvplugin_list(gvc, API_layout, val)); } if (GvExitOnUsage) exit(1); return(2); } Kflag = 1; break; case 'P': P_graph = gvplugin_graph(gvc); break; case 'V': fprintf(stderr, "%s - %s version %s (%s)\n", gvc->common.cmdname, gvc->common.info[0], gvc->common.info[1], gvc->common.info[2]); if (GvExitOnUsage) exit(0); return (1); break; case 'l': val = getFlagOpt(argc, argv, &i); if (!val) { fprintf(stderr, "Missing argument for -l flag\n"); return (dotneato_usage(1)); } use_library(gvc, val); break; case 'o': val = getFlagOpt(argc, argv, &i); if (! gvc->common.auto_outfile_names) gvjobs_output_filename(gvc, val); break; case 'q': if (*rest) { v = atoi(rest); if (v <= 0) { fprintf(stderr, "Invalid parameter \"%s\" for -q flag - ignored\n", rest); } else if (v == 1) agseterr(AGERR); else agseterr(AGMAX); } else agseterr(AGERR); break; case 's': if (*rest) { PSinputscale = atof(rest); if (PSinputscale < 0) { fprintf(stderr, "Invalid parameter \"%s\" for -s flag\n", rest); return (dotneato_usage(1)); } else if (PSinputscale == 0) PSinputscale = POINTS_PER_INCH; } else PSinputscale = POINTS_PER_INCH; break; case 'x': Reduce = TRUE; break; case 'y': Y_invert = TRUE; break; case '?': return (dotneato_usage(0)); break; default: agerr(AGERR, "%s: option -%c unrecognized\n\n", gvc->common.cmdname, c); return (dotneato_usage(1)); } } else if (argv[i]) gvc->input_filenames[nfiles++] = argv[i]; } agxbfree (&xb); /* if no -K, use cmd name to set layout type */ if (!Kflag) { layout = gvc->common.cmdname; if (streq(layout, "dot_static") || streq(layout, "dot_builtins") || streq(layout, "lt-dot") || streq(layout, "lt-dot_builtins") || streq(layout, "") /* when run as a process from Gvedit on Windows */ ) layout = "dot"; i = gvlayout_select(gvc, layout); if (i == NO_SUPPORT) { fprintf(stderr, "There is no layout engine support for \"%s\"\n", layout); if (streq(layout, "dot")) fprintf(stderr, "Perhaps \"dot -c\" needs to be run (with installer's privileges) to register the plugins?\n"); else fprintf(stderr, "Use one of:%s\n", gvplugin_list(gvc, API_layout, "")); if (GvExitOnUsage) exit(1); return(2); } } /* if no -Txxx, then set default format */ if (!gvc->jobs || !gvc->jobs->output_langname) { v = gvjobs_output_langname(gvc, "dot"); if (!v) { // assert(v); /* "dot" should always be available as an output format */ fprintf(stderr, "Unable to find even the default \"-Tdot\" renderer. Has the config\nfile been generated by running \"dot -c\" with installer's priviledges?\n"); return(2); } } /* set persistent attributes here (if not already set from command line options) */ if (!agattr(NULL, AGNODE, "label", 0)) agattr(NULL, AGNODE, "label", NODENAME_ESC); return 0; }
void dotneato_args_initialize(GVC_t * gvc, int argc, char **argv) { char *rest, c, *val; int i, v, nfiles; /* establish if we are running in a CGI environment */ HTTPServerEnVar = getenv("SERVER_NAME"); /* establish Gvfilepath, if any */ Gvfilepath = getenv("GV_FILE_PATH"); /* configure for available plugins and codegens */ gvconfig(gvc, gvc->common.config); if (gvc->common.config) exit (0); gvc->common.cmdname = dotneato_basename(argv[0]); i = gvlayout_select(gvc, gvc->common.cmdname); if (i == NO_SUPPORT) gvlayout_select(gvc, "dot"); /* feed the globals */ Verbose = gvc->common.verbose; CmdName = gvc->common.cmdname; aginit(); nfiles = 0; for (i = 1; i < argc; i++) if (argv[i] && argv[i][0] != '-') nfiles++; gvc->input_filenames = N_NEW(nfiles + 1, char *); nfiles = 0; for (i = 1; i < argc; i++) { if (argv[i] && argv[i][0] == '-') { rest = &(argv[i][2]); switch (c = argv[i][1]) { case 'G': if (*rest) global_def(rest, agraphattr); else { fprintf(stderr, "Missing argument for -G flag\n"); dotneato_usage(1); } break; case 'N': if (*rest) global_def(rest, agnodeattr); else { fprintf(stderr, "Missing argument for -N flag\n"); dotneato_usage(1); } break; case 'E': if (*rest) global_def(rest, agedgeattr); else { fprintf(stderr, "Missing argument for -E flag\n"); dotneato_usage(1); } break; case 'T': val = getFlagOpt(argc, argv, &i); if (!val) { fprintf(stderr, "Missing argument for -T flag\n"); dotneato_usage(1); exit(1); } v = gvjobs_output_langname(gvc, val); if (!v) { fprintf(stderr, "Format: \"%s\" not recognized. Use one of:%s\n", val, gvplugin_list(gvc, API_device, val)); exit(1); } break; case 'K': val = getFlagOpt(argc, argv, &i); if (!val) { fprintf(stderr, "Missing argument for -K flag\n"); dotneato_usage(1); exit(1); } v = gvlayout_select(gvc, val); if (v == NO_SUPPORT) { fprintf(stderr, "Layout type: \"%s\" not recognized. Use one of:%s\n", val, gvplugin_list(gvc, API_layout, val)); exit(1); } break; case 'V': fprintf(stderr, "%s - %s version %s (%s)\n", gvc->common.cmdname, gvc->common.info[0], gvc->common.info[1], gvc->common.info[2]); exit(0); break; case 'l': val = getFlagOpt(argc, argv, &i); if (!val) { fprintf(stderr, "Missing argument for -l flag\n"); dotneato_usage(1); } use_library(gvc, val); break; case 'o': val = getFlagOpt(argc, argv, &i); if (! gvc->common.auto_outfile_names) gvjobs_output_filename(gvc, val); break; case 'q': if (*rest) { v = atoi(rest); if (v <= 0) { fprintf(stderr, "Invalid parameter \"%s\" for -q flag - ignored\n", rest); } else if (v == 1) agseterr(AGERR); else agseterr(AGMAX); } else agseterr(AGERR); break; case 's': if (*rest) { PSinputscale = atof(rest); if (PSinputscale <= 0) { fprintf(stderr, "Invalid parameter \"%s\" for -s flag\n", rest); dotneato_usage(1); } } else PSinputscale = POINTS_PER_INCH; break; case 'x': Reduce = TRUE; break; case 'y': Y_invert = TRUE; break; case '?': dotneato_usage(0); break; default: fprintf(stderr, "%s: option -%c unrecognized\n\n", gvc->common.cmdname, c); dotneato_usage(1); } } else if (argv[i]) gvc->input_filenames[nfiles++] = argv[i]; } /* if no -Txxx, then set default format */ if (!gvc->jobs || !gvc->jobs->output_langname) { v = gvjobs_output_langname(gvc, "dot"); assert(v); /* "dot" should always be available as an output format */ } /* set persistent attributes here (if not already set from command line options) */ if (!(agfindattr(agprotograph()->proto->n, "label"))) agnodeattr(NULL, "label", NODENAME_ESC); }