34 const char *main_title,
50 printf(
"%s(tac, '%s', %g, %g, %g, %g, '%s')\n", __func__, main_title, x1, x2, y1, y2, fname);
53 if(fname==NULL ||
strnlen(fname, 1)<1) {
57 double minx, maxx, miny, maxy, tx1, tx2, ty1, ty2;
61 if(minx>0.0) {
double f=maxx-minx; minx-=0.05*f;
if(minx<0.0) minx=0.0;}
62 if(isfinite(x1)) minx=x1;
63 if(isfinite(x2)) maxx=x2;
64 if(status->
verbose>1) {printf(
" minx := %g\n maxx := %g\n", minx, maxx); fflush(stdout);}
71 if(miny>0.0) {
double f=maxy-miny; miny-=0.05*f;
if(miny<0.0) miny=0.0;}
72 else if(maxy<0.0) maxy=0.0;
73 if(isfinite(y1)) miny=y1;
74 if(isfinite(y2)) maxy=y2;
75 if(status->
verbose>1) {printf(
" miny := %g\n maxy := %g\n", miny, maxy); fflush(stdout);}
78 struct svg_viewports viewports; svg_init_viewports(&viewports);
79 viewports.x.min=minx; viewports.x.max=maxx;
80 viewports.y.min=miny; viewports.y.max=maxy;
81 viewports.label_area_viewport.is=0;
82 if(svg_calculate_axes(&viewports, status->
verbose-1)) {
86 if(svg_define_viewports(0, 0, strlen(main_title), 0, 0, 0, &viewports, status->
verbose-1)) {
90 FILE *fp=svg_initiate(fname, 0, 0, &viewports, NULL, status->
verbose-1);
95 if(svg_create_main_title(fp, main_title,
"", &viewports, NULL, status->
verbose-2)) {
97 fclose(fp);
return(status->
error);
100 if(svg_start_plot_viewport(fp, &viewports, NULL, status->
verbose-2)) {
102 fclose(fp);
return(status->
error);
105 if(svg_start_coordinate_viewport(fp, &viewports, NULL, status->
verbose-3)) {
107 fclose(fp);
return(status->
error);
110 if(svg_write_axes(fp, &viewports, NULL, status->
verbose-3)) {
112 fclose(fp);
return(status->
error);
118 char ilc[9], tmp[1024];
119 if(
SVG_INLINE) strcpy(ilc,
"svg:");
else strcpy(ilc,
"");
121 sprintf(tmp,
"\n<%sg stroke=\"black\" stroke-width=\"25\" fill=\"black\">\n", ilc);
122 if(svg_write(fp, tmp, NULL, status->
verbose-5)!=0) {
124 fclose(fp);
return(status->
error);
128 sprintf(tmp,
"<%spath fill=\"none\" d=\"", ilc);
129 svg_write(fp, tmp, NULL, status->
verbose-5);
131 if(!isfinite(d->
x[i]) || !isfinite(d->
c[0].
y[i]))
continue;
132 double nx1, ny1, nx2, ny2;
133 nx1=nx2=viewports.x.origo+d->
x[i]*viewports.x.scale;
134 ny1=viewports.coordinate_area_viewport.h-(viewports.y.origo+viewports.y.scale*0.0);
135 ny2=viewports.coordinate_area_viewport.h-(viewports.y.origo+viewports.y.scale*d->
c[0].
y[i]);
137 if(nx1<0 && nx2<=0)
continue;
138 if(nx1>viewports.coordinate_area_viewport.w+1 || nx1>viewports.coordinate_area_viewport.w+1)
141 if((ny1<0 || ny2>viewports.coordinate_area_viewport.h+1) &&
142 (ny2<0 || ny1>viewports.coordinate_area_viewport.h+1))
continue;
144 if(ny1<0) ny1=0.0;
else if(ny2<0) ny2=0.0;
145 if(ny1>viewports.coordinate_area_viewport.h+1) ny1=viewports.coordinate_area_viewport.h+1;
146 else if(ny2>viewports.coordinate_area_viewport.h+1) ny2=viewports.coordinate_area_viewport.h+1;
148 sprintf(tmp,
" M%.0f %.0f L%.0f %.0f", nx1, ny1, nx2, ny2);
149 svg_write(fp, tmp, NULL, status->
verbose-5);
152 strcpy(tmp,
"\" />\n");
153 svg_write(fp, tmp, NULL, status->
verbose-5);
156 if(!isfinite(d->
x[i]) || !isfinite(d->
c[0].
y[i]))
continue;
157 double nx1, ny1, nx2, ny2;
158 nx1=viewports.x.origo+d->
x1[i]*viewports.x.scale;
159 nx2=viewports.x.origo+d->
x2[i]*viewports.x.scale;
160 ny1=viewports.coordinate_area_viewport.h-(viewports.y.origo+viewports.y.scale*0.0);
161 ny2=viewports.coordinate_area_viewport.h-(viewports.y.origo+viewports.y.scale*d->
c[0].
y[i]);
163 if(nx1<0 && nx2<=0)
continue;
164 if(nx1>viewports.coordinate_area_viewport.w+1 || nx1>viewports.coordinate_area_viewport.w+1)
167 if((ny1<0 || ny2>viewports.coordinate_area_viewport.h+1) &&
168 (ny2<0 || ny1>viewports.coordinate_area_viewport.h+1))
continue;
170 if(ny1<0) ny1=0.0;
else if(ny2<0) ny2=0.0;
171 if(ny1>viewports.coordinate_area_viewport.h+1) ny1=viewports.coordinate_area_viewport.h+1;
172 else if(ny2>viewports.coordinate_area_viewport.h+1) ny2=viewports.coordinate_area_viewport.h+1;
173 if(ny1>ny2) {
double f=ny1; ny1=ny2; ny2=f;}
175 sprintf(tmp,
" <rect x=\"%.0f\" y=\"%.0f\" width=\"%.0f\" height=\"%.0f\" />\n",
176 nx1, ny1, nx2-nx1, fabs(ny2-ny1));
177 svg_write(fp, tmp, NULL, status->
verbose-5);
181 sprintf(tmp,
"</%sg>\n", ilc);
182 if(svg_write(fp, tmp, NULL, status->
verbose-5)!=0) {
184 fclose(fp);
return(status->
error);
188 if(svg_end_coordinate_viewport(fp, NULL, status->
verbose-1)) {
190 fclose(fp);
return(status->
error);
194 if(svg_write_xticks(fp, &viewports, NULL, status->
verbose-3)!=0 ||
195 svg_write_yticks(fp, &viewports, NULL, status->
verbose-3)!=0) {
197 fclose(fp);
return(status->
error);
201 if(svg_end_plot_viewport(fp, NULL, status->
verbose-2)) {
203 fclose(fp);
return(status->
error);
207 if(svg_close(fp, NULL, status->
verbose-1)) {
209 fclose(fp);
return(status->
error);
212 if(status->
verbose>0) fprintf(stdout,
" written file %s\n", fname);