2009-02-17 20:48:39 +03:00
/* svg.c - Scalable Vector Graphics */
/*
libzint - the open source barcode library
2018-06-10 11:16:18 +03:00
Copyright ( C ) 2009 - 2018 Robin Stuart < rstuart114 @ gmail . com >
2013-05-16 21:26:38 +04:00
Redistribution and use in source and binary forms , with or without
modification , are permitted provided that the following conditions
are met :
2017-10-23 22:37:52 +03:00
1. Redistributions of source code must retain the above copyright
notice , this list of conditions and the following disclaimer .
2013-05-16 21:26:38 +04:00
2. Redistributions in binary form must reproduce the above copyright
notice , this list of conditions and the following disclaimer in the
2017-10-23 22:37:52 +03:00
documentation and / or other materials provided with the distribution .
2013-05-16 21:26:38 +04:00
3. Neither the name of the project nor the names of its contributors
may be used to endorse or promote products derived from this software
2017-10-23 22:37:52 +03:00
without specific prior written permission .
2013-05-16 21:26:38 +04:00
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS " AS IS " AND
ANY EXPRESS OR IMPLIED WARRANTIES , INCLUDING , BUT NOT LIMITED TO , THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
ARE DISCLAIMED . IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT , INDIRECT , INCIDENTAL , SPECIAL , EXEMPLARY , OR CONSEQUENTIAL
DAMAGES ( INCLUDING , BUT NOT LIMITED TO , PROCUREMENT OF SUBSTITUTE GOODS
OR SERVICES ; LOSS OF USE , DATA , OR PROFITS ; OR BUSINESS INTERRUPTION )
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY , WHETHER IN CONTRACT , STRICT
LIABILITY , OR TORT ( INCLUDING NEGLIGENCE OR OTHERWISE ) ARISING IN ANY WAY
2017-10-23 22:37:52 +03:00
OUT OF THE USE OF THIS SOFTWARE , EVEN IF ADVISED OF THE POSSIBILITY OF
2013-05-16 21:26:38 +04:00
SUCH DAMAGE .
2016-02-20 14:29:19 +03:00
*/
2009-02-17 20:48:39 +03:00
2010-05-23 09:02:08 +04:00
# include <locale.h>
2009-02-17 20:48:39 +03:00
# include <string.h>
# include <stdlib.h>
# include <stdio.h>
2016-03-03 00:12:38 +03:00
# include <math.h>
2016-11-05 19:46:24 +03:00
# ifdef _MSC_VER
# include <malloc.h>
# endif
2009-02-17 20:48:39 +03:00
# include "common.h"
2016-02-20 14:29:19 +03:00
int svg_plot ( struct zint_symbol * symbol ) {
FILE * fsvg ;
int error_number = 0 ;
const char * locale = NULL ;
2018-06-10 11:16:18 +03:00
float ax , ay , bx , by , cx , cy , dx , dy , ex , ey , fx , fy ;
float radius ;
struct zint_vector_rect * rect ;
struct zint_vector_hexagon * hex ;
struct zint_vector_circle * circle ;
struct zint_vector_string * string ;
2016-02-20 14:29:19 +03:00
2016-08-26 17:13:40 +03:00
if ( symbol - > output_options & BARCODE_STDOUT ) {
2016-02-20 14:29:19 +03:00
fsvg = stdout ;
} else {
fsvg = fopen ( symbol - > outfile , " w " ) ;
}
if ( fsvg = = NULL ) {
2017-07-27 18:01:53 +03:00
strcpy ( symbol - > errtxt , " 660: Could not open output file " ) ;
2016-02-20 14:29:19 +03:00
return ZINT_ERROR_FILE_ACCESS ;
}
locale = setlocale ( LC_ALL , " C " ) ;
/* Start writing the header */
fprintf ( fsvg , " <?xml version= \" 1.0 \" standalone= \" no \" ?> \n " ) ;
fprintf ( fsvg , " <!DOCTYPE svg PUBLIC \" -//W3C//DTD SVG 1.1//EN \" \n " ) ;
fprintf ( fsvg , " \" http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd \" > \n " ) ;
2018-06-10 11:16:18 +03:00
fprintf ( fsvg , " <svg width= \" %d \" height= \" %d \" version= \" 1.1 \" \n " , ( int ) ceil ( symbol - > vector - > width ) , ( int ) ceil ( symbol - > vector - > height ) ) ;
2016-02-20 14:29:19 +03:00
fprintf ( fsvg , " xmlns= \" http://www.w3.org/2000/svg \" > \n " ) ;
2018-06-10 11:16:18 +03:00
fprintf ( fsvg , " <desc>Zint Generated Symbol \n " ) ;
2016-02-20 14:29:19 +03:00
fprintf ( fsvg , " </desc> \n " ) ;
fprintf ( fsvg , " \n <g id= \" barcode \" fill= \" #%s \" > \n " , symbol - > fgcolour ) ;
2018-06-10 11:16:18 +03:00
fprintf ( fsvg , " <rect x= \" 0 \" y= \" 0 \" width= \" %d \" height= \" %d \" fill= \" #%s \" /> \n " , ( int ) ceil ( symbol - > vector - > width ) , ( int ) ceil ( symbol - > vector - > height ) , symbol - > bgcolour ) ;
rect = symbol - > vector - > rectangles ;
while ( rect ) {
fprintf ( fsvg , " <rect x= \" %.2f \" y= \" %.2f \" width= \" %.2f \" height= \" %.2f \" /> \n " , rect - > x , rect - > y , rect - > width , rect - > height ) ;
rect = rect - > next ;
}
hex = symbol - > vector - > hexagons ;
while ( hex ) {
radius = hex - > diameter / 2.0 ;
ay = hex - > y + ( 1.0 * radius ) ;
by = hex - > y + ( 0.5 * radius ) ;
cy = hex - > y - ( 0.5 * radius ) ;
dy = hex - > y - ( 1.0 * radius ) ;
ey = hex - > y - ( 0.5 * radius ) ;
fy = hex - > y + ( 0.5 * radius ) ;
ax = hex - > x ;
bx = hex - > x + ( 0.86 * radius ) ;
cx = hex - > x + ( 0.86 * radius ) ;
dx = hex - > x ;
ex = hex - > x - ( 0.86 * radius ) ;
fx = hex - > x - ( 0.86 * radius ) ;
fprintf ( fsvg , " <path d= \" M %.2f %.2f L %.2f %.2f L %.2f %.2f L %.2f %.2f L %.2f %.2f L %.2f %.2f Z \" /> \n " , ax , ay , bx , by , cx , cy , dx , dy , ex , ey , fx , fy ) ;
hex = hex - > next ;
}
circle = symbol - > vector - > circles ;
while ( circle ) {
if ( circle - > colour ) {
fprintf ( fsvg , " <circle cx= \" %.2f \" cy= \" %.2f \" r= \" %.2f \" fill= \" #%s \" /> \n " , circle - > x , circle - > y , circle - > diameter / 2.0 , symbol - > bgcolour ) ;
} else {
fprintf ( fsvg , " <circle cx= \" %.2f \" cy= \" %.2f \" r= \" %.2f \" fill= \" #%s \" /> \n " , circle - > x , circle - > y , circle - > diameter / 2.0 , symbol - > fgcolour ) ;
}
circle = circle - > next ;
}
string = symbol - > vector - > strings ;
while ( string ) {
fprintf ( fsvg , " <text x= \" %.2f \" y= \" %.2f \" text-anchor= \" middle \" \n " , string - > x , string - > y ) ;
fprintf ( fsvg , " font-family= \" Helvetica \" font-size= \" %.1f \" fill= \" #%s \" > \n " , string - > fsize , symbol - > fgcolour ) ;
fprintf ( fsvg , " %s \n " , string - > text ) ;
2016-06-19 13:59:09 +03:00
fprintf ( fsvg , " </text> \n " ) ;
2018-06-10 11:16:18 +03:00
string = string - > next ;
2016-06-19 13:59:09 +03:00
}
2016-02-20 14:29:19 +03:00
fprintf ( fsvg , " </g> \n " ) ;
fprintf ( fsvg , " </svg> \n " ) ;
if ( symbol - > output_options & BARCODE_STDOUT ) {
fflush ( fsvg ) ;
} else {
fclose ( fsvg ) ;
}
if ( locale )
setlocale ( LC_ALL , locale ) ;
return error_number ;
2009-02-17 20:48:39 +03:00
}