1 /*
2 Copyright (C) 2012-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: f2leps.ctr
12 */
13 
14 /**	@file f2leps.c The f2leps module.
15 */
16 
17 
18 #include <libdk3c/dk3all.h>
19 #include <libdk3c/dk3bezcu.h>
20 #include <fig2lat/fig2lat.h>
21 #include <fig2lat/f2lud.h>
22 #include <fig2lat/f2lsvg.h>
23 #include <fig2lat/f2leps.h>
24 #include <libdk3fig/dk3figto.h>
25 #if 0
26 #include <libdk3c/dkt-version.h>
27 #endif
28 #include <libdk4base/dk4vers.h>
29 #include <libdk3fig/dk3font.h>
30 #include <libdk3bmeps/dk3bm.h>
31 #include <libdk3bmeps/dk3bmeps.h>
32 #include <libdk3c/dk3unused.h>
33 
34 
35 
36 
37 
38 
39 
40 /**	Drawing-related information for EPS output.
41 */
42 typedef struct {
43   char const	*shortOutFile;	/**< Short output file name. */
44   dk3_sto_t	*sFonts;	/**< Fonts and sizes (dk3_fig_font_t). */
45   dk3_sto_it_t	*iFonts;	/**< Fonts storage iterator. */
46   int		*fonts;		/**< 35 flags: Font used. */
47   unsigned long	 nFonts;	/**< Number of fonts in sFonts. */
48   int		 havetext;	/**< Flag: Text to show as PS text. */
49   int		 alignedright;	/**< Flag: Right-aligned text found. */
50   int		 alignedcenter;	/**< Flag: Centered text found. */
51   int		 dictsize;	/**< Size of dictionary. */
52 } f2leps_drawing_info_t;
53 
54 
55 
56 #if 0
57 /**	Font reencoding to write ISO-LATIN-1 encoded strings.
58 */
59 static char const * const	f2leps_font_reencode_2[] = {
60 "/FontReEncode\t\t% originalname encodedname --",
61 "{",
62 "  5 dict begin /nn exch def /an exch def an findfont dup",
63 "  length dict /nf exch def",
64 "  {",
65 "    1 index /FID ne",
66 "    { nf 3 1 roll put }",
67 "    { pop pop }",
68 "    ifelse",
69 "  }",
70 "  forall",
71 "  nf /Encoding ISOLatin1Encoding put nn nf end definefont pop",
72 "}",
73 "def",
74 NULL
75 
76 };
77 #else
78 /**	Font reencoding to write ISO-LATIN-1 encoded strings.
79 */
80 static char const * const	f2leps_font_reencode_2[] = {
81 "/FontReEncode\t\t\t\t% originalname newname --",
82 "{\t\t\t\t\t% on nn",
83 "  exch\t\t\t\t\t% nn on",
84 "  findfont\t\t\t\t% nn of",
85 "  dup\t\t\t\t\t% nn of of",
86 "  length\t\t\t\t% nn of length",
87 "  1 add\t\t\t\t\t% nn of length",
88 "  dict\t\t\t\t\t% nn of nf",
89 "  exch\t\t\t\t\t% nn nf of",
90 "  {\t\t\t\t\t% nn nf key value",
91 "    1 index\t\t\t\t% nn nf key value key",
92 "    /FID eq\t\t\t\t% nn nf key value flag",
93 "    {\t\t\t\t\t% nn nf key value",
94 "      pop pop\t\t\t\t% nn nf",
95 "    }",
96 "    {\t\t\t\t\t% nn nf key value",
97 "      2 index\t\t\t\t% nn nf key value nf",
98 "      3 1 roll\t\t\t\t% nn nf nf key value",
99 "      put\t\t\t\t% nn nf",
100 "    }",
101 "    ifelse\t\t\t\t% nn nf",
102 "  }",
103 "  forall\t\t\t\t% nn nf",
104 "  dup\t\t\t\t\t% nn nf nf",
105 "  /Encoding ISOLatin1Encoding put\t% nn nf",
106 "  definefont\t\t\t\t% nf",
107 "  pop\t\t\t\t\t%",
108 "}",
109 "def",
110 NULL
111 
112 };
113 #endif
114 
115 #if 0
116 
117 /**	Procedure for right aligned text.
118 */
119 static char const * const	f2leps_right_aligned_text[] = {
120 "/TextAlignedRight \t% text --",
121 "{",
122 "  currentpoint\t\t% text x y",
123 "  3 -1 roll\t\t% x y text",
124 "  dup\t\t\t% x y text text",
125 "  true charpath\t\t% x y text",
126 "  flattenpath\t\t% x y text",
127 "  pathbbox\t\t% x y text x1 y1 x2 y2",
128 "  pop exch pop\t\t% x y text x1 x2",
129 "  exch sub abs\t\t% x y text length",
130 "  newpath 4 -2 roll\t% text length x y",
131 "  moveto\t\t% text length",
132 "  0 exch sub\t\t% text distance",
133 "  0 rmoveto\t\t% text",
134 "  show\t\t\t%",
135 "} def",
136 NULL
137 
138 };
139 
140 
141 
142 /**	Procedure for centered text.
143 */
144 static char const * const	f2leps_centered_aligned_text[] = {
145 "/TextAlignedCentered \t% text --",
146 "{",
147 "  currentpoint\t\t% text x y",
148 "  3 -1 roll\t\t% x y text",
149 "  dup\t\t\t% x y text text",
150 "  true charpath\t\t% x y text",
151 "  flattenpath\t\t% x y text",
152 "  pathbbox\t\t% x y text x1 y1 x2 y2",
153 "  pop exch pop\t\t% x y text x1 x2",
154 "  exch sub abs\t\t% x y text length",
155 "  newpath 4 -2 roll\t% text length x y",
156 "  moveto\t\t% text length",
157 "  0.5 mul\t\t% text distance",
158 "  0 exch sub\t\t% text xshift",
159 "  0 rmoveto\t\t% text",
160 "  show\t\t\t%",
161 "} def",
162 NULL
163 
164 };
165 
166 #else
167 
168 /**	Procedure for right aligned text.
169 */
170 static char const * const	f2leps_right_aligned_text[] = {
171 "/TextAlignedRight \t% x y text --",
172 "{",
173 "  dup\t\t\t% x y text text",
174 "  newpath\t\t% x y text text",
175 "  0 0 moveto\t\t% x y text text",
176 "  true charpath\t\t% x y text",
177 "  pathbbox\t\t% x y text x1 y1 x2 y2",
178 "  pop\t\t\t% x y text x1 y1 x2",
179 "  exch\t\t\t% x y text x1 x2 y1",
180 "  pop\t\t\t% x y text x1 x2",
181 "  exch\t\t\t% x y text x2 x1",
182 "  pop\t\t\t% x y text width",
183 "  newpath\t\t% x y text width",
184 "  4 3 roll\t\t% y text width x",
185 "  exch\t\t\t% y text x width",
186 "  sub\t\t\t% y text x",
187 "  3 2 roll\t\t% text x y",
188 "  moveto\t\t% text",
189 "  show\t\t\t% -",
190 "} def",
191 NULL
192 
193 };
194 
195 
196 
197 /**	Procedure for centered text.
198 */
199 static char const * const	f2leps_centered_aligned_text[] = {
200 "/TextAlignedCentered \t% x y text --",
201 "{",
202 "  dup\t\t\t% x y text text",
203 "  newpath\t\t% x y text text",
204 "  0 0 moveto\t\t% x y text text",
205 "  true charpath\t\t% x y text",
206 "  pathbbox\t\t% x y text x1 y1 x2 y2",
207 "  pop\t\t\t% x y text x1 y1 x2",
208 "  exch\t\t\t% x y text x1 x2 y1",
209 "  pop\t\t\t% x y text x1 x2",
210 "  exch\t\t\t% x y text x2 x1",
211 "  pop\t\t\t% x y text width",
212 "  0.5 mul\t\t% x y text width/2",
213 "  newpath\t\t% x y text width/2",
214 "  4 3 roll\t\t% y text width/2 x",
215 "  exch\t\t\t% y text x width/2",
216 "  sub\t\t\t% y text x",
217 "  3 2 roll\t\t% text x y",
218 "  moveto\t\t% text",
219 "  show\t\t\t% -",
220 "} def",
221 NULL
222 
223 };
224 
225 #endif
226 
227 
228 
229 /**	Keywords used by the module.
230 */
231 static
232 char const * const	f2leps_c8_kw[] = {
233 /* 0 */
234 "\n",
235 
236 /* 1 */
237 " ",
238 
239 /* 2 */
240 "%!PS-Adobe-3.0 EPSF-3.0\n",
241 
242 /* 3 */
243 "%!PS-Adobe-2.0 EPSF-2.0\n",
244 
245 /* 4 */
246 "%%LanguageLevel: 3\n",
247 
248 /* 5 */
249 "%%LanguageLevel: 2\n",
250 
251 /* 6 */
252 "%%BoundingBox: ",
253 
254 /* 7 */
255 "0 0 %ld %ld\n",
256 
257 /* 8 */
258 "%%Creator: http://sourceforge.net/p/dktools/wiki/fig2lat/\n",
259 
260 /* 9 */
261 "%%Title: Converted Fig image\n",
262 
263 /* 10 */
264 "%%Pages: 1\n",
265 
266 /* 11 */
267 "%%PageOrder: Ascend\n",
268 
269 /* 12 */
270 "%%DocumentData: Clean7Bit\n",
271 
272 /* 13 */
273 "%%EndComments\n",
274 
275 /* 14 */
276 "%%Page: 1 1\n",
277 
278 /* 15 */
279 "gsave\n",
280 
281 /* 16 */
282 "grestore\n",
283 
284 /* 17 */
285 "%d dict begin\n",
286 
287 /* 18 */
288 "end\n",
289 
290 /* 19 */
291 "showpage\n",
292 
293 /* 20 */
294 "%%Trailer\n%%EOF\n",
295 
296 /* 21 */
297 "newpath\n",
298 
299 /* 22 */
300 "0 0 moveto %ld 0 lineto %ld %ld lineto 0 %ld lineto 0 0 lineto\n",
301 
302 /* 23 */
303 "closepath clip\n",
304 
305 /* 24 */
306 "/%s /fnt%02d FontReEncode\n",
307 
308 /* 25 */
309 "%g %g moveto\n",
310 
311 /* 26 */
312 "%g %g lineto\n",
313 
314 /* 27 */
315 "%g %g %g %g %g %g curveto\n",
316 
317 /* 28 */
318 "closepath\n",
319 
320 /* 29 */
321 "eofill\n",
322 
323 /* 30 */
324 "eoclip\n",
325 
326 /* 31 */
327 "stroke\n",
328 
329 /* 32 */
330 "%g %g %g setrgbcolor\n",
331 
332 /* 33 */
333 "%g setlinewidth\n",
334 
335 /* 34 */
336 "%d setlinecap\n",
337 
338 /* 35 */
339 "%d setlinejoin\n",
340 
341 /* 36 */
342 "[] 0 setdash\n",
343 
344 /* 37 */
345 "[%g %g] 0 setdash\n",
346 
347 /* 38 */
348 "[%g %g %g %g] 0 setdash\n",
349 
350 /* 39 */
351 "[%g %g %g %g %g %g] 0 setdash\n",
352 
353 /* 40 */
354 "[%g %g %g %g %g %g %g %g] 0 setdash\n",
355 
356 /* 41 */
357 "(",
358 
359 /* 42 */
360 ")",
361 
362 /* 43 */
363 "/fnt%02d findfont %g scalefont setfont\n",
364 
365 /* 44 */
366 " show\n",
367 
368 /* 45 */
369 " TextAlignedCentered\n",
370 
371 /* 46 */
372 " TextAlignedRight\n",
373 
374 /* 47 */
375 "%g %g translate\n",
376 
377 /* 48 */
378 "%g rotate\n",
379 
380 /* 49 */
381 "0 0 moveto\n",
382 
383 /* 50 */
384 " 3 -2 roll newpath moveto show\n",
385 
386 /* 51 */
387 "0 0 ",
388 
389 /* 52 */
390 "% ",
391 
392 NULL
393 
394 };
395 
396 
397 /* ************************************************************************ */
398 /* *                                                                      * */
399 /* * Tool functions                                                       * */
400 /* *                                                                      * */
401 /* ************************************************************************ */
402 
403 
404 
405 
406 /**	Destroy drawing info structure.
407 	@param 	pdi	Structure to destroy.
408 */
409 static
410 void
f2leps_drawing_info_delete(f2leps_drawing_info_t * pdi)411 f2leps_drawing_info_delete(
412   f2leps_drawing_info_t	*pdi
413 )
414 {
415   void		*ptr;	/* Current text handling information to delete. */
416 
417   if(pdi) {
418     dk3_release(pdi->shortOutFile);
419     if(pdi->sFonts) {
420       if(pdi->iFonts) {
421         dk3sto_it_reset(pdi->iFonts);
422 	while(NULL != (ptr = dk3sto_it_next(pdi->iFonts))) {
423 	  dk3_delete(ptr);
424 	}
425         dk3sto_it_close(pdi->iFonts);
426       }
427       dk3sto_close(pdi->sFonts);
428     } pdi->sFonts = NULL; pdi->iFonts = NULL;
429     dk3_release(pdi->fonts);
430     dk3_delete(pdi);
431   }
432 }
433 
434 
435 
436 /**	Create drawing information structure.
437 	@param	job		Job structure.
438 	@param	withFonts	Flag: Gather LaTeX font information.
439 	This flag is set to 1 for EPS/LaTeX and set to 0 for
440 	pure EPS.
441 	@return	Pointer to new structure on success, NULL on error.
442 */
443 static
444 f2leps_drawing_info_t *
f2leps_drawing_info_new(f2l_job_t * job,int withFonts)445 f2leps_drawing_info_new(
446   f2l_job_t		*job,
447   int			 withFonts
448 )
449 {
450   f2leps_drawing_info_t	*back;
451   int			 ok	= 0;
452   back = dk3_new_app(f2leps_drawing_info_t,1,job->app);
453   if(back) {
454     back->nFonts = 0UL;
455     back->sFonts = NULL;
456     back->iFonts = NULL;
457     back->fonts = NULL;
458     back->havetext = 0;
459     back->alignedright = 0;
460     back->alignedcenter = 0;
461     back->dictsize = 0;
462     back->shortOutFile = NULL;
463     if(withFonts) {
464         back->sFonts = dk3sto_open_app(job->app);
465 	if(back->sFonts) {
466 	  dk3sto_set_comp(back->sFonts, dk3fig_tool_font_compare, 0);
467 	  back->iFonts = dk3sto_it_open(back->sFonts);
468 	  if(back->iFonts) {
469 	    ok = 1;
470 	  }
471 	}
472     } else {
473         back->fonts = dk3_new_app(int,35,job->app);
474 	if(back->fonts) {
475 	  ok = 1;
476 	}
477     }
478     if(!(ok)) {
479       f2leps_drawing_info_delete(back);
480       back = NULL;
481     }
482   }
483   return back;
484 }
485 
486 
487 
488 /**	Write a text section to the output file.
489 	@param	of	Output file.
490 	@param	ta	String array to write.
491 */
492 static
493 void
f2leps_write_text_section(FILE * of,char const * const * ta)494 f2leps_write_text_section(
495   FILE			*of,
496   char const * const	*ta
497 )
498 {
499   char const * const	*ptr;
500   ptr = ta;
501   while(*ptr) {
502     fputs(*(ptr++), of);
503     fputc('\n', of);
504   }
505 }
506 
507 
508 
509 /**	Write EPS file header.
510 	@param	job	Job structure.
511 	@param	drw	Drawing structure.
512 	@param	of	Output file.
513 	@param	pure	Flag: Pure EPS (1) or EPS/LaTeX (0).
514 */
515 static
516 void
f2leps_file_header(f2l_job_t * job,dk3_fig_drawing_t * drw,FILE * of,int pure)517 f2leps_file_header(
518   f2l_job_t		*job,
519   dk3_fig_drawing_t	*drw,
520   FILE			*of,
521   int			 pure
522 )
523 {
524   f2leps_drawing_info_t	*pdi;
525   int			 i;
526   pdi = (f2leps_drawing_info_t *)(drw->dsd);
527   /* %!PS-Adobe-3.0 EPSF-3.0 */
528   if(2 < job->pslevel) {
529     fputs(f2leps_c8_kw[2], of);
530     fputs(f2leps_c8_kw[4], of);
531   } else {
532     fputs(f2leps_c8_kw[3], of);
533     fputs(f2leps_c8_kw[5], of);
534   }
535   /* bounding box */
536   fputs(f2leps_c8_kw[6], of);
537   fprintf(of, f2leps_c8_kw[7], job->lwidth, job->lheight);
538   if(job->dsc) {
539     /* Creator */
540     fputs(f2leps_c8_kw[8], of);
541     /* Title */
542     fputs(f2leps_c8_kw[9], of);
543     /* Pages */
544     fputs(f2leps_c8_kw[10], of);
545     /* PageOrder */
546     fputs(f2leps_c8_kw[11], of);
547     /* DocumentData */
548     fputs(f2leps_c8_kw[12], of);
549     if(pure) {
550       /* ##### HIER WEITER: DocumentNeededFonts */
551     }
552     /* EndComments */
553     fputs(f2leps_c8_kw[13], of);
554     /* Page */
555     fputs(f2leps_c8_kw[14], of);
556   }
557   fputs(f2leps_c8_kw[15], of);
558   fputs(f2leps_c8_kw[21], of);
559   fprintf(
560     of, f2leps_c8_kw[22],
561     job->lwidth, job->lwidth, job->lheight, job->lheight
562   );
563   fputs(f2leps_c8_kw[23], of);
564   if(pure) {
565     /* xxx dict begin */
566     fprintf(of, f2leps_c8_kw[17], pdi->dictsize);
567   }
568   /* Text procedures */
569   if(pdi->havetext) {
570     f2leps_write_text_section(of, f2leps_font_reencode_2);
571     if(pdi->alignedcenter) {
572       f2leps_write_text_section(of, f2leps_centered_aligned_text);
573     }
574     if(pdi->alignedright) {
575       f2leps_write_text_section(of, f2leps_right_aligned_text);
576     }
577     /* Font reencodings */
578     for(i = 0; i < 35; i++) {
579       if((pdi->fonts)[i]) {
580         fprintf(of, f2leps_c8_kw[24], dk3font_get_ps_font_name(i), i);
581       }
582     }
583   }
584 }
585 
586 
587 
588 /**	Write EPS file header.
589 	@param	job	Job structure.
590 	@param	drw	Drawing structure.
591 	@param	of	Output file.
592 	@param	pure	Flag: Pure EPS (1) or EPS/LaTeX (0).
593 */
594 static
595 void
f2leps_file_footer(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),FILE * of,int pure)596 f2leps_file_footer(
597   f2l_job_t		*job,
598   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
599   FILE			*of,
600   int			 pure
601 )
602 {
603   DK3_UNUSED_ARG(drw)
604   if(pure) {
605     /* end */
606     fputs(f2leps_c8_kw[18], of);
607   }
608   /* grestore */
609   fputs(f2leps_c8_kw[16], of);
610   if(job->showpage) {
611     /* showpage */
612     fputs(f2leps_c8_kw[19], of);
613   }
614   if(job->dsc) {
615     /* Trailer, EOF */
616     fputs(f2leps_c8_kw[20], of);
617   }
618 }
619 
620 
621 
622 /**	Check whether a text character is literal.
623 	@param	c	Character to check.
624 	@return	1 to issue character as is, 0 for octal encoding.
625 */
626 static
627 int
f2leps_is_literal(char c)628 f2leps_is_literal(char c)
629 {
630   int		 back = 0;
631   if(('A' <= c) && ('Z' >= c)) {
632     back = 1;
633   } else {
634     if(('a' <= c) && ('z' >= c)) {
635       back = 1;
636     } else {
637       if(('0' <= c) && ('9' >= c)) {
638         back = 1;
639       } else {
640         switch(c) {
641 	  case ' ':
642 	  {
643 	    back = 1;
644 	  } break;
645 	}
646       }
647     }
648   }
649   return back;
650 }
651 
652 
653 
654 /**	Write string PS-encoded to output.
655 	@param	of	Output file.
656 	@param	str	String to write.
657 */
658 static
659 void
f2leps_encode_string(FILE * of,char const * str)660 f2leps_encode_string(
661   FILE		*of,
662   char const	*str
663 )
664 {
665   char			 buf[32];
666   char const		*ptr;
667   char			 c;
668   unsigned char		 uc;
669   unsigned		 u;
670   ptr = str;
671   fputs(f2leps_c8_kw[41], of);
672   while(*ptr) {
673     c = *(ptr++);
674     if(f2leps_is_literal(c)) {
675       fputc(c, of);
676     } else {
677       uc = (unsigned char)c;
678       u  = (unsigned)uc;
679       while(255 < u) { u = u - 256; }
680       sprintf(buf, "\\%03o", u);
681       fputs(buf, of);
682     }
683   }
684   fputs(f2leps_c8_kw[42], of);
685 }
686 
687 
688 
689 /**	Process an embedded bitmap image.
690 	@param	of	Output file.
691 	@param	job	Job structure.
692 	@param	drw	Drawing structure.
693 	@param	obj	Image object.
694 	@param	outbb	Destination image area.
695 	@param	drawdir	Drawing direction / coordinates origin.
696 	@param	ec	Pointer to error code variable.
697 */
698 static
699 void
f2leps_image_object(FILE * of,f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * obj,dk3_bb_t * outbb,int drawdir,int * ec)700 f2leps_image_object(
701   FILE			*of,
702   f2l_job_t		*job,
703   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
704   dk3_fig_obj_t		*obj,
705   dk3_bb_t		*outbb,
706   int			 drawdir,
707   int			*ec
708 )
709 {
710   int		res = 0;
711   DK3_UNUSED_ARG(drw)
712   res = dk3bm_ps_place_object(
713     of,outbb,drawdir,(obj->dt).pol.fn,job->app,job->pslevel,ec
714   );
715   if(!(res)) {
716     job->exval = FIG2LAT_EXIT_ERROR_UNKNOWN;
717   }
718 }
719 
720 
721 
722 /**	Set line style.
723 	@param	of	Output file.
724 	@param	job	Job structure.
725 	@param	drw	Drawing structure.
726 	@param	obj	Object using the line style.
727 	@param	ls	Line style.
728 	@param	sv	Style value (gap length).
729 	@param	lw	Line width.
730 */
731 static
732 void
f2leps_set_line_style(FILE * of,f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),int ls,double sv,double lw)733 f2leps_set_line_style(
734   FILE			*of,
735   f2l_job_t		*job,
736   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
737   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
738   int			 ls,
739   double		 sv,
740   double		 lw
741 )
742 {
743   double		gw;	/* Gap width. */
744   DK3_UNUSED_ARG(drw)
745   DK3_UNUSED_ARG(obj)
746   gw = f2lto_find_gap_length(job, lw, sv);
747   switch(ls) {
748     case DK3_FIG_LS_DASHED: {
749       fprintf(of, f2leps_c8_kw[37], sv, gw);
750     } break;
751     case DK3_FIG_LS_DOTTED: {
752       fprintf(of, f2leps_c8_kw[37], lw, gw);
753     } break;
754     case DK3_FIG_LS_DASH_DOTTED: {
755       fprintf(of, f2leps_c8_kw[38], sv, gw, lw, gw);
756     } break;
757     case DK3_FIG_LS_DASH_DOUBLE_DOTTED: {
758       fprintf(of, f2leps_c8_kw[39], sv, gw, lw, gw, lw, gw);
759     } break;
760     case DK3_FIG_LS_DASH_TRIPLE_DOTTED: {
761       fprintf(of, f2leps_c8_kw[40], sv, gw, lw, gw, lw, gw, lw, gw);
762     } break;
763     default: {
764       fputs(f2leps_c8_kw[36], of);
765     } break;
766   }
767 }
768 
769 
770 
771 /**	Write debug line to output.
772 	@param	of	Output file.
773 	@param	job	Job structure.
774 	@param	msg	Message text to write.
775 */
776 static
777 void
f2leps_debug(FILE * of,f2l_job_t * job,char const * msg)778 f2leps_debug(
779   FILE			*of,
780   f2l_job_t		*job,
781   char const		*msg
782 )
783 {
784   if((job) && (msg)) {
785     fputs(f2leps_c8_kw[52], of);
786     fputs(msg, of);
787     fputs(f2leps_c8_kw[0], of);
788   }
789 }
790 
791 
792 
793 /* ************************************************************************ */
794 /* *                                                                      * */
795 /* * Driver: EPS with LaTeX                                               * */
796 /* *                                                                      * */
797 /* ************************************************************************ */
798 
799 
800 
801 int
f2leps_eps_with_tex_initialize(f2l_job_t * job,dk3_fig_drawing_t * drw)802 f2leps_eps_with_tex_initialize(f2l_job_t *job, dk3_fig_drawing_t *drw)
803 {
804   f2leps_drawing_info_t	*pdi;
805   dk3_fig_obj_t		*pobj;
806   dkChar const		*oldsourcename = NULL;
807   unsigned long		 oldsourceline = 0UL;
808   int			 back = 0;
809   int			 ff;
810 
811   drw->dsd = (void *)(pdi = f2leps_drawing_info_new(job, 1));
812   if(drw->dsd) {
813     oldsourcename = dk3app_get_source_file(job->app);
814     oldsourceline = dk3app_get_source_line(job->app);
815     pdi->shortOutFile = dk3fig_tool_short_output_file_name(job->on2, job->app);
816     if(pdi->shortOutFile) {
817       back = 1;
818       dk3sto_it_reset(drw->iobj);
819       while(NULL != (pobj = (dk3_fig_obj_t *)dk3sto_it_next(drw->iobj))) {
820 
821 	dk3app_set_source_line(job->app, pobj->li);
822         switch(pobj->ot) {
823           case DK3_FIG_OBJ_TEXT: {
824 	    ff = (pobj->dt).txt.ff;
825 	    if(!(ff & DK3_FIG_FONT_FLAG_HIDDEN)) {
826 	      if(!(ff & DK3_FIG_FONT_FLAG_SPECIAL)) {
827 	        if(ff & DK3_FIG_FONT_FLAG_PS) {
828 	          if(job->ntf) {
829 		    pobj->dsd = (void *)f2l_tool_register_font(
830 		      pdi->sFonts, pdi->iFonts, &(pdi->nFonts),
831 		      (pobj->dt).txt.fo, (pobj->dt).txt.fs, job->app
832 		    );
833 		    if(!(pobj->dsd)) {
834 		      back = 0;
835 		      f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM);
836 		    }
837 		  } else {
838 		  }
839 	        }
840 	      }
841 	    }
842 	  } break;
843         }
844       }
845     } else {
846       f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM);
847     }
848     dk3app_set_source_file(job->app, oldsourcename);
849     dk3app_set_source_line(job->app, oldsourceline);
850   } else {
851     f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM);
852   }
853   return back;
854 }
855 
856 
857 
858 void
f2leps_eps_with_tex_end(f2l_job_t * DK3_SILENCE_ARG_UNUSED (job),dk3_fig_drawing_t * drw)859 f2leps_eps_with_tex_end(
860   f2l_job_t		* DK3_SILENCE_ARG_UNUSED(job),
861   dk3_fig_drawing_t	*drw
862 )
863 {
864 
865   DK3_UNUSED_ARG(job)
866   if(drw->dsd) {
867     f2leps_drawing_info_delete((f2leps_drawing_info_t *)(drw->dsd));
868   }
869 
870 }
871 
872 
873 
874 int
f2leps_eps_with_tex_open_output_files(f2l_job_t * job)875 f2leps_eps_with_tex_open_output_files(f2l_job_t *job)
876 {
877   int		 back = 0;
878 
879   job->of1 = dk3sf_fopen_app(job->on1, dkT("w"), job->app);
880   if(job->of1) {
881     job->of2 = dk3sf_fopen_app(job->on2, dkT("wb"), job->app);
882     if(job->of2) {
883       back = 1;
884     } else {
885       f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM);
886     }
887   } else {
888     f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM);
889   }
890 
891   return back;
892 }
893 
894 
895 
896 void
f2leps_eps_with_tex_close_output_files(f2l_job_t * job)897 f2leps_eps_with_tex_close_output_files(f2l_job_t *job)
898 {
899 
900   if(job->of2) {
901     dk3sf_fclose_app(job->of2, job->app);
902   } job->of2 = NULL;
903   if(job->of1) {
904     dk3sf_fclose_app(job->of1, job->app);
905   } job->of1 = NULL;
906 
907 }
908 
909 
910 
911 int
f2leps_eps_with_tex_start_processing(f2l_job_t * job,dk3_fig_drawing_t * drw)912 f2leps_eps_with_tex_start_processing(f2l_job_t *job, dk3_fig_drawing_t *drw)
913 {
914   f2leps_drawing_info_t	*pdi;
915   int			 back = 1;
916 
917   pdi = (f2leps_drawing_info_t *)(drw->dsd);
918   f2leps_file_header(job, drw, job->of2, 0);
919   f2l_tool_start_tex_part(
920     job->of1, job, pdi->shortOutFile, pdi->iFonts, pdi->nFonts
921   );
922 
923   return back;
924 }
925 
926 
927 
928 void
f2leps_eps_with_tex_end_processing(f2l_job_t * job,dk3_fig_drawing_t * drw)929 f2leps_eps_with_tex_end_processing(f2l_job_t *job, dk3_fig_drawing_t *drw)
930 {
931 
932   f2leps_file_footer(job, drw, job->of2, 0);
933   f2l_tool_end_tex_part(job->of1);
934 
935 }
936 
937 
938 
939 void
f2leps_eps_with_tex_text_object(f2l_job_t * job,dk3_fig_drawing_t * drw,dk3_fig_obj_t * obj,double x,double y)940 f2leps_eps_with_tex_text_object(
941   f2l_job_t		*job,
942   dk3_fig_drawing_t	*drw,
943   dk3_fig_obj_t		*obj,
944   double		 x,
945   double		 y
946 )
947 {
948   f2leps_drawing_info_t	*pdi;
949   pdi = (f2leps_drawing_info_t *)(drw->dsd);
950   f2l_tool_text_object(job->of1, job, drw, obj, x, y, pdi->nFonts);
951 }
952 
953 
954 
955 void
f2leps_eps_with_tex_image_object(f2l_job_t * job,dk3_fig_drawing_t * drw,dk3_fig_obj_t * obj,dk3_bb_t * outbb,int drawdir,int * ec)956 f2leps_eps_with_tex_image_object(
957   f2l_job_t		*job,
958   dk3_fig_drawing_t	*drw,
959   dk3_fig_obj_t		*obj,
960   dk3_bb_t		*outbb,
961   int			 drawdir,
962   int			*ec
963 )
964 {
965   f2leps_image_object(job->of2, job, drw, obj, outbb, drawdir, ec);
966 }
967 
968 
969 void
f2leps_eps_with_tex_newpath(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))970 f2leps_eps_with_tex_newpath(
971   f2l_job_t		*job,
972   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
973   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
974 )
975 {
976   DK3_UNUSED_ARG(drw)
977   DK3_UNUSED_ARG(obj)
978   fputs(f2leps_c8_kw[21], job->of2);
979 }
980 
981 
982 
983 void
f2leps_eps_with_tex_moveto(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),double x,double y)984 f2leps_eps_with_tex_moveto(
985   f2l_job_t		*job,
986   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
987   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
988   double		 x,
989   double		 y
990 )
991 {
992   DK3_UNUSED_ARG(drw)
993   DK3_UNUSED_ARG(obj)
994   fprintf(job->of2, f2leps_c8_kw[25], x, y);
995 }
996 
997 
998 
999 void
f2leps_eps_with_tex_lineto(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),double x,double y)1000 f2leps_eps_with_tex_lineto(
1001   f2l_job_t		*job,
1002   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1003   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1004   double		 x,
1005   double		 y
1006 )
1007 {
1008   DK3_UNUSED_ARG(drw)
1009   DK3_UNUSED_ARG(obj)
1010   fprintf(job->of2, f2leps_c8_kw[26], x, y);
1011 }
1012 
1013 
1014 
1015 void
f2leps_eps_with_tex_curveto(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),double xcs,double ycs,double xce,double yce,double xe,double ye)1016 f2leps_eps_with_tex_curveto(
1017   f2l_job_t		*job,
1018   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1019   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1020   double		 xcs,
1021   double		 ycs,
1022   double		 xce,
1023   double		 yce,
1024   double		 xe,
1025   double		 ye
1026 )
1027 {
1028   DK3_UNUSED_ARG(drw)
1029   DK3_UNUSED_ARG(obj)
1030   fprintf(job->of2, f2leps_c8_kw[27], xcs, ycs, xce, yce, xe, ye);
1031 }
1032 
1033 
1034 
1035 void
f2leps_eps_with_tex_closepath(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1036 f2leps_eps_with_tex_closepath(
1037   f2l_job_t		*job,
1038   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1039   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1040 )
1041 {
1042   DK3_UNUSED_ARG(drw)
1043   DK3_UNUSED_ARG(obj)
1044   fputs(f2leps_c8_kw[28], job->of2);
1045 }
1046 
1047 
1048 
1049 void
f2leps_eps_with_tex_fill(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1050 f2leps_eps_with_tex_fill(
1051   f2l_job_t		*job,
1052   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1053   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1054 )
1055 {
1056   DK3_UNUSED_ARG(drw)
1057   DK3_UNUSED_ARG(obj)
1058   fputs(f2leps_c8_kw[29], job->of2);
1059 }
1060 
1061 
1062 
1063 void
f2leps_eps_with_tex_clip(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1064 f2leps_eps_with_tex_clip(
1065   f2l_job_t		*job,
1066   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1067   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1068 )
1069 {
1070   DK3_UNUSED_ARG(drw)
1071   DK3_UNUSED_ARG(obj)
1072   fputs(f2leps_c8_kw[30], job->of2);
1073 }
1074 
1075 
1076 
1077 void
f2leps_eps_with_tex_stroke(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1078 f2leps_eps_with_tex_stroke(
1079   f2l_job_t		*job,
1080   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1081   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1082 )
1083 {
1084   DK3_UNUSED_ARG(drw)
1085   DK3_UNUSED_ARG(obj)
1086   fputs(f2leps_c8_kw[31], job->of2);
1087 }
1088 
1089 
1090 
1091 void
f2leps_eps_with_tex_gsave(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1092 f2leps_eps_with_tex_gsave(
1093   f2l_job_t		*job,
1094   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1095   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1096 )
1097 {
1098   DK3_UNUSED_ARG(drw)
1099   DK3_UNUSED_ARG(obj)
1100   fputs(f2leps_c8_kw[15], job->of2);
1101 }
1102 
1103 
1104 
1105 void
f2leps_eps_with_tex_grestore(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1106 f2leps_eps_with_tex_grestore(
1107   f2l_job_t		*job,
1108   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1109   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1110 )
1111 {
1112   DK3_UNUSED_ARG(drw)
1113   DK3_UNUSED_ARG(obj)
1114   fputs(f2leps_c8_kw[16], job->of2);
1115 }
1116 
1117 
1118 
1119 void
f2leps_eps_with_tex_setcolor(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),double r,double g,double b)1120 f2leps_eps_with_tex_setcolor(
1121   f2l_job_t		*job,
1122   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1123   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1124   double		 r,
1125   double		 g,
1126   double		 b
1127 )
1128 {
1129   DK3_UNUSED_ARG(drw)
1130   DK3_UNUSED_ARG(obj)
1131   fprintf(job->of2, f2leps_c8_kw[32], r, g, b);
1132 }
1133 
1134 
1135 
1136 void
f2leps_eps_with_tex_set_line_width(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),double lw)1137 f2leps_eps_with_tex_set_line_width(
1138   f2l_job_t		*job,
1139   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1140   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1141   double		 lw
1142 )
1143 {
1144   DK3_UNUSED_ARG(drw)
1145   DK3_UNUSED_ARG(obj)
1146   fprintf(job->of2, f2leps_c8_kw[33], lw);
1147 }
1148 
1149 
1150 void
f2leps_eps_with_tex_set_line_style(f2l_job_t * job,dk3_fig_drawing_t * drw,dk3_fig_obj_t * obj,int ls,double sv,double lw)1151 f2leps_eps_with_tex_set_line_style(
1152   f2l_job_t		*job,
1153   dk3_fig_drawing_t	*drw,
1154   dk3_fig_obj_t		*obj,
1155   int			 ls,
1156   double		 sv,
1157   double		 lw
1158 )
1159 {
1160   f2leps_set_line_style(job->of2, job, drw, obj, ls, sv, lw);
1161 }
1162 
1163 
1164 
1165 void
f2leps_eps_with_tex_set_line_end(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),int le)1166 f2leps_eps_with_tex_set_line_end(
1167   f2l_job_t		*job,
1168   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1169   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1170   int			 le
1171 )
1172 {
1173   DK3_UNUSED_ARG(drw)
1174   DK3_UNUSED_ARG(obj)
1175   fprintf(job->of2, f2leps_c8_kw[34], le);
1176 }
1177 
1178 
1179 
1180 void
f2leps_eps_with_tex_set_line_join(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),int lj)1181 f2leps_eps_with_tex_set_line_join(
1182   f2l_job_t		*job,
1183   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1184   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1185   int			 lj
1186 )
1187 {
1188   DK3_UNUSED_ARG(drw)
1189   DK3_UNUSED_ARG(obj)
1190   fprintf(job->of2, f2leps_c8_kw[35], lj);
1191 }
1192 
1193 
1194 
1195 void
f2leps_eps_with_tex_set_color_1(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_rgb_color_t * rgb)1196 f2leps_eps_with_tex_set_color_1(
1197   f2l_job_t		*job,
1198   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1199   dk3_rgb_color_t	*rgb
1200 )
1201 {
1202   DK3_UNUSED_ARG(drw)
1203   fprintf(job->of2, f2leps_c8_kw[32], rgb->r, rgb->g, rgb->b);
1204 }
1205 
1206 
1207 
1208 void
f2leps_eps_with_tex_set_color_2(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_rgb_color_t * rgb)1209 f2leps_eps_with_tex_set_color_2(
1210   f2l_job_t		*job,
1211   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1212   dk3_rgb_color_t	*rgb
1213 )
1214 {
1215   DK3_UNUSED_ARG(drw)
1216   fprintf(job->of2, f2leps_c8_kw[32], rgb->r, rgb->g, rgb->b);
1217 }
1218 
1219 
1220 
1221 void
f2leps_eps_with_tex_debug(f2l_job_t * job,char const * msg)1222 f2leps_eps_with_tex_debug(
1223   f2l_job_t		*job,
1224   char const		*msg
1225 )
1226 {
1227   f2leps_debug(job->of2, job, msg);
1228 }
1229 
1230 
1231 /* ************************************************************************ */
1232 /* *                                                                      * */
1233 /* * Driver: EPS standalone file                                          * */
1234 /* *                                                                      * */
1235 /* ************************************************************************ */
1236 
1237 
1238 
1239 int
f2leps_eps_pure_initialize(f2l_job_t * job,dk3_fig_drawing_t * drw)1240 f2leps_eps_pure_initialize(f2l_job_t *job, dk3_fig_drawing_t *drw)
1241 {
1242   f2leps_drawing_info_t	*pdi;
1243   dk3_fig_obj_t		*pobj;
1244   int			 back = 0;
1245   int			 fn;
1246   int			 i;
1247   int			 ff;
1248   drw->dsd = (void *)(pdi = f2leps_drawing_info_new(job, 0));
1249   if(drw->dsd) {
1250     back = 1;
1251     /*	Inspect all elements.
1252     */
1253     dk3sto_it_reset(drw->iobj);
1254     while(NULL != (pobj = (dk3_fig_obj_t *)dk3sto_it_next(drw->iobj))) {
1255       switch(pobj->ot) {
1256         case DK3_FIG_OBJ_TEXT: {
1257 	  ff = (pobj->dt).txt.ff;
1258 	  if(!(ff & DK3_FIG_FONT_FLAG_HIDDEN)) {
1259 	    if(!(ff & DK3_FIG_FONT_FLAG_SPECIAL)) {
1260 	      pdi->havetext = 1;
1261 	      switch(pobj->st) {
1262 	        case 1: {
1263 	          pdi->alignedcenter = 1;
1264 	        } break;
1265 	        case 2: {
1266 	          pdi->alignedright = 1;
1267 	        } break;
1268 	      }
1269 	      fn = dk3fig_tool_ps_font_number(pobj);
1270 	      if(-1 < fn) {
1271 	        if(35 > fn) {
1272 	          (pdi->fonts)[fn] = 1;
1273 	        }
1274 	      }
1275 	    }
1276 	  }
1277 	} break;
1278 	case DK3_FIG_OBJ_ELLIPSE:
1279 	case DK3_FIG_OBJ_POLYLINE:
1280 	case DK3_FIG_OBJ_SPLINE:
1281 	case DK3_FIG_OBJ_ARC: {
1282 	} break;
1283       }
1284     }
1285     /*	Calculate dictionary size.
1286     */
1287     for(i = 0; i < 35; i++) {
1288       if((pdi->fonts)[i]) {		/* Fonts */
1289         pdi->dictsize += 1;
1290       }
1291     }
1292     if(pdi->havetext) {			/* Font reencode procedure */
1293       pdi->dictsize += 1;
1294     }
1295     if(pdi->alignedcenter) {		/* Procedure to show centered text. */
1296       pdi->dictsize += 1;
1297     }
1298     if(pdi->alignedright) {		/* Procedure to show right-algigned. */
1299       pdi->dictsize += 1;
1300     }
1301     pdi->dictsize += 5;			/* Reserve. */
1302   } else {
1303     f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM);
1304   }
1305   return back;
1306 }
1307 
1308 
1309 
1310 void
f2leps_eps_pure_end(f2l_job_t * DK3_SILENCE_ARG_UNUSED (job),dk3_fig_drawing_t * drw)1311 f2leps_eps_pure_end(
1312   f2l_job_t		* DK3_SILENCE_ARG_UNUSED(job),
1313   dk3_fig_drawing_t	*drw
1314 )
1315 {
1316   DK3_UNUSED_ARG(job)
1317   if(drw->dsd) {
1318     f2leps_drawing_info_delete((f2leps_drawing_info_t *)(drw->dsd));
1319   }
1320 }
1321 
1322 
1323 
1324 int
f2leps_eps_pure_open_output_files(f2l_job_t * job)1325 f2leps_eps_pure_open_output_files(f2l_job_t *job)
1326 {
1327   int		 back = 0;
1328   job->of1 = dk3sf_fopen_app(job->on1, dkT("wb"), job->app);
1329   if(job->of1) {
1330     back = 1;
1331   } else {
1332     f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYSTEM);
1333   }
1334   return back;
1335 }
1336 
1337 
1338 
1339 void
f2leps_eps_pure_close_output_files(f2l_job_t * job)1340 f2leps_eps_pure_close_output_files(f2l_job_t *job)
1341 {
1342   if(job->of1) {
1343     dk3sf_fclose_app(job->of1, job->app);
1344   } job->of1 = NULL;
1345 }
1346 
1347 
1348 
1349 int
f2leps_eps_pure_start_processing(f2l_job_t * job,dk3_fig_drawing_t * drw)1350 f2leps_eps_pure_start_processing(f2l_job_t *job, dk3_fig_drawing_t *drw)
1351 {
1352   int		 back = 1;
1353   f2leps_file_header(job, drw, job->of1, 1);
1354   return back;
1355 }
1356 
1357 
1358 
1359 void
f2leps_eps_pure_end_processing(f2l_job_t * job,dk3_fig_drawing_t * drw)1360 f2leps_eps_pure_end_processing(f2l_job_t *job, dk3_fig_drawing_t *drw)
1361 {
1362   f2leps_file_footer(job, drw, job->of1, 1);
1363 }
1364 
1365 
1366 
1367 void
f2leps_eps_pure_text_object(f2l_job_t * job,dk3_fig_drawing_t * drw,dk3_fig_obj_t * obj,double x,double y)1368 f2leps_eps_pure_text_object(
1369   f2l_job_t		*job,
1370   dk3_fig_drawing_t	*drw,
1371   dk3_fig_obj_t		*obj,
1372   double		 x,
1373   double		 y
1374 )
1375 {
1376   dk3_rgb_color_t	 rgb;
1377   double		 fs;
1378   int			 ff;
1379   int			 fn;
1380   int			 muc;
1381   ff = (obj->dt).txt.ff;
1382   if(!(ff & DK3_FIG_FONT_FLAG_HIDDEN)) {
1383     if(!(ff & DK3_FIG_FONT_FLAG_SPECIAL)) {
1384       fn = dk3fig_tool_ps_font_number(obj);
1385       if(-1 < fn) {
1386         if((obj->dt).txt.st) {
1387 	  /* Set color */
1388 	  dk3fig_tool_find_color(&rgb, drw, (obj->pc), 20);
1389           muc = dk3fig_tool_must_set_color(
1390             (job->gs).hc1, (job->gs).c1.r, (job->gs).c1.g, (job->gs).c1.b,
1391             rgb.r, rgb.g, rgb.b
1392           );
1393 	  if(muc) {
1394 	    fprintf(job->of1, f2leps_c8_kw[32], rgb.r, rgb.g, rgb.b);
1395 	    (job->gs).c1.r = rgb.r;
1396 	    (job->gs).c1.g = rgb.g;
1397 	    (job->gs).c1.b = rgb.b;
1398 	    (job->gs).c2.r = rgb.r;
1399 	    (job->gs).c2.g = rgb.g;
1400 	    (job->gs).c2.b = rgb.b;
1401 	    (job->gs).hc1 = 1;
1402 	    (job->gs).hc2 = 1;
1403 	  }
1404 	  /* Set font */
1405 	  fs = (obj->dt).txt.fs;
1406 	  if(0.0 < job->nts) { fs = fs * job->nts; }
1407 	  muc = dk3fig_tool_must_set_font(
1408 	    (job->gs).hfn, (job->gs).fn, (job->gs).fs, fn, fs
1409 	  );
1410 	  if(muc) {
1411 	    fprintf(job->of1, f2leps_c8_kw[43], fn, fs);
1412 	    (job->gs).hfn = 1;
1413 	    (job->gs).fn = fn;
1414 	    (job->gs).fs = fs;
1415 	  }
1416           if(1.0e-6 < fabs((obj->dt).txt.an)) {	/* rotated */
1417 	    /* gsave */
1418 	    fputs(f2leps_c8_kw[15], job->of1);
1419 	    /* translate */
1420 	    fprintf(job->of1, f2leps_c8_kw[47], x, y);
1421 	    /* rotate */
1422 	    fprintf(
1423 	      job->of1, f2leps_c8_kw[48],
1424 	      ((180.0 * (obj->dt).txt.an) / M_PI)
1425 	    );
1426 #if 0
1427 	    /* newpath */
1428 	    fputs(f2leps_c8_kw[21], job->of1);
1429 	    /* 0 0 moveto */
1430 	    fputs(f2leps_c8_kw[49], job->of1);
1431 	    /* string */
1432 	    f2leps_encode_string(job->of1, (obj->dt).txt.st);
1433 	    /* show/show aligned */
1434 	    switch(obj->st) {
1435 	      case 2: {
1436 	        fputs(f2leps_c8_kw[46], job->of1);
1437 	      } break;
1438 	      case 1: {
1439 	        fputs(f2leps_c8_kw[45], job->of1);
1440 	      } break;
1441 	      default: {
1442 	        fputs(f2leps_c8_kw[44], job->of1);
1443 	      } break;
1444 	    }
1445 #else
1446 	    fputs(f2leps_c8_kw[51], job->of1);
1447 	    /* string */
1448 	    f2leps_encode_string(job->of1, (obj->dt).txt.st);
1449 	    /* show/show aligned */
1450 	    switch(obj->st) {
1451 	      case 2: {
1452 	        fputs(f2leps_c8_kw[46], job->of1);
1453 	      } break;
1454 	      case 1: {
1455 	        fputs(f2leps_c8_kw[45], job->of1);
1456 	      } break;
1457 	      default: {
1458 	        fputs(f2leps_c8_kw[50], job->of1);
1459 	      } break;
1460 	    }
1461 #endif
1462 	    /* grestore */
1463 	    fputs(f2leps_c8_kw[16], job->of1);
1464 	  } else {				/* not rotated */
1465 #if 0
1466 	    /* newpath */
1467 	    fputs(f2leps_c8_kw[21], job->of1);
1468 	    /* moveto */
1469 	    fprintf(job->of1, f2leps_c8_kw[25], x, y);
1470 	    /* string */
1471 	    f2leps_encode_string(job->of1, (obj->dt).txt.st);
1472 	    /* show/show aligned */
1473 	    switch(obj->st) {
1474 	      case 2: {
1475 	        fputs(f2leps_c8_kw[46], job->of1);
1476 	      } break;
1477 	      case 1: {
1478 	        fputs(f2leps_c8_kw[45], job->of1);
1479 	      } break;
1480 	      default: {
1481 	        fputs(f2leps_c8_kw[44], job->of1);
1482 	      } break;
1483 	    }
1484 #else
1485 	    fprintf(job->of1, "%g %g\n", x, y);
1486 	    /* string */
1487 	    f2leps_encode_string(job->of1, (obj->dt).txt.st);
1488 	    /* show/show aligned */
1489 	    switch(obj->st) {
1490 	      case 2: {
1491 	        fputs(f2leps_c8_kw[46], job->of1);
1492 	      } break;
1493 	      case 1: {
1494 	        fputs(f2leps_c8_kw[45], job->of1);
1495 	      } break;
1496 	      default: {
1497 	        fputs(f2leps_c8_kw[50], job->of1);
1498 	      } break;
1499 	    }
1500 #endif
1501 	  }
1502 	} else {
1503 	  /* ##### BUG: No string */
1504 	}
1505       } else {
1506         /* ##### BUG: No font number found! */
1507       }
1508     } else {
1509       /* Warning: Skipping special text! */
1510       dk3app_log_1(job->app, DK3_LL_WARNING, job->msg, 41);
1511       f2l_tool_set_exit_status(job, FIG2LAT_EXIT_ERROR_SYNTAX);
1512     }
1513   }
1514 }
1515 
1516 
1517 
1518 void
f2leps_eps_pure_image_object(f2l_job_t * job,dk3_fig_drawing_t * drw,dk3_fig_obj_t * obj,dk3_bb_t * outbb,int drawdir,int * ec)1519 f2leps_eps_pure_image_object(
1520   f2l_job_t		*job,
1521   dk3_fig_drawing_t	*drw,
1522   dk3_fig_obj_t		*obj,
1523   dk3_bb_t		*outbb,
1524   int			 drawdir,
1525   int			*ec
1526 )
1527 {
1528   f2leps_image_object(job->of1, job, drw, obj, outbb, drawdir, ec);
1529 }
1530 
1531 
1532 void
f2leps_eps_pure_newpath(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1533 f2leps_eps_pure_newpath(
1534   f2l_job_t		*job,
1535   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1536   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1537 )
1538 {
1539   DK3_UNUSED_ARG(drw)
1540   DK3_UNUSED_ARG(obj)
1541   fputs(f2leps_c8_kw[21], job->of1);
1542 }
1543 
1544 
1545 
1546 void
f2leps_eps_pure_moveto(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),double x,double y)1547 f2leps_eps_pure_moveto(
1548   f2l_job_t		*job,
1549   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1550   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1551   double		 x,
1552   double		 y
1553 )
1554 {
1555   DK3_UNUSED_ARG(drw)
1556   DK3_UNUSED_ARG(obj)
1557   fprintf(job->of1, f2leps_c8_kw[25], x, y);
1558 }
1559 
1560 
1561 
1562 void
f2leps_eps_pure_lineto(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),double x,double y)1563 f2leps_eps_pure_lineto(
1564   f2l_job_t		*job,
1565   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1566   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1567   double		 x,
1568   double		 y
1569 )
1570 {
1571   DK3_UNUSED_ARG(drw)
1572   DK3_UNUSED_ARG(obj)
1573   fprintf(job->of1, f2leps_c8_kw[26], x, y);
1574 }
1575 
1576 
1577 
1578 void
f2leps_eps_pure_curveto(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),double xcs,double ycs,double xce,double yce,double xe,double ye)1579 f2leps_eps_pure_curveto(
1580   f2l_job_t		*job,
1581   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1582   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1583   double		 xcs,
1584   double		 ycs,
1585   double		 xce,
1586   double		 yce,
1587   double		 xe,
1588   double		 ye
1589 )
1590 {
1591   DK3_UNUSED_ARG(drw)
1592   DK3_UNUSED_ARG(obj)
1593   fprintf(job->of1, f2leps_c8_kw[27], xcs, ycs, xce, yce, xe, ye);
1594 }
1595 
1596 
1597 
1598 void
f2leps_eps_pure_closepath(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1599 f2leps_eps_pure_closepath(
1600   f2l_job_t		*job,
1601   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1602   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1603 )
1604 {
1605   DK3_UNUSED_ARG(drw)
1606   DK3_UNUSED_ARG(obj)
1607   fputs(f2leps_c8_kw[28], job->of1);
1608 }
1609 
1610 
1611 
1612 void
f2leps_eps_pure_fill(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1613 f2leps_eps_pure_fill(
1614   f2l_job_t		*job,
1615   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1616   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1617 )
1618 {
1619   DK3_UNUSED_ARG(drw)
1620   DK3_UNUSED_ARG(obj)
1621   fputs(f2leps_c8_kw[29], job->of1);
1622 }
1623 
1624 
1625 
1626 void
f2leps_eps_pure_clip(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1627 f2leps_eps_pure_clip(
1628   f2l_job_t		*job,
1629   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1630   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1631 )
1632 {
1633   DK3_UNUSED_ARG(drw)
1634   DK3_UNUSED_ARG(obj)
1635   fputs(f2leps_c8_kw[30], job->of1);
1636 }
1637 
1638 
1639 
1640 void
f2leps_eps_pure_stroke(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1641 f2leps_eps_pure_stroke(
1642   f2l_job_t		*job,
1643   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1644   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1645 )
1646 {
1647   DK3_UNUSED_ARG(drw)
1648   DK3_UNUSED_ARG(obj)
1649   fputs(f2leps_c8_kw[31], job->of1);
1650 }
1651 
1652 
1653 
1654 void
f2leps_eps_pure_gsave(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1655 f2leps_eps_pure_gsave(
1656   f2l_job_t		*job,
1657   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1658   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1659 )
1660 {
1661   DK3_UNUSED_ARG(drw)
1662   DK3_UNUSED_ARG(obj)
1663   fputs(f2leps_c8_kw[15], job->of1);
1664 }
1665 
1666 
1667 
1668 void
f2leps_eps_pure_grestore(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj))1669 f2leps_eps_pure_grestore(
1670   f2l_job_t		*job,
1671   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1672   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj)
1673 )
1674 {
1675   DK3_UNUSED_ARG(drw)
1676   DK3_UNUSED_ARG(obj)
1677   fputs(f2leps_c8_kw[16], job->of1);
1678 }
1679 
1680 
1681 
1682 void
f2leps_eps_pure_setcolor(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),double r,double g,double b)1683 f2leps_eps_pure_setcolor(
1684   f2l_job_t		*job,
1685   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1686   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1687   double		 r,
1688   double		 g,
1689   double		 b
1690 )
1691 {
1692   DK3_UNUSED_ARG(drw)
1693   DK3_UNUSED_ARG(obj)
1694   fprintf(job->of1, f2leps_c8_kw[32], r, g, b);
1695 }
1696 
1697 
1698 
1699 void
f2leps_eps_pure_set_line_width(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),double lw)1700 f2leps_eps_pure_set_line_width(
1701   f2l_job_t		*job,
1702   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1703   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1704   double		 lw
1705 )
1706 {
1707   DK3_UNUSED_ARG(drw)
1708   DK3_UNUSED_ARG(obj)
1709   fprintf(job->of1, f2leps_c8_kw[33], lw);
1710 }
1711 
1712 
1713 
1714 void
f2leps_eps_pure_set_line_style(f2l_job_t * job,dk3_fig_drawing_t * drw,dk3_fig_obj_t * obj,int ls,double sv,double lw)1715 f2leps_eps_pure_set_line_style(
1716   f2l_job_t		*job,
1717   dk3_fig_drawing_t	*drw,
1718   dk3_fig_obj_t		*obj,
1719   int			 ls,
1720   double		 sv,
1721   double		 lw
1722 )
1723 {
1724   f2leps_set_line_style(job->of1, job, drw, obj, ls, sv, lw);
1725 }
1726 
1727 
1728 
1729 void
f2leps_eps_pure_set_line_end(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),int le)1730 f2leps_eps_pure_set_line_end(
1731   f2l_job_t		*job,
1732   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1733   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1734   int			 le
1735 )
1736 {
1737   DK3_UNUSED_ARG(drw)
1738   DK3_UNUSED_ARG(obj)
1739   fprintf(job->of1, f2leps_c8_kw[34], le);
1740 }
1741 
1742 
1743 
1744 void
f2leps_eps_pure_set_line_join(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_fig_obj_t * DK3_SILENCE_ARG_UNUSED (obj),int lj)1745 f2leps_eps_pure_set_line_join(
1746   f2l_job_t		*job,
1747   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1748   dk3_fig_obj_t		* DK3_SILENCE_ARG_UNUSED(obj),
1749   int			 lj
1750 )
1751 {
1752   DK3_UNUSED_ARG(drw)
1753   DK3_UNUSED_ARG(obj)
1754   fprintf(job->of1, f2leps_c8_kw[35], lj);
1755 }
1756 
1757 
1758 
1759 void
f2leps_eps_pure_set_color_1(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_rgb_color_t * rgb)1760 f2leps_eps_pure_set_color_1(
1761   f2l_job_t		*job,
1762   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1763   dk3_rgb_color_t	*rgb
1764 )
1765 {
1766   DK3_UNUSED_ARG(drw)
1767   fprintf(job->of1, f2leps_c8_kw[32], rgb->r, rgb->g, rgb->b);
1768 }
1769 
1770 
1771 
1772 void
f2leps_eps_pure_set_color_2(f2l_job_t * job,dk3_fig_drawing_t * DK3_SILENCE_ARG_UNUSED (drw),dk3_rgb_color_t * rgb)1773 f2leps_eps_pure_set_color_2(
1774   f2l_job_t		*job,
1775   dk3_fig_drawing_t	* DK3_SILENCE_ARG_UNUSED(drw),
1776   dk3_rgb_color_t	*rgb
1777 )
1778 {
1779   DK3_UNUSED_ARG(drw)
1780   fprintf(job->of1, f2leps_c8_kw[32], rgb->r, rgb->g, rgb->b);
1781 }
1782 
1783 
1784 
1785 void
f2leps_eps_pure_debug(f2l_job_t * job,char const * msg)1786 f2leps_eps_pure_debug(
1787   f2l_job_t		*job,
1788   char const		*msg
1789 )
1790 {
1791   f2leps_debug(job->of1, job, msg);
1792 }
1793 
1794