44#define LOCALNAMEPREFIX '%'
58static const char none[] =
"none";
59static const char black[] =
"black";
70 if (
A[0].x <=
A[n-1].x) {
72 for (
size_t i = 0; i < n; i++) {
84 for (
size_t i = n - 1; i !=
SIZE_MAX; i--) {
108 gvprintf(job,
"\" class=\"%s", kind);
121 switch (
color.type) {
129 if (
color.u.rgba[3] == 0)
149 switch (
color.type) {
189 gvprintf(job,
"\" fill-opacity=\"%f",
194 gvputs(job,
"\" stroke=\"");
197 const double GVPRINT_DOUBLE_THRESHOLD = 0.005;
199 gvputs(job,
"\" stroke-width=\"");
209 gvprintf(job,
"\" stroke-opacity=\"%f",
227 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n");
228 if ((
s =
agget(job->
gvc->
g,
"stylesheet")) &&
s[0]) {
229 gvputs(job,
"<?xml-stylesheet href=\"");
231 gvputs(job,
"\" type=\"text/css\"?>\n");
233 gvputs(job,
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\n"
234 " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\n");
236 gvputs(job,
"<!-- Generated by ");
258 gvprintf(job,
"<svg width=\"%dpt\" height=\"%dpt\"\n",
260 gvprintf(job,
" viewBox=\"%d.00 %d.00 %d.00 %d.00\"",
272 gvputs(job,
" xmlns=\"http://www.w3.org/2000/svg\""
274 " xmlns:xlink=\"http://www.w3.org/1999/xlink\"");
312 gvputs(job,
" transform=\"scale(");
324 gvputs(job,
"</title>\n");
341 gvputs(job,
"</title>\n");
362 gvputs(job,
"</title>\n");
382 gvputs(job,
"</title>\n");
408 if (href && href[0]) {
409 gvputs(job,
" xlink:href=\"");
414 if (tooltip && tooltip[0]) {
415 gvputs(job,
" xlink:title=\"");
420 if (target && target[0]) {
421 gvputs(job,
" target=\"");
441 gvputs(job,
"<text xml:space=\"preserve\"");
442 switch (span->
just) {
444 gvputs(job,
" text-anchor=\"start\"");
447 gvputs(job,
" text-anchor=\"end\"");
451 gvputs(job,
" text-anchor=\"middle\"");
484 gvprintf(job,
" font-family=\"%s", family);
489 gvprintf(job,
" font-weight=\"%s\"", weight);
491 gvprintf(job,
" font-stretch=\"%s\"", stretch);
493 gvprintf(job,
" font-style=\"%s\"", style);
498 gvputs(job,
" font-weight=\"bold\"");
500 gvputs(job,
" font-style=\"italic\"");
503 gvputs(job,
" text-decoration=\"");
509 gvprintf(job,
"%soverline", (comma?
",":
""));
513 gvprintf(job,
"%sline-through", (comma?
",":
""));
517 gvputs(job,
" baseline-shift=\"super\"");
519 gvputs(job,
" baseline-shift=\"sub\"");
529 gvprintf(job,
" fill=\"#%02x%02x%02x\"",
540 gvputs(job,
"<textPath xlink:href=\"#");
542 gvputs(job,
"_p\" startOffset=\"50%\"><tspan x=\"0\" dy=\"");
549 gvputs(job,
"</tspan></textPath>");
555 if (fabs(offset - 0.0) < 0.0005)
556 gvputs(job,
"<stop offset=\"0\" style=\"stop-color:");
557 else if (fabs(offset - 1.0) < 0.0005)
558 gvputs(job,
"<stop offset=\"1\" style=\"stop-color:");
560 gvprintf(job,
"<stop offset=\"%.03f\" style=\"stop-color:", offset);
562 gvputs(job,
";stop-opacity:");
582 G[0].x =
G[0].y =
G[1].x =
G[1].y = 0.;
585 gvputs(job,
"<defs>\n<linearGradient id=\"");
590 gvprintf(job,
"l_%d\" gradientUnits=\"userSpaceOnUse\" ",
id);
604 gvputs(job,
"</linearGradient>\n</defs>\n");
622 ifx = round(50 * (1 + cos(angle)));
623 ify = round(50 * (1 - sin(angle)));
625 gvputs(job,
"<defs>\n<radialGradient id=\"");
630 gvprintf(job,
"r_%d\" cx=\"50%%\" cy=\"50%%\" r=\"75%%\" "
631 "fx=\"%.0f%%\" fy=\"%.0f%%\">\n",
637 gvputs(job,
"</radialGradient>\n</defs>\n");
695 gvputs(job,
" points=\"");
696 for (
size_t i = 0; i < n; i++) {
712 gvputs(job,
" points=\"");
713 for (
size_t i = 0; i < n; i++) {
727 "aliceblue",
"antiquewhite",
"aqua",
"aquamarine",
"azure",
728 "beige",
"bisque",
"black",
"blanchedalmond",
"blue",
729 "blueviolet",
"brown",
"burlywood",
730 "cadetblue",
"chartreuse",
"chocolate",
"coral",
731 "cornflowerblue",
"cornsilk",
"crimson",
"cyan",
732 "darkblue",
"darkcyan",
"darkgoldenrod",
"darkgray",
733 "darkgreen",
"darkgrey",
"darkkhaki",
"darkmagenta",
734 "darkolivegreen",
"darkorange",
"darkorchid",
"darkred",
735 "darksalmon",
"darkseagreen",
"darkslateblue",
"darkslategray",
736 "darkslategrey",
"darkturquoise",
"darkviolet",
"deeppink",
737 "deepskyblue",
"dimgray",
"dimgrey",
"dodgerblue",
738 "firebrick",
"floralwhite",
"forestgreen",
"fuchsia",
739 "gainsboro",
"ghostwhite",
"gold",
"goldenrod",
"gray",
740 "green",
"greenyellow",
"grey",
741 "honeydew",
"hotpink",
"indianred",
742 "indigo",
"ivory",
"khaki",
743 "lavender",
"lavenderblush",
"lawngreen",
"lemonchiffon",
744 "lightblue",
"lightcoral",
"lightcyan",
"lightgoldenrodyellow",
745 "lightgray",
"lightgreen",
"lightgrey",
"lightpink",
746 "lightsalmon",
"lightseagreen",
"lightskyblue",
747 "lightslategray",
"lightslategrey",
"lightsteelblue",
748 "lightyellow",
"lime",
"limegreen",
"linen",
749 "magenta",
"maroon",
"mediumaquamarine",
"mediumblue",
750 "mediumorchid",
"mediumpurple",
"mediumseagreen",
751 "mediumslateblue",
"mediumspringgreen",
"mediumturquoise",
752 "mediumvioletred",
"midnightblue",
"mintcream",
753 "mistyrose",
"moccasin",
754 "navajowhite",
"navy",
"oldlace",
755 "olive",
"olivedrab",
"orange",
"orangered",
"orchid",
756 "palegoldenrod",
"palegreen",
"paleturquoise",
757 "palevioletred",
"papayawhip",
"peachpuff",
"peru",
"pink",
758 "plum",
"powderblue",
"purple",
759 "red",
"rosybrown",
"royalblue",
760 "saddlebrown",
"salmon",
"sandybrown",
"seagreen",
"seashell",
761 "sienna",
"silver",
"skyblue",
"slateblue",
"slategray",
762 "slategrey",
"snow",
"springgreen",
"steelblue",
763 "tan",
"teal",
"thistle",
"tomato",
"transparent",
"turquoise",
765 "wheat",
"white",
"whitesmoke",
766 "yellow",
"yellowgreen"
Dynamically expanding string buffers.
void get_gradient_points(pointf *A, pointf *G, size_t n, double angle, int flags)
char * agget(void *obj, char *name)
char * agnameof(void *)
returns a string descriptor for the object.
#define GVDEVICE_COMPRESSED_FORMAT
#define GVRENDER_DOES_TOOLTIPS
#define GVRENDER_DOES_LABELS
#define GVDEVICE_DOES_LAYERS
#define GVDEVICE_DOES_TRUECOLOR
#define GVDEVICE_BINARY_FORMAT
#define GVRENDER_DOES_MAPS
#define GVRENDER_DOES_TARGETS
#define GVRENDER_DOES_TRANSFORM
#define GVRENDER_Y_GOES_DOWN
static void color(Agraph_t *g)
size_t gvwrite(GVJ_t *job, const char *s, size_t len)
int gvputc(GVJ_t *job, int c)
int gvputs_xml(GVJ_t *job, const char *s)
int gvputs(GVJ_t *job, const char *s)
void gvprintf(GVJ_t *job, const char *format,...)
void gvprintdouble(GVJ_t *job, double num)
static UNUSED gvdevice_features_t device_features_svgz
static const char transparent[]
static void svg_textspan(GVJ_t *job, pointf p, textspan_t *span)
static int svg_gradstyle(GVJ_t *job, pointf *A, size_t n)
static void svg_end_page(GVJ_t *job)
static void svg_begin_node(GVJ_t *job)
static void svg_print_paint(GVJ_t *job, gvcolor_t color)
static void svg_grstyle(GVJ_t *job, int filled, int gid)
static bool emit_standalone_headers(const GVJ_t *job)
static gvrender_features_t render_features_svg
static const char sdasharray[]
static void svg_print_gradient_color(GVJ_t *job, gvcolor_t color)
static gvdevice_features_t device_features_svg
static void svg_end_cluster(GVJ_t *job)
static void svg_end_node(GVJ_t *job)
static void svg_begin_cluster(GVJ_t *job)
static void svg_polyline(GVJ_t *job, pointf *A, size_t n)
static void svg_bezier(GVJ_t *job, pointf *A, size_t n, int filled)
static void svg_comment(GVJ_t *job, char *str)
static int gvputs_wrapper(void *state, const char *s)
wrap gvputs to offer a void * first parameter
static void svg_end_edge(GVJ_t *job)
static gvrender_engine_t svg_engine
gvplugin_installed_t gvdevice_svg_types[]
static char * svg_knowncolors[]
static void svg_begin_page(GVJ_t *job)
static void svg_bzptarray(GVJ_t *job, pointf *A, size_t n)
static const char sdotarray[]
static void svg_end_anchor(GVJ_t *job)
static void svg_polygon(GVJ_t *job, pointf *A, size_t n, int filled)
static void svg_end_layer(GVJ_t *job)
static void svg_print_id_class(GVJ_t *job, char *id, char *idx, char *kind, void *obj)
static void svg_begin_layer(GVJ_t *job, char *layername, int layerNum, int numLayers)
static void svg_begin_anchor(GVJ_t *job, char *href, char *tooltip, char *target, char *id)
static void svg_begin_edge(GVJ_t *job)
static void svg_begin_graph(GVJ_t *job)
static void svg_ellipse(GVJ_t *job, pointf *A, int filled)
static void svg_begin_job(GVJ_t *job)
gvplugin_installed_t gvrender_svg_types[]
static const char black[]
static void svg_end_graph(GVJ_t *job)
static int svg_rgradstyle(GVJ_t *job)
static void svg_print_stop(GVJ_t *job, double offset, gvcolor_t color)
textitem scanner parser str
char * strdup_and_subst_obj(char *str, void *obj)
Processes graph object escape sequences; also collapses \ to .
platform abstraction for case-insensitive string functions
gvplugin_active_render_t render
unsigned labeledgealigned
PostscriptAlias * postscript_alias
double yoffset_centerline
options to tweak the behavior of XML escaping
unsigned raw
assume no embedded escapes, and escape "\n" and "\r"
abstraction for squashing compiler warnings for unused symbols
int gv_xml_escape(const char *s, xml_flags_t flags, int(*cb)(void *state, const char *s), void *state)
XML escaping functionality.