1 /*
2 Copyright (C) 2013-2021, Dirk Krause
3 SPDX-License-Identifier: BSD-3-Clause
4 */
5 
6 /*
7 	WARNING: This file was generated by the dkct program (see
8 	http://dktools.sourceforge.net/ for details).
9 	Changes you make here will be lost if dkct is run again!
10 	You should modify the original source and run dkct on it.
11 	Original source: f2lsvgst.ctr
12 */
13 
14 /**	@file f2lsvgst.c The f2lsvgst module.
15 */
16 
17 
18 #include <fig2lat/f2lsvgst.h>
19 #include <libdk3c/dk3unused.h>
20 
21 
22 
23 
24 
25 
26 
27 /**	Keywords used by the module.
28 */
29 static char const * const	f2lsvgst_c8_kw[] = {
30 /* 0 */
31 "\n",
32 
33 /* 1 */
34 "svg:",
35 
36 /* 2 */
37 "<",
38 
39 /* 3 */
40 "pattern",
41 
42 /* 4 */
43 "/",
44 
45 /* 5 */
46 ">",
47 
48 /* 6 */
49 "<",
50 
51 /* 7 */
52 " id=\"",
53 
54 /* 8 */
55 "p",
56 
57 /* 9 */
58 "\" x=\"0\" y=\"0\" width=\"%g\" height=\"%g\"\npatternUnits=\"userSpaceOnUse\"\n>\n",
59 
60 /* 10 */
61 "rect",
62 
63 /* 11 */
64 " x=\"0\" y=\"0\" width=\"%g\" height=\"%g\"\n",
65 
66 /* 12 */
67 "style=\"fill: #%02X%02X%02X; stroke: none;\"\n",
68 
69 /* 13 */
70 "/>\n",
71 
72 /* 14 */
73 " style=\"stroke: none; fill: #%02X%02X%02X;\"\n",
74 
75 /* 15 */
76 "points=\"0,0 0.9,0 7.2,3.64 7.2,4.16 6.3,4.16 0,0.52\"",
77 
78 /* 16 */
79 "points=\"0,3.64 0.9,4.16 0,4.16\"",
80 
81 /* 17 */
82 "points=\"6.3,0 7.2,0.52 7.2,0\"",
83 
84 /* 18 */
85 "polyline",
86 
87 /* 19 */
88 "points=\"0,4.16 0.9,4.16 7.2,0.52 7.2,0 6.3,0 0,3.64\"",
89 
90 /* 20 */
91 "points=\"0,0.52 0.9,0 0,0\"",
92 
93 /* 21 */
94 "points=\"6.3,4.16 7.2,4.16 7.2,3.64\"",
95 
96 /* 22 */
97 "style=\"fill: none; stroke: #%02X%02X%02X; stroke-width: 0.9; stroke-linecap: round;\"",
98 
99 /* 23 */
100 "points=\"0,0 7.2,4.16\"",
101 
102 /* 24 */
103 "points=\"0,4.16 7.2,0\"",
104 
105 /* 25 */
106 "points=\"0,0 0.64,0 10.18,9.54 10.18,10.18 9.54,10.18 0,0.64\"",
107 
108 /* 26 */
109 "points=\"0,9.54 0.64,10.18 0,10.18\"",
110 
111 /* 27 */
112 "points=\"9.54,0 10.18,0.64 10.18,0\"",
113 
114 /* 28 */
115 "points=\"0,10.18 0.64,10.18 10.18,0.64 10.18,0 9.54,0 0,9.54\"",
116 
117 /* 29 */
118 "points=\"0,0.64 0.64,0 0,0\"",
119 
120 /* 30 */
121 "points=\"9.54,10.18 10.18,10.18 10.18,9.54\"",
122 
123 /* 31 */
124 "points=\"0,0 10.18,10.18\"",
125 
126 /* 32 */
127 "points=\"0,10.18 10.18,0\"",
128 
129 /* 33 */
130 "points=\"3.6,0 3.6,7.2\"",
131 
132 /* 34 */
133 "points=\"18,0 18,7.2\"",
134 
135 /* 35 */
136 "points=\"10.8,7.2 10.8,14.4\"",
137 
138 /* 36 */
139 "points=\"25.2,7.2 25.2,14.4\"",
140 
141 /* 37 */
142 "points=\"0,0 28.8,0\"",
143 
144 /* 38 */
145 "points=\"0,14.4 28.8,14.4\"",
146 
147 /* 39 */
148 "points=\"0,7.2 28.8,7.2\"",
149 
150 /* 40 */
151 "points=\"0,3.6 7.2,3.6\"",
152 
153 /* 41 */
154 "points=\"0,18 7.2,18\"",
155 
156 /* 42 */
157 "points=\"7.2,10.8 14.4,10.8\"",
158 
159 /* 43 */
160 "points=\"7.2,25.2 14.4,25.2\"",
161 
162 /* 44 */
163 "points=\"0,0 0,28.8\"",
164 
165 /* 45 */
166 "points=\"7.2,0 7.2,28.8\"",
167 
168 /* 46 */
169 "points=\"14.4,0 14.4,28.8\"",
170 
171 /* 47 */
172 "points=\"0,0 3.6,0\"",
173 
174 /* 48 */
175 "points=\"0,3.6 3.6,3.6\"",
176 
177 /* 49 */
178 "points=\"0,0 0,3.6\"",
179 
180 /* 50 */
181 "points=\"3.6,0 3.6,3.6\"",
182 
183 /* 51 */
184 "polygon",
185 
186 /* 52 */
187 "points=\"0,0 0,3.6 3.6,3.6 3.6,0\"",
188 
189 /* 53 */
190 "points=\"0.45,7.2 3.15,0\"",
191 
192 /* 54 */
193 "points=\"4.05,14.4 6.75,7.2\"",
194 
195 /* 55 */
196 "points=\"7.65,21.6 10.35,14.4\"",
197 
198 /* 56 */
199 "points=\"11.25,28.8 13.95,21.6\"",
200 
201 /* 57 */
202 "points=\"0,0 14.4,0\"",
203 
204 /* 58 */
205 "points=\"0,7.2 14.4,7.2\"",
206 
207 /* 59 */
208 "points=\"0,14.4 14.4,14.4\"",
209 
210 /* 60 */
211 "points=\"0,21.6 14.4,21.6\"",
212 
213 /* 61 */
214 "points=\"0,28.8 14.4,28.8\"",
215 
216 /* 62 */
217 "points=\"0,0 3.6,7.2\"",
218 
219 /* 63 */
220 "points=\"10.8,7.2 14.4,14.4\"",
221 
222 /* 64 */
223 "points=\"7.2,14.4 10.8,21.6\"",
224 
225 /* 65 */
226 "points=\"3.6,21.6 7.2,28.8\"",
227 
228 /* 66 */
229 "points=\"0,0 14.4,0\"",
230 
231 /* 67 */
232 "points=\"0,7.2 14.4,7.2\"",
233 
234 /* 68 */
235 "points=\"0,14.4 14.4,14.4\"",
236 
237 /* 69 */
238 "points=\"0,21.6 14.4,21.6\"",
239 
240 /* 70 */
241 "points=\"0,28.8 14.4,28.8\"",
242 
243 /* 71 */
244 "points=\"0,10.8 7.2,14.4\"",
245 
246 /* 72 */
247 "points=\"7.2,7.2 14.4,10.8\"",
248 
249 /* 73 */
250 "points=\"14.4,3.6 21.6,7.2\"",
251 
252 /* 74 */
253 "points=\"21.6,0 28.8,3.6\"",
254 
255 /* 75 */
256 "points=\"0,0 0,14.4\"",
257 
258 /* 76 */
259 "points=\"7.2,0 7.2,14.4\"",
260 
261 /* 77 */
262 "points=\"14.4,0 14.4,14.4\"",
263 
264 /* 78 */
265 "points=\"21.6,0 21.6,14.4\"",
266 
267 /* 79 */
268 "points=\"28.8,0 28.8,14.4\"",
269 
270 /* 80 */
271 "points=\"0,14.4 7.2,10.8\"",
272 
273 /* 81 */
274 "points=\"7.2,3.6 14.4,0\"",
275 
276 /* 82 */
277 "points=\"14.4,7.2 21.6,3.6\"",
278 
279 /* 83 */
280 "points=\"21.6,10.8 28.8,7.2\"",
281 
282 /* 84 */
283 "points=\"0,0 0,14.4\"",
284 
285 /* 85 */
286 "points=\"7.2,0 7.2,14.4\"",
287 
288 /* 86 */
289 "points=\"14.4,0 14.4,14.4\"",
290 
291 /* 87 */
292 "points=\"21.6,0 21.6,14.4\"",
293 
294 /* 88 */
295 "points=\"28.8,0 28.8,14.4\"",
296 
297 /* 89 */
298 "path",
299 
300 /* 90 */
301 "d=\"M0,0A9 9 0 0 0 14.54,0\"",
302 
303 /* 91 */
304 "d=\"M0,7.4A9 9 0 0 0 7.27,3.7\"",
305 
306 /* 92 */
307 "d=\"M7.27,3.7A9 9 0 0 0 14.54,7.4\"",
308 
309 /* 93 */
310 "d=\"M0,0A9 9 0 0 0 7.27,-3.7\"",
311 
312 /* 94 */
313 "d=\"M7.27,-3.7A9 9 0 0 0 14.54,0\"",
314 
315 /* 95 */
316 "d=\"M0,0A3.6 3.6 0 0 0 7.2,0\"",
317 
318 /* 96 */
319 "d=\"M0,7.2A3.6 3.6 0 0 0 3.6,3.6\"",
320 
321 /* 97 */
322 "d=\"M3.6,3.6A3.6 3.6 0 0 0 7.2,7.2\"",
323 
324 /* 98 */
325 "d=\"M0,0A3.6 3.6 0 0 0 3.6,-3.6\"",
326 
327 /* 99 */
328 "d=\"M3.6,-3.6A3.6 3.6 0 0 0 7.2,0\"",
329 
330 /* 100 */
331 "circle",
332 
333 /* 101 */
334 "style=\"fill: none; stroke: #%02X%02X%02X; stroke-width: 0.9;\"",
335 
336 /* 102 */
337 " cx=\"7.2\" cy=\"7.2\" r=\"7.2\"",
338 
339 /* 103 */
340 "points=\"3.6,0 0,6.24 3.6,12.47 10.8,12.47 14.4,6.24 10.8,0\"",
341 
342 /* 104 */
343 "points=\"14.4,6.24 21.6,6.24\"",
344 
345 /* 105 */
346 "points=\"21.6,6.24 25.2,0\"",
347 
348 /* 106 */
349 "points=\"21.6,6.24 25.2,12.47\"",
350 
351 /* 107 */
352 "points=\"0,4.22 4.22,0 10.18,0 14.4,4.22",
353 
354 /* 108 */
355 "14.4,10.18 10.18,14.4 4.22,14.4 0,10.18\"",
356 
357 /* 109 */
358 "points=\"0,1.8 3.6,5.4 7.2,1.8\"",
359 
360 /* 110 */
361 "points=\"1.8,0 5.4,3.6 1.8,7.2\"",
362 
363 /* 111 */
364 "s",
365 
366 /* 112 */
367 ".",
368 
369 /* 113 */
370 " {\n",
371 
372 /* 114 */
373 "}\n",
374 
375 /* 115 */
376 "font-family: \"",
377 
378 /* 116 */
379 "\",serif;\n",
380 
381 /* 117 */
382 "\",sans-serif;\n",
383 
384 /* 118 */
385 "\",monospace;\n",
386 
387 /* 119 */
388 "font-style: normal;\n",
389 
390 /* 120 */
391 "font-style: italic;\n",
392 
393 /* 121 */
394 "font-style: oblique;\n",
395 
396 /* 122 */
397 "font-weight: %d;\n",
398 
399 /* 123 */
400 "font-family: serif;\n",
401 
402 /* 124 */
403 "font-family: sans-serif;\n",
404 
405 /* 125 */
406 "font-family: monospace;\n",
407 
408 /* 126 */
409 "font-style: normal;\n",
410 
411 /* 127 */
412 "font-style: italic;\n",
413 
414 /* 128 */
415 "font-weight: normal;\n",
416 
417 /* 129 */
418 "font-weight: bold;\n",
419 
420 /* 130 */
421 "font-size: %gpt;\n",
422 
423 /* 131 */
424 "text-anchor: start;\n",
425 
426 /* 132 */
427 "text-anchor: middle;\n",
428 
429 /* 133 */
430 "text-anchor: end;\n",
431 
432 /* 134 */
433 "fill: url(#",
434 
435 /* 135 */
436 ");\nfillrule: evenodd;\n",
437 
438 /* 136 */
439 "fill: #%02X%02X%02X;\nfillrule: evenodd;\n",
440 
441 /* 137 */
442 "fill: none;\n",
443 
444 /* 138 */
445 "stroke: #%02X%02X%02X;\n",
446 
447 /* 139 */
448 "stroke-width: %g;\n",
449 
450 /* 140 */
451 "stroke-linecap: square;\n",
452 
453 /* 141 */
454 "stroke-linecap: round;\n",
455 
456 /* 142 */
457 "stroke-linecap: butt;\n",
458 
459 /* 143 */
460 "stroke-linejoin: bevel;\n",
461 
462 /* 144 */
463 "stroke-linejoin: round;\n",
464 
465 /* 145 */
466 "stroke-linejoin: miter;\n",
467 
468 /* 146 */
469 "stroke-dasharray: ",
470 
471 /* 147 */
472 ";\n",
473 
474 /* 148 */
475 "none",
476 
477 /* 149 */
478 "%g,%g",
479 
480 /* 150 */
481 "%g,%g,%g,%g",
482 
483 /* 151 */
484 "%g,%g,%g,%g,%g,%g",
485 
486 /* 152 */
487 "%g,%g,%g,%g,%g,%g,%g,%g",
488 
489 /* 153 */
490 "font-family=\"'",
491 
492 /* 154 */
493 "',serif\"\n",
494 
495 /* 155 */
496 "',sans-serif\"\n",
497 
498 /* 156 */
499 "',monospace\"\n",
500 
501 /* 157 */
502 "font-style=\"oblique\"\n",
503 
504 /* 158 */
505 "font-style=\"italic\"\n",
506 
507 /* 159 */
508 "font-weight=\"%d\"\n",
509 
510 /* 160 */
511 "font-size=\"%gpt\"\n",
512 
513 /* 161 */
514 "font-family=\"serif\"\n",
515 
516 /* 162 */
517 "font-family=\"sans-serif\"\n",
518 
519 /* 163 */
520 "font-family=\"monospace\"\n",
521 
522 /* 164 */
523 "font-weight=\"bold\"\n",
524 
525 /* 165 */
526 "text-anchor=\"middle\"\n",
527 
528 /* 166 */
529 "text-anchor=\"end\"\n",
530 
531 /* 167 */
532 "fill=\"url(#",
533 
534 /* 168 */
535 ")\"\n",
536 
537 /* 169 */
538 "fill=\"#%02X%02X%02X\"\n",
539 
540 /* 170 */
541 "fill=\"none\"\n",
542 
543 /* 171 */
544 "stroke=\"#%02X%02X%02X\"\n",
545 
546 /* 172 */
547 "stroke-width=\"%g\"\n",
548 
549 /* 173 */
550 "stroke-dasharray=\"%g,%g\"\n",
551 
552 /* 174 */
553 "stroke-dasharray=\"%g,%g,%g,%g\"\n",
554 
555 /* 175 */
556 "stroke-dasharray=\"%g,%g,%g,%g,%g,%g\"\n",
557 
558 /* 176 */
559 "stroke-dasharray=\"%g,%g,%g,%g,%g,%g,%g,%g\"\n",
560 
561 /* 177 */
562 "stroke-linecap=\"square\"\n",
563 
564 /* 178 */
565 "stroke-linecap=\"round\"\n",
566 
567 /* 179 */
568 "stroke-linejoin=\"bevel\"\n",
569 
570 /* 180 */
571 "stroke-linejoin=\"round\"\n",
572 
573 /* 181 */
574 "class=\"",
575 
576 /* 182 */
577 "\"\n",
578 
579 /* 183 */
580 "fill: #%02X%02X%02X;\n",
581 
582 /* 184 */
583 "fill=\"#%02X%02X%02X\"\nfillrule=\"evenodd\"\n",
584 
585 /* 185 */
586 "stroke-miterlimit: 20;\n",
587 
588 /* 186 */
589 "stroke-miterlimit=\"20\"\n",
590 
591 /* 187 */
592 "\",\"",
593 
594 /* 188 */
595 "','",
596 
597 NULL
598 
599 };
600 
601 
602 
603 /**	Compare two integer values.
604 	@param	x	Left value.
605 	@param	y	Right value.
606 	@return	Comparison result.
607 */
608 static
609 int
f2lsvgst_compare_int(int x,int y)610 f2lsvgst_compare_int(int x, int y)
611 {
612   int		 back = 0;
613 
614   if(x > y) {
615     back = 1;
616   } else {
617     if(x < y) {
618       back = -1;
619     }
620   }
621   return	 back;
622 }
623 
624 
625 
626 static
627 int
f2lsvgst_compare_pattern(void const * l,void const * r,int DK3_ARG_UNUSED (cr))628 f2lsvgst_compare_pattern(
629   void const *l, void const *r, int DK3_ARG_UNUSED(cr)
630 )
631 {
632   int				 back = 0;
633   f2l_svg_fill_pattern_t const	*pl;
634   f2l_svg_fill_pattern_t const	*pr;
635 
636   DK3_UNUSED_ARG(cr)
637   if(l) {
638     if(r) {
639       pl = (f2l_svg_fill_pattern_t const *)l;
640       pr = (f2l_svg_fill_pattern_t const *)r;
641       back = f2lsvgst_compare_int(pl->fn, pr->fn);
642       if(0 == back) {
643         back = f2lsvgst_compare_int(pl->sr, pr->sr);
644 	if(0 == back) {
645 	  back = f2lsvgst_compare_int(pl->sg, pr->sg);
646 	  if(0 == back) {
647 	    back = f2lsvgst_compare_int(pl->sb, pr->sb);
648 	    if(0 == back) {
649 	      back = f2lsvgst_compare_int(pl->fr, pr->fr);
650 	      if(0 == back) {
651 	        back = f2lsvgst_compare_int(pl->fg, pr->fg);
652 		if(0 == back) {
653 		  back = f2lsvgst_compare_int(pl->fb, pr->fb);
654 		}
655 	      }
656 	    }
657 	  }
658 	}
659       }
660     } else { back = 1; }
661   } else {
662     if(r) { back = -1; }
663   }
664   return back;
665 }
666 
667 
668 
669 static
670 int
f2lsvgst_compare_object_styles(void const * l,void const * r,int DK3_ARG_UNUSED (cr))671 f2lsvgst_compare_object_styles(
672   void const *l, void const *r, int DK3_ARG_UNUSED(cr)
673 )
674 {
675   f2l_svg_style_t const	*pl;
676   f2l_svg_style_t const	*pr;
677   int			 back = 0;
678 
679   DK3_UNUSED_ARG(cr)
680   if(l) {
681     if(r) {
682       pl = (f2l_svg_style_t const *)l;
683       pr = (f2l_svg_style_t const *)r;
684       /*	Stroke color.
685       */
686       if((pl->flags) & DK3_SVG_FLAGS_COLOR_STROKE) {
687         if((pr->flags) & DK3_SVG_FLAGS_COLOR_STROKE) {
688 	  back = f2lsvgst_compare_int(pl->sr, pr->sr);
689 
690 	  if(0 == back) {
691 	    back = f2lsvgst_compare_int(pl->sg, pr->sg);
692 
693 	    if(0 == back) {
694 	      back = f2lsvgst_compare_int(pl->sb, pr->sb);
695 
696 	    }
697 	  }
698 	} else {
699 	  back = 1;
700 	}
701       } else {
702         if((pr->flags) & DK3_SVG_FLAGS_COLOR_STROKE) {
703 	  back = -1;
704 	}
705       }
706       /*	Line width.
707       */
708       if(0 == back) {
709         if((pl->flags) & DK3_SVG_FLAGS_LINEWIDTH) {
710           if((pr->flags) & DK3_SVG_FLAGS_LINEWIDTH) {
711 	    if(pl->lw > (pr->lw + 1.0e-6)) {
712 	      back = 1;
713 	    } else {
714 	      if(pr->lw > (pl->lw + 1.0e-6)) {
715 	        back = -1;
716 	      }
717 	    }
718 	  } else {
719 	    back = 1;
720 	  }
721         } else {
722           if((pr->flags) & DK3_SVG_FLAGS_LINEWIDTH) {
723 	    back = -1;
724 	  }
725         }
726       }
727       /*	Line cap.
728       */
729       if(0 == back) {
730         if((pl->flags) & DK3_SVG_FLAGS_LINE_CAP) {
731 	  if((pr->flags) & DK3_SVG_FLAGS_LINE_CAP) {
732 	    back = f2lsvgst_compare_int(pl->lc, pr->lc);
733 
734 	  } else {
735 	    back = 1;
736 	  }
737 	} else {
738 	  if((pr->flags) & DK3_SVG_FLAGS_LINE_CAP) {
739 	    back = -1;
740 	  }
741 	}
742       }
743       /*	Line join.
744       */
745       if(0 == back) {
746         if((pl->flags) & DK3_SVG_FLAGS_LINE_JOIN) {
747 	  if((pr->flags) & DK3_SVG_FLAGS_LINE_JOIN) {
748 	    back = f2lsvgst_compare_int(pl->lj, pr->lj);
749 
750 	  } else {
751 	    back = 1;
752 	  }
753 	} else {
754 	  if((pr->flags) & DK3_SVG_FLAGS_LINE_JOIN) {
755 	    back = -1;
756 	  }
757 	}
758       }
759       /*	Line style.
760       */
761       if(0 == back) {
762         if((pl->flags) & DK3_SVG_FLAGS_LINESTYLE) {
763           if((pr->flags) & DK3_SVG_FLAGS_LINESTYLE) {
764 	    if(pl->ls > pr->ls) {
765 	      back = 1;
766 	    } else {
767 	      if(pr->ls > pl->ls) {
768 	        back = -1;
769 	      } else {
770 	        if((0 != pl->ls) && (0 != pr->ls)) {
771 	          if(pl->lsv > (pr->lsv + 1.0e-6)) {
772 		    back = 1;
773 		  } else {
774 		    if(pr->lsv > (pl->lsv + 1.0e-6)) {
775 		      back = -1;
776 		    }
777 		  }
778 	        }
779 	      }
780 	    }
781 	  } else {
782 	    back = 1;
783 	  }
784         } else {
785           if((pr->flags) & DK3_SVG_FLAGS_LINESTYLE) {
786 	    back = -1;
787 	  }
788         }
789       }
790       /*	Fill pattern or fill color.
791       */
792       if(0 == back) {
793         if(pl->fp) {
794 	  if(pr->fp) {
795 	    back =
796 	    f2lsvgst_compare_pattern((void *)(pl->fp),(void *)(pr->fp),0);
797 
798 	  } else {
799 	    back = 1;
800 	  }
801 	} else {
802 	  if(pr->fp) {
803 	    back = -1;
804 	  }
805 	  else {
806             /*	Fill color only if both objects do not have fill patterns.
807             */
808             if(0 == back) {
809 	      if((pl->flags) & DK3_SVG_FLAGS_COLOR_FILL) {
810 	        if((pr->flags) & DK3_SVG_FLAGS_COLOR_FILL) {
811                   back = f2lsvgst_compare_int(pl->fr, pr->fr);
812 
813 	          if(0 == back) {
814 	            back = f2lsvgst_compare_int(pl->fg, pr->fg);
815 
816 	            if(0 == back) {
817 	              back = f2lsvgst_compare_int(pl->fb, pr->fb);
818 
819 	            }
820 	          }
821 	        } else {
822 	          back = 1;
823 	        }
824 	      } else {
825 	        if((pr->flags) & DK3_SVG_FLAGS_COLOR_FILL) {
826 	          back = -1;
827 	        }
828 	      }
829             }
830  	  }
831 	}
832       }
833       /*	Font.
834       */
835       if(0 == back) {
836         if((pl->flags) & DK3_SVG_FLAGS_FONT) {
837 	  if((pr->flags) & DK3_SVG_FLAGS_FONT) {
838 	    if((pl->flags) & DK3_SVG_FLAGS_PS_FONT) {
839 	      if((pr->flags) & DK3_SVG_FLAGS_PS_FONT) {
840 	        back = f2lsvgst_compare_int(pl->tf, pr->tf);
841 
842 	        if(0 == back) {
843 	          if(pl->ts > (pr->ts + 1.0e-6)) {
844 	            back = 1;
845 	          } else {
846 	            if(pl->ts < (pr->ts - 1.0e-6)) {
847 		      back = -1;
848 		    }
849 	          }
850 	        }
851 	      } else {
852 	        back = 1;
853 	      }
854 	    } else {
855 	      if((pr->flags) & DK3_SVG_FLAGS_PS_FONT) {
856 	        back = -1;
857 	      } else {
858 	        back = f2lsvgst_compare_int(pl->tf, pr->tf);
859 
860 		if(0 == back) {
861 	          if(pl->ts > (pr->ts + 1.0e-6)) {
862 	            back = 1;
863 	          } else {
864 	            if(pl->ts < (pr->ts - 1.0e-6)) {
865 		      back = -1;
866 		    }
867 	          }
868 		}
869 	      }
870 	    }
871 	  } else {
872 	    back = 1;
873 	  }
874 	} else {
875 	  if((pr->flags) & DK3_SVG_FLAGS_FONT) {
876 	    back = -1;
877 	  }
878 	}
879       }
880       /*	Text align.
881       */
882       if(0 == back) {
883         if((pl->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) {
884 	  if((pr->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) {
885 	    back = f2lsvgst_compare_int(pl->al, pr->al);
886 
887 	  } else {
888 	    back = 1;
889 	  }
890 	} else {
891 	  if((pr->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) {
892 	    back = -1;
893 	  }
894 	}
895       }
896     } else {
897       back = 1;
898     }
899   } else {
900     if(r) {
901       back = -1;
902     }
903   }
904   return back;
905 }
906 
907 
908 
909 void
f2lsvgst_pattern_delete(f2l_svg_fill_pattern_t * pa)910 f2lsvgst_pattern_delete(f2l_svg_fill_pattern_t *pa)
911 {
912 
913   if(pa) {
914 
915   }
916   dk3_delete(pa);
917 
918 }
919 
920 
921 
922 f2l_svg_fill_pattern_t *
f2lsvgst_pattern_new(f2l_svg_t * psvg)923 f2lsvgst_pattern_new(f2l_svg_t *psvg)
924 {
925   f2l_svg_fill_pattern_t	*back	= NULL;
926 
927   if(psvg) {
928     back = dk3_new(f2l_svg_fill_pattern_t,1);
929     if(back) {
930       back->pn = 0UL;
931       back->fn = 0;
932       back->sr = 0; back->sg = 0; back->sb = 0;
933       back->fr = 0; back->fg = 0; back->fb = 0;
934     } else {
935       psvg->ec = DK3_ERROR_MEMORY;
936     }
937   }
938   return back;
939 }
940 
941 
942 
943 void
f2lsvgst_style_initialize(f2l_svg_style_t * st)944 f2lsvgst_style_initialize(f2l_svg_style_t *st)
945 {
946 
947   if(st) {
948     /*	2013-01-25: Same order as in typedef makes completeness checking easier.
949     */
950     st->fp = NULL;
951     st->ts = 0.0;
952     st->lw = 0.0;
953     st->lsv = 0.0;
954     st->sn = 0UL;
955     st->tf = 0;
956     st->flags = 0;
957     st->sr = 0; st->sg = 0; st->sb = 0;
958     st->fr = 0; st->fg = 0; st->fb = 0;
959     st->ls = 0;
960     st->al = 0;
961     st->lc = 0;
962     st->lj = 0;
963   }
964 }
965 
966 
967 #if 0
968 /**	Report style contents.
969 	@param	pst	SVG style to report.
970 */
971 static
972 void
973 f2lsvgst_style_report(f2l_svg_style_t	*pst)
974 {
975   FILE		*tf;
976   tf = dktrace_file();
977   if(tf) {
978     if((pst->flags) & DK3_SVG_FLAGS_COLOR_STROKE) {
979       fprintf(tf, "Stroke: #%02X%02X%02X\n", pst->sr, pst->sg, pst->sb);
980     }
981     if((pst->flags) & DK3_SVG_FLAGS_LINEWIDTH) {
982       fprintf(tf, "Line width: %g\n", pst->lw);
983     }
984     if((pst->flags) & DK3_SVG_FLAGS_LINESTYLE) {
985       fprintf(tf, "Line style: %d %g\n", pst->ls, pst->lsv);
986     }
987     if((pst->flags) & DK3_SVG_FLAGS_LINE_CAP) {
988       fprintf(tf, "Line   cap: %d\n", pst->lc);
989     }
990     if((pst->flags) & DK3_SVG_FLAGS_LINE_JOIN) {
991       fprintf(tf, "Line  join: %d\n", pst->lj);
992     }
993     if(pst->fp) {
994       fprintf(tf, "Fill: pattern\n");
995     } else {
996       if((pst->flags) & DK3_SVG_FLAGS_COLOR_FILL) {
997         fprintf(tf, "Fill: #%02X%02X%02X", pst->fr, pst->fg, pst->fb);
998       }
999     }
1000     if((pst->flags) & DK3_SVG_FLAGS_FONT) {
1001       fprintf(tf, "Font:  PS=%d  NUMBER=%d  SIZE=%g\n", (((pst->flags) & DK3_SVG_FLAGS_PS_FONT) ? 1 : 0), pst->tf, pst->ts);
1002     }
1003     if((pst->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) {
1004       fprintf(tf, "Text align: %d\n", pst->al);
1005     }
1006   }
1007 }
1008 #endif
1009 
1010 
1011 void
f2lsvgst_style_delete(f2l_svg_style_t * st)1012 f2lsvgst_style_delete(f2l_svg_style_t *st)
1013 {
1014 
1015   if(st) {
1016     f2lsvgst_style_initialize(st);
1017     dk3_delete(st);
1018   }
1019 }
1020 
1021 
1022 
1023 f2l_svg_style_t *
f2lsvgst_style_new(f2l_svg_t * psvg)1024 f2lsvgst_style_new(f2l_svg_t *psvg)
1025 {
1026   f2l_svg_style_t	*back	= NULL;
1027 
1028   if(psvg) {
1029     back = dk3_new(f2l_svg_style_t,1);
1030     if(back) {
1031       f2lsvgst_style_initialize(back);
1032     } else {
1033       psvg->ec = DK3_ERROR_MEMORY;
1034     }
1035   }
1036   return back;
1037 }
1038 
1039 
1040 
1041 void
f2lsvgst_delete(f2l_svg_t * psvg)1042 f2lsvgst_delete(f2l_svg_t *psvg)
1043 {
1044   f2l_svg_style_t		*st;
1045   f2l_svg_fill_pattern_t	*pa;
1046 
1047   if(psvg) {
1048     dk3_release(psvg->psFontsUsed);
1049     if(psvg->sStyles) {
1050       if(psvg->iStyles) {
1051         dk3sto_it_reset(psvg->iStyles);
1052 	while(NULL != (st = (f2l_svg_style_t *)dk3sto_it_next(psvg->iStyles))) {
1053 	  f2lsvgst_style_delete(st);
1054 	}
1055 	dk3sto_it_close(psvg->iStyles);
1056       }
1057       dk3sto_close(psvg->sStyles);
1058     } psvg->sStyles = NULL; psvg->iStyles = NULL;
1059     if(psvg->sPatterns) {
1060       if(psvg->iPatterns) {
1061         dk3sto_it_reset(psvg->iPatterns);
1062 	do {
1063 	  pa = (f2l_svg_fill_pattern_t *)dk3sto_it_next(psvg->iPatterns);
1064 	  if(pa) {
1065 	    f2lsvgst_pattern_delete(pa);
1066 	  }
1067 	} while(pa);
1068 	dk3sto_it_close(psvg->iPatterns);
1069       }
1070       dk3sto_close(psvg->sPatterns);
1071     } psvg->sPatterns = NULL; psvg->iPatterns = NULL;
1072     dk3_delete(psvg);
1073   }
1074 }
1075 
1076 
1077 
1078 f2l_svg_t *
f2lsvgst_new_app(dk3_app_t * app)1079 f2lsvgst_new_app(dk3_app_t *app)
1080 {
1081   f2l_svg_t		*back	= NULL;
1082   size_t		 i;
1083   int			 ok	= 0;
1084 
1085   back = dk3_new_app(f2l_svg_t,1,app);
1086   if(back) {
1087     back->sPatterns = NULL;
1088     back->iPatterns = NULL;
1089     back->sStyles = NULL;
1090     back->iStyles = NULL;
1091     back->nPatterns = 0UL;
1092     back->nStyles = 0UL;
1093     back->psFontsUsed = NULL;
1094     back->ec = 0;
1095     back->sPatterns = dk3sto_open_app(app);
1096     if(back->sPatterns) {
1097       dk3sto_set_comp(back->sPatterns, f2lsvgst_compare_pattern, 0);
1098       back->iPatterns = dk3sto_it_open(back->sPatterns);
1099       if(back->iPatterns) {
1100         back->sStyles = dk3sto_open_app(app);
1101 	if(back->sStyles) {
1102 	  dk3sto_set_comp(back->sStyles, f2lsvgst_compare_object_styles, 0);
1103 	  back->iStyles = dk3sto_it_open(back->sStyles);
1104 	  if(back->iStyles) {
1105 	    back->psFontsUsed = dk3_new_app(int,35,app);
1106 	    if(back) {
1107 	      for(i = 0; i < 35; i++) { (back->psFontsUsed)[i] = 0; }
1108 	      ok = 1;
1109 	    }
1110 	  }
1111 	}
1112       }
1113     }
1114     if(!(ok)) {
1115       f2lsvgst_delete(back);
1116       back = NULL;
1117     }
1118   }
1119   return back;
1120 }
1121 
1122 
1123 
1124 int
f2lsvgst_get_error_code(f2l_svg_t * psvg)1125 f2lsvgst_get_error_code(f2l_svg_t *psvg)
1126 {
1127   int		 back = 0;
1128   if(psvg) {
1129     back = psvg->ec;
1130     psvg->ec = 0;
1131   }
1132   return back;
1133 }
1134 
1135 
1136 f2l_svg_fill_pattern_t *
f2lsvgst_pattern_add(f2l_svg_t * psvg,f2l_svg_fill_pattern_t * src)1137 f2lsvgst_pattern_add(f2l_svg_t *psvg, f2l_svg_fill_pattern_t *src)
1138 {
1139   f2l_svg_fill_pattern_t	*back = NULL;
1140 
1141   if((psvg) && (src)) {
1142     back = (f2l_svg_fill_pattern_t *)dk3sto_it_find_like(
1143       psvg->iPatterns, (void *)src, 0
1144     );
1145     if(!(back)) {
1146       if(0UL != (1UL + psvg->nPatterns)) {
1147         back = f2lsvgst_pattern_new(psvg);
1148         if(back) {
1149           dk3mem_cpy((void *)back, (void *)src, sizeof(f2l_svg_fill_pattern_t));
1150 	  if(dk3sto_add(psvg->sPatterns, (void *)back)) {
1151 	    back->pn = psvg->nPatterns;
1152 	    psvg->nPatterns += 1UL;
1153 	  } else {
1154 	    f2lsvgst_pattern_delete(back);
1155 	    back = NULL;
1156 	  }
1157         }
1158       } else {
1159         psvg->ec = DK3_ERROR_MATH_OVERFLOW;
1160       }
1161     }
1162   }
1163   return  back;
1164 }
1165 
1166 
1167 
1168 f2l_svg_style_t *
f2lsvgst_style_add(f2l_svg_t * psvg,f2l_svg_style_t * src)1169 f2lsvgst_style_add(f2l_svg_t *psvg, f2l_svg_style_t *src)
1170 {
1171   f2l_svg_style_t		*back = NULL;
1172 
1173   if((psvg) && (src)) {
1174     back = (f2l_svg_style_t *)dk3sto_it_find_like(
1175       psvg->iStyles, (void *)src, 0
1176     );
1177     if(!(back)) {
1178       if(0UL != (1UL + psvg->nStyles)) {
1179         back = f2lsvgst_style_new(psvg);
1180         if(back) {
1181           dk3mem_cpy((void *)back, (void *)src, sizeof(f2l_svg_style_t));
1182 	  if(dk3sto_add(psvg->sStyles, (void *)back)) {
1183 	    back->sn = psvg->nStyles;
1184 	    psvg->nStyles += 1UL;
1185 	  } else {
1186 	    f2lsvgst_style_delete(back);
1187 	    back = NULL;
1188 	  }
1189         } else {
1190 	}
1191       } else {
1192         psvg->ec = DK3_ERROR_MATH_OVERFLOW;
1193       }
1194     } else {
1195     }
1196   }
1197   return back;
1198 }
1199 
1200 
1201 
1202 int
f2lsvgst_style_set_pattern(f2l_svg_t * psvg,f2l_svg_style_t * pst,f2l_svg_fill_pattern_t * ppat)1203 f2lsvgst_style_set_pattern(
1204   f2l_svg_t			*psvg,
1205   f2l_svg_style_t		*pst,
1206   f2l_svg_fill_pattern_t	*ppat
1207 )
1208 {
1209   int				 back = 0;
1210 
1211   if((psvg) && (pst) && (ppat)) {
1212     if(!(pst->fp)) {
1213       pst->fp = f2lsvgst_pattern_add(psvg, ppat);
1214       if(pst->fp) {
1215         back = 1;
1216       }
1217     }
1218   }
1219   return back;
1220 }
1221 
1222 
1223 
1224 void
f2lsvgst_style_set_text(f2l_svg_t * psvg,f2l_svg_style_t * pst,int ps,int tf,double ts)1225 f2lsvgst_style_set_text(
1226   f2l_svg_t		*psvg,
1227   f2l_svg_style_t	*pst,
1228   int			 ps,
1229   int			 tf,
1230   double		 ts
1231 )
1232 {
1233 
1234   if(pst) {
1235     pst->tf = tf;
1236     pst->ts = ts;
1237     pst->flags |= (DK3_SVG_FLAGS_FONT);
1238     if(ps) {
1239       pst->flags |= (DK3_SVG_FLAGS_PS_FONT);
1240     } else {
1241       pst->flags &= (~(DK3_SVG_FLAGS_PS_FONT));
1242     }
1243   }
1244   if((psvg) && (ps)) {
1245     if((0 <= tf) && (tf < 35)) {
1246       (psvg->psFontsUsed)[tf] = 1;
1247     }
1248   }
1249 }
1250 
1251 
1252 
1253 void
f2lsvgst_style_set_line_width(f2l_svg_style_t * pst,double lw)1254 f2lsvgst_style_set_line_width(
1255   f2l_svg_style_t	*pst,
1256   double		 lw
1257 )
1258 {
1259 
1260   if(pst) {
1261     pst->lw = lw;
1262     pst->flags |= (DK3_SVG_FLAGS_LINEWIDTH);
1263   }
1264 }
1265 
1266 
1267 
1268 void
f2lsvgst_style_set_line_style(f2l_svg_style_t * pst,int ls,double lsv)1269 f2lsvgst_style_set_line_style(
1270   f2l_svg_style_t		*pst,
1271   int				 ls,
1272   double			 lsv
1273 )
1274 {
1275 
1276   if(pst) {
1277     pst->ls = ls; pst->lsv = lsv;
1278     pst->flags|= (DK3_SVG_FLAGS_LINESTYLE);
1279   }
1280 }
1281 
1282 
1283 
1284 void
f2lsvgst_style_set_line_color(f2l_svg_style_t * pst,int r,int g,int b)1285 f2lsvgst_style_set_line_color(
1286   f2l_svg_style_t		*pst,
1287   int				 r,
1288   int				 g,
1289   int				 b
1290 )
1291 {
1292 
1293   if(pst) {
1294     pst->sr = r; pst->sg = g; pst->sb = b;
1295     pst->flags |= (DK3_SVG_FLAGS_COLOR_STROKE);
1296   }
1297 }
1298 
1299 
1300 
1301 void
f2lsvgst_style_set_fill_color(f2l_svg_style_t * pst,int r,int g,int b)1302 f2lsvgst_style_set_fill_color(
1303   f2l_svg_style_t		*pst,
1304   int				 r,
1305   int				 g,
1306   int				 b
1307 )
1308 {
1309 
1310   if(pst) {
1311     pst->fr = r; pst->fg = g; pst->fb = b;
1312     pst->flags |= (DK3_SVG_FLAGS_COLOR_FILL);
1313   }
1314 }
1315 
1316 
1317 
1318 int
f2lsvgst_any_ps_font_used(f2l_svg_t * psvg)1319 f2lsvgst_any_ps_font_used(f2l_svg_t *psvg)
1320 {
1321   size_t	 i;
1322   int		 back = 0;
1323   for(i = 0; i < 35; i++) {
1324     if((psvg->psFontsUsed)[i]) {
1325       back = 1;
1326     }
1327   }
1328   return back;
1329 }
1330 
1331 
1332 
1333 void
f2lsvgst_style_set_text_align(f2l_svg_style_t * pst,int al)1334 f2lsvgst_style_set_text_align(f2l_svg_style_t *pst, int al)
1335 {
1336   if(pst) {
1337     pst->al = al;
1338     pst->flags |= (DK3_SVG_FLAGS_TEXT_ALIGN);
1339   }
1340 }
1341 
1342 
1343 
1344 void
f2lsvgst_style_set_text_line_cap(f2l_svg_style_t * pst,int lc)1345 f2lsvgst_style_set_text_line_cap(f2l_svg_style_t *pst, int lc)
1346 {
1347   if(pst) {
1348     pst->lc = lc;
1349     pst->flags |= (DK3_SVG_FLAGS_LINE_CAP);
1350   }
1351 }
1352 
1353 
1354 
1355 void
f2lsvgst_style_set_text_line_join(f2l_svg_style_t * pst,int lj)1356 f2lsvgst_style_set_text_line_join(f2l_svg_style_t *pst, int lj)
1357 {
1358   if(pst) {
1359     pst->lj = lj;
1360     pst->flags |= (DK3_SVG_FLAGS_LINE_JOIN);
1361   }
1362 }
1363 
1364 
1365 
1366 /**	Write one tag name, either with or without svg: prefix.
1367 	@param	job	Job structure.
1368 	@param	ind	Index of tag name in f2lsvgst_c8_kw.
1369 */
1370 static
1371 void
f2lsvgst_tag(f2l_job_t * job,size_t ind)1372 f2lsvgst_tag(
1373   f2l_job_t		*job,
1374   size_t		 ind
1375 )
1376 {
1377   if(job->fragment) {
1378     fputs(f2lsvgst_c8_kw[1], job->of1);
1379   }
1380   fputs(f2lsvgst_c8_kw[ind], job->of1);
1381 }
1382 
1383 
1384 
1385 /**	Write a number as string.
1386 	@param	job	Job structure.
1387 	@param	current	Current value.
1388 	@param	max	Maximum value.
1389 */
1390 static
1391 void
f2lsvgst_write_id(f2l_job_t * job,unsigned long current,unsigned long max)1392 f2lsvgst_write_id(
1393   f2l_job_t		*job,
1394   unsigned long		 current,
1395   unsigned long		 max
1396 )
1397 {
1398   char		 buf[128];
1399   char		*ptr;
1400   size_t	 maxlgt;
1401   size_t	 lgt;
1402   size_t	 i;
1403 
1404   sprintf(buf, "%lu", max);
1405   maxlgt = strlen(buf);
1406   sprintf(buf, "%lu", current);
1407   lgt = strlen(buf);
1408   for(i = lgt; i < maxlgt; i++) {
1409     fputc('A', job->of1);
1410   }
1411   ptr = buf;
1412   while(*ptr) {
1413     switch(*ptr) {
1414       case '0': { *ptr = 'A'; } break;
1415       case '1': { *ptr = 'B'; } break;
1416       case '2': { *ptr = 'C'; } break;
1417       case '3': { *ptr = 'D'; } break;
1418       case '4': { *ptr = 'E'; } break;
1419       case '5': { *ptr = 'F'; } break;
1420       case '6': { *ptr = 'G'; } break;
1421       case '7': { *ptr = 'H'; } break;
1422       case '8': { *ptr = 'I'; } break;
1423       case '9': { *ptr = 'J'; } break;
1424     }
1425     ptr++;
1426   }
1427   fputs(buf, job->of1);
1428 }
1429 
1430 
1431 
1432 /**	Write pattern ID.
1433 	@param	job	Job structure.
1434 	@param	psvg	SVG style collection.
1435 	@param	pat	Pattern used for current object.
1436 */
1437 static
1438 void
f2lsvgst_write_pattern_id(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)1439 f2lsvgst_write_pattern_id(
1440   f2l_job_t			*job,
1441   f2l_svg_t			*psvg,
1442   f2l_svg_fill_pattern_t	*pat
1443 )
1444 {
1445 
1446   fputs(f2lsvgst_c8_kw[8], job->of1);
1447   f2lsvgst_write_id(job, pat->pn, psvg->nPatterns);
1448 
1449 }
1450 
1451 
1452 
1453 /**	Write style ID.
1454 	@param	job	Job structure.
1455 	@param	psvg	SVG style collection.
1456 	@param	pst	Style used by current object.
1457 */
1458 static
1459 void
f2lsvgst_write_style_id(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_style_t * pst)1460 f2lsvgst_write_style_id(
1461   f2l_job_t			*job,
1462   f2l_svg_t			*psvg,
1463   f2l_svg_style_t		*pst
1464 )
1465 {
1466 
1467   fputs(f2lsvgst_c8_kw[111], job->of1);
1468   f2lsvgst_write_id(job, pst->sn, psvg->nStyles);
1469 
1470 }
1471 
1472 
1473 /**	Write opening pattern tag.
1474 	@param	job	Job structure.
1475 	@param	psvg	SVG style collection.
1476 	@param	pat	Pattern to write.
1477 	@param	w	Pattern width.
1478 	@param	h	Pattern height.
1479 */
1480 static
1481 void
f2lsvgst_write_opening_pattern_tag(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat,double w,double h)1482 f2lsvgst_write_opening_pattern_tag(
1483   f2l_job_t			*job,
1484   f2l_svg_t			*psvg,
1485   f2l_svg_fill_pattern_t	*pat,
1486   double			 w,
1487   double			 h
1488 )
1489 {
1490   fputs(f2lsvgst_c8_kw[6], job->of1);
1491   f2lsvgst_tag(job, 3);
1492   fputs(f2lsvgst_c8_kw[7], job->of1);
1493   f2lsvgst_write_pattern_id(job, psvg, pat);
1494   fprintf(job->of1, f2lsvgst_c8_kw[9], w, h);
1495 }
1496 
1497 
1498 
1499 /**	Write opening pattern tag.
1500 	@param	job	Job structure.
1501 	@param	pat	Pattern to write.
1502 	@param	w	Pattern width.
1503 	@param	h	Pattern height.
1504 */
1505 static
1506 void
f2lsvgst_pattern_background(f2l_job_t * job,f2l_svg_fill_pattern_t * pat,double w,double h)1507 f2lsvgst_pattern_background(
1508   f2l_job_t			*job,
1509   f2l_svg_fill_pattern_t	*pat,
1510   double			 w,
1511   double			 h
1512 )
1513 {
1514   fputs(f2lsvgst_c8_kw[6], job->of1);
1515   f2lsvgst_tag(job, 10);
1516   fprintf(job->of1, f2lsvgst_c8_kw[11], w, h);
1517   fprintf(job->of1, f2lsvgst_c8_kw[12], pat->fr, pat->fg, pat->fb);
1518   fputs(f2lsvgst_c8_kw[13], job->of1);
1519 }
1520 
1521 
1522 
1523 /**	Draw foreground line in pattern.
1524 	@param	job	Job structure.
1525 	@param	pat	Pattern to write.
1526 	@param	ind	Index of points line in f2lsvgst_c8_kw.
1527 */
1528 static
1529 void
f2lsvgst_pattern_foreground_line(f2l_job_t * job,f2l_svg_fill_pattern_t * pat,size_t ind)1530 f2lsvgst_pattern_foreground_line(
1531   f2l_job_t			*job,
1532   f2l_svg_fill_pattern_t	*pat,
1533   size_t			 ind
1534 )
1535 {
1536   fputs(f2lsvgst_c8_kw[6], job->of1);
1537   f2lsvgst_tag(job, 18);
1538   fprintf(job->of1, f2lsvgst_c8_kw[14], pat->sr, pat->sg, pat->sb);
1539   fputs(f2lsvgst_c8_kw[ind], job->of1);
1540   fputs(f2lsvgst_c8_kw[0], job->of1);
1541   fputs(f2lsvgst_c8_kw[13], job->of1);
1542 }
1543 
1544 
1545 
1546 /**	Draw foreground line in pattern.
1547 	@param	job	Job structure.
1548 	@param	pat	Pattern to write.
1549 	@param	ind	Index of points line in f2lsvgst_c8_kw.
1550 */
1551 static
1552 void
f2lsvgst_pattern_foreground_line_lcr(f2l_job_t * job,f2l_svg_fill_pattern_t * pat,size_t ind)1553 f2lsvgst_pattern_foreground_line_lcr(
1554   f2l_job_t			*job,
1555   f2l_svg_fill_pattern_t	*pat,
1556   size_t			 ind
1557 )
1558 {
1559   fputs(f2lsvgst_c8_kw[6], job->of1);
1560   f2lsvgst_tag(job, 18);
1561   fputs(f2lsvgst_c8_kw[0], job->of1);
1562   fprintf(job->of1, f2lsvgst_c8_kw[22], pat->sr, pat->sg, pat->sb);
1563   fputs(f2lsvgst_c8_kw[0], job->of1);
1564   fputs(f2lsvgst_c8_kw[ind], job->of1);
1565   fputs(f2lsvgst_c8_kw[0], job->of1);
1566   fputs(f2lsvgst_c8_kw[13], job->of1);
1567 }
1568 
1569 
1570 
1571 /**	Draw foreground polygon in pattern.
1572 	@param	job	Job structure.
1573 	@param	pat	Pattern to write.
1574 	@param	ind	Index of points line in f2lsvgst_c8_kw.
1575 */
1576 static
1577 void
f2lsvgst_pattern_foreground_polygon_lcr(f2l_job_t * job,f2l_svg_fill_pattern_t * pat,size_t ind)1578 f2lsvgst_pattern_foreground_polygon_lcr(
1579   f2l_job_t			*job,
1580   f2l_svg_fill_pattern_t	*pat,
1581   size_t			 ind
1582 )
1583 {
1584   fputs(f2lsvgst_c8_kw[6], job->of1);
1585   f2lsvgst_tag(job, 51);
1586   fputs(f2lsvgst_c8_kw[0], job->of1);
1587   fprintf(job->of1, f2lsvgst_c8_kw[22], pat->sr, pat->sg, pat->sb);
1588   fputs(f2lsvgst_c8_kw[0], job->of1);
1589   fputs(f2lsvgst_c8_kw[ind], job->of1);
1590   fputs(f2lsvgst_c8_kw[0], job->of1);
1591   fputs(f2lsvgst_c8_kw[13], job->of1);
1592 }
1593 
1594 
1595 
1596 /**	Draw foreground polygon in pattern, 2 data lines.
1597 	@param	job	Job structure.
1598 	@param	pat	Pattern to write.
1599 	@param	i1	Index of points line in f2lsvgst_c8_kw.
1600 	@param	i2	Index of points line 2.
1601 */
1602 static
1603 void
f2lsvgst_pattern_foreground_polygon_lcr_l2(f2l_job_t * job,f2l_svg_fill_pattern_t * pat,size_t i1,size_t i2)1604 f2lsvgst_pattern_foreground_polygon_lcr_l2(
1605   f2l_job_t			*job,
1606   f2l_svg_fill_pattern_t	*pat,
1607   size_t			 i1,
1608   size_t			 i2
1609 )
1610 {
1611   fputs(f2lsvgst_c8_kw[6], job->of1);
1612   f2lsvgst_tag(job, 51);
1613   fputs(f2lsvgst_c8_kw[0], job->of1);
1614   fprintf(job->of1, f2lsvgst_c8_kw[22], pat->sr, pat->sg, pat->sb);
1615   fputs(f2lsvgst_c8_kw[0], job->of1);
1616   fputs(f2lsvgst_c8_kw[i1], job->of1);
1617   fputs(f2lsvgst_c8_kw[0], job->of1);
1618   fputs(f2lsvgst_c8_kw[i2], job->of1);
1619   fputs(f2lsvgst_c8_kw[0], job->of1);
1620   fputs(f2lsvgst_c8_kw[13], job->of1);
1621 }
1622 
1623 
1624 
1625 /**	Draw foreground path in pattern
1626 	@param	job	Job structure.
1627 	@param	pat	Pattern to write.
1628 	@param	ind	Index of data line in f2lsvgst_c8_kw.
1629 */
1630 static
1631 void
f2lsvgst_pattern_foreground_path_lcr(f2l_job_t * job,f2l_svg_fill_pattern_t * pat,size_t ind)1632 f2lsvgst_pattern_foreground_path_lcr(
1633   f2l_job_t			*job,
1634   f2l_svg_fill_pattern_t	*pat,
1635   size_t			 ind
1636 )
1637 {
1638   fputs(f2lsvgst_c8_kw[6], job->of1);
1639   f2lsvgst_tag(job, 89);
1640   fputs(f2lsvgst_c8_kw[0], job->of1);
1641   fprintf(job->of1, f2lsvgst_c8_kw[22], pat->sr, pat->sg, pat->sb);
1642   fputs(f2lsvgst_c8_kw[0], job->of1);
1643   fputs(f2lsvgst_c8_kw[ind], job->of1);
1644   fputs(f2lsvgst_c8_kw[0], job->of1);
1645   fputs(f2lsvgst_c8_kw[13], job->of1);
1646 }
1647 
1648 
1649 
1650 /**	Draw foreground circle in pattern
1651 	@param	job	Job structure.
1652 	@param	pat	Pattern to write.
1653 */
1654 static
1655 void
f2lsvgst_pattern_foreground_circle_lcr(f2l_job_t * job,f2l_svg_fill_pattern_t * pat)1656 f2lsvgst_pattern_foreground_circle_lcr(
1657   f2l_job_t			*job,
1658   f2l_svg_fill_pattern_t	*pat
1659 )
1660 {
1661   fputs(f2lsvgst_c8_kw[6], job->of1);
1662   f2lsvgst_tag(job, 100);
1663   fputs(f2lsvgst_c8_kw[102], job->of1);
1664   fputs(f2lsvgst_c8_kw[0], job->of1);
1665   fprintf(job->of1, f2lsvgst_c8_kw[101], pat->sr, pat->sg, pat->sb);
1666   fputs(f2lsvgst_c8_kw[0], job->of1);
1667   fputs(f2lsvgst_c8_kw[13], job->of1);
1668 }
1669 
1670 
1671 
1672 /**	Write pattern 41 definition to SVG output file.
1673 	@param	job	Job structure.
1674 	@param	psvg	SVG style collection.
1675 	@param	pat	Pattern to write.
1676 */
1677 static
1678 void
f2lsvgst_pattern_41(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)1679 f2lsvgst_pattern_41(
1680   f2l_job_t			*job,
1681   f2l_svg_t			*psvg,
1682   f2l_svg_fill_pattern_t	*pat
1683 )
1684 {
1685   /*	Opening pattern tag.
1686   */
1687   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 7.2, 4.16);
1688   /*	Pattern contents 1: background.
1689   */
1690   f2lsvgst_pattern_background(job, pat, 7.2, 4.16);
1691   /*	Pattern contents 2: lines.
1692   */
1693   f2lsvgst_pattern_foreground_line(job, pat, 15);
1694   f2lsvgst_pattern_foreground_line(job, pat, 16);
1695   f2lsvgst_pattern_foreground_line(job, pat, 17);
1696   /*	Close pattern tag.
1697   */
1698   fputs(f2lsvgst_c8_kw[6], job->of1);
1699   fputs(f2lsvgst_c8_kw[4], job->of1);
1700   f2lsvgst_tag(job, 3);
1701   fputs(f2lsvgst_c8_kw[5], job->of1);
1702   fputs(f2lsvgst_c8_kw[0], job->of1);
1703 }
1704 
1705 
1706 
1707 /**	Write pattern 42 definition to SVG output file.
1708 	@param	job	Job structure.
1709 	@param	psvg	SVG style collection.
1710 	@param	pat	Pattern to write.
1711 */
1712 static
1713 void
f2lsvgst_pattern_42(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)1714 f2lsvgst_pattern_42(
1715   f2l_job_t			*job,
1716   f2l_svg_t			*psvg,
1717   f2l_svg_fill_pattern_t	*pat
1718 )
1719 {
1720   /*	Opening pattern tag.
1721   */
1722   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 7.2, 4.16);
1723   /*	Pattern contents 1: background.
1724   */
1725   f2lsvgst_pattern_background(job, pat, 7.2, 4.16);
1726   /*	Pattern contents 2: lines.
1727   */
1728   f2lsvgst_pattern_foreground_line(job, pat, 19);
1729   f2lsvgst_pattern_foreground_line(job, pat, 20);
1730   f2lsvgst_pattern_foreground_line(job, pat, 21);
1731   /*	Close pattern tag.
1732   */
1733   fputs(f2lsvgst_c8_kw[6], job->of1);
1734   fputs(f2lsvgst_c8_kw[4], job->of1);
1735   f2lsvgst_tag(job, 3);
1736   fputs(f2lsvgst_c8_kw[5], job->of1);
1737   fputs(f2lsvgst_c8_kw[0], job->of1);
1738 }
1739 
1740 
1741 
1742 /**	Write pattern 43 definition to SVG output file.
1743 	@param	job	Job structure.
1744 	@param	psvg	SVG style collection.
1745 	@param	pat	Pattern to write.
1746 */
1747 static
1748 void
f2lsvgst_pattern_43(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)1749 f2lsvgst_pattern_43(
1750   f2l_job_t			*job,
1751   f2l_svg_t			*psvg,
1752   f2l_svg_fill_pattern_t	*pat
1753 )
1754 {
1755   /*	Opening pattern tag.
1756   */
1757   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 7.2, 4.16);
1758   /*	Pattern contents 1: background.
1759   */
1760   f2lsvgst_pattern_background(job, pat, 7.2, 4.16);
1761   /*	Pattern contents 2: lines.
1762   */
1763 #if 1
1764   f2lsvgst_pattern_foreground_line_lcr(job, pat, 23);
1765   f2lsvgst_pattern_foreground_line_lcr(job, pat, 24);
1766 #else
1767   f2lsvgst_pattern_foreground_line(job, pat, 15);
1768   f2lsvgst_pattern_foreground_line(job, pat, 16);
1769   f2lsvgst_pattern_foreground_line(job, pat, 17);
1770   f2lsvgst_pattern_foreground_line(job, pat, 19);
1771   f2lsvgst_pattern_foreground_line(job, pat, 20);
1772   f2lsvgst_pattern_foreground_line(job, pat, 21);
1773 #endif
1774   /*	Close pattern tag.
1775   */
1776   fputs(f2lsvgst_c8_kw[6], job->of1);
1777   fputs(f2lsvgst_c8_kw[4], job->of1);
1778   f2lsvgst_tag(job, 3);
1779   fputs(f2lsvgst_c8_kw[5], job->of1);
1780   fputs(f2lsvgst_c8_kw[0], job->of1);
1781 }
1782 
1783 
1784 
1785 /**	Write pattern 44 definition to SVG output file.
1786 	@param	job	Job structure.
1787 	@param	psvg	SVG style collection.
1788 	@param	pat	Pattern to write.
1789 */
1790 static
1791 void
f2lsvgst_pattern_44(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)1792 f2lsvgst_pattern_44(
1793   f2l_job_t			*job,
1794   f2l_svg_t			*psvg,
1795   f2l_svg_fill_pattern_t	*pat
1796 )
1797 {
1798   /*	Opening pattern tag.
1799   */
1800   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 10.18, 10.18);
1801   /*	Pattern contents 1: background.
1802   */
1803   f2lsvgst_pattern_background(job, pat, 10.18, 10.18);
1804   /*	Pattern contents 2: lines.
1805   */
1806   f2lsvgst_pattern_foreground_line(job, pat, 25);
1807   f2lsvgst_pattern_foreground_line(job, pat, 26);
1808   f2lsvgst_pattern_foreground_line(job, pat, 27);
1809   /*	Close pattern tag.
1810   */
1811   fputs(f2lsvgst_c8_kw[6], job->of1);
1812   fputs(f2lsvgst_c8_kw[4], job->of1);
1813   f2lsvgst_tag(job, 3);
1814   fputs(f2lsvgst_c8_kw[5], job->of1);
1815   fputs(f2lsvgst_c8_kw[0], job->of1);
1816 }
1817 
1818 
1819 
1820 /**	Write pattern 45 definition to SVG output file.
1821 	@param	job	Job structure.
1822 	@param	psvg	SVG style collection.
1823 	@param	pat	Pattern to write.
1824 */
1825 static
1826 void
f2lsvgst_pattern_45(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)1827 f2lsvgst_pattern_45(
1828   f2l_job_t			*job,
1829   f2l_svg_t			*psvg,
1830   f2l_svg_fill_pattern_t	*pat
1831 )
1832 {
1833   /*	Opening pattern tag.
1834   */
1835   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 10.18, 10.18);
1836   /*	Pattern contents 1: background.
1837   */
1838   f2lsvgst_pattern_background(job, pat, 10.18, 10.18);
1839   /*	Pattern contents 2: lines.
1840   */
1841   f2lsvgst_pattern_foreground_line(job, pat, 28);
1842   f2lsvgst_pattern_foreground_line(job, pat, 29);
1843   f2lsvgst_pattern_foreground_line(job, pat, 30);
1844   /*	Close pattern tag.
1845   */
1846   fputs(f2lsvgst_c8_kw[6], job->of1);
1847   fputs(f2lsvgst_c8_kw[4], job->of1);
1848   f2lsvgst_tag(job, 3);
1849   fputs(f2lsvgst_c8_kw[5], job->of1);
1850   fputs(f2lsvgst_c8_kw[0], job->of1);
1851 }
1852 
1853 
1854 
1855 /**	Write pattern 46 definition to SVG output file.
1856 	@param	job	Job structure.
1857 	@param	psvg	SVG style collection.
1858 	@param	pat	Pattern to write.
1859 */
1860 static
1861 void
f2lsvgst_pattern_46(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)1862 f2lsvgst_pattern_46(
1863   f2l_job_t			*job,
1864   f2l_svg_t			*psvg,
1865   f2l_svg_fill_pattern_t	*pat
1866 )
1867 {
1868   /*	Opening pattern tag.
1869   */
1870   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 10.18, 10.18);
1871   /*	Pattern contents 1: background.
1872   */
1873   f2lsvgst_pattern_background(job, pat, 10.18, 10.18);
1874   /*	Pattern contents 2: lines.
1875   */
1876 #if 1
1877   f2lsvgst_pattern_foreground_line_lcr(job, pat, 31);
1878   f2lsvgst_pattern_foreground_line_lcr(job, pat, 32);
1879 #else
1880   f2lsvgst_pattern_foreground_line(job, pat, 25);
1881   f2lsvgst_pattern_foreground_line(job, pat, 26);
1882   f2lsvgst_pattern_foreground_line(job, pat, 27);
1883   f2lsvgst_pattern_foreground_line(job, pat, 28);
1884   f2lsvgst_pattern_foreground_line(job, pat, 29);
1885   f2lsvgst_pattern_foreground_line(job, pat, 30);
1886 #endif
1887   /*	Close pattern tag.
1888   */
1889   fputs(f2lsvgst_c8_kw[6], job->of1);
1890   fputs(f2lsvgst_c8_kw[4], job->of1);
1891   f2lsvgst_tag(job, 3);
1892   fputs(f2lsvgst_c8_kw[5], job->of1);
1893   fputs(f2lsvgst_c8_kw[0], job->of1);
1894 }
1895 
1896 
1897 
1898 /**	Write pattern 47 definition to SVG output file.
1899 	@param	job	Job structure.
1900 	@param	psvg	SVG style collection.
1901 	@param	pat	Pattern to write.
1902 */
1903 static
1904 void
f2lsvgst_pattern_47(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)1905 f2lsvgst_pattern_47(
1906   f2l_job_t			*job,
1907   f2l_svg_t			*psvg,
1908   f2l_svg_fill_pattern_t	*pat
1909 )
1910 {
1911   /*	Opening pattern tag.
1912   */
1913   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 28.8, 14.4);
1914   /*	Pattern contents 1: background.
1915   */
1916   f2lsvgst_pattern_background(job, pat, 28.8, 14.4);
1917   /*	Pattern contents 2: lines.
1918   */
1919   f2lsvgst_pattern_foreground_line_lcr(job, pat, 33);
1920   f2lsvgst_pattern_foreground_line_lcr(job, pat, 34);
1921   f2lsvgst_pattern_foreground_line_lcr(job, pat, 35);
1922   f2lsvgst_pattern_foreground_line_lcr(job, pat, 36);
1923   f2lsvgst_pattern_foreground_line_lcr(job, pat, 37);
1924   f2lsvgst_pattern_foreground_line_lcr(job, pat, 38);
1925   f2lsvgst_pattern_foreground_line_lcr(job, pat, 39);
1926   /*	Close pattern tag.
1927   */
1928   fputs(f2lsvgst_c8_kw[6], job->of1);
1929   fputs(f2lsvgst_c8_kw[4], job->of1);
1930   f2lsvgst_tag(job, 3);
1931   fputs(f2lsvgst_c8_kw[5], job->of1);
1932   fputs(f2lsvgst_c8_kw[0], job->of1);
1933 }
1934 
1935 
1936 
1937 /**	Write pattern 48 definition to SVG output file.
1938 	@param	job	Job structure.
1939 	@param	psvg	SVG style collection.
1940 	@param	pat	Pattern to write.
1941 */
1942 static
1943 void
f2lsvgst_pattern_48(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)1944 f2lsvgst_pattern_48(
1945   f2l_job_t			*job,
1946   f2l_svg_t			*psvg,
1947   f2l_svg_fill_pattern_t	*pat
1948 )
1949 {
1950   /*	Opening pattern tag.
1951   */
1952   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 14.4, 28.8);
1953   /*	Pattern contents 1: background.
1954   */
1955   f2lsvgst_pattern_background(job, pat, 14.4, 28.8);
1956   /*	Pattern contents 2: lines.
1957   */
1958   f2lsvgst_pattern_foreground_line_lcr(job, pat, 40);
1959   f2lsvgst_pattern_foreground_line_lcr(job, pat, 41);
1960   f2lsvgst_pattern_foreground_line_lcr(job, pat, 42);
1961   f2lsvgst_pattern_foreground_line_lcr(job, pat, 43);
1962   f2lsvgst_pattern_foreground_line_lcr(job, pat, 44);
1963   f2lsvgst_pattern_foreground_line_lcr(job, pat, 45);
1964   f2lsvgst_pattern_foreground_line_lcr(job, pat, 46);
1965   /*	Close pattern tag.
1966   */
1967   fputs(f2lsvgst_c8_kw[6], job->of1);
1968   fputs(f2lsvgst_c8_kw[4], job->of1);
1969   f2lsvgst_tag(job, 3);
1970   fputs(f2lsvgst_c8_kw[5], job->of1);
1971   fputs(f2lsvgst_c8_kw[0], job->of1);
1972 }
1973 
1974 
1975 
1976 /**	Write pattern 49 definition to SVG output file.
1977 	@param	job	Job structure.
1978 	@param	psvg	SVG style collection.
1979 	@param	pat	Pattern to write.
1980 */
1981 static
1982 void
f2lsvgst_pattern_49(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)1983 f2lsvgst_pattern_49(
1984   f2l_job_t			*job,
1985   f2l_svg_t			*psvg,
1986   f2l_svg_fill_pattern_t	*pat
1987 )
1988 {
1989   /*	Opening pattern tag.
1990   */
1991   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 3.6, 3.6);
1992   /*	Pattern contents 1: background.
1993   */
1994   f2lsvgst_pattern_background(job, pat, 3.6, 3.6);
1995   /*	Pattern contents 2: lines.
1996   */
1997   f2lsvgst_pattern_foreground_line_lcr(job, pat, 47);
1998   f2lsvgst_pattern_foreground_line_lcr(job, pat, 48);
1999   /*	Close pattern tag.
2000   */
2001   fputs(f2lsvgst_c8_kw[6], job->of1);
2002   fputs(f2lsvgst_c8_kw[4], job->of1);
2003   f2lsvgst_tag(job, 3);
2004   fputs(f2lsvgst_c8_kw[5], job->of1);
2005   fputs(f2lsvgst_c8_kw[0], job->of1);
2006 }
2007 
2008 
2009 
2010 /**	Write pattern 50 definition to SVG output file.
2011 	@param	job	Job structure.
2012 	@param	psvg	SVG style collection.
2013 	@param	pat	Pattern to write.
2014 */
2015 static
2016 void
f2lsvgst_pattern_50(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2017 f2lsvgst_pattern_50(
2018   f2l_job_t			*job,
2019   f2l_svg_t			*psvg,
2020   f2l_svg_fill_pattern_t	*pat
2021 )
2022 {
2023   /*	Opening pattern tag.
2024   */
2025   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 3.6, 3.6);
2026   /*	Pattern contents 1: background.
2027   */
2028   f2lsvgst_pattern_background(job, pat, 3.6, 3.6);
2029   /*	Pattern contents 2: lines.
2030   */
2031   f2lsvgst_pattern_foreground_line_lcr(job, pat, 49);
2032   f2lsvgst_pattern_foreground_line_lcr(job, pat, 50);
2033   /*	Close pattern tag.
2034   */
2035   fputs(f2lsvgst_c8_kw[6], job->of1);
2036   fputs(f2lsvgst_c8_kw[4], job->of1);
2037   f2lsvgst_tag(job, 3);
2038   fputs(f2lsvgst_c8_kw[5], job->of1);
2039   fputs(f2lsvgst_c8_kw[0], job->of1);
2040 }
2041 
2042 
2043 
2044 /**	Write pattern 51 definition to SVG output file.
2045 	@param	job	Job structure.
2046 	@param	psvg	SVG style collection.
2047 	@param	pat	Pattern to write.
2048 */
2049 static
2050 void
f2lsvgst_pattern_51(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2051 f2lsvgst_pattern_51(
2052   f2l_job_t			*job,
2053   f2l_svg_t			*psvg,
2054   f2l_svg_fill_pattern_t	*pat
2055 )
2056 {
2057   /*	Opening pattern tag.
2058   */
2059   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 3.6, 3.6);
2060   /*	Pattern contents 1: background.
2061   */
2062   f2lsvgst_pattern_background(job, pat, 3.6, 3.6);
2063   /*	Pattern contents 2: lines.
2064   */
2065   f2lsvgst_pattern_foreground_polygon_lcr(job, pat, 52);
2066   /*	Close pattern tag.
2067   */
2068   fputs(f2lsvgst_c8_kw[6], job->of1);
2069   fputs(f2lsvgst_c8_kw[4], job->of1);
2070   f2lsvgst_tag(job, 3);
2071   fputs(f2lsvgst_c8_kw[5], job->of1);
2072   fputs(f2lsvgst_c8_kw[0], job->of1);
2073 }
2074 
2075 
2076 
2077 /**	Write pattern 52 definition to SVG output file.
2078 	@param	job	Job structure.
2079 	@param	psvg	SVG style collection.
2080 	@param	pat	Pattern to write.
2081 */
2082 static
2083 void
f2lsvgst_pattern_52(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2084 f2lsvgst_pattern_52(
2085   f2l_job_t			*job,
2086   f2l_svg_t			*psvg,
2087   f2l_svg_fill_pattern_t	*pat
2088 )
2089 {
2090   /*	Opening pattern tag.
2091   */
2092   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 14.4, 28.8);
2093   /*	Pattern contents 1: background.
2094   */
2095   f2lsvgst_pattern_background(job, pat, 14.4, 28.8);
2096   /*	Pattern contents 2: lines.
2097   */
2098   f2lsvgst_pattern_foreground_line_lcr(job, pat, 53);
2099   f2lsvgst_pattern_foreground_line_lcr(job, pat, 54);
2100   f2lsvgst_pattern_foreground_line_lcr(job, pat, 55);
2101   f2lsvgst_pattern_foreground_line_lcr(job, pat, 56);
2102   f2lsvgst_pattern_foreground_line_lcr(job, pat, 57);
2103   f2lsvgst_pattern_foreground_line_lcr(job, pat, 58);
2104   f2lsvgst_pattern_foreground_line_lcr(job, pat, 59);
2105   f2lsvgst_pattern_foreground_line_lcr(job, pat, 60);
2106   f2lsvgst_pattern_foreground_line_lcr(job, pat, 61);
2107   /*	Close pattern tag.
2108   */
2109   fputs(f2lsvgst_c8_kw[6], job->of1);
2110   fputs(f2lsvgst_c8_kw[4], job->of1);
2111   f2lsvgst_tag(job, 3);
2112   fputs(f2lsvgst_c8_kw[5], job->of1);
2113   fputs(f2lsvgst_c8_kw[0], job->of1);
2114 }
2115 
2116 
2117 
2118 /**	Write pattern 53 definition to SVG output file.
2119 	@param	job	Job structure.
2120 	@param	psvg	SVG style collection.
2121 	@param	pat	Pattern to write.
2122 */
2123 static
2124 void
f2lsvgst_pattern_53(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2125 f2lsvgst_pattern_53(
2126   f2l_job_t			*job,
2127   f2l_svg_t			*psvg,
2128   f2l_svg_fill_pattern_t	*pat
2129 )
2130 {
2131   /*	Opening pattern tag.
2132   */
2133   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 14.4, 28.8);
2134   /*	Pattern contents 1: background.
2135   */
2136   f2lsvgst_pattern_background(job, pat, 14.4, 28.8);
2137   /*	Pattern contents 2: lines.
2138   */
2139   f2lsvgst_pattern_foreground_line_lcr(job, pat, 62);
2140   f2lsvgst_pattern_foreground_line_lcr(job, pat, 63);
2141   f2lsvgst_pattern_foreground_line_lcr(job, pat, 64);
2142   f2lsvgst_pattern_foreground_line_lcr(job, pat, 65);
2143   f2lsvgst_pattern_foreground_line_lcr(job, pat, 66);
2144   f2lsvgst_pattern_foreground_line_lcr(job, pat, 67);
2145   f2lsvgst_pattern_foreground_line_lcr(job, pat, 68);
2146   f2lsvgst_pattern_foreground_line_lcr(job, pat, 69);
2147   f2lsvgst_pattern_foreground_line_lcr(job, pat, 70);
2148   /*	Close pattern tag.
2149   */
2150   fputs(f2lsvgst_c8_kw[6], job->of1);
2151   fputs(f2lsvgst_c8_kw[4], job->of1);
2152   f2lsvgst_tag(job, 3);
2153   fputs(f2lsvgst_c8_kw[5], job->of1);
2154   fputs(f2lsvgst_c8_kw[0], job->of1);
2155 }
2156 
2157 
2158 
2159 /**	Write pattern 54 definition to SVG output file.
2160 	@param	job	Job structure.
2161 	@param	psvg	SVG style collection.
2162 	@param	pat	Pattern to write.
2163 */
2164 static
2165 void
f2lsvgst_pattern_54(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2166 f2lsvgst_pattern_54(
2167   f2l_job_t			*job,
2168   f2l_svg_t			*psvg,
2169   f2l_svg_fill_pattern_t	*pat
2170 )
2171 {
2172   /*	Opening pattern tag.
2173   */
2174   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 28.8, 14.4);
2175   /*	Pattern contents 1: background.
2176   */
2177   f2lsvgst_pattern_background(job, pat, 28.8, 14.4);
2178   /*	Pattern contents 2: lines.
2179   */
2180   f2lsvgst_pattern_foreground_line_lcr(job, pat, 71);
2181   f2lsvgst_pattern_foreground_line_lcr(job, pat, 72);
2182   f2lsvgst_pattern_foreground_line_lcr(job, pat, 73);
2183   f2lsvgst_pattern_foreground_line_lcr(job, pat, 74);
2184   f2lsvgst_pattern_foreground_line_lcr(job, pat, 75);
2185   f2lsvgst_pattern_foreground_line_lcr(job, pat, 76);
2186   f2lsvgst_pattern_foreground_line_lcr(job, pat, 77);
2187   f2lsvgst_pattern_foreground_line_lcr(job, pat, 78);
2188   f2lsvgst_pattern_foreground_line_lcr(job, pat, 79);
2189   /*	Close pattern tag.
2190   */
2191   fputs(f2lsvgst_c8_kw[6], job->of1);
2192   fputs(f2lsvgst_c8_kw[4], job->of1);
2193   f2lsvgst_tag(job, 3);
2194   fputs(f2lsvgst_c8_kw[5], job->of1);
2195   fputs(f2lsvgst_c8_kw[0], job->of1);
2196 }
2197 
2198 
2199 
2200 /**	Write pattern 55 definition to SVG output file.
2201 	@param	job	Job structure.
2202 	@param	psvg	SVG style collection.
2203 	@param	pat	Pattern to write.
2204 */
2205 static
2206 void
f2lsvgst_pattern_55(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2207 f2lsvgst_pattern_55(
2208   f2l_job_t			*job,
2209   f2l_svg_t			*psvg,
2210   f2l_svg_fill_pattern_t	*pat
2211 )
2212 {
2213   /*	Opening pattern tag.
2214   */
2215   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 28.8, 14.4);
2216   /*	Pattern contents 1: background.
2217   */
2218   f2lsvgst_pattern_background(job, pat, 28.8, 14.4);
2219   /*	Pattern contents 2: lines.
2220   */
2221   f2lsvgst_pattern_foreground_line_lcr(job, pat, 80);
2222   f2lsvgst_pattern_foreground_line_lcr(job, pat, 81);
2223   f2lsvgst_pattern_foreground_line_lcr(job, pat, 82);
2224   f2lsvgst_pattern_foreground_line_lcr(job, pat, 83);
2225   f2lsvgst_pattern_foreground_line_lcr(job, pat, 84);
2226   f2lsvgst_pattern_foreground_line_lcr(job, pat, 85);
2227   f2lsvgst_pattern_foreground_line_lcr(job, pat, 86);
2228   f2lsvgst_pattern_foreground_line_lcr(job, pat, 87);
2229   f2lsvgst_pattern_foreground_line_lcr(job, pat, 88);
2230   /*	Close pattern tag.
2231   */
2232   fputs(f2lsvgst_c8_kw[6], job->of1);
2233   fputs(f2lsvgst_c8_kw[4], job->of1);
2234   f2lsvgst_tag(job, 3);
2235   fputs(f2lsvgst_c8_kw[5], job->of1);
2236   fputs(f2lsvgst_c8_kw[0], job->of1);
2237 }
2238 
2239 
2240 
2241 /**	Write pattern 56 definition to SVG output file.
2242 	@param	job	Job structure.
2243 	@param	psvg	SVG style collection.
2244 	@param	pat	Pattern to write.
2245 */
2246 static
2247 void
f2lsvgst_pattern_56(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2248 f2lsvgst_pattern_56(
2249   f2l_job_t			*job,
2250   f2l_svg_t			*psvg,
2251   f2l_svg_fill_pattern_t	*pat
2252 )
2253 {
2254   /*	Opening pattern tag.
2255   */
2256   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 14.54, 7.4);
2257   /*	Pattern contents 1: background.
2258   */
2259   f2lsvgst_pattern_background(job, pat, 14.54, 7.4);
2260   /*	Pattern contents 2: lines.
2261   */
2262   f2lsvgst_pattern_foreground_path_lcr(job, pat, 90);
2263   f2lsvgst_pattern_foreground_path_lcr(job, pat, 91);
2264   f2lsvgst_pattern_foreground_path_lcr(job, pat, 92);
2265   f2lsvgst_pattern_foreground_path_lcr(job, pat, 93);
2266   f2lsvgst_pattern_foreground_path_lcr(job, pat, 94);
2267   /*	Close pattern tag.
2268   */
2269   fputs(f2lsvgst_c8_kw[6], job->of1);
2270   fputs(f2lsvgst_c8_kw[4], job->of1);
2271   f2lsvgst_tag(job, 3);
2272   fputs(f2lsvgst_c8_kw[5], job->of1);
2273   fputs(f2lsvgst_c8_kw[0], job->of1);
2274 }
2275 
2276 
2277 
2278 /**	Write pattern 57 definition to SVG output file.
2279 	@param	job	Job structure.
2280 	@param	drw	Drawing structure.
2281 	@param	psvg	SVG style collection.
2282 	@param	pat	Pattern to write.
2283 */
2284 static
2285 void
f2lsvgst_pattern_57(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2286 f2lsvgst_pattern_57(
2287   f2l_job_t			*job,
2288   f2l_svg_t			*psvg,
2289   f2l_svg_fill_pattern_t	*pat
2290 )
2291 {
2292   /*	Opening pattern tag.
2293   */
2294   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 7.2, 7.2);
2295   /*	Pattern contents 1: background.
2296   */
2297   f2lsvgst_pattern_background(job, pat, 7.2, 7.2);
2298   /*	Pattern contents 2: lines.
2299   */
2300   f2lsvgst_pattern_foreground_path_lcr(job, pat, 95);
2301   f2lsvgst_pattern_foreground_path_lcr(job, pat, 96);
2302   f2lsvgst_pattern_foreground_path_lcr(job, pat, 97);
2303   f2lsvgst_pattern_foreground_path_lcr(job, pat, 98);
2304   f2lsvgst_pattern_foreground_path_lcr(job, pat, 99);
2305   /*	Close pattern tag.
2306   */
2307   fputs(f2lsvgst_c8_kw[6], job->of1);
2308   fputs(f2lsvgst_c8_kw[4], job->of1);
2309   f2lsvgst_tag(job, 3);
2310   fputs(f2lsvgst_c8_kw[5], job->of1);
2311   fputs(f2lsvgst_c8_kw[0], job->of1);
2312 }
2313 
2314 
2315 
2316 /**	Write pattern 58 definition to SVG output file.
2317 	@param	job	Job structure.
2318 	@param	psvg	SVG style collection.
2319 	@param	pat	Pattern to write.
2320 */
2321 static
2322 void
f2lsvgst_pattern_58(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2323 f2lsvgst_pattern_58(
2324   f2l_job_t			*job,
2325   f2l_svg_t			*psvg,
2326   f2l_svg_fill_pattern_t	*pat
2327 )
2328 {
2329   /*	Opening pattern tag.
2330   */
2331   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 14.4, 14.4);
2332   /*	Pattern contents 1: background.
2333   */
2334   f2lsvgst_pattern_background(job, pat, 14.4, 14.4);
2335   /*	Pattern contents 2: lines.
2336   */
2337   f2lsvgst_pattern_foreground_circle_lcr(job, pat);
2338   /*	Close pattern tag.
2339   */
2340   fputs(f2lsvgst_c8_kw[6], job->of1);
2341   fputs(f2lsvgst_c8_kw[4], job->of1);
2342   f2lsvgst_tag(job, 3);
2343   fputs(f2lsvgst_c8_kw[5], job->of1);
2344   fputs(f2lsvgst_c8_kw[0], job->of1);
2345 }
2346 
2347 
2348 
2349 /**	Write pattern 59 definition to SVG output file.
2350 	@param	job	Job structure.
2351 	@param	psvg	SVG style collection.
2352 	@param	pat	Pattern to write.
2353 */
2354 static
2355 void
f2lsvgst_pattern_59(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2356 f2lsvgst_pattern_59(
2357   f2l_job_t			*job,
2358   f2l_svg_t			*psvg,
2359   f2l_svg_fill_pattern_t	*pat
2360 )
2361 {
2362   /*	Opening pattern tag.
2363   */
2364   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 21.6, 12.47);
2365   /*	Pattern contents 1: background.
2366   */
2367   f2lsvgst_pattern_background(job, pat, 21.6, 12.47);
2368   /*	Pattern contents 2: lines.
2369   */
2370   f2lsvgst_pattern_foreground_polygon_lcr(job, pat, 103);
2371   f2lsvgst_pattern_foreground_line_lcr(job, pat, 104);
2372   f2lsvgst_pattern_foreground_line_lcr(job, pat, 105);
2373   f2lsvgst_pattern_foreground_line_lcr(job, pat, 106);
2374   /*	Close pattern tag.
2375   */
2376   fputs(f2lsvgst_c8_kw[6], job->of1);
2377   fputs(f2lsvgst_c8_kw[4], job->of1);
2378   f2lsvgst_tag(job, 3);
2379   fputs(f2lsvgst_c8_kw[5], job->of1);
2380   fputs(f2lsvgst_c8_kw[0], job->of1);
2381 }
2382 
2383 
2384 
2385 /**	Write pattern 60 definition to SVG output file.
2386 	@param	job	Job structure.
2387 	@param	psvg	SVG style collection.
2388 	@param	pat	Pattern to write.
2389 */
2390 static
2391 void
f2lsvgst_pattern_60(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2392 f2lsvgst_pattern_60(
2393   f2l_job_t			*job,
2394   f2l_svg_t			*psvg,
2395   f2l_svg_fill_pattern_t	*pat
2396 )
2397 {
2398   /*	Opening pattern tag.
2399   */
2400   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 14.4, 14.4);
2401   /*	Pattern contents 1: background.
2402   */
2403   f2lsvgst_pattern_background(job, pat, 14.4, 14.4);
2404   /*	Pattern contents 2: lines.
2405   */
2406   f2lsvgst_pattern_foreground_polygon_lcr_l2(job, pat, 107, 108);
2407   /*	Close pattern tag.
2408   */
2409   fputs(f2lsvgst_c8_kw[6], job->of1);
2410   fputs(f2lsvgst_c8_kw[4], job->of1);
2411   f2lsvgst_tag(job, 3);
2412   fputs(f2lsvgst_c8_kw[5], job->of1);
2413   fputs(f2lsvgst_c8_kw[0], job->of1);
2414 }
2415 
2416 
2417 
2418 /**	Write pattern 61 definition to SVG output file.
2419 	@param	job	Job structure.
2420 	@param	psvg	SVG style collection.
2421 	@param	pat	Pattern to write.
2422 */
2423 static
2424 void
f2lsvgst_pattern_61(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2425 f2lsvgst_pattern_61(
2426   f2l_job_t			*job,
2427   f2l_svg_t			*psvg,
2428   f2l_svg_fill_pattern_t	*pat
2429 )
2430 {
2431   /*	Opening pattern tag.
2432   */
2433   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 7.2, 7.2);
2434   /*	Pattern contents 1: background.
2435   */
2436   f2lsvgst_pattern_background(job, pat, 7.2, 7.2);
2437   /*	Pattern contents 2: lines.
2438   */
2439   f2lsvgst_pattern_foreground_line_lcr(job, pat, 109);
2440   /*	Close pattern tag.
2441   */
2442   fputs(f2lsvgst_c8_kw[6], job->of1);
2443   fputs(f2lsvgst_c8_kw[4], job->of1);
2444   f2lsvgst_tag(job, 3);
2445   fputs(f2lsvgst_c8_kw[5], job->of1);
2446   fputs(f2lsvgst_c8_kw[0], job->of1);
2447 }
2448 
2449 
2450 
2451 /**	Write pattern 62 definition to SVG output file.
2452 	@param	job	Job structure.
2453 	@param	psvg	SVG style collection.
2454 	@param	pat	Pattern to write.
2455 */
2456 static
2457 void
f2lsvgst_pattern_62(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2458 f2lsvgst_pattern_62(
2459   f2l_job_t			*job,
2460   f2l_svg_t			*psvg,
2461   f2l_svg_fill_pattern_t	*pat
2462 )
2463 {
2464   /*	Opening pattern tag.
2465   */
2466   f2lsvgst_write_opening_pattern_tag(job, psvg, pat, 7.2, 7.2);
2467   /*	Pattern contents 1: background.
2468   */
2469   f2lsvgst_pattern_background(job, pat, 7.2, 7.2);
2470   /*	Pattern contents 2: lines.
2471   */
2472   f2lsvgst_pattern_foreground_line_lcr(job, pat, 110);
2473   /*	Close pattern tag.
2474   */
2475   fputs(f2lsvgst_c8_kw[6], job->of1);
2476   fputs(f2lsvgst_c8_kw[4], job->of1);
2477   f2lsvgst_tag(job, 3);
2478   fputs(f2lsvgst_c8_kw[5], job->of1);
2479   fputs(f2lsvgst_c8_kw[0], job->of1);
2480 }
2481 
2482 
2483 
2484 /**	Write one pattern definition to SVG output file.
2485 	@param	job	Job structure.
2486 	@param	psvg	SVG style collection.
2487 	@param	pat	Pattern to write.
2488 */
2489 static
2490 void
f2lsvgst_write_one_pattern(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_fill_pattern_t * pat)2491 f2lsvgst_write_one_pattern(
2492   f2l_job_t			*job,
2493   f2l_svg_t			*psvg,
2494   f2l_svg_fill_pattern_t	*pat
2495 )
2496 {
2497   switch(pat->fn) {
2498     case 41: {
2499       f2lsvgst_pattern_41(job, psvg, pat);
2500     } break;
2501     case 42: {
2502       f2lsvgst_pattern_42(job, psvg, pat);
2503     } break;
2504     case 43: {
2505       f2lsvgst_pattern_43(job, psvg, pat);
2506     } break;
2507     case 44: {
2508       f2lsvgst_pattern_44(job, psvg, pat);
2509     } break;
2510     case 45: {
2511       f2lsvgst_pattern_45(job, psvg, pat);
2512     } break;
2513     case 46: {
2514       f2lsvgst_pattern_46(job, psvg, pat);
2515     } break;
2516     case 47: {
2517       f2lsvgst_pattern_47(job, psvg, pat);
2518     } break;
2519     case 48: {
2520       f2lsvgst_pattern_48(job, psvg, pat);
2521     } break;
2522     case 49: {
2523       f2lsvgst_pattern_49(job, psvg, pat);
2524     } break;
2525     case 50: {
2526       f2lsvgst_pattern_50(job, psvg, pat);
2527     } break;
2528     case 51: {
2529       f2lsvgst_pattern_51(job, psvg, pat);
2530     } break;
2531     case 52: {
2532       f2lsvgst_pattern_52(job, psvg, pat);
2533     } break;
2534     case 53: {
2535       f2lsvgst_pattern_53(job, psvg, pat);
2536     } break;
2537     case 54: {
2538       f2lsvgst_pattern_54(job, psvg, pat);
2539     } break;
2540     case 55: {
2541       f2lsvgst_pattern_55(job, psvg, pat);
2542     } break;
2543     case 56: {
2544       f2lsvgst_pattern_56(job, psvg, pat);
2545     } break;
2546     case 57: {
2547       f2lsvgst_pattern_57(job, psvg, pat);
2548     } break;
2549     case 58: {
2550       f2lsvgst_pattern_58(job, psvg, pat);
2551     } break;
2552     case 59: {
2553       f2lsvgst_pattern_59(job, psvg, pat);
2554     } break;
2555     case 60: {
2556       f2lsvgst_pattern_60(job, psvg, pat);
2557     } break;
2558     case 61: {
2559       f2lsvgst_pattern_61(job, psvg, pat);
2560     } break;
2561     case 62: {
2562       f2lsvgst_pattern_62(job, psvg, pat);
2563     } break;
2564   }
2565 }
2566 
2567 
2568 
2569 void
f2lsvgst_write_patterns(f2l_job_t * job,f2l_svg_t * psvg)2570 f2lsvgst_write_patterns(
2571   f2l_job_t		*job,
2572   f2l_svg_t		*psvg
2573 )
2574 {
2575   f2l_svg_fill_pattern_t	*pat;
2576   if((psvg->sPatterns) && (psvg->iPatterns)) {
2577     dk3sto_it_reset(psvg->iPatterns);
2578     do {
2579       pat = (f2l_svg_fill_pattern_t *)dk3sto_it_next(psvg->iPatterns);
2580       if(pat) {
2581         f2lsvgst_write_one_pattern(job, psvg, pat);
2582       }
2583     } while(pat);
2584   }
2585 }
2586 
2587 
2588 
2589 /**	Write one style to SVG output file.
2590 	@param	job	Job structure.
2591 	@param	psvg	SVG style collection.
2592 	@param	pst	Style definition to write.
2593 */
2594 static
2595 void
f2lsvgst_write_one_style(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_style_t * pst)2596 f2lsvgst_write_one_style(
2597   f2l_job_t		*job,
2598   f2l_svg_t		*psvg,
2599   f2l_svg_style_t	*pst
2600 )
2601 {
2602   char const * const	*rffn;	/* Replacement font family name. */
2603   double		 ts;	/* Text size. */
2604   double		 gw;	/* Gap width in line styles. */
2605   int			 ff;	/* Font family */
2606 
2607   if(pst->tf < 0)  { pst->tf = 0; }
2608   if(pst->tf > 34) { pst->tf = 34; }
2609   fputs(f2lsvgst_c8_kw[112], job->of1);
2610   f2lsvgst_write_style_id(job, psvg, pst);
2611   fputs(f2lsvgst_c8_kw[113], job->of1);
2612   if((pst->flags) & DK3_SVG_FLAGS_FONT) {
2613     if((pst->flags) & DK3_SVG_FLAGS_PS_FONT) {
2614       /*	Font family
2615       */
2616       fputs(f2lsvgst_c8_kw[115], job->of1);
2617       fputs(dk3font_get_svg_family(pst->tf), job->of1);
2618       if(job->otherfonts) {
2619         /*	PS family name.
2620         */
2621         fputs(f2lsvgst_c8_kw[187], job->of1);
2622         fputs(dk3font_get_ps_family(pst->tf), job->of1);
2623         /*	Replacement family names.
2624         */
2625 	rffn = dk3font_get_replacement_families(pst->tf);
2626 	while(*rffn) {
2627 	  fputs(f2lsvgst_c8_kw[187], job->of1);
2628 	  fputs(*rffn, job->of1);
2629 	  rffn++;
2630 	}
2631       }
2632       ff = dk3font_get_svg_features(pst->tf);
2633       switch(ff & DK3_FONT_FAMILY) {
2634         case DK3_FONT_TYPEWRITER: {
2635 	  fputs(f2lsvgst_c8_kw[118], job->of1);
2636 	} break;
2637 	case DK3_FONT_SANS_SERIF: {
2638 	  fputs(f2lsvgst_c8_kw[117], job->of1);
2639 	} break;
2640 	default: {
2641 	  fputs(f2lsvgst_c8_kw[116], job->of1);
2642 	} break;
2643       }
2644       /*	Font style
2645       */
2646       if(ff & DK3_FONT_OBLIQUE) {
2647         fputs(f2lsvgst_c8_kw[121], job->of1);
2648       } else {
2649         if(ff & DK3_FONT_ITALIC) {
2650 	  fputs(f2lsvgst_c8_kw[120], job->of1);
2651 	} else {
2652 #if 0
2653 	  /*	2013-01-27: This is the default.
2654 	  */
2655 	  fputs(f2lsvgst_c8_kw[119], job->of1);
2656 #endif
2657 	}
2658       }
2659       /*	Font weight
2660       */
2661       ff = dk3font_get_svg_font_weight(pst->tf);
2662       fprintf(job->of1, f2lsvgst_c8_kw[122], ff);
2663     } else {
2664       /*	Font family, style, weight
2665       */
2666       switch(pst->tf) {
2667         case 5: {	/* Typewriter */
2668           fputs(f2lsvgst_c8_kw[125], job->of1);
2669 #if 0
2670 	  /*	2013-01-27: This is the default.
2671 	  */
2672 	  fputs(f2lsvgst_c8_kw[126], job->of1);
2673 	  fputs(f2lsvgst_c8_kw[128], job->of1);
2674 #endif
2675 	} break;
2676 	case 4: {	/* Sans-serif */
2677           fputs(f2lsvgst_c8_kw[124], job->of1);
2678 #if 0
2679 	  /*	2013-01-27: This is the default.
2680 	  */
2681 	  fputs(f2lsvgst_c8_kw[126], job->of1);
2682 	  fputs(f2lsvgst_c8_kw[128], job->of1);
2683 #endif
2684 	} break;
2685 	case 3: {	/* Italic serif */
2686           fputs(f2lsvgst_c8_kw[123], job->of1);
2687 	  fputs(f2lsvgst_c8_kw[127], job->of1);
2688 #if 0
2689 	  /*	2013-01-27: This is the default.
2690 	  */
2691 	  fputs(f2lsvgst_c8_kw[128], job->of1);
2692 #endif
2693 	} break;
2694 	case 2: {	/* Bold serif */
2695           fputs(f2lsvgst_c8_kw[123], job->of1);
2696 #if 0
2697 	  /*	2013-01-27: This is the default.
2698 	  */
2699 	  fputs(f2lsvgst_c8_kw[126], job->of1);
2700 #endif
2701 	  fputs(f2lsvgst_c8_kw[129], job->of1);
2702 	} break;
2703 	default: {	/* Default font (serif) */
2704           fputs(f2lsvgst_c8_kw[123], job->of1);
2705 #if 0
2706 	  /*	2013-01-27: This is the default.
2707 	  */
2708 	  fputs(f2lsvgst_c8_kw[126], job->of1);
2709 	  fputs(f2lsvgst_c8_kw[128], job->of1);
2710 #endif
2711 	} break;
2712       }
2713     }
2714     /*	Font size
2715     */
2716     ts = pst->ts;
2717     if(0.0 < job->nts) {
2718       ts = ts * job->nts;
2719     }
2720     fprintf(job->of1, f2lsvgst_c8_kw[130], ts);
2721   }
2722   /*	Text align
2723   */
2724   if((pst->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) {
2725     switch(pst->al) {
2726       case 2: {
2727         fputs(f2lsvgst_c8_kw[133], job->of1);
2728       } break;
2729       case 1: {
2730         fputs(f2lsvgst_c8_kw[132], job->of1);
2731       } break;
2732       default: {
2733 #if 0
2734 	/*	2013-01-27: This is the default.
2735 	*/
2736         fputs(f2lsvgst_c8_kw[131], job->of1);
2737 #endif
2738       } break;
2739     }
2740   }
2741   /*	Fill pattern or color		fill
2742   */
2743   if(pst->fp) {
2744     fputs(f2lsvgst_c8_kw[134], job->of1);
2745     f2lsvgst_write_pattern_id(job, psvg, pst->fp);
2746     fputs(f2lsvgst_c8_kw[135], job->of1);
2747   } else {
2748     if((pst->flags) & DK3_SVG_FLAGS_COLOR_FILL) {
2749       if((pst->flags) & DK3_SVG_FLAGS_FONT) {
2750         fprintf(job->of1, f2lsvgst_c8_kw[183], pst->fr, pst->fg, pst->fb);
2751       } else {
2752         fprintf(job->of1, f2lsvgst_c8_kw[136], pst->fr, pst->fg, pst->fb);
2753       }
2754     } else {				/* No fill */
2755       fputs(f2lsvgst_c8_kw[137], job->of1);
2756     }
2757   }
2758   /*	Stroke color			stroke
2759   */
2760   if((pst->flags) & DK3_SVG_FLAGS_COLOR_STROKE) {
2761     fprintf(job->of1, f2lsvgst_c8_kw[138], pst->sr, pst->sg, pst->sb);
2762   }
2763   /*	Stroke linewidth		stroke-width
2764   */
2765   if((pst->flags) & DK3_SVG_FLAGS_LINEWIDTH) {
2766     fprintf(job->of1, f2lsvgst_c8_kw[139], pst->lw);
2767   }
2768   /*	Stroke linestyle		stroke-dasharray
2769   */
2770   if((pst->flags) & DK3_SVG_FLAGS_LINESTYLE) {
2771     if((pst->flags) & DK3_SVG_FLAGS_LINEWIDTH) {
2772       if(0 != pst->ls) {
2773   	gw = f2lto_find_gap_length(job, pst->lw, pst->lsv);
2774         fputs(f2lsvgst_c8_kw[146], job->of1);
2775         switch(pst->ls) {
2776           case DK3_FIG_LS_DASH_TRIPLE_DOTTED: {
2777 	    fprintf(
2778 	      job->of1,
2779 	      f2lsvgst_c8_kw[152],
2780 	      pst->lsv, gw, pst->lw, gw, pst->lw, gw,
2781 	      pst->lw, gw
2782 	    );
2783 	  } break;
2784 	  case DK3_FIG_LS_DASH_DOUBLE_DOTTED: {
2785 	    fprintf(
2786 	      job->of1,
2787 	      f2lsvgst_c8_kw[151],
2788 	      pst->lsv, gw, pst->lw, gw, pst->lw, gw
2789 	    );
2790 	  } break;
2791 	  case DK3_FIG_LS_DASH_DOTTED: {
2792 	    fprintf(
2793 	      job->of1,
2794 	      f2lsvgst_c8_kw[150],
2795 	      pst->lsv, gw, pst->lw, gw
2796 	    );
2797 	  } break;
2798 	  case DK3_FIG_LS_DOTTED: {
2799 	    fprintf(
2800 	      job->of1,
2801 	      f2lsvgst_c8_kw[149],
2802 	      pst->lw, gw
2803 	    );
2804 	  } break;
2805 	  case DK3_FIG_LS_DASHED: {
2806 	    fprintf(
2807 	      job->of1,
2808 	      f2lsvgst_c8_kw[149],
2809 	      pst->lsv, gw
2810 	    );
2811 	  } break;
2812 	  default: {
2813             fputs(f2lsvgst_c8_kw[148], job->of1);
2814 	  } break;
2815         }
2816         fputs(f2lsvgst_c8_kw[147], job->of1);
2817       }
2818     }
2819   }
2820   /*	Linecap				stroke-linecap
2821   */
2822   if((pst->flags) & DK3_SVG_FLAGS_LINE_CAP) {
2823     if(DK3_FIG_LC_BUTT != pst->lc) {
2824       switch(pst->lc) {
2825         case DK3_FIG_LC_PROJECTING: {
2826           fputs(f2lsvgst_c8_kw[140], job->of1);
2827 	} break;
2828 	case DK3_FIG_LC_ROUND: {
2829           fputs(f2lsvgst_c8_kw[141], job->of1);
2830 	} break;
2831 	default: {
2832 #if 0
2833 	  /*	2013-01-27: This is the default.
2834 	  */
2835           fputs(f2lsvgst_c8_kw[142], job->of1);
2836 #endif
2837 	} break;
2838       }
2839     }
2840   }
2841   /*	Linejoin			stroke-linejoin
2842   */
2843   if((pst->flags) & DK3_SVG_FLAGS_LINE_JOIN) {
2844     switch(pst->lj) {
2845         case DK3_FIG_LJ_BEVEL: {
2846           fputs(f2lsvgst_c8_kw[143], job->of1);
2847 	} break;
2848 	case DK3_FIG_LJ_ROUND: {
2849           fputs(f2lsvgst_c8_kw[144], job->of1);
2850 	} break;
2851 	default: {
2852 #if 0
2853 	  /*	2013-01-27: This is the default.
2854 	  */
2855           fputs(f2lsvgst_c8_kw[145], job->of1);
2856 #endif
2857 	  if(job->miterlim) {
2858 	    fputs(f2lsvgst_c8_kw[185], job->of1);
2859 	  }
2860 	} break;
2861     }
2862   }
2863   /*	End
2864   */
2865   fputs(f2lsvgst_c8_kw[114], job->of1);
2866 }
2867 
2868 
2869 
2870 /**	Write attributes for one style to SVG output file.
2871 	@param	job	Job structure.
2872 	@param	psvg	SVG style collection.
2873 	@param	pst	Style definition to write.
2874 */
2875 static
2876 void
f2lsvgst_write_attributes_for_one_style(f2l_job_t * job,f2l_svg_t * psvg,f2l_svg_style_t * pst)2877 f2lsvgst_write_attributes_for_one_style(
2878   f2l_job_t		*job,
2879   f2l_svg_t		*psvg,
2880   f2l_svg_style_t	*pst
2881 )
2882 {
2883   char const * const	*rffn;	/* Replacement font family names. */
2884   int			 ff;	/* Font family and flags. */
2885   double		 ts;	/* Font size. */
2886   double		 gw;	/* Gap width in line styles. */
2887 
2888   if((pst->flags) & DK3_SVG_FLAGS_FONT) {
2889     ff = dk3font_get_svg_features(pst->tf);
2890     ts = pst->ts;
2891     if(0.0 < job->nts) {
2892       ts = ts * job->nts;
2893     }
2894     /*	Font family, font style, font weight, text size.
2895     */
2896     if((pst->flags) & DK3_SVG_FLAGS_PS_FONT) {
2897       fputs(f2lsvgst_c8_kw[153], job->of1);
2898       fputs(dk3font_get_svg_family(pst->tf), job->of1);
2899       if(job->otherfonts) {
2900         /*	PS family name.
2901 	*/
2902 	fputs(f2lsvgst_c8_kw[188], job->of1);
2903 	fputs(dk3font_get_ps_family(pst->tf), job->of1);
2904 	/*	Replacement family names.
2905 	*/
2906 	rffn = dk3font_get_replacement_families(pst->tf);
2907 	while(*rffn) {
2908 	  fputs(f2lsvgst_c8_kw[188], job->of1);
2909 	  fputs(*rffn, job->of1);
2910 	  rffn++;
2911 	}
2912       }
2913       switch(ff & DK3_FONT_FAMILY) {
2914         case DK3_FONT_TYPEWRITER: {
2915 	  fputs(f2lsvgst_c8_kw[156], job->of1);
2916 	} break;
2917 	case DK3_FONT_SANS_SERIF: {
2918 	  fputs(f2lsvgst_c8_kw[155], job->of1);
2919 	} break;
2920 	default: {
2921 	  fputs(f2lsvgst_c8_kw[154], job->of1);
2922 	} break;
2923       }
2924       if(ff & DK3_FONT_OBLIQUE) {
2925         fputs(f2lsvgst_c8_kw[157], job->of1);
2926       } else {
2927         if(ff & DK3_FONT_ITALIC) {
2928 	  fputs(f2lsvgst_c8_kw[158], job->of1);
2929 	}
2930       }
2931       fprintf(
2932         job->of1, f2lsvgst_c8_kw[159], dk3font_get_svg_font_weight(pst->tf)
2933       );
2934     } else {
2935       switch(pst->tf) {
2936         case 5: {	/* typewriter */
2937           fputs(f2lsvgst_c8_kw[163], job->of1);
2938 	} break;
2939 	case 4: {	/* sans-serif */
2940           fputs(f2lsvgst_c8_kw[162], job->of1);
2941 	} break;
2942 	case 3: {	/* serif italic */
2943           fputs(f2lsvgst_c8_kw[161], job->of1);
2944           fputs(f2lsvgst_c8_kw[158], job->of1);
2945 	} break;
2946 	case 2: {	/* serif bold */
2947           fputs(f2lsvgst_c8_kw[161], job->of1);
2948           fputs(f2lsvgst_c8_kw[164], job->of1);
2949 	} break;
2950 	default: {	/* serif */
2951           fputs(f2lsvgst_c8_kw[161], job->of1);
2952 	} break;
2953       }
2954     }
2955     fprintf(job->of1, f2lsvgst_c8_kw[160], ts);
2956     /*	Text align.
2957     */
2958     if((pst->flags) & DK3_SVG_FLAGS_TEXT_ALIGN) {
2959       switch(pst->al) {
2960         case 2: {
2961           fputs(f2lsvgst_c8_kw[166], job->of1);
2962 	} break;
2963 	case 1: {
2964           fputs(f2lsvgst_c8_kw[165], job->of1);
2965 	} break;
2966       }
2967     }
2968   }
2969   /*	Fill pattern or color.
2970   */
2971   if(pst->fp) {
2972     fputs(f2lsvgst_c8_kw[167], job->of1);
2973     f2lsvgst_write_pattern_id(job, psvg, pst->fp);
2974     fputs(f2lsvgst_c8_kw[168], job->of1);
2975   } else {
2976     if((pst->flags) & DK3_SVG_FLAGS_COLOR_FILL) {
2977       if((pst->flags) & DK3_SVG_FLAGS_FONT) {
2978         fprintf(job->of1, f2lsvgst_c8_kw[169], pst->fr, pst->fg, pst->fb);
2979       } else {
2980 	fprintf(job->of1, f2lsvgst_c8_kw[184], pst->fr, pst->fg, pst->fb);
2981       }
2982     } else {
2983       fputs(f2lsvgst_c8_kw[170], job->of1);
2984     }
2985   }
2986   /*	Stroke color
2987   */
2988   if((pst->flags) & DK3_SVG_FLAGS_COLOR_STROKE) {
2989     fprintf(job->of1, f2lsvgst_c8_kw[171], pst->sr, pst->sg, pst->sb);
2990   }
2991   /*	Stroke linewidth.
2992   */
2993   if((pst->flags) & DK3_SVG_FLAGS_LINEWIDTH) {
2994     fprintf(job->of1, f2lsvgst_c8_kw[172], pst->lw);
2995   }
2996   /*	Stroke linestyle.
2997   */
2998   if((pst->flags) & DK3_SVG_FLAGS_LINESTYLE) {
2999     if((pst->flags) & DK3_SVG_FLAGS_LINEWIDTH) {
3000       gw = f2lto_find_gap_length(job, pst->lw, pst->lsv);
3001       switch(pst->ls) {
3002         case DK3_FIG_LS_DASH_TRIPLE_DOTTED: {
3003           fprintf(
3004             job->of1, f2lsvgst_c8_kw[176],
3005             pst->lsv, gw, pst->lw, gw, pst->lw, gw,
3006             pst->lw, gw
3007           );
3008         } break;
3009         case DK3_FIG_LS_DASH_DOUBLE_DOTTED: {
3010           fprintf(
3011             job->of1, f2lsvgst_c8_kw[175],
3012             pst->lsv, gw, pst->lw, gw, pst->lw, gw
3013           );
3014         } break;
3015         case DK3_FIG_LS_DASH_DOTTED: {
3016           fprintf(
3017             job->of1, f2lsvgst_c8_kw[174],
3018             pst->lsv, gw, pst->lw, gw
3019           );
3020         } break;
3021         case DK3_FIG_LS_DOTTED: {
3022           fprintf(
3023             job->of1, f2lsvgst_c8_kw[173],
3024             pst->lw, gw
3025           );
3026         } break;
3027         case DK3_FIG_LS_DASHED: {
3028           fprintf(
3029             job->of1, f2lsvgst_c8_kw[173],
3030             pst->lsv, gw
3031           );
3032         } break;
3033       }
3034     }
3035   }
3036   /*	Linecap.
3037   */
3038   if((pst->flags) & DK3_SVG_FLAGS_LINE_CAP) {
3039     switch(pst->lc) {
3040       case DK3_FIG_LC_PROJECTING: {
3041         fputs(f2lsvgst_c8_kw[178], job->of1);
3042       } break;
3043       case DK3_FIG_LC_ROUND: {
3044         fputs(f2lsvgst_c8_kw[177], job->of1);
3045       } break;
3046     }
3047   }
3048   /*	Linejoin.
3049   */
3050   if((pst->flags) & DK3_SVG_FLAGS_LINE_JOIN) {
3051     switch(pst->lj) {
3052       case DK3_FIG_LJ_BEVEL: {
3053         fputs(f2lsvgst_c8_kw[180], job->of1);
3054       } break;
3055       case DK3_FIG_LJ_ROUND: {
3056         fputs(f2lsvgst_c8_kw[179], job->of1);
3057       } break;
3058       default: {
3059         if(job->miterlim) {
3060           fputs(f2lsvgst_c8_kw[186], job->of1);
3061 	}
3062       } break;
3063     }
3064   }
3065 }
3066 
3067 
3068 
3069 void
f2lsvgst_write_style_for_object(f2l_job_t * job,dk3_fig_drawing_t * drw,f2l_svg_t * psvg,dk3_fig_obj_t * pobj)3070 f2lsvgst_write_style_for_object(
3071   f2l_job_t		*job,
3072   dk3_fig_drawing_t	*drw,
3073   f2l_svg_t		*psvg,
3074   dk3_fig_obj_t		*pobj
3075 )
3076 {
3077   f2l_svg_style_t	*pst;
3078 
3079   if((job) && (drw) && (psvg) && (pobj)) {
3080     pst = (f2l_svg_style_t *)(pobj->dsd);
3081     if(pst) {
3082       if(job->css) {
3083         fputs(f2lsvgst_c8_kw[181], job->of1);
3084 	f2lsvgst_write_style_id(job, psvg, pst);
3085         fputs(f2lsvgst_c8_kw[182], job->of1);
3086       } else {
3087         f2lsvgst_write_attributes_for_one_style(job, psvg, pst);
3088       }
3089     } else {
3090     }
3091   } else {
3092   }
3093 }
3094 
3095 
3096 
3097 void
f2lsvgst_write_styles(f2l_job_t * job,f2l_svg_t * psvg)3098 f2lsvgst_write_styles(
3099   f2l_job_t		*job,
3100   f2l_svg_t		*psvg
3101 )
3102 {
3103   f2l_svg_style_t *pst;
3104   if((psvg->sStyles) && (psvg->iStyles)) {
3105     dk3sto_it_reset(psvg->iStyles);
3106     do {
3107       pst = (f2l_svg_style_t *)dk3sto_it_next(psvg->iStyles);
3108       if(pst) {
3109         f2lsvgst_write_one_style(job, psvg, pst);
3110       }
3111     } while(pst);
3112   }
3113 }
3114 
3115 
3116 
3117