1 /*
2 Copyright (C) 2011-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: dk3bmeo.ctr
12 */
13 
14 /**	@file dk3bmeo.c The dk3bmeo module.
15 */
16 
17 
18 
19 #include <libdk3c/dk3all.h>
20 #include <libdk3bmeps/dk3bmeo.h>
21 #include <libdk3bmeps/dk3bmeps.h>
22 #include <libdk3bmeps/dk3bmj.h>
23 #include <libdk3bmeps/dk3bm.h>
24 #include <libdk3bmeps/dk3range.h>
25 #include <libdk3bmeps/dk3paper.h>
26 
27 
28 
29 
30 
31 
32 /**	Keywords used by the module.
33 */
34 static dkChar const * const dk3bmeo_kw[] = {
35 /* 0 */
36 dkT("/print/paper-size"),
37 
38 /* 1 */
39 dkT("1px1pt"),
40 
41 /* 2 */
42 dkT("chunk"),
43 
44 /* 3 */
45 dkT("1:1"),
46 
47 /* 4 */
48 dkT("/print/ps/level"),
49 
50 /* 5 */
51 dkT("%ld"),
52 
53 NULL
54 
55 };
56 
57 
58 
59 /**	Names for options.
60 */
61 static dkChar const * const dk3bmeo_option_names[] = {
62 /* 0 */
63 dkT("level"),
64 
65 /* 1 */
66 dkT("color"),
67 
68 /* 2 */
69 dkT("dsc"),
70 
71 /* 3 */
72 dkT("draft"),
73 
74 /* 4 */
75 dkT("predictor"),
76 
77 /* 5 */
78 dkT("duplex"),
79 
80 /* 6 */
81 dkT("tumble"),
82 
83 /* 7 */
84 dkT("dct"),
85 
86 /* 8 */
87 dkT("bg"),
88 
89 /* 9 */
90 dkT("interpolation"),
91 
92 /* 10 */
93 dkT("jpeg-interpolation"),
94 
95 /* 11 */
96 dkT("resolution"),
97 
98 /* 12 */
99 dkT("paper"),
100 
101 /* 13 */
102 dkT("make"),
103 
104 /* 14 */
105 dkT("aspect"),
106 
107 /* 15 */
108 dkT("bpc"),
109 
110 NULL
111 
112 };
113 
114 
115 
116 /**	Driver names.
117 */
118 dkChar const * const	dk3bmeo_driver_names[] = {
119 /* 0 */
120 dkT("ps"),
121 
122 /* 1 */
123 dkT("eps"),
124 
125 /* 2 */
126 dkT("pdf"),
127 
128 /* 3 */
129 dkT("bb"),
130 
131 NULL
132 
133 };
134 
135 
136 
137 /**	Mode names
138 */
139 dkChar const * const    dk3bmeo_mode_names[] = {
140 /* 0 */
141 dkT("i$mage"),
142 
143 /* 1 */
144 dkT("o$bject"),
145 
146 /* 2 */
147 dkT("d$ocument"),
148 
149 NULL
150 
151 };
152 
153 
154 
155 /**	Names for flate compression predictors.
156 	Order must match DK3_COMPRESSION_PREDICTOR_xxx
157 	in dk3const.h, see @ref flatepredictors.
158 */
159 dkChar const * const	dk3bmeo_predictor_names[] = {
160 /* 0 */
161 dkT("tiff"),
162 
163 /* 1 */
164 dkT("sub"),
165 
166 /* 2 */
167 dkT("up"),
168 
169 /* 3 */
170 dkT("average"),
171 
172 /* 4 */
173 dkT("paeth"),
174 
175 NULL
176 
177 };
178 
179 
180 
181 
182 void
dk3bmeo_init(dk3_bm_eps_options_t * opt)183 dk3bmeo_init(dk3_bm_eps_options_t *opt)
184 {
185 
186   if(opt) {
187     (opt->ima).ps.w = 595.0;
188     (opt->ima).ps.h = 842.0;
189     (opt->ima).ps.i = 0.0;
190     (opt->ima).ps.o = 0.0;
191     (opt->ima).ps.t = 0.0;
192     (opt->ima).ps.b = 0.0;
193     opt->resolution = 72.0;
194     opt->app = NULL;
195     opt->mode = DK3_BMEPS_MODE_OBJECT;
196     opt->szmode = DK3_BMEPS_SIZE_1_1;
197     opt->dr = DK3_BMEPS_DRIVER_PDF;
198     opt->pred = 0;
199     opt->io = 0;
200     opt->draft = 0;
201     opt->duplex = 0;
202     opt->tumble = 0;
203     opt->psl = 3;
204     opt->dsc = 0;
205     opt->dct = 1;
206     opt->kar = 1;
207     opt->bgr = 255; opt->bgg = 255; opt->bgb = 255; opt->fbg = 0;
208     opt->ip = 1; opt->jip = 0;
209     opt->make = 0;
210     opt->color = 1;
211     opt->to_stdout = 0;
212     opt->rbpc = 1;
213   }
214 }
215 
216 
217 
218 dk3_bm_eps_options_t *
dk3bmeo_new_app(dk3_app_t * app)219 dk3bmeo_new_app(dk3_app_t *app)
220 {
221   dk3_bm_eps_options_t	*back = NULL;
222 
223   back = dk3_new_app(dk3_bm_eps_options_t,1,app);
224   if(back) {
225     dk3bmeo_init(back);
226     back->app = app;
227   }
228   return back;
229 }
230 
231 
232 
233 void
dk3bmeo_delete(dk3_bm_eps_options_t * opt)234 dk3bmeo_delete(dk3_bm_eps_options_t *opt)
235 {
236 
237   if(opt) {
238     opt->app = NULL;
239     dk3_delete(opt);
240   }
241 }
242 
243 
244 
245 int
dk3bmeo_get_mode(dk3_bm_eps_options_t * opt)246 dk3bmeo_get_mode(dk3_bm_eps_options_t *opt)
247 {
248   int back = DK3_BMEPS_MODE_IMAGE;
249 
250   if(opt) {
251     back = opt->mode;
252   }
253   return back;
254 }
255 
256 
257 
258 /**	Set paper size, complain if named size is not found.
259 	@param	opt	Option set to receive size information.
260 	@param	psn	Paper size name.
261 	@param	cond	Flag: Complain (nonzero) or not (0).
262 	@return	1 on success, 0 on error.
263 */
264 static
265 int
dk3bmeo_set_paper_size_complain(dk3_bm_eps_options_t * opt,dkChar const * psn,int cond)266 dk3bmeo_set_paper_size_complain(
267   dk3_bm_eps_options_t *opt, dkChar const *psn, int cond
268 )
269 {
270   dk3_paper_size_collection_t	*psc;    /* Paper size collection. */
271   dk3_paper_size_t const	*pap;	 /* Paper size. */
272   dkChar const * const		*msg;	 /* Localized message texts. */
273   int			back	= 0;
274 
275   msg = dk3app_messages(
276     opt->app,
277     dk3bmep_str_get_string_table_name(),
278     (dkChar const **)dk3bmep_str_get_message_texts()
279   );
280   if(!(msg)) {
281     msg = dk3bmep_str_get_message_texts();
282   }
283   if((opt) && (psn)) {
284     if(opt->app) {
285       psc = dk3paper_open_app(opt->app);
286       if(psc) {
287         pap = dk3paper_find(psc, psn);
288         if(pap) {
289           (opt->ima).ps.w = pap->w;
290           (opt->ima).ps.h = pap->h;
291           (opt->ima).ps.i = pap->i;
292           (opt->ima).ps.o = pap->o;
293           (opt->ima).ps.t = pap->t;
294           (opt->ima).ps.b = pap->b;
295 	  back = 1;
296         } else {
297           /* ERROR: No such paper size. */
298           dk3bmj_log_3(
299 	    opt->app, DK3_LL_ERROR,msg,39,40,psn,DK3_BMJ_LOG_BOTH,NULL
300 	  );
301         }
302         dk3paper_close(psc);
303       } else {
304       }
305       if(!(opt->mode == DK3_BMEPS_MODE_DOCUMENT)) {
306         /* ERROR: Not a document */
307 	if(cond) {
308 	  dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,38,DK3_BMJ_LOG_BOTH,NULL);
309 	}
310       }
311     } else {
312       /* ERROR: No app! */
313     }
314   } else {
315   }
316   return back;
317 }
318 
319 
320 
321 void
dk3bmeo_apply_preferences(dk3_bm_eps_options_t * opt)322 dk3bmeo_apply_preferences(dk3_bm_eps_options_t *opt)
323 {
324   dkChar			psn[64]; /* Buffer for paper size name. */
325   int				psl;	 /* PS level. */
326 
327   if(opt->app) {
328     if(dk3app_get_pref(opt->app,dk3bmeo_kw[0],psn,DK3_SIZEOF(psn,dkChar)))
329     {
330       (void)dk3bmeo_set_paper_size_complain(opt, psn, 0);
331     }
332     if(dk3app_get_pref(opt->app,dk3bmeo_kw[4],psn,DK3_SIZEOF(psn,dkChar)))
333     {
334 #if VERSION_BEFORE_20140716
335       if(dk3sf_sscanf3(psn, dk3bmeo_kw[5], &psl) == 1)
336 #else
337       if (0 != dk3ma_i_from_string(&psl, psn, NULL))
338 #endif
339       {
340         if(psl > 3) { psl = 3; }
341 	if(psl < 2) { psl = 2; }
342 	opt->psl = psl;
343       }
344     }
345   }
346 
347 }
348 
349 
350 
351 /**	Initialize for a given driver and mode.
352 	@param	opt	Option set to complete setup.
353 */
354 static
355 void
dk3bmeo_initialize_for_driver_and_mode(dk3_bm_eps_options_t * opt)356 dk3bmeo_initialize_for_driver_and_mode(dk3_bm_eps_options_t *opt)
357 {
358   switch(opt->dr) {
359     case DK3_BMEPS_DRIVER_PS: {
360     } break;
361     case DK3_BMEPS_DRIVER_EPS: {
362     } break;
363     case DK3_BMEPS_DRIVER_PDF: {
364     } break;
365     case DK3_BMEPS_DRIVER_BB: {
366       opt->mode = DK3_BMEPS_MODE_OBJECT;
367     } break;
368   }
369   switch(opt->mode) {
370     case DK3_BMEPS_MODE_IMAGE: {
371       opt->szmode = DK3_BMEPS_SIZE_CHUNK;
372     } break;
373     case DK3_BMEPS_MODE_OBJECT: {
374       opt->szmode = DK3_BMEPS_SIZE_1_1;
375     } break;
376     case DK3_BMEPS_MODE_DOCUMENT: {
377       opt->szmode = DK3_BMEPS_SIZE_PAPER;
378       if(opt->dr == DK3_BMEPS_DRIVER_PS) {
379         opt->dsc = 1;
380       }
381     } break;
382   }
383   (opt->ima).ps.w = 595.0;
384   (opt->ima).ps.h = 842.0;
385   if(opt->mode == DK3_BMEPS_MODE_DOCUMENT) {
386     /*
387       	The option -l ps.document is typically used for fax TIFF files
388 	which already have a border. So we do not need an additional border.
389     */
390     (opt->ima).ps.i = 0.0;
391     (opt->ima).ps.o = 0.0;
392     (opt->ima).ps.t = 0.0;
393     (opt->ima).ps.b = 0.0;
394     opt->szmode = DK3_BMEPS_SIZE_PAPER;
395   } else {
396     (opt->ima).ps.i = 56.0;
397     (opt->ima).ps.o = 28.0;
398     (opt->ima).ps.t = 14.0;
399     (opt->ima).ps.b = 14.0;
400   }
401   dk3bmeo_apply_preferences(opt);
402 }
403 
404 
405 
406 
407 void
dk3bmeo_set_driver_and_mode(dk3_bm_eps_options_t * opt,int driver,int mode)408 dk3bmeo_set_driver_and_mode(dk3_bm_eps_options_t *opt, int driver, int mode)
409 {
410 
411   if(opt) {
412     opt->dr = driver;
413     opt->mode = mode;
414     dk3bmeo_initialize_for_driver_and_mode(opt);
415   }
416 }
417 
418 
419 
420 int
dk3bmeo_set_paper_size(dk3_bm_eps_options_t * opt,dkChar const * psn)421 dk3bmeo_set_paper_size(dk3_bm_eps_options_t *opt, dkChar const *psn)
422 {
423   int back;
424   back = dk3bmeo_set_paper_size_complain(opt, psn, 1);
425   return back;
426 }
427 
428 
429 
430 int
dk3bmeo_get_driver(dk3_bm_eps_options_t * opt)431 dk3bmeo_get_driver(dk3_bm_eps_options_t *opt)
432 {
433   int back = DK3_BMEPS_DRIVER_PS;
434 
435   if(opt) {
436     back = opt->dr;
437   }
438   return back;
439 }
440 
441 
442 
443 void
dk3bmeo_set_draft(dk3_bm_eps_options_t * opt,int drflag)444 dk3bmeo_set_draft(dk3_bm_eps_options_t *opt, int drflag)
445 {
446 
447   if(opt) {
448     opt->draft = drflag;
449   }
450 }
451 
452 
453 
454 int
dk3bmeo_get_draft(dk3_bm_eps_options_t * opt)455 dk3bmeo_get_draft(dk3_bm_eps_options_t *opt)
456 {
457   int back = 0;
458 
459   if(opt) {
460     back = ((opt->draft) ? 1 : 0);
461   }
462   return back;
463 }
464 
465 
466 
467 void
dk3bmeo_set_duplex(dk3_bm_eps_options_t * opt,int duplex)468 dk3bmeo_set_duplex(dk3_bm_eps_options_t *opt, int duplex)
469 {
470 
471   if(opt) {
472     opt->duplex = duplex;
473   }
474 }
475 
476 
477 
478 int
dk3bmeo_get_duplex(dk3_bm_eps_options_t * opt)479 dk3bmeo_get_duplex(dk3_bm_eps_options_t *opt)
480 {
481   int back = 0;
482 
483   if(opt) {
484     back = ((opt->duplex) ? 1 : 0);
485   }
486   return back;
487 }
488 
489 
490 
491 void
dk3bmeo_set_predictor(dk3_bm_eps_options_t * opt,int pred)492 dk3bmeo_set_predictor(dk3_bm_eps_options_t *opt, int pred)
493 {
494 
495   if(opt) {
496     opt->pred = pred;
497   }
498 }
499 
500 
501 
502 int
dk3bmeo_get_predictor(dk3_bm_eps_options_t * opt)503 dk3bmeo_get_predictor(dk3_bm_eps_options_t *opt)
504 {
505   int back = 0;
506 
507   if(opt) {
508     back = opt->pred;
509   }
510   return back;
511 }
512 
513 
514 
515 void
dk3bmeo_set_origin(dk3_bm_eps_options_t * opt,int io)516 dk3bmeo_set_origin(dk3_bm_eps_options_t *opt, int io)
517 {
518 
519   if(opt) {
520     opt->io = io;
521   }
522 }
523 
524 
525 
526 int
dk3bmeo_get_origin(dk3_bm_eps_options_t * opt)527 dk3bmeo_get_origin(dk3_bm_eps_options_t *opt)
528 {
529   int back = 0;
530 
531   if(opt) {
532     back = opt->io;
533   }
534   return back;
535 }
536 
537 
538 
539 void
dk3bmeo_set_ps_level(dk3_bm_eps_options_t * opt,int psl)540 dk3bmeo_set_ps_level(dk3_bm_eps_options_t *opt, int psl)
541 {
542 
543   if(opt) {
544     opt->psl = psl;
545     if(psl < 2) opt->psl = 2;
546     if(psl > 3) opt->psl = 3;
547   }
548 }
549 
550 
551 
552 int
dk3bmeo_get_ps_level(dk3_bm_eps_options_t * opt)553 dk3bmeo_get_ps_level(dk3_bm_eps_options_t *opt)
554 {
555   int back = 3;
556 
557   if(opt) {
558     back = opt->psl;
559   }
560   return back;
561 }
562 
563 
564 
565 void
dk3bmeo_set_dct(dk3_bm_eps_options_t * opt,int dct)566 dk3bmeo_set_dct(dk3_bm_eps_options_t *opt, int dct)
567 {
568 
569   if(opt) {
570     opt->dct = dct;
571   }
572 }
573 
574 
575 
576 int
dk3bmeo_get_dct(dk3_bm_eps_options_t * opt)577 dk3bmeo_get_dct(dk3_bm_eps_options_t *opt)
578 {
579   int back = 1;
580 
581   if(opt) {
582     back = ((opt->dct) ? 1 : 0);
583   }
584   return back;
585 }
586 
587 
588 void
dk3bmeo_set_keep_aspect_ratio(dk3_bm_eps_options_t * opt,int kar)589 dk3bmeo_set_keep_aspect_ratio(dk3_bm_eps_options_t *opt, int kar)
590 {
591 
592   if(opt) {
593     opt->kar = kar;
594   }
595 }
596 
597 
598 
599 int
dk3bmeo_get_keep_aspect_ratio(dk3_bm_eps_options_t * opt)600 dk3bmeo_get_keep_aspect_ratio(dk3_bm_eps_options_t *opt)
601 {
602   int back = 1;
603 
604   if(opt) {
605     back = ((opt->kar) ? 1 : 0);
606   }
607   return back;
608 }
609 
610 
611 
612 void
dk3bmeo_set_background(dk3_bm_eps_options_t * opt,int r,int g,int b,int f)613 dk3bmeo_set_background(dk3_bm_eps_options_t *opt, int r, int g, int b, int f)
614 {
615 
616   if(opt) {
617     opt->bgr = r; opt->bgg = g; opt->bgb = b; opt->fbg = f;
618   }
619 }
620 
621 
622 
623 int
dk3bmeo_get_background_red(dk3_bm_eps_options_t * opt)624 dk3bmeo_get_background_red(dk3_bm_eps_options_t *opt)
625 {
626   int back = 0;
627 
628   if(opt) {
629     back = opt->bgr;
630   }
631   return back;
632 }
633 
634 
635 
636 
637 int
dk3bmeo_get_background_green(dk3_bm_eps_options_t * opt)638 dk3bmeo_get_background_green(dk3_bm_eps_options_t *opt)
639 {
640   int back = 0;
641 
642   if(opt) {
643     back = opt->bgg;
644   }
645   return back;
646 }
647 
648 
649 
650 int
dk3bmeo_get_background_blue(dk3_bm_eps_options_t * opt)651 dk3bmeo_get_background_blue(dk3_bm_eps_options_t *opt)
652 {
653   int back = 0;
654 
655   if(opt) {
656     back = opt->bgb;
657   }
658   return back;
659 }
660 
661 
662 
663 int
dk3bmeo_get_background_force(dk3_bm_eps_options_t * opt)664 dk3bmeo_get_background_force(dk3_bm_eps_options_t *opt)
665 {
666   int back = 0;
667 
668   if(opt) {
669     back = ((opt->fbg) ? 1 : 0);
670   }
671   return back;
672 }
673 
674 
675 
676 void
dk3bmeo_set_interpolation(dk3_bm_eps_options_t * opt,int iip)677 dk3bmeo_set_interpolation(dk3_bm_eps_options_t *opt, int iip)
678 {
679 
680   if(opt) {
681     opt->ip = iip;
682   }
683 }
684 
685 
686 
687 int
dk3bmeo_get_interpolation(dk3_bm_eps_options_t * opt)688 dk3bmeo_get_interpolation(dk3_bm_eps_options_t *opt)
689 {
690   int back = 1;
691 
692   if(opt) {
693     back = ((opt->ip) ? 1 : 0);
694   }
695   return back;
696 }
697 
698 
699 
700 void
dk3bmeo_set_jpeg_interpolation(dk3_bm_eps_options_t * opt,int iip)701 dk3bmeo_set_jpeg_interpolation(dk3_bm_eps_options_t *opt, int iip)
702 {
703 
704   if(opt) {
705     opt->jip = iip;
706   }
707 }
708 
709 
710 
711 int
dk3bmeo_get_jpeg_interpolation(dk3_bm_eps_options_t * opt)712 dk3bmeo_get_jpeg_interpolation(dk3_bm_eps_options_t *opt)
713 {
714   int back = 0;
715 
716   if(opt) {
717     back = ((opt->jip) ? 1 : 0);
718   }
719   return back;
720 }
721 
722 
723 
724 void
dk3bmeo_set_szmode(dk3_bm_eps_options_t * opt,int newmode)725 dk3bmeo_set_szmode(dk3_bm_eps_options_t *opt, int newmode)
726 {
727 
728   if(opt) {
729     if((newmode >= 0) && (newmode <= 2)) {
730       opt->szmode = newmode;
731     }
732   }
733 }
734 
735 
736 
737 void
dk3bmeo_set_resolution(dk3_bm_eps_options_t * opt,double dpi)738 dk3bmeo_set_resolution(dk3_bm_eps_options_t *opt, double dpi)
739 {
740 
741   if(opt) {
742     opt->resolution = dpi;
743   }
744 }
745 
746 
747 
748 double
dk3bmeo_get_resolution(dk3_bm_eps_options_t * opt)749 dk3bmeo_get_resolution(dk3_bm_eps_options_t *opt)
750 {
751   double back = 72.0;
752 
753   if(opt) {
754     back = opt->resolution;
755     if(back < 0.0) { back = 0.0; }
756   }
757   return back;
758 }
759 
760 
761 
762 int
dk3bmeo_get_szmode(dk3_bm_eps_options_t * opt)763 dk3bmeo_get_szmode(dk3_bm_eps_options_t *opt)
764 {
765   int back = 0;
766 
767   if(opt) {
768     back = opt->szmode;
769   }
770   return back;
771 }
772 
773 
774 
775 /**	Set PS level.
776 	@param	opt	Option set to modify.
777 	@param	val	Value for option.
778 	@param	msg	Localized message texts.
779 	@return	1 on success, 0 on error.
780 */
781 static
782 int
dk3bmeo_option_pslevel(dk3_bm_eps_options_t * opt,dkChar const * val,dkChar const * const * msg)783 dk3bmeo_option_pslevel(
784   dk3_bm_eps_options_t	*opt,
785   dkChar const		*val,
786   dkChar const * const	*msg
787 )
788 {
789   int		back	= 0;
790   int		i;		/* Number obtained from val. */
791 
792   if(val) {
793 #if VERSION_BEFORE_20140716
794     if(dk3sf_sscanf3(val, dkT("%d"), &i))
795 #else
796     if (0 != dk3ma_i_from_string(&i, val, NULL))
797 #endif
798     {
799       if(i >= 2) {
800         if(i <= 3) {
801 	  opt->psl = i; back = 1;
802 	} else {
803 	  /* ERROR: Must be 2 or 3! */
804 	  dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,26,DK3_BMJ_LOG_BOTH,NULL);
805 	}
806       } else {
807         /* ERROR: Must be 2 or 3! */
808 	dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,26,DK3_BMJ_LOG_BOTH,NULL);
809       }
810     } else {
811       /* ERROR: Not a number! */
812       dk3bmj_log_3(opt->app, DK3_LL_ERROR,msg,24,25,val,DK3_BMJ_LOG_BOTH,NULL);
813     }
814   } else {
815     /* ERROR: Missing argument! */
816   }
817   return back;
818 }
819 
820 
821 
822 
823 /**	Set a boolean value.
824 	@param	opt	Option set, used for diagnostics.
825 	@param	dest	Boolean variable.
826 	@param	val	Text containing the value.
827 	@param	msg	Localized message texts.
828 	@return	1 on success, 0 on error.
829 */
830 static
831 int
dk3bmeo_set_boolean(dk3_bm_eps_options_t * opt,int * dest,dkChar const * val,dkChar const * const * msg)832 dk3bmeo_set_boolean(
833   dk3_bm_eps_options_t	*opt,
834   int			*dest,
835   dkChar const		*val,
836   dkChar const * const	*msg
837 )
838 {
839   int back = 0;
840 
841   if(val) {
842     if(dk3str_is_bool(val)) {
843       back = 1;
844       if(dk3str_is_on(val)) {
845         *dest = 1;
846       } else {
847         *dest = 0;
848       }
849     } else {
850       /* ERROR: Not a boolean! */
851       dk3bmj_log_3(opt->app, DK3_LL_ERROR,msg,27,28,val,DK3_BMJ_LOG_BOTH,NULL);
852     }
853   } else {
854     *dest = 1; back = 1;
855   }
856   return back;
857 }
858 
859 
860 
861 /**	Set flate predictor name.
862 	@param	opt	Option set to modify.
863 	@param	val	Value for option.
864 	@param	msg	Localized message texts.
865 	@return	1 on success, 0 on error.
866 */
867 static
868 int
dk3bmeo_option_predictor(dk3_bm_eps_options_t * opt,dkChar const * val,dkChar const * const * msg)869 dk3bmeo_option_predictor(
870   dk3_bm_eps_options_t	*opt,
871   dkChar const		*val,
872   dkChar const * const	*msg
873 )
874 {
875   int		back	= 0;
876 
877   if(val) {
878     back = dk3str_array_index(dk3bmeo_predictor_names, val, 0);
879     if(back > -1) {
880       opt->pred = back + 1;
881       back = 1;
882     } else {
883       back = 0;
884       dk3bmj_log_3(opt->app, DK3_LL_ERROR,msg,29,30,val,DK3_BMJ_LOG_BOTH,NULL);
885     }
886   } else {
887     opt->pred = DK3_COMPRESSION_PREDICTOR_TIFF; back = 1;
888   }
889   return back;
890 }
891 
892 
893 
894 /**	Set background.
895 	@param	opt	Option set to modify.
896 	@param	val	Value for option.
897 	@param	msg	Localized message texts.
898 	@return	1 on success, 0 on error.
899 */
900 static
901 int
dk3bmeo_option_background(dk3_bm_eps_options_t * opt,dkChar const * val,dkChar const * const * msg)902 dk3bmeo_option_background(
903   dk3_bm_eps_options_t	*opt,
904   dkChar const		*val,
905   dkChar const * const	*msg
906 )
907 {
908   int		back	= 0;
909   int		i;		/* Temporary conversion result. */
910   dkChar	*pc;		/* Current word pointer. */
911   dkChar	*pn;		/* Next word pointer. */
912 
913   if(val) {
914     pc = dk3str_start(val, NULL);
915     if(pc) {
916       pn = dk3str_chr(pc, dkT(':'));
917       if(pn) {
918         *(pn++) = dkT('\0');
919 #if VERSION_BEFORE_20140716
920 	if(dk3sf_sscanf3(pc, dkT("%d"), &i))
921 #else
922 	if (0 != dk3ma_i_from_string(&i, pc, NULL))
923 #endif
924 	{
925 	  opt->bgr = DK3_TO_RANGE(i,0,255);
926 	  pc = pn;
927 	  pn = dk3str_chr(pc, dkT(':'));
928 	  if(pn) {
929 	    *(pn++) = dkT('\0');
930 #if VERSION_BEFORE_20140716
931 	    if(dk3sf_sscanf3(pc, dkT("%d"), &i))
932 #else
933 	    if (0 != dk3ma_i_from_string(&i, pc, NULL))
934 #endif
935 	    {
936 	      opt->bgg = DK3_TO_RANGE(i,0,255);
937 	      pc = pn;
938 	      pn = dk3str_chr(pc, dkT(':'));
939 	      if(pn) { *(pn++) = dkT('\0'); pn = dk3str_start(pn, NULL); }
940 #if VERSION_BEFORE_20140716
941 	      if(dk3sf_sscanf3(pc, dkT("%d"), &i))
942 #else
943 	      if (0 != dk3ma_i_from_string(&i, pc, NULL))
944 #endif
945 	      {
946 	        opt->bgb = DK3_TO_RANGE(i,0,255);
947 		back = 1;
948 		if(pn) {
949 		  back = 0;
950 		  if(dk3str_is_bool(pn)) {
951 		    back = 1;
952 		    opt->fbg = (dk3str_is_on(pn) ? 1 : 0);
953 		  } else {
954 		    /* ERROR: Not a boolean! */
955 		    dk3bmj_log_3(
956 		      opt->app, DK3_LL_ERROR,msg,27,28,pn,DK3_BMJ_LOG_BOTH,NULL
957 		    );
958 		  }
959 		}
960 	      } else {
961 	        /* ERROR: Not a number! */
962 		dk3bmj_log_3(
963 		  opt->app, DK3_LL_ERROR,msg,24,25,pc,DK3_BMJ_LOG_BOTH,NULL
964 		);
965 	      }
966 	    } else {
967 	      /* ERROR: Not a number! */
968 	      dk3bmj_log_3(
969 	        opt->app, DK3_LL_ERROR,msg,24,25,pc,DK3_BMJ_LOG_BOTH,NULL
970 	      );
971 	    }
972 	  } else {
973 	    /* ERROR: Syntax! */
974 	    dk3bmj_log_3(
975 	      opt->app, DK3_LL_ERROR,msg,32,33,pc,DK3_BMJ_LOG_BOTH,NULL
976 	    );
977 	  }
978 	} else {
979 	  /* ERROR: Not a number! */
980           dk3bmj_log_3(
981 	    opt->app, DK3_LL_ERROR,msg,24,25,pc,DK3_BMJ_LOG_BOTH,NULL
982 	  );
983 	}
984       } else {
985         /* ERROR: Syntax! */
986         dk3bmj_log_3(opt->app, DK3_LL_ERROR,msg,32,33,pc,DK3_BMJ_LOG_BOTH,NULL);
987       }
988     } else {
989       /* ERROR: Empty string */
990       dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,31,DK3_BMJ_LOG_BOTH,NULL);
991     }
992   } else {
993     opt->bgr = 255; opt->bgg = 255; opt->bgb = 255; opt->fbg = 1;
994   }
995   return back;
996 }
997 
998 
999 
1000 /**	Set resolution, numeric or by name.
1001 	@param	opt	Option set to modify.
1002 	@param	val	Value for option.
1003 	@param	msg	Localized message texts.
1004 	@return	1 on success, 0 on error.
1005 */
1006 static
1007 int
dk3bmeo_option_resolution(dk3_bm_eps_options_t * opt,dkChar const * val,dkChar const * const * msg)1008 dk3bmeo_option_resolution(
1009   dk3_bm_eps_options_t	*opt,
1010   dkChar const		*val,
1011   dkChar const * const	*msg
1012 )
1013 {
1014   int		back	= 0;
1015   double	d;		/* Temporary conversion result. */
1016 
1017   if(val) {
1018     if(dk3str_casecmp(dk3bmeo_kw[1], val) == 0) {
1019       opt->szmode = DK3_BMEPS_SIZE_1_1;
1020       back = 1;
1021     } else {
1022       if(dk3str_casecmp(dk3bmeo_kw[2], val) == 0) {
1023         opt->szmode = DK3_BMEPS_SIZE_CHUNK;
1024 	back = 1;
1025       } else {
1026         if(dk3str_casecmp(dk3bmeo_kw[3], val) == 0) {
1027 	  opt->szmode = DK3_BMEPS_SIZE_1_1;
1028 	  back = 1;
1029 	} else {
1030 #if VERSION_BEFORE_20140716
1031 	  if(dk3sf_sscanf3(val, dkT("%lf"), &d))
1032 #else
1033 	  if (0 != dk3ma_d_from_string(&d, val, NULL))
1034 #endif
1035 	  {
1036 	    opt->szmode = DK3_BMEPS_SIZE_SPECIFIED;
1037 	    opt->resolution = d;
1038 	    back = 1;
1039 	  } else {
1040 	    /* ERROR: Illegal resolution value */
1041             dk3bmj_log_3(
1042 	      opt->app, DK3_LL_ERROR,msg,35,36,val,DK3_BMJ_LOG_BOTH,NULL
1043 	    );
1044 	  }
1045 	}
1046       }
1047     }
1048   } else {
1049     /* ERROR: Missing value! */
1050     dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,34,DK3_BMJ_LOG_BOTH,NULL);
1051   }
1052 
1053   return back;
1054 }
1055 
1056 
1057 
1058 /**	Set paper size.
1059 	@param	opt	Option set to modify.
1060 	@param	val	Value for option.
1061 	@param	msg	Localized message texts.
1062 	@return	1 on success, 0 on error.
1063 */
1064 static
1065 int
dk3bmeo_option_paper(dk3_bm_eps_options_t * opt,dkChar const * val,dkChar const * const * msg)1066 dk3bmeo_option_paper(
1067   dk3_bm_eps_options_t	*opt,
1068   dkChar const		*val,
1069   dkChar const * const	*msg
1070 )
1071 {
1072   int		back	= 0;
1073 
1074   if(val) {
1075     back = dk3bmeo_set_paper_size_complain(opt, val, 1);
1076     opt->szmode = DK3_BMEPS_SIZE_PAPER;
1077   } else {
1078     /* ERROR: Missing value! */
1079     dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,37,DK3_BMJ_LOG_BOTH,NULL);
1080   }
1081   return back;
1082 }
1083 
1084 
1085 
1086 int
dk3bmeo_apply_option(dk3_bm_eps_options_t * opt,dkChar const * str,dkChar const * const * msg)1087 dk3bmeo_apply_option(
1088   dk3_bm_eps_options_t	*opt,
1089   dkChar const		*str,
1090   dkChar const * const	*msg
1091 )
1092 {
1093   dkChar	 bu[1024];		/* Private copy of str. */
1094   dkChar	*p1;			/* String start, option value. */
1095   int		 ind;			/* Option name index. */
1096   int		 back	= 0;
1097 
1098   if((opt) && (str)) {
1099     p1 = dk3str_start(str, NULL);
1100     if(p1) {
1101       if(dk3str_len(p1) < DK3_SIZEOF(bu,dkChar)) {
1102         dk3str_cpy_not_overlapped(bu, p1);
1103 	p1 = dk3str_chr(bu, dkT('='));
1104 	if(p1) {
1105 	  *(p1++) = dkT('\0');
1106 	  p1 = dk3str_start(p1, NULL);
1107 	}
1108 	ind = dk3str_array_index(dk3bmeo_option_names, bu, 0);
1109 	switch(ind) {
1110 	  case 0: {	/* PS level */
1111 	    back = dk3bmeo_option_pslevel(opt, p1, msg);
1112 	  } break;
1113 	  case 1: {	/* Color flag */
1114 	    back = dk3bmeo_set_boolean(opt, &(opt->color), p1, msg);
1115 	  } break;
1116 	  case 2: {	/* DSC flag */
1117 	    back = dk3bmeo_set_boolean(opt, &(opt->dsc), p1, msg);
1118 	  } break;
1119 	  case 3: {	/* Draft flag */
1120 	    back = dk3bmeo_set_boolean(opt, &(opt->draft), p1, msg);
1121 	  } break;
1122 	  case 4: {	/* Flate predictor name */
1123 	    back = dk3bmeo_option_predictor(opt, p1, msg);
1124 	  } break;
1125 	  case 5: {	/* Duplex flag */
1126 	    back = dk3bmeo_set_boolean(opt, &(opt->duplex), p1, msg);
1127 	  } break;
1128 	  case 6: {	/* Tumble for duplex flag */
1129 	    back = dk3bmeo_set_boolean(opt, &(opt->tumble), p1, msg);
1130 	  } break;
1131 	  case 7: {	/* DCT flag */
1132 	    back = dk3bmeo_set_boolean(opt, &(opt->dct), p1, msg);
1133 	  } break;
1134 	  case 8: {	/* Background color and optional force flag */
1135 	    back = dk3bmeo_option_background(opt, p1, msg);
1136 	  } break;
1137 	  case 9: {	/* Interpolation flag */
1138 	    back = dk3bmeo_set_boolean(opt, &(opt->ip), p1, msg);
1139 	  } break;
1140 	  case 10: {	/* JPEG interpolation flag */
1141 	    back = dk3bmeo_set_boolean(opt, &(opt->jip), p1, msg);
1142 	  } break;
1143 	  case 11: {	/* Resolution, dpi number or name */
1144 	    back = dk3bmeo_option_resolution(opt, p1, msg);
1145 	  } break;
1146 	  case 12: {	/* Paper size, name or numeric */
1147 	    back = dk3bmeo_option_paper(opt, p1, msg);
1148 	  } break;
1149 	  case 13: {	/* Make */
1150 	    back = dk3bmeo_set_boolean(opt, &(opt->make), p1, msg);
1151 	  } break;
1152 	  case 14: {	/* Keep aspect ratio. */
1153 	    back = dk3bmeo_set_boolean(opt, &(opt->kar), p1, msg);
1154 	  } break;
1155 	  case 15: {	/* Reduce bits per component if possible. */
1156 
1157 	    back = dk3bmeo_set_boolean(opt, &(opt->rbpc), p1, msg);
1158 	  } break;
1159 	  default: {
1160 	    /* ERROR: Unknown option name! */
1161             dk3bmj_log_3(
1162 	      opt->app, DK3_LL_ERROR,msg,22,23,bu,DK3_BMJ_LOG_BOTH,NULL
1163 	    );
1164 	  } break;
1165 	}
1166       } else {
1167         /* ERROR: Configuration string too long! */
1168         dk3bmj_log_3(opt->app, DK3_LL_ERROR,msg,20,21,p1,DK3_BMJ_LOG_BOTH,NULL);
1169       }
1170     } else {
1171       /* ERROR: Empty configuration string! */
1172       dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,19,DK3_BMJ_LOG_BOTH,NULL);
1173     }
1174   }
1175   return back;
1176 }
1177 
1178 
1179 
1180 #if 0
1181 int
1182 dk3bmeo_set_language(
1183   dk3_bm_eps_options_t *opt, dkChar const *str, dk3_app_t *app
1184 )
1185 {
1186   dkChar		bu[1024];	/* Private copy of str. */
1187   dkChar const * const	*msg;		/* Localized messages. */
1188   dkChar		*pn;		/* Next part to process. */
1189   dkChar		*pc;		/* Current part to process. */
1190   dkChar		*pt;		/* Type. */
1191   int			back	= 0;
1192   int			lang	= -1;	/* Language. */
1193   int			mode	= -1;	/* Mode. */
1194 
1195   msg = dk3app_messages(
1196     opt->app,
1197     dk3bmep_str_get_string_table_name(),
1198     (dkChar const **)dk3bmep_str_get_message_texts()
1199   );
1200   if(!(msg)) {
1201     msg = dk3bmep_str_get_message_texts();
1202   }
1203   if((opt) && (str)) {
1204     if(dk3str_len(str) < DK3_SIZEOF(bu,dkChar)) {
1205       dk3str_cpy_not_overlapped(bu, str);
1206       pn = dk3str_chr(bu, dkT(','));
1207       if(pn) { *(pn++) = dkT('\0'); }
1208       pc = dk3str_start(bu, NULL);
1209       if(pc) {
1210         pt = dk3str_chr(pc, dkT('.'));
1211 	if(pt) { *(pt++) = dkT('\0'); pt = dk3str_start(pt, NULL); }
1212 	lang = dk3str_array_index(dk3bmeo_driver_names, pc, 0);
1213 	switch(lang) {
1214 	  case 0: {
1215 	    lang = DK3_BMEPS_DRIVER_PS; back = 1;
1216 	  } break;
1217 	  case 1: {
1218 	    lang = DK3_BMEPS_DRIVER_EPS; back = 1;
1219 	  } break;
1220 	  case 2: {
1221 	    lang = DK3_BMEPS_DRIVER_PDF; back = 1;
1222 	  } break;
1223 	  case 3: {
1224 	    back = DK3_BMEPS_DRIVER_BB; back = 1;
1225 	  } break;
1226 	  default: {
1227 	    /* ERROR: Unknown language! */
1228 	    if(app) {
1229 	      dkChar const * const	*msg;
1230               msg = dk3app_messages(
1231                 app,
1232                 dk3bmep_str_get_string_table_name(),
1233                 (dkChar const **)dk3bmep_str_get_message_texts()
1234               );
1235 	      if(msg) {
1236 	        dk3app_log_3(app, DK3_LL_ERROR, msg, 74, 75, pc);
1237 	      }
1238 	    }
1239 	  } break;
1240 	}
1241 	if(back) {
1242 	  mode = DK3_BMEPS_MODE_OBJECT;
1243 	  if(pt) {
1244 	    back = 0;
1245 	    switch(dk3str_array_index(dk3bmeo_mode_names, pt, 0)) {
1246 	      case 0: case 1: {
1247 	        mode = DK3_BMEPS_MODE_IMAGE; back = 1;
1248 	      } break;
1249 	      case 2: case 3: {
1250 	        mode = DK3_BMEPS_MODE_OBJECT; back = 1;
1251 	      } break;
1252 	      case 4: case 5: {
1253 	        mode = DK3_BMEPS_MODE_DOCUMENT; back = 1;
1254 	      } break;
1255 	    }
1256 	  }
1257 	  if(back) {
1258 	    dk3bmeo_set_driver_and_mode(opt, lang, mode);
1259             pc = pn;
1260             while(pc) {
1261 	      pn = dk3str_chr(pc, dkT(','));
1262 	      if(pn) { *(pn++) = dkT('\0'); pn = dk3str_start(pn, NULL); }
1263 	      if(!dk3bmeo_apply_option(opt, pc, msg)) { back = 0; }
1264 	      pc = pn;
1265             }
1266 	  }
1267 	}
1268       } else {
1269         /* ##### ERROR: Missing language/mode! */
1270       }
1271     } else {
1272       /* ERROR: String too long! */
1273       dk3bmj_log_3(opt->app, DK3_LL_ERROR,msg,12,13,str,DK3_BMJ_LOG_BOTH,job);
1274     }
1275   }
1276   return back;
1277 }
1278 #else
1279 int
dk3bmeo_set_language(dk3_bm_eps_options_t * opt,dkChar const * str,dk3_app_t * app)1280 dk3bmeo_set_language(
1281   dk3_bm_eps_options_t	*opt,
1282   dkChar const		*str,
1283   dk3_app_t		*app
1284 )
1285 {
1286   dkChar		bu[1024];	/* Private copy of str. */
1287   dkChar const * const	*msg;		/* Localized messages. */
1288   dkChar		*pn;		/* Next part to process. */
1289   dkChar		*pc;		/* Current part to process. */
1290   dkChar		*pt;		/* Type. */
1291   int			back	= 0;
1292 
1293   msg = dk3app_messages(
1294     opt->app,
1295     dk3bmep_str_get_string_table_name(),
1296     (dkChar const **)dk3bmep_str_get_message_texts()
1297   );
1298   if(!(msg)) {
1299     msg = dk3bmep_str_get_message_texts();
1300   }
1301   if((opt) && (str)) {
1302     dk3bmeo_init(opt);
1303     opt->app = app;
1304     if(dk3str_len(str) < DK3_SIZEOF(bu,dkChar)) {
1305       dk3str_cpy_not_overlapped(bu, str);
1306       pc = dk3str_start(bu, NULL);
1307       if(pc) {
1308         pn = dk3str_chr(pc, dkT(','));
1309 	if(pn) { *(pn++) = dkT('\0'); pn = dk3str_start(pn, NULL); }
1310 	pt = dk3str_chr(pc, dkT('.'));
1311 	if(pt) { *(pt++) = dkT('\0'); pt = dk3str_start(pt, NULL); }
1312 	back = 1;
1313 	opt->mode = DK3_BMEPS_MODE_OBJECT;
1314 	opt->szmode = DK3_BMEPS_SIZE_1_1;
1315 	switch(dk3str_array_index(dk3bmeo_driver_names, pc, 0)) {
1316 	  case 0: {
1317 	    opt->dr = DK3_BMEPS_DRIVER_PS;
1318 	  } break;
1319 	  case 1: {
1320 	    opt->dr = DK3_BMEPS_DRIVER_EPS;
1321 	  } break;
1322 	  case 2: {
1323 	    opt->dr = DK3_BMEPS_DRIVER_PDF;
1324 	  } break;
1325 	  case 3: {
1326 	    opt->dr = DK3_BMEPS_DRIVER_BB;
1327 	    opt->mode = DK3_BMEPS_MODE_OBJECT;
1328 	    opt->szmode = DK3_BMEPS_SIZE_1_1;
1329 	  } break;
1330 	  default: {
1331 	    back = 0;
1332             dk3bmj_log_3(
1333 	      opt->app, DK3_LL_ERROR,msg,15,16,pc,DK3_BMJ_LOG_BOTH,NULL
1334 	    );
1335 	  } break;
1336 	}
1337 	if(back) {
1338 	  if(pt) {
1339 	    switch(dk3str_array_abbr(dk3bmeo_mode_names, pt, dkT('$'), 0)) {
1340 	      case 0: {
1341 	        opt->mode = DK3_BMEPS_MODE_IMAGE;
1342 		opt->szmode = DK3_BMEPS_SIZE_CHUNK;
1343 	      } break;
1344 	      case 1: {
1345 	        opt->mode = DK3_BMEPS_MODE_OBJECT;
1346 		opt->szmode = DK3_BMEPS_SIZE_1_1;
1347 	      } break;
1348 	      case 2: {
1349 	        opt->mode = DK3_BMEPS_MODE_DOCUMENT;
1350 		opt->szmode = DK3_BMEPS_SIZE_PAPER;
1351 	      } break;
1352 	      default: {
1353 	        back = 0;
1354 		/* ERROR: Illegal mode! */
1355                 dk3bmj_log_3(
1356 		  opt->app, DK3_LL_ERROR,msg,17,18,pt,DK3_BMJ_LOG_BOTH,NULL
1357 		);
1358 	      } break;
1359 	    }
1360 	    if(opt->dr == DK3_BMEPS_DRIVER_BB) {
1361 	      if(opt->mode != DK3_BMEPS_MODE_OBJECT) {
1362 	        back = 0;
1363 		/* ERROR: BB driver can only produce objects! */
1364 	        dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,8,DK3_BMJ_LOG_BOTH,NULL);
1365 	      }
1366 	    }
1367 	  } else {
1368 	  }
1369           dk3bmeo_initialize_for_driver_and_mode(opt);
1370 	  if(back) {
1371 	    pc = pn;
1372 	    while(pc) {
1373 	      pn = dk3str_chr(pc, dkT(','));
1374 	      if(pn) { *(pn++) = dkT('\0'); pn = dk3str_start(pn, NULL); }
1375 	      if(!dk3bmeo_apply_option(opt, pc, msg)) { back = 0; }
1376 	      pc = pn;
1377 	    }
1378 	  }
1379 	}
1380       } else {
1381         /* ERROR: Empty string! */
1382 	dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,14,DK3_BMJ_LOG_BOTH,NULL);
1383       }
1384     } else {
1385       /* ERROR: String too long! */
1386       dk3bmj_log_3(opt->app, DK3_LL_ERROR,msg,12,13,str,DK3_BMJ_LOG_BOTH,NULL);
1387     }
1388   } else {
1389   }
1390   return back;
1391 }
1392 #endif
1393 
1394 
1395 
1396 int
dk3bmeo_check(dk3_bm_eps_options_t * opt,int type,dk3_bm_conversion_job_t * job)1397 dk3bmeo_check(
1398   dk3_bm_eps_options_t		*opt,
1399   int				 type,
1400   dk3_bm_conversion_job_t	*job
1401 )
1402 {
1403   dkChar const * const	*msg;		/* Localized message texts. */
1404   int			 back	= 1;	/* No error found (yet). */
1405 
1406   /*
1407   	Check driver.
1408   */
1409   msg = dk3app_messages(
1410     opt->app,
1411     dk3bmep_str_get_string_table_name(),
1412     (dkChar const **)dk3bmep_str_get_message_texts()
1413   );
1414   if(!(msg)) {
1415     msg = dk3bmep_str_get_message_texts();
1416   }
1417   if(type) {
1418     switch(opt->dr) {
1419       case DK3_BMEPS_DRIVER_PS:
1420       case DK3_BMEPS_DRIVER_PDF:
1421       {
1422       }
1423       break;
1424       default: {
1425         back = 0;
1426 	/* ERROR: Placed objects can use the PS or PDF driver only! */
1427 	opt->dr = DK3_BMEPS_DRIVER_PS;
1428 	dk3bmj_log_1(opt->app, DK3_LL_ERROR, msg, 2, DK3_BMJ_LOG_BOTH, job);
1429       } break;
1430     }
1431   } else {
1432     switch(opt->dr) {
1433       case DK3_BMEPS_DRIVER_PS:
1434       case DK3_BMEPS_DRIVER_EPS:
1435       case DK3_BMEPS_DRIVER_PDF:
1436       case DK3_BMEPS_DRIVER_BB:
1437       {
1438       }
1439       break;
1440       default: {
1441         back = 0;
1442 	/* ERROR: Illegal driver, must be PS, EPS, PDF, BB! */
1443 	opt->dr = DK3_BMEPS_DRIVER_PDF;
1444 	dk3bmj_log_1(opt->app, DK3_LL_ERROR, msg, 3, DK3_BMJ_LOG_BOTH, job);
1445       } break;
1446     }
1447   }
1448   /*
1449   	Check mode.
1450   */
1451   if(type) {
1452     if(opt->mode != DK3_BMEPS_MODE_PLACED_OBJECT) {
1453       back = 0;
1454       /* ERROR: Illegal mode, must be placed object! */
1455       opt->mode = DK3_BMEPS_MODE_PLACED_OBJECT;
1456       dk3bmj_log_1(opt->app, DK3_LL_ERROR, msg, 4, DK3_BMJ_LOG_BOTH, job);
1457     }
1458   } else {
1459     if(opt->mode == DK3_BMEPS_MODE_PLACED_OBJECT) {
1460       dk3bmj_log_1(opt->app, DK3_LL_ERROR, msg, 5, DK3_BMJ_LOG_BOTH, job);
1461     } else {
1462       switch(opt->dr) {
1463         case DK3_BMEPS_DRIVER_PS: {
1464           switch(opt->mode) {
1465             case DK3_BMEPS_MODE_IMAGE:
1466 	    case DK3_BMEPS_MODE_OBJECT:
1467 	    case DK3_BMEPS_MODE_DOCUMENT:
1468 	    {
1469 	    }
1470 	    break;
1471 	    default: {
1472 	      back = 0;
1473 	      /* ERROR: Illegal mode, must be image, object, document! */
1474 	      opt->mode = DK3_BMEPS_MODE_IMAGE;
1475 	      dk3bmj_log_1(opt->app,DK3_LL_ERROR,msg,6,DK3_BMJ_LOG_BOTH,job);
1476 	    } break;
1477           }
1478         } break;
1479         case DK3_BMEPS_DRIVER_EPS: {
1480 	  switch(opt->mode) {
1481 	    case DK3_BMEPS_MODE_IMAGE:
1482 	    case DK3_BMEPS_MODE_OBJECT:
1483 	    {
1484 	    }
1485 	    break;
1486 	    default: {
1487 	      back = 0;
1488 	      /* ERROR: Illegal mode, must be image or object! */
1489 	      opt->mode = DK3_BMEPS_MODE_OBJECT;
1490 	      dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,7,DK3_BMJ_LOG_BOTH,job);
1491 	    } break;
1492 	  }
1493         } break;
1494         case DK3_BMEPS_DRIVER_PDF: {
1495 	  switch(opt->mode) {
1496             case DK3_BMEPS_MODE_IMAGE:
1497 	    case DK3_BMEPS_MODE_OBJECT:
1498 	    case DK3_BMEPS_MODE_DOCUMENT:
1499 	    {
1500 	    }
1501 	    break;
1502 	    default: {
1503 	      back = 0;
1504 	      /* ERROR: Illegal mode, must be image, object, document! */
1505 	      opt->mode = DK3_BMEPS_MODE_OBJECT;
1506 	      dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,6,DK3_BMJ_LOG_BOTH,job);
1507 	    } break;
1508 	  }
1509         } break;
1510         case DK3_BMEPS_DRIVER_BB: {
1511 	  switch(opt->mode) {
1512 	    case DK3_BMEPS_MODE_OBJECT:
1513 	    {
1514 	    }
1515 	    break;
1516 	    default: {
1517 	      back = 0;
1518 	      /* ERROR: Illegal mode, BB requires object! */
1519 	      opt->mode = DK3_BMEPS_MODE_OBJECT;
1520 	      dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,8,DK3_BMJ_LOG_BOTH,job);
1521 	    } break;
1522 	  }
1523 	  if(opt->draft) {
1524 	    opt->draft = 0;
1525 	    /* ERROR: Draft mode can not be used for bounding box! */
1526 	  }
1527         } break;
1528       }
1529     }
1530   }
1531   /*
1532   	Check size mode.
1533   */
1534   if(type) {
1535   } else {
1536     switch(opt->mode) {
1537       case DK3_BMEPS_MODE_IMAGE: {
1538         switch(opt->szmode) {
1539 	  case DK3_BMEPS_SIZE_1_1: {
1540 	  } break;
1541 	  case DK3_BMEPS_SIZE_CHUNK: {
1542 	  } break;
1543 	  case DK3_BMEPS_SIZE_SPECIFIED: {
1544 	  } break;
1545 	  case DK3_BMEPS_SIZE_PAPER: {
1546 	  } break;
1547 	  default: {
1548 	    back = 0;
1549 	    /* ERROR: Illegal size mode! */
1550 	    opt->szmode = DK3_BMEPS_SIZE_1_1;
1551 	    dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,9,DK3_BMJ_LOG_BOTH,job);
1552 	  } break;
1553 	}
1554       } break;
1555       case DK3_BMEPS_MODE_OBJECT: {
1556         switch(opt->szmode) {
1557 	  case DK3_BMEPS_SIZE_1_1: {
1558 	  } break;
1559 	  default: {
1560 	    back = 0;
1561 	    /* ERROR: Illegal size mode, must be 1:1! */
1562 	    opt->szmode = DK3_BMEPS_SIZE_1_1;
1563 	    dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,10,DK3_BMJ_LOG_BOTH,job);
1564 	  } break;
1565 	}
1566       } break;
1567       case DK3_BMEPS_MODE_DOCUMENT: {
1568         if(opt->draft) {
1569 	  opt->draft = 0;
1570 	  /* ERROR: Draft can not be used with documents! */
1571 	  dk3bmj_log_1(opt->app, DK3_LL_WARNING,msg,11,DK3_BMJ_LOG_BOTH,job);
1572 	}
1573         switch(opt->szmode) {
1574 	  case DK3_BMEPS_SIZE_1_1: {
1575 	  } break;
1576 	  case DK3_BMEPS_SIZE_CHUNK: {
1577 	  } break;
1578 	  case DK3_BMEPS_SIZE_SPECIFIED: {
1579 	  } break;
1580 	  case DK3_BMEPS_SIZE_PAPER: {
1581 	  } break;
1582 	  default: {
1583 	    back = 0;
1584 	    /* ERROR: Illegal size mode! */
1585 	    opt->szmode = DK3_BMEPS_SIZE_1_1;
1586 	    dk3bmj_log_1(opt->app, DK3_LL_ERROR,msg,9,DK3_BMJ_LOG_BOTH,job);
1587 	  } break;
1588 	}
1589       } break;
1590     }
1591   }
1592   return back;
1593 }
1594 
1595