X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fsn-svg.c;fp=src%2Fsn-svg.c;h=d3da59ca002d24080a0e01cb7e827934fa93c6bf;hb=9f77fbe43254d5920b3b1fac1ab0c01cc3a3adcc;hp=c69c59d5e66b8d37facbf15b7476c2221399fdfd;hpb=3db97a65c34df1d0e9c2abf08f7c5ae2e853004f;p=sort-networks.git diff --git a/src/sn-svg.c b/src/sn-svg.c index c69c59d..d3da59c 100644 --- a/src/sn-svg.c +++ b/src/sn-svg.c @@ -24,6 +24,7 @@ #include #include #include +#include #include "sn_network.h" @@ -35,8 +36,6 @@ #define Y_SPACING 40 static double x_offset = OUTER_SPACING; -static int next_vertex_number = 0; - static _Bool embedded = 0; static void exit_usage (void) /* {{{ */ @@ -71,14 +70,15 @@ static int read_options (int argc, char **argv) /* {{{ */ return (0); } /* }}} int read_options */ -static int tex_show_stage (sn_stage_t *s) /* {{{ */ +static double determine_stage_width (sn_stage_t *s) { int lines[s->comparators_num]; int right[s->comparators_num]; int lines_used = 0; int i; - printf (" \n", SN_STAGE_DEPTH (s)); + if (SN_STAGE_COMP_NUM (s) == 0) + return (0.0); for (i = 0; i < SN_STAGE_COMP_NUM (s); i++) { @@ -91,14 +91,54 @@ static int tex_show_stage (sn_stage_t *s) /* {{{ */ int j; sn_comparator_t *c = SN_STAGE_COMP_GET (s, i); - int min_num; - int max_num; + for (j = 0; j < lines_used; j++) + if (SN_COMP_LEFT (c) > right[j]) + break; + + lines[i] = j; + right[j] = SN_COMP_RIGHT (c); + if (j >= lines_used) + lines_used = j + 1; + } + assert (lines_used >= 1); + + return (((double) (lines_used - 1)) * INNER_SPACING); +} + +static double determine_network_width (sn_network_t *n) /* {{{ */ +{ + double width; + int i; + + /* Spacing between stages and at the beginning and end of the network */ + width = (SN_NETWORK_STAGE_NUM (n) + 1) * OUTER_SPACING; - min_num = next_vertex_number; - next_vertex_number++; + /* Spacing required within a stage */ + for (i = 0; i < SN_NETWORK_STAGE_NUM (n); i++) + width += determine_stage_width (SN_NETWORK_STAGE_GET (n, i)); - max_num = next_vertex_number; - next_vertex_number++; + return (width); +} /* }}} double determine_network_width */ + +static int sn_svg_show_stage (sn_stage_t *s) /* {{{ */ +{ + int lines[s->comparators_num]; + int right[s->comparators_num]; + int lines_used = 0; + int i; + + printf (" \n", SN_STAGE_DEPTH (s)); + + for (i = 0; i < SN_STAGE_COMP_NUM (s); i++) + { + lines[i] = -1; + right[i] = -1; + } + + for (i = 0; i < SN_STAGE_COMP_NUM (s); i++) + { + int j; + sn_comparator_t *c = SN_STAGE_COMP_GET (s, i); for (j = 0; j < lines_used; j++) if (SN_COMP_LEFT (c) > right[j]) @@ -131,12 +171,16 @@ static int tex_show_stage (sn_stage_t *s) /* {{{ */ printf ("\n"); return (0); -} /* }}} int tex_show_stage */ +} /* }}} int sn_svg_show_stage */ int main (int argc, char **argv) /* {{{ */ { sn_network_t *n; FILE *fh = NULL; + + double svg_height; + double svg_width; + int i; read_options (argc, argv); @@ -157,18 +201,24 @@ int main (int argc, char **argv) /* {{{ */ return (1); } + svg_height = (2 * Y_OFFSET) + ((SN_NETWORK_INPUT_NUM (n) - 1) * Y_SPACING); + svg_width = determine_network_width (n); + if (embedded) - printf ("\n"); + printf ("\n", + svg_width, svg_height); else printf ("\n" "\n" - "\n"); + "\n", + svg_width, svg_height, svg_width, svg_height); printf ("\n", PACKAGE_STRING); for (i = 0; i < SN_NETWORK_STAGE_NUM (n); i++) - tex_show_stage (SN_NETWORK_STAGE_GET (n, i)); + sn_svg_show_stage (SN_NETWORK_STAGE_GET (n, i)); printf (" \n"); for (i = 0; i < SN_NETWORK_INPUT_NUM (n); i++)