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 ");
259 gvprintf(job,
"<svg width=\"%dpt\" height=\"%dpt\"\n",
261 gvprintf(job,
" viewBox=\"%d.00 %d.00 %d.00 %d.00\"",
273 gvputs(job,
" xmlns=\"http://www.w3.org/2000/svg\""
275 " xmlns:xlink=\"http://www.w3.org/1999/xlink\"");
277 if ((svgid =
agget(obj->
u.
g,
"svgid")) && svgid[0]) {
318 gvputs(job,
" transform=\"scale(");
330 gvputs(job,
"</title>\n");
347 gvputs(job,
"</title>\n");
368 gvputs(job,
"</title>\n");
388 gvputs(job,
"</title>\n");
414 if (href && href[0]) {
415 gvputs(job,
" xlink:href=\"");
420 if (tooltip && tooltip[0]) {
421 gvputs(job,
" xlink:title=\"");
426 if (target && target[0]) {
427 gvputs(job,
" target=\"");
447 gvputs(job,
"<text xml:space=\"preserve\"");
448 switch (span->
just) {
450 gvputs(job,
" text-anchor=\"start\"");
453 gvputs(job,
" text-anchor=\"end\"");
457 gvputs(job,
" text-anchor=\"middle\"");
490 gvprintf(job,
" font-family=\"%s", family);
495 gvprintf(job,
" font-weight=\"%s\"", weight);
497 gvprintf(job,
" font-stretch=\"%s\"", stretch);
499 gvprintf(job,
" font-style=\"%s\"", style);
504 gvputs(job,
" font-weight=\"bold\"");
506 gvputs(job,
" font-style=\"italic\"");
509 gvputs(job,
" text-decoration=\"");
515 gvprintf(job,
"%soverline", (comma?
",":
""));
519 gvprintf(job,
"%sline-through", (comma?
",":
""));
523 gvputs(job,
" baseline-shift=\"super\"");
525 gvputs(job,
" baseline-shift=\"sub\"");
535 gvprintf(job,
" fill=\"#%02x%02x%02x\"",
546 gvputs(job,
"<textPath xlink:href=\"#");
548 gvputs(job,
"_p\" startOffset=\"50%\"><tspan x=\"0\" dy=\"");
555 gvputs(job,
"</tspan></textPath>");
561 if (fabs(offset - 0.0) < 0.0005)
562 gvputs(job,
"<stop offset=\"0\" style=\"stop-color:");
563 else if (fabs(offset - 1.0) < 0.0005)
564 gvputs(job,
"<stop offset=\"1\" style=\"stop-color:");
566 gvprintf(job,
"<stop offset=\"%.03f\" style=\"stop-color:", offset);
568 gvputs(job,
";stop-opacity:");
588 G[0].x =
G[0].y =
G[1].x =
G[1].y = 0.;
591 gvputs(job,
"<defs>\n<linearGradient id=\"");
596 gvprintf(job,
"l_%d\" gradientUnits=\"userSpaceOnUse\" ",
id);
610 gvputs(job,
"</linearGradient>\n</defs>\n");
628 ifx = round(50 * (1 + cos(angle)));
629 ify = round(50 * (1 - sin(angle)));
631 gvputs(job,
"<defs>\n<radialGradient id=\"");
636 gvprintf(job,
"r_%d\" cx=\"50%%\" cy=\"50%%\" r=\"75%%\" "
637 "fx=\"%.0f%%\" fy=\"%.0f%%\">\n",
643 gvputs(job,
"</radialGradient>\n</defs>\n");
701 gvputs(job,
" points=\"");
702 for (
size_t i = 0; i < n; i++) {
718 gvputs(job,
" points=\"");
719 for (
size_t i = 0; i < n; i++) {
733 "aliceblue",
"antiquewhite",
"aqua",
"aquamarine",
"azure",
734 "beige",
"bisque",
"black",
"blanchedalmond",
"blue",
735 "blueviolet",
"brown",
"burlywood",
736 "cadetblue",
"chartreuse",
"chocolate",
"coral",
737 "cornflowerblue",
"cornsilk",
"crimson",
"cyan",
738 "darkblue",
"darkcyan",
"darkgoldenrod",
"darkgray",
739 "darkgreen",
"darkgrey",
"darkkhaki",
"darkmagenta",
740 "darkolivegreen",
"darkorange",
"darkorchid",
"darkred",
741 "darksalmon",
"darkseagreen",
"darkslateblue",
"darkslategray",
742 "darkslategrey",
"darkturquoise",
"darkviolet",
"deeppink",
743 "deepskyblue",
"dimgray",
"dimgrey",
"dodgerblue",
744 "firebrick",
"floralwhite",
"forestgreen",
"fuchsia",
745 "gainsboro",
"ghostwhite",
"gold",
"goldenrod",
"gray",
746 "green",
"greenyellow",
"grey",
747 "honeydew",
"hotpink",
"indianred",
748 "indigo",
"ivory",
"khaki",
749 "lavender",
"lavenderblush",
"lawngreen",
"lemonchiffon",
750 "lightblue",
"lightcoral",
"lightcyan",
"lightgoldenrodyellow",
751 "lightgray",
"lightgreen",
"lightgrey",
"lightpink",
752 "lightsalmon",
"lightseagreen",
"lightskyblue",
753 "lightslategray",
"lightslategrey",
"lightsteelblue",
754 "lightyellow",
"lime",
"limegreen",
"linen",
755 "magenta",
"maroon",
"mediumaquamarine",
"mediumblue",
756 "mediumorchid",
"mediumpurple",
"mediumseagreen",
757 "mediumslateblue",
"mediumspringgreen",
"mediumturquoise",
758 "mediumvioletred",
"midnightblue",
"mintcream",
759 "mistyrose",
"moccasin",
760 "navajowhite",
"navy",
"oldlace",
761 "olive",
"olivedrab",
"orange",
"orangered",
"orchid",
762 "palegoldenrod",
"palegreen",
"paleturquoise",
763 "palevioletred",
"papayawhip",
"peachpuff",
"peru",
"pink",
764 "plum",
"powderblue",
"purple",
765 "red",
"rosybrown",
"royalblue",
766 "saddlebrown",
"salmon",
"sandybrown",
"seagreen",
"seashell",
767 "sienna",
"silver",
"skyblue",
"slateblue",
"slategray",
768 "slategrey",
"snow",
"springgreen",
"steelblue",
769 "tan",
"teal",
"thistle",
"tomato",
"transparent",
"turquoise",
771 "wheat",
"white",
"whitesmoke",
772 "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.