47 #define WIDTH_NORMAL 1
50 #define DIA_RESOLUTION 1.0
51 #define SCALE (DIA_RESOLUTION/15.0)
57 static int onetime =
TRUE;
69 #define SVG_COLORS_P 0
71 static int dia_comparestr(
const void *
s1,
const void *s2)
73 return strcmp(*(
char **) s1, *(
char **) s2);
76 static char *dia_resolve_color(
char *name)
80 static char *svg_known_colors[] = {
81 "aliceblue",
"antiquewhite",
"aqua",
"aquamarine",
"azure",
82 "beige",
"bisque",
"black",
"blanchedalmond",
"blue",
83 "blueviolet",
"brown",
"burlywood",
84 "cadetblue",
"chartreuse",
"chocolate",
"coral",
85 "cornflowerblue",
"cornsilk",
"crimson",
"cyan",
86 "darkblue",
"darkcyan",
"darkgoldenrod",
"darkgray",
87 "darkgreen",
"darkgrey",
"darkkhaki",
"darkmagenta",
88 "darkolivegreen",
"darkorange",
"darkorchid",
"darkred",
89 "darksalmon",
"darkseagreen",
"darkslateblue",
"darkslategray",
90 "darkslategrey",
"darkturquoise",
"darkviolet",
"deeppink",
91 "deepskyblue",
"dimgray",
"dimgrey",
"dodgerblue",
92 "firebrick",
"floralwhite",
"forestgreen",
"fuchsia",
93 "gainsboro",
"ghostwhite",
"gold",
"goldenrod",
"gray",
94 "green",
"greenyellow",
"grey",
95 "honeydew",
"hotpink",
"indianred",
96 "indigo",
"ivory",
"khaki",
97 "lavender",
"lavenderblush",
"lawngreen",
"lemonchiffon",
98 "lightblue",
"lightcoral",
"lightcyan",
"lightgoldenrodyellow",
99 "lightgray",
"lightgreen",
"lightgrey",
"lightpink",
100 "lightsalmon",
"lightseagreen",
"lightskyblue",
101 "lightslategray",
"lightslategrey",
"lightsteelblue",
102 "lightyellow",
"lime",
"limegreen",
"linen",
103 "magenta",
"maroon",
"mediumaquamarine",
"mediumblue",
104 "mediumorchid",
"mediumpurple",
"mediumseagreen",
105 "mediumslateblue",
"mediumspringgreen",
"mediumturquoise",
106 "mediumvioletred",
"midnightblue",
"mintcream",
107 "mistyrose",
"moccasin",
108 "navajowhite",
"navy",
"oldlace",
109 "olive",
"olivedrab",
"orange",
"orangered",
"orchid",
110 "palegoldenrod",
"palegreen",
"paleturquoise",
111 "palevioletred",
"papayawhip",
"peachpuff",
"peru",
"pink",
112 "plum",
"powderblue",
"purple",
113 "red",
"rosybrown",
"royalblue",
114 "saddlebrown",
"salmon",
"sandybrown",
"seagreen",
"seashell",
115 "sienna",
"silver",
"skyblue",
"slateblue",
"slategray",
116 "slategrey",
"snow",
"springgreen",
"steelblue",
117 "tan",
"teal",
"thistle",
"tomato",
"turquoise",
119 "wheat",
"white",
"whitesmoke",
120 "yellow",
"yellowgreen",
130 sizeof(svg_known_colors) /
sizeof(
char *),
131 sizeof(
char *), dia_comparestr) ==
NULL)) {
133 if (
streq(tok,
"transparent")) {
137 sprintf(buf,
"#%02x%02x%02x",
146 static void dia_reset(
void)
152 static void init_dia(
void)
170 rv.
x = PB.
LL.
x + p.
x * Scale + Offset.
x;
171 rv.
y = PB.
UR.
y - 1 - p.
y * Scale - Offset.
y;
173 rv.
x = PB.
UR.
x - 1 - p.
y * Scale - Offset.
x;
174 rv.
y = PB.
UR.
y - 1 - p.
x * Scale - Offset.
y;
182 gvputs(job,
" <dia:attribute name=\"border_color\">\n");
183 gvprintf(job,
" <dia:color val=\"%s\"/>\n",
185 gvputs(job,
" </dia:attribute>\n");
188 gvputs(job,
" <dia:attribute name=\"line_width\">\n");
189 gvprintf(job,
" <dia:real val=\"%g\"/>\n",
191 gvputs(job,
" </dia:attribute>\n");
194 gvputs(job,
" <dia:attribute name=\"line_style\">\n");
195 gvprintf(job,
" <dia:real val=\"%d\"/>\n", 1);
196 gvputs(job,
" </dia:attribute>\n");
199 gvprintf(job,
"stroke-dasharray:%s;", sdotarray);
204 static void dia_stylefill(
GVJ_t * job,
context_t * cp,
int filled)
207 gvputs(job,
" <dia:attribute name=\"inner_color\">\n");
208 gvprintf(job,
" <dia:color val=\"%s\"/>\n",
210 gvputs(job,
" </dia:attribute>\n");
212 gvputs(job,
" <dia:attribute name=\"show_background\">\n");
213 gvprintf(job,
" <dia:boolean val=\"%s\"/>\n",
"true");
214 gvputs(job,
" </dia:attribute>\n");
218 static void dia_comment(
GVJ_t * job,
char *
str)
226 dia_begin_job(
GVJ_t *job)
228 gvprintf(job,
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
231 static void dia_end_job(
GVJ_t *job)
235 static void dia_begin_graph(
GVJ_t * job)
237 gvprintf(job,
"<dia:diagram xmlns:dia=\"http://www.lysator.liu.se/~alla/dia/\">\n");
250 gvputs(job,
" <dia:diagramdata>\n");
252 gvputs(job,
" <dia:attribute name=\"background\">\n");
253 gvputs(job,
" <dia:color val=\"#ffffff\"/>\n");
254 gvputs(job,
" </dia:attribute>\n");
256 gvputs(job,
" <dia:attribute name=\"paper\">\n");
257 gvputs(job,
" <dia:composite type=\"paper\">\n");
258 gvputs(job,
" <dia:attribute name=\"name\">\n");
259 gvputs(job,
" <dia:string>#A4#</dia:string>\n");
260 gvputs(job,
" </dia:attribute>\n");
261 gvputs(job,
" <dia:attribute name=\"tmargin\">\n");
262 gvputs(job,
" <dia:real val=\"2.8222\"/>\n");
263 gvputs(job,
" </dia:attribute>\n");
264 gvputs(job,
" <dia:attribute name=\"bmargin\">\n");
265 gvputs(job,
" <dia:real val=\"2.8222\"/>\n");
266 gvputs(job,
" </dia:attribute>\n");
267 gvputs(job,
" <dia:attribute name=\"lmargin\">\n");
268 gvputs(job,
" <dia:real val=\"2.8222\"/>\n");
269 gvputs(job,
" </dia:attribute>\n");
270 gvputs(job,
" <dia:attribute name=\"rmargin\">\n");
271 gvputs(job,
" <dia:real val=\"2.8222\"/>\n");
272 gvputs(job,
" </dia:attribute>\n");
273 gvputs(job,
" <dia:attribute name=\"is_portrait\">\n");
274 gvputs(job,
" <dia:boolean val=\"true\"/>\n");
275 gvputs(job,
" </dia:attribute>\n");
276 gvputs(job,
" <dia:attribute name=\"scaling\">\n");
277 gvputs(job,
" <dia:real val=\"1\"/>\n");
278 gvputs(job,
" </dia:attribute>\n");
279 gvputs(job,
" <dia:attribute name=\"fitto\">\n");
280 gvputs(job,
" <dia:boolean val=\"false\"/>\n");
281 gvputs(job,
" </dia:attribute>\n");
282 gvputs(job,
" </dia:composite>\n");
283 gvputs(job,
" </dia:attribute>\n");
285 gvputs(job,
" <dia:attribute name=\"grid\">\n");
286 gvputs(job,
" <dia:composite type=\"grid\">\n");
287 gvputs(job,
" <dia:attribute name=\"width_x\">\n");
288 gvputs(job,
" <dia:real val=\"1\"/>\n");
289 gvputs(job,
" </dia:attribute>\n");
290 gvputs(job,
" <dia:attribute name=\"width_y\">\n");
291 gvputs(job,
" <dia:real val=\"1\"/>\n");
292 gvputs(job,
" </dia:attribute>\n");
293 gvputs(job,
" <dia:attribute name=\"visible_x\">\n");
294 gvputs(job,
" <dia:int val=\"1\"/>\n");
295 gvputs(job,
" </dia:attribute>\n");
296 gvputs(job,
" <dia:attribute name=\"visible_y\">\n");
297 gvputs(job,
" <dia:int val=\"1\"/>\n");
298 gvputs(job,
" </dia:attribute>\n");
299 gvputs(job,
" </dia:composite>\n");
300 gvputs(job,
" </dia:attribute>\n");
302 gvputs(job,
" <dia:attribute name=\"guides\">\n");
303 gvputs(job,
" <dia:composite type=\"guides\">\n");
304 gvputs(job,
" <dia:attribute name=\"hguides\"/>\n");
305 gvputs(job,
" <dia:attribute name=\"vguides\"/>\n");
306 gvputs(job,
" </dia:composite>\n");
307 gvputs(job,
" </dia:attribute>\n");
309 gvputs(job,
" </dia:diagramdata>\n");
312 static void dia_end_graph(
GVJ_t * job)
318 dia_begin_page(
GVJ_t * job)
320 gvprintf(job,
" <dia:layer name=\"Background\" visible=\"true\">\n");
323 static void dia_end_page(
GVJ_t * job)
325 gvputs(job,
" </dia:layer>\n");
328 static void dia_begin_cluster(
GVJ_t * job)
335 static void dia_end_cluster(
GVJ_t * job)
340 static void dia_begin_node(
GVJ_t * job)
345 static void dia_end_node(
GVJ_t * job)
350 static void dia_begin_edge(
GVJ_t * job)
355 static void dia_end_edge(
GVJ_t * job)
360 static void dia_begin_context(
void)
363 cstk[SP + 1] = cstk[SP];
367 static void dia_end_context(
void)
375 static void dia_set_font(
char *name,
double size)
387 static void dia_set_pencolor(
char *name)
392 static void dia_set_fillcolor(
char *name)
397 static void dia_set_style(
char **
s)
404 while ((p = line = *s++)) {
405 if (
streq(line,
"solid"))
407 else if (
streq(line,
"dashed"))
409 else if (
streq(line,
"dotted"))
415 else if (
streq(line,
"setlinewidth")) {
420 }
else if (
streq(line,
"filled"))
422 else if (
streq(line,
"unfilled"))
425 agwarn(
"dia_set_style: unsupported style %s - ignoring\n",
442 switch (span->
just) {
478 gvprintf(job,
" font-family=\"%s", family);
481 if (weight)
gvprintf(job,
" font-weight=\"%s\"", weight);
482 if (stretch)
gvprintf(job,
" font-stretch=\"%s\"", stretch);
483 if (style)
gvprintf(job,
" font-style=\"%s\"", style);
487 family = span->fontname;
488 size = span->fontsize;
497 gvprintf(job,
" fill=\"#%02x%02x%02x\"",
506 " <dia:object type=\"Standard - Text\" version=\"0\" id=\"%s\">\n",
508 gvputs(job,
" <dia:attribute name=\"text\">\n");
509 gvputs(job,
" <dia:composite type=\"text\">\n");
510 gvputs(job,
" <dia:attribute name=\"string\">\n");
511 gvputs(job,
" <dia:string>#");
513 gvputs(job,
"#</dia:string>\n");
514 gvputs(job,
" </dia:attribute>\n");
515 gvputs(job,
" <dia:attribute name=\"font\">\n");
516 gvprintf(job,
" <dia:font name=\"%s\"/>\n", family);
517 gvputs(job,
" </dia:attribute>\n");
518 gvputs(job,
" <dia:attribute name=\"height\">\n");
519 gvprintf(job,
" <dia:real val=\"%g\"/>\n", size);
520 gvputs(job,
" </dia:attribute>\n");
521 gvputs(job,
" <dia:attribute name=\"pos\">\n");
522 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", p.
x, p.
y);
523 gvputs(job,
" </dia:attribute>\n");
524 gvputs(job,
" <dia:attribute name=\"color\">\n");
526 gvprintf(job,
" <dia:color val=\"%s\"/>\n",
529 gvprintf(job,
" <dia:color val=\"%s\"/>\n",
532 gvputs(job,
" </dia:attribute>\n");
533 gvputs(job,
" <dia:attribute name=\"alignment\">\n");
534 gvprintf(job,
" <dia:enum val=\"%d\"/>\n", anchor);
535 gvputs(job,
" </dia:attribute>\n");
536 gvputs(job,
" </dia:composite>\n");
537 gvputs(job,
" </dia:attribute>\n");
538 gvputs(job,
" <dia:attribute name=\"obj_pos\">\n");
539 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", p.
x, p.
y);
540 gvputs(job,
" </dia:attribute>\n");
542 gvputs(job,
" <dia:attribute name=\"obj_bb\">\n");
543 gvprintf(job,
" <dia:rectangle val=\"%g,%g;%g,%g\"/>\n",
544 p.
x - (Scale * (span->
size.
x) / 2.), p.
y - 0.4,
545 p.
x + (Scale * (span->
size.
x) / 2.), p.
y + 0.4);
546 gvputs(job,
" </dia:attribute>\n");
548 gvputs(job,
" </dia:object>\n");
551 static void dia_ellipse(
GVJ_t * job,
pointf *A,
int filled)
559 nodeId = Curnode->id;
566 if (cstk[SP].pen ==
P_NONE) {
582 " <dia:object type=\"Standard - Ellipse\" version=\"0\" id=\"%d\">\n",
584 gvputs(job,
" <dia:attribute name=\"elem_corner\">\n");
585 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", cp.
x - rp.
x,
587 gvputs(job,
" </dia:attribute>\n");
588 gvputs(job,
" <dia:attribute name=\"elem_width\">\n");
589 gvprintf(job,
" <dia:real val=\"%g\"/>\n", rp.
x + rp.
x);
590 gvputs(job,
" </dia:attribute>\n");
591 gvputs(job,
" <dia:attribute name=\"elem_height\">\n");
592 gvprintf(job,
" <dia:real val=\"%g\"/>\n", rp.
y + rp.
y);
593 gvputs(job,
" </dia:attribute>\n");
594 gvputs(job,
" <dia:attribute name=\"obj_pos\">\n");
595 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", cp.
x - rp.
x,
597 gvputs(job,
" </dia:attribute>\n");
598 gvputs(job,
" <dia:attribute name=\"obj_bb\">\n");
599 gvprintf(job,
" <dia:rectangle val=\"%g,%g;%g,%g\"/>\n",
600 cp.
x - rp.
x - .11, cp.
y - rp.
y - .11, cp.
x + rp.
x + .11,
602 gvputs(job,
" </dia:attribute>\n");
603 dia_style(job, &cstk[SP]);
604 dia_stylefill(job, &cstk[SP], filled);
605 gvputs(job,
" </dia:object>\n");
619 }
else if (cp.
y == p.
y) {
624 }
else if (cp.
x < p.
x) {
629 }
else if (cp.
x > p.
x) {
644 int i = 0, j, sides, conn = 0, peripheries, z;
645 double xsize, ysize, mindist2 = 0.0,
dist2;
656 if (A_size < sides) {
658 A = malloc(A_size*
sizeof(
pointf));
664 for (j = 0; j < peripheries; j++) {
665 for (i = 0; i < sides; i++) {
666 P = vertices[i + j * sides];
670 A[i].
x =
ROUND(P.
x * xsize) / 16;
671 A[i].
y =
ROUND(P.
y * ysize) / 16;
673 A[i].
x += ND_coord_i(n).x;
674 A[i].
y += ND_coord_i(n).y;
686 if (
dist2 < mindist2) {
695 P.
x = (dia_pt(A[z]).
x + dia_pt(A[z + 1]).
x) / 2;
696 P.
y = (dia_pt(A[z]).
y + dia_pt(A[z + 1]).
y) / 2;
698 if (
dist2 < mindist2) {
710 dia_bezier(
GVJ_t *job,
pointf * A,
int n,
int arrow_at_start,
int arrow_at_end,
int filled)
713 int i, conn_h, conn_t;
714 pointf p, firstp = { 0, 0 }, llp = {
721 if (cstk[SP].pen ==
P_NONE) {
727 " <dia:object type=\"Standard - BezierLine\" version=\"0\" id=\"%s\">\n",
729 gvputs(job,
" <dia:attribute name=\"bez_points\">\n");
730 for (i = 0; i < n; i++) {
733 llp = urp = firstp = p;
734 if (p.
x < llp.x || p.
y < llp.y)
736 if (p.
x > urp.x || p.
y > urp.y)
738 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", p.
x, p.
y);
740 gvputs(job,
" </dia:attribute>\n");
741 dia_style(job, &cstk[SP]);
742 gvputs(job,
" <dia:attribute name=\"obj_pos\">\n");
743 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", firstp.
x, firstp.
y);
744 gvputs(job,
" </dia:attribute>\n");
745 gvputs(job,
" <dia:attribute name=\"obj_bb\">\n");
746 gvprintf(job,
" <dia:rectangle val=\"%g,%g;%g,%g\"/>\n",
747 llp.x - .11, llp.y - .11, urp.x + .11, urp.y + .11);
748 gvputs(job,
" </dia:attribute>\n");
749 if (!Curedge)
return;
751 conn_h = conn_t = -1;
753 head = Curedge->head;
754 tail = Curedge->tail;
759 if (arrow_at_start) {
760 gvputs(job,
" <dia:attribute name=\"start_arrow\">\n");
761 gvputs(job,
" <dia:enum val=\"3\"/>\n");
762 gvputs(job,
" </dia:attribute>\n");
763 gvputs(job,
" <dia:attribute name=\"start_arrow_length\">\n");
764 gvputs(job,
" <dia:real val=\"0.8\"/>\n");
765 gvputs(job,
" </dia:attribute>\n");
767 (
" <dia:attribute name=\"start_arrow_width\">\n");
768 gvputs(job,
" <dia:real val=\"0.8\"/>\n");
769 gvputs(job,
" </dia:attribute>\n");
772 gvputs(job,
" <dia:attribute name=\"end_arrow\">\n");
773 gvputs(job,
" <dia:enum val=\"3\"/>\n");
774 gvputs(job,
" </dia:attribute>\n");
775 gvputs(job,
" <dia:attribute name=\"end_arrow_length\">\n");
776 gvputs(job,
" <dia:real val=\"0.8\"/>\n");
777 gvputs(job,
" </dia:attribute>\n");
779 (
" <dia:attribute name=\"end_arrow_width\">\n");
780 gvputs(job,
" <dia:real val=\"0.8\"/>\n");
781 gvputs(job,
" </dia:attribute>\n");
784 gvputs(job,
" <dia:attribute name=\"conn_endpoints\">\n");
785 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", dia_pt(A[0]).x,
787 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", dia_pt(A[n - 1]).x,
789 gvputs(job,
" </dia:attribute>\n");
790 gvputs(job,
" <dia:connections>\n");
792 if ((strcmp(shape_t,
"ellipse") == 0)
793 || (strcmp(shape_t,
"circle") == 0)
794 || (strcmp(shape_t,
"doublecircle") == 0)) {
795 cp_h = dia_pt(ND_coord_i(head));
796 if (AG_IS_DIRECTED(Rootgraph))
801 if (AG_IS_DIRECTED(Rootgraph))
807 if ((strcmp(shape_t,
"ellipse") == 0)
808 || (strcmp(shape_t,
"circle") == 0)
809 || (strcmp(shape_t,
"doublecircle") == 0)) {
810 cp_t = dia_pt(ND_coord_i(tail));
811 if (AG_IS_DIRECTED(Rootgraph))
816 if (AG_IS_DIRECTED(Rootgraph))
822 if (arrow_at_start) {
824 " <dia:connection handle=\"0\" to=\"%d\" connection=\"%d\"/>\n",
827 " <dia:connection handle=\"%d\" to=\"%d\" connection=\"%d\"/>\n",
828 (n - 1), tail->id, conn_t);
831 " <dia:connection handle=\"0\" to=\"%d\" connection=\"%d\"/>\n",
834 " <dia:connection handle=\"%d\" to=\"%d\" connection=\"%d\"/>\n",
835 (n - 1), head->id, conn_h);
838 gvputs(job,
" </dia:connections>\n");
839 gvputs(job,
" </dia:object>\n");
845 static void dia_polygon(
GVJ_t * job,
pointf * A,
int n,
int filled)
849 pointf p, firstp = { 0, 0 }, llp = {
853 if (cstk[SP].pen ==
P_NONE) {
861 " <dia:object type=\"Standard - Polygon\" version=\"0\" id=\"%d\">\n",
869 " <dia:object type=\"Standard - Polygon\" version=\"0\" id=\"%s\">\n",
874 " <dia:object type=\"Standard - Polygon\" version=\"0\" id=\"%s\">\n",
878 gvputs(job,
" <dia:attribute name=\"poly_points\">\n");
879 for (i = 0; i < n; i++) {
882 llp = urp = firstp = p;
883 if (p.
x < llp.x || p.
y < llp.y)
885 if (p.
x > urp.x || p.
y > urp.y)
887 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", p.
x, p.
y);
889 gvputs(job,
" </dia:attribute>\n");
890 gvputs(job,
" <dia:attribute name=\"obj_pos\">\n");
891 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", firstp.
x, firstp.
y);
892 gvputs(job,
" </dia:attribute>\n");
893 gvputs(job,
" <dia:attribute name=\"obj_bb\">\n");
894 gvprintf(job,
" <dia:rectangle val=\"%g,%g;%g,%g\"/>\n",
895 llp.x - .11, llp.y - .11, urp.x + .11, urp.y + .11);
896 gvputs(job,
" </dia:attribute>\n");
897 dia_style(job, &cstk[SP]);
898 dia_stylefill(job, &cstk[SP], filled);
899 gvputs(job,
" </dia:object>\n");
903 static void dia_polyline(
GVJ_t * job,
pointf * A,
int n)
907 pointf p, firstp = { 0, 0 }, llp = {
911 if (cstk[SP].pen ==
P_NONE) {
916 " <dia:object type=\"Standard - PolyLine\" version=\"0\" id=\"%s\">\n",
918 gvputs(job,
" <dia:attribute name=\"poly_points\">\n");
919 for (i = 0; i < n; i++) {
922 llp = urp = firstp = p;
923 if (p.
x < llp.x || p.
y < llp.y)
925 if (p.
x > urp.x || p.
y > urp.y)
927 gvprintf(job,
"<dia:point val=\"%g,%g\"/>\n", p.
x, p.
y);
929 gvputs(job,
" </dia:attribute>\n");
930 dia_style(job, &cstk[SP]);
931 gvputs(job,
" <dia:attribute name=\"obj_pos\">\n");
932 gvprintf(job,
" <dia:point val=\"%g,%g\"/>\n", firstp.
x, firstp.
y);
933 gvputs(job,
" </dia:attribute>\n");
934 gvputs(job,
" <dia:attribute name=\"obj_bb\">\n");
935 gvprintf(job,
" <dia:rectangle val=\"%g,%g;%g,%g\"/>\n",
936 llp.x - .11, llp.y - .11, urp.x + .11, urp.y + .11);
937 gvputs(job,
" </dia:attribute>\n");
938 gvputs(job,
" </dia:object>\n");
943 dia_begin_job, dia_end_job,
944 dia_begin_graph, dia_end_graph,
946 dia_begin_page, dia_end_page,
947 dia_begin_cluster, dia_end_cluster,
950 dia_begin_node, dia_end_node,
951 dia_begin_edge, dia_end_edge,
954 dia_textspan, dia_resolve_color,
955 dia_ellipse, dia_polygon,
956 dia_bezier, dia_polyline,
void s1(graph_t *, node_t *)
#define GVDEVICE_BINARY_FORMAT
int gvputs(GVJ_t *job, const char *s)
struct context_t context_t
int box_connection(node_t *n, pointf p)
gvplugin_installed_t gvrender_dia_types[]
char * xml_string(char *s)
gvplugin_installed_t gvdevice_dia_types[]
double yoffset_centerline
PostscriptAlias * postscript_alias
int ellipse_connection(pointf cp, pointf p)
COORD dist2(Ppoint_t, Ppoint_t)
if(aagss+aagstacksize-1<=aagssp)
int strcasecmp(const char *s1, const char *s2)
gvrender_engine_t dia_engine
#define GVDEVICE_COMPRESSED_FORMAT
void gvprintf(GVJ_t *job, const char *format,...)