diff options
Diffstat (limited to 'zbar/svg.c')
-rw-r--r-- | zbar/svg.c | 187 |
1 files changed, 187 insertions, 0 deletions
diff --git a/zbar/svg.c b/zbar/svg.c new file mode 100644 index 0000000..f4788dd --- /dev/null +++ b/zbar/svg.c @@ -0,0 +1,187 @@ +/*------------------------------------------------------------------------ + * Copyright 2009 (c) Jeff Brown <spadix@users.sourceforge.net> + * + * This file is part of the ZBar Bar Code Reader. + * + * The ZBar Bar Code Reader is free software; you can redistribute it + * and/or modify it under the terms of the GNU Lesser Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * The ZBar Bar Code Reader is distributed in the hope that it will be + * useful, but WITHOUT ANY WARRANTY; without even the implied warranty + * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser Public License for more details. + * + * You should have received a copy of the GNU Lesser Public License + * along with the ZBar Bar Code Reader; if not, write to the Free + * Software Foundation, Inc., 51 Franklin St, Fifth Floor, + * Boston, MA 02110-1301 USA + * + * http://sourceforge.net/projects/zbar + *------------------------------------------------------------------------*/ + +#include <stdarg.h> +#include <stdio.h> +#include <stdlib.h> + +#include "svg.h" + +static const char svg_head[] = + "<?xml version='1.0'?>\n" + "<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.1//EN'" + " 'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'>\n" + "<svg version='1.1' id='top' width='8in' height='8in'" + " preserveAspectRatio='xMidYMid' overflow='visible'" + " viewBox='%g,%g %g,%g' xmlns:xlink='http://www.w3.org/1999/xlink'" + " xmlns='http://www.w3.org/2000/svg'>\n" + "<defs><style type='text/css'><![CDATA[\n" + "* { image-rendering: optimizeSpeed }\n" + "image { opacity: .9 }\n" + "path, line, circle { fill: none; stroke-width: .5;" + " stroke-linejoin: round; stroke-linecap: butt;" + " stroke-opacity: .666; fill-opacity: .666 }\n" + /*"#hedge line, #vedge line { stroke: #34f }\n"*/ + "#hedge, #vedge { stroke: yellow }\n" + "#target * { fill: none; stroke: #f24 }\n" + "#mdot * { fill: #e2f; stroke: none }\n" + "#ydot * { fill: yellow; stroke: none }\n" + "#cross * { stroke: #44f }\n" + ".hedge { marker: url(#hedge) }\n" + ".vedge { marker: url(#vedge) }\n" + ".scanner .hedge, .scanner .vedge { stroke-width: 8 }\n" + ".finder .hedge, .finder .vedge { /*stroke: #a0c;*/ stroke-width: .9 }\n" + ".cluster { stroke: #a0c; stroke-width: 1; stroke-opacity: .45 }\n" + ".cluster.valid { stroke: #c0a; stroke-width: 1; stroke-opacity: .666 }\n" + ".h.cluster { marker: url(#vedge) }\n" + ".v.cluster { marker: url(#hedge) }\n" + ".centers { marker: url(#target); stroke-width: 3 }\n" + ".edge-pts { marker: url(#ydot); stroke-width: .5 }\n" + ".align { marker: url(#mdot); stroke-width: 1.5 }\n" + ".sampling-grid { stroke-width: .75; marker: url(#cross) }\n" + "]]></style>\n" + "<marker id='hedge' overflow='visible'><line x1='-2' x2='2'/></marker>\n" + "<marker id='vedge' overflow='visible'><line y1='-2' y2='2'/></marker>\n" + "<marker id='ydot' overflow='visible'><circle r='2'/></marker>\n" + "<marker id='mdot' overflow='visible'><circle r='2'/></marker>\n" + "<marker id='cross' overflow='visible'><path d='M-2,0h4 M0,-2v4'/></marker>\n" + "<marker id='target' overflow='visible'><path d='M-4,0h8 M0,-4v8'/><circle r='2'/></marker>\n" + "</defs>\n"; + +static FILE *svg = NULL; + +void svg_open(const char *name, double x, double y, double w, double h) +{ + svg = fopen(name, "w"); + if (!svg) + return; + + /* FIXME calc scaled size */ + fprintf(svg, svg_head, x, y, w, h); +} + +void svg_close() +{ + if (!svg) + return; + fprintf(svg, "</svg>\n"); + fclose(svg); + svg = NULL; +} + +void svg_commentf(const char *format, ...) +{ + if (!svg) + return; + fprintf(svg, "<!-- "); + va_list args; + va_start(args, format); + vfprintf(svg, format, args); + va_end(args); + fprintf(svg, " -->\n"); +} + +void svg_image(const char *name, double width, double height) +{ + if (!svg) + return; + fprintf(svg, "<image width='%g' height='%g' xlink:href='%s'/>\n", width, + height, name); +} + +void svg_group_start(const char *cls, double deg, double sx, double sy, + double x, double y) +{ + if (!svg) + return; + fprintf(svg, "<g class='%s'", cls); + if (sx != 1. || sy != 1 || deg || x || y) { + fprintf(svg, " transform='"); + if (deg) + fprintf(svg, "rotate(%g)", deg); + if (x || y) + fprintf(svg, "translate(%g,%g)", x, y); + if (sx != 1. || sy != 1.) { + if (!sy) + fprintf(svg, "scale(%g)", sx); + else + fprintf(svg, "scale(%g,%g)", sx, sy); + } + fprintf(svg, "'"); + } + fprintf(svg, ">\n"); +} + +void svg_group_end() +{ + fprintf(svg, "</g>\n"); +} + +void svg_path_start(const char *cls, double scale, double x, double y) +{ + if (!svg) + return; + fprintf(svg, "<path class='%s'", cls); + if (scale != 1. || x || y) { + fprintf(svg, " transform='"); + if (x || y) + fprintf(svg, "translate(%g,%g)", x, y); + if (scale != 1.) + fprintf(svg, "scale(%g)", scale); + fprintf(svg, "'"); + } + fprintf(svg, " d='"); +} + +void svg_path_end() +{ + if (!svg) + return; + fprintf(svg, "'/>\n"); +} + +void svg_path_close() +{ + if (!svg) + return; + fprintf(svg, "z"); +} + +void svg_path_moveto(svg_absrel_t abs, double x, double y) +{ + if (!svg) + return; + fprintf(svg, " %c%g,%g", (abs) ? 'M' : 'm', x, y); +} + +void svg_path_lineto(svg_absrel_t abs, double x, double y) +{ + if (!svg) + return; + if (x && y) + fprintf(svg, "%c%g,%g", (abs) ? 'L' : 'l', x, y); + else if (x) + fprintf(svg, "%c%g", (abs) ? 'H' : 'h', x); + else if (y) + fprintf(svg, "%c%g", (abs) ? 'V' : 'v', y); +} |