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