1 /* xsane -- a graphical (X11, gtk) scanner-oriented SANE frontend
2 
3    xsane.h
4 
5    Oliver Rauch <Oliver.Rauch@rauch-domain.de>
6    Copyright (C) 1998-2013 Oliver Rauch
7    This file is part of the XSANE package.
8 
9    This program is free software; you can redistribute it and/or modify
10    it under the terms of the GNU General Public License as published by
11    the Free Software Foundation; either version 2 of the License, or
12    (at your option) any later version.
13 
14    This program is distributed in the hope that it will be useful,
15    but WITHOUT ANY WARRANTY; without even the implied warranty of
16    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17    GNU General Public License for more details.
18 
19    You should have received a copy of the GNU General Public License
20    along with this program; if not, write to the Free Software
21    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
22 
23 /* ---------------------------------------------------------------------------------------------------------------------- */
24 
25 #ifndef XSANE_H
26 #define XSANE_H
27 
28 /* ---------------------------------------------------------------------------------------------------------------------- */
29 
30 /* needed for most of the xsane sources: */
31 
32 #ifdef _AIX
33 # include <lalloca.h>
34 #endif
35 
36 #if defined(__hpux) || defined(__sgi)
37 # include <alloca.h>
38 #endif
39 
40 #include <assert.h>
41 #include <errno.h>
42 #include <memory.h>
43 #include <pwd.h>
44 #include <fcntl.h>
45 #include <getopt.h>
46 #include <math.h>
47 #include <stdio.h>
48 #include <stdlib.h>
49 #include <string.h>
50 #include <unistd.h>
51 #include <signal.h>
52 #include <getopt.h>
53 #include <time.h>
54 
55 /* OS/2 want sys/types before sys/stat */
56 #include <sys/types.h>
57 #include <sys/stat.h>
58 
59 #include <locale.h>
60 
61 #include <sane/sane.h>
62 #include <sane/saneopts.h>
63 #include "xsaneopts.h"
64 
65 #include "../include/config.h"
66 #include "../include/sanei_signal.h"
67 
68 #include <gdk/gdkkeysyms.h>
69 #include <gdk/gdk.h>
70 #include <gtk/gtk.h>
71 
72 #ifdef HAVE_LIBLCMS
73 # include "lcms.h"
74 #else
75 # define cmsHTRANSFORM void *
76 #endif
77 
78 /* ---------------------------------------------------------------------------------------------------------------------- */
79 
80 #if 0
81 #define DEF_GTK_ACCEL_LOCKED 0
82 #else
83 #define DEF_GTK_ACCEL_LOCKED GTK_ACCEL_LOCKED
84 #endif
85 
86 /* ---------------------------------------------------------------------------------------------------------------------- */
87 
88 /* #define XSANE_TEST */
89 /* #define SUPPORT_RGBA */
90 /* #define HAVE_WORKING_GTK_GAMMACURVE */
91 
92 /* ---------------------------------------------------------------------------------------------------------------------- */
93 
94 #define XSANE_VERSION		"0.999"
95 #define XSANE_AUTHOR		"Oliver Rauch"
96 #define XSANE_COPYRIGHT		"Oliver Rauch"
97 #define XSANE_DATE		"1998-2013"
98 #define XSANE_EMAIL_ADR		"Oliver.Rauch@xsane.org"
99 #define XSANE_HOMEPAGE		"http://www.xsane.org"
100 #define XSANE_COPYRIGHT_TXT	XSANE_DATE " " XSANE_COPYRIGHT
101 
102 /* ---------------------------------------------------------------------------------------------------------------------- */
103 
104 #define XSANE_DEBUG_ENVIRONMENT	"XSANE_DEBUG"
105 
106 #define XSANE_PROGRESS_BAR_MIN_DELTA_PERCENT 0.025
107 #define XSANE_DEFAULT_UMASK		0007
108 #define XSANE_HOLD_TIME			200
109 #define XSANE_CONTINUOUS_HOLD_TIME	10
110 #define XSANE_DEFAULT_DEVICE		"SANE_DEFAULT_DEVICE"
111 #define XSANE_3PASS_BUFFER_RGB_SIZE	1024
112 #define TEXTBUFSIZE			255
113 
114 #ifndef M_PI_2
115 # define M_PI_2 1.57079632679489661923 /* pi/2 */
116 #endif
117 
118 #ifdef HAVE_WINDOWS_H
119 # define _WIN32
120 #endif
121 
122 #ifdef _WIN32
123 # define BUGGY_GDK_INPUT_EXCEPTION
124 #endif
125 
126 #ifdef HAVE_OS2_H
127 # define BUGGY_GDK_INPUT_EXCEPTION
128 # define strcasecmp stricmp
129 #endif
130 
131 #ifdef HAVE_LIBPNG
132 #ifdef HAVE_LIBZ
133 # define XSANE_DEFAULT_EMAIL_TYPE XSANE_FILETYPE_PNG
134 # define XSANE_ACTIVATE_EMAIL
135 #endif
136 #endif
137 
138 #ifndef XSANE_DEFAULT_EMAIL_TYPE
139 #ifdef HAVE_LIBJPEG
140 # define XSANE_DEFAULT_EMAIL_TYPE XSANE_FILETYPE_JPEG
141 # define XSANE_ACTIVATE_EMAIL
142 #endif
143 #endif
144 
145 #ifndef XSANE_DEFAULT_EMAIL_TYPE
146 #ifdef HAVE_LIBTIFF
147 # define XSANE_DEFAULT_EMAIL_TYPE XSANE_FILETYPE_TIFF
148 # define XSANE_ACTIVATE_EMAIL
149 #endif
150 #endif
151 
152 #ifndef XSANE_DEFAULT_EMAIL_TYPE
153 # define XSANE_DEFAULT_EMAIL_TYPE XSANE_FILETYPE_PNM
154 #endif
155 
156 
157 /* ---------------------------------------------------------------------------------------------------------------------- */
158 
159 #ifndef SLASH
160 # ifdef _WIN32
161 #  define SLASH '\\'
162 # elif defined(HAVE_OS2_H)
163 #  define SLASH '\\'
164 # else
165 #  define SLASH '/'
166 # endif
167 #endif
168 
169 /* *** NOT USED IN THE MOMENT. MAY BE USED LATER *** */
170 /* ************************************************* */
171 #ifndef XSANE_FIXED_HOME_DIR
172 # ifdef _WIN32
173 #  define XSANE_FIXED_HOME_DIR c:\\SANE-Images
174 # elif defined(HAVE_OS2_H)
175 #  define XSANE_FIXED_HOME_DIR c:\\SANE-Images
176 # else
177 #  define XSANE_FIXED_HOME_DIR /tmp
178 # endif
179 #endif
180 
181 /* *** FIXED_APPDATA_DIR is used when the environment variable *** */
182 /* *** ENVIRONMENT_APPDATA_DIR_NAME does not exist. It is used *** */
183 /* *** to store the configuration files of xsane.              *** */
184 /* *************************************************************** */
185 #ifndef XSANE_FIXED_APPDATA_DIR
186 # ifdef _WIN32
187 #  define XSANE_FIXED_APPDATA_DIR c:\\SANE
188 # elif defined(HAVE_OS2_H)
189 #  define XSANE_FIXED_APPDATA_DIR c:\\SANE
190 # else
191 #  define XSANE_FIXED_APPDATA_DIR /tmp
192 # endif
193 #endif
194 
195 /* *** NOT USED IN THE MOMENT. MAY BE USED LATER *** */
196 /* ************************************************* */
197 #ifndef ENVIRONMENT_HOME_DIR_NAME
198 # ifdef _WIN32
199 #  define ENVIRONMENT_HOME_DIR_NAME HOME
200 # elif defined(HAVE_OS2_H)
201 #  define ENVIRONMENT_HOME_DIR_NAME HOME
202 # else
203 #  define ENVIRONMENT_HOME_DIR_NAME HOME
204 # endif
205 #endif
206 
207 /* *** ENVIRONMENT_APPDATA_DIR_NAME is used to store the       *** */
208 /* *** configuration files of xsane.                           *** */
209 /* *************************************************************** */
210 #ifndef ENVIRONMENT_APPDATA_DIR_NAME
211 # ifdef _WIN32
212 #  define ENVIRONMENT_APPDATA_DIR_NAME APPDATA
213 # elif defined(HAVE_OS2_H)
214 #  define ENVIRONMENT_APPDATA_DIR_NAME HOME
215 # else
216 #  define ENVIRONMENT_APPDATA_DIR_NAME HOME
217 # endif
218 #endif
219 
220 /* *** NOT USED IN THE MOMENT. MAY BE USED LATER *** */
221 /* ************************************************* */
222 #ifndef ENVIRONMENT_SYSTEMROOT_DIR_NAME
223 # ifdef _WIN32
224 /* SYSTEMROOT is used on WIN2K and WINXP */
225 #  define ENVIRONMENT_SYSTEMROOT_DIR_NAME_1 SYSTEMROOT
226 #  define ENVIRONMENT_SYSTEMROOT_DIR_NAME_2 WINDIR
227 /* WINDIR is used on WIN98 and WINME */
228 # elif defined(HAVE_OS2_H)
229 #  define ENVIRONMENT_SYSTEMROOT_DIR_NAME_1 NONE
230 #  define ENVIRONMENT_SYSTEMROOT_DIR_NAME_2 NONE
231 # else
232 #  define ENVIRONMENT_SYSTEMROOT_DIR_NAME_1 NONE
233 #  define ENVIRONMENT_SYSTEMROOT_DIR_NAME_2 NONE
234 # endif
235 #endif
236 
237 #ifndef ENVIRONMENT_TEMP_DIR_NAME
238 # define ENVIRONMENT_TEMP_DIR_NAME TMP
239 #endif
240 
241 #ifndef ENVIRONMENT_BROWSER_NAME
242 # define ENVIRONMENT_BROWSER_NAME BROWSER
243 #endif
244 
245 /* *** DEFAULT_BROWSER is used when environment variable       *** */
246 /* *** BROWSER is not defined at first startup of xsane.       *** */
247 /* *************************************************************** */
248 #ifndef DEFAULT_BROWSER
249 # ifdef _WIN32
250 #  define DEFAULT_BROWSER "iexplore.exe"
251 # elif defined(HAVE_OS2_H)
252 #  define DEFAULT_BROWSER "netscape"
253 # else
254 #  define DEFAULT_BROWSER "xdg-open"
255 # endif
256 #endif
257 
258 /* ---------------------------------------------------------------------------------------------------------------------- */
259 
260 #define IMAGE_SAVED	TRUE
261 #define IMAGE_NOT_SAVED	FALSE
262 
263 /* ---------------------------------------------------------------------------------------------------------------------- */
264 
265 #include "xsane-text.h"
266 #include "xsane-fixedtext.h"
267 #include "xsane-icons.h"
268 #include "xsane-viewer.h"
269 
270 /* ---------------------------------------------------------------------------------------------------------------------- */
271 
272 #if GTK_MAJOR_VERSION == 2
273 # define HAVE_GTK2
274 # ifndef _WIN32
275 #  define USE_GTK2_WINDOW_GET_POSITION
276 # endif
277 #endif
278 
279 #ifdef HAVE_GTK2
280 # define HAVE_GTK_TEXT_VIEW_H
281 # define DEF_GTK_MENU_ACCEL_VISIBLE GTK_ACCEL_VISIBLE
282 #else /* we don't have gtk+-2.0 */
283 # include "xsane-gtk-1_x-compat.h"
284 #endif
285 
286 /* ---------------------------------------------------------------------------------------------------------------------- */
287 
288 #ifdef ENABLE_NLS
289 #    include <libintl.h>
290 #    define _(String) gettext (String)
291 #    ifdef gettext_noop
292 #        define N_(String) gettext_noop (String)
293 #    else
294 #        define N_(String) (String)
295 #    endif
296 #else
297 /* Stubs that do something close enough.  */
298 #    define textdomain(String) (String)
299 #    define gettext(String) (String)
300 #    define dgettext(Domain,Message) (Message)
301 #    define dcgettext(Domain,Message,Type) (Message)
302 #    define bindtextdomain(Domain,Directory) (Domain)
303 #    define _(String) (String)
304 #    define N_(String) (String)
305 #endif
306 
307 /* ---------------------------------------------------------------------------------------------------------------------- */
308 
309 #ifndef PATH_MAX
310 # define PATH_MAX	1024
311 #endif
312 
313 /* ---------------------------------------------------------------------------------------------------------------------- */
314 
315 enum
316 {
317   XSANE_PATH_LOCAL_SANE = 0,
318   XSANE_PATH_SYSTEM,
319   XSANE_PATH_TMP
320 };
321 
322 /* ---------------------------------------------------------------------------------------------------------------------- */
323 
324 typedef struct
325 {
326   char *name;
327   float xoffset;
328   float yoffset;
329   float width;
330   float height;
331 } pref_default_preset_area_t;
332 
333 /* ---------------------------------------------------------------------------------------------------------------------- */
334 
335 typedef struct
336   {
337     /* The option number of the well-known options.  Each of these may
338        be -1 in case the backend doesn't define the respective option.  */
339     int scanmode;
340     int scansource;
341     int preview;
342     int dpi;
343     int dpi_x;
344     int dpi_y;
345     int coord[4];
346     int gamma_vector;
347     int gamma_vector_r;
348     int gamma_vector_g;
349     int gamma_vector_b;
350     int bit_depth;
351     int threshold;
352     int highlight;
353     int highlight_r;
354     int highlight_g;
355     int highlight_b;
356     int shadow;
357     int shadow_r;
358     int shadow_g;
359     int shadow_b;
360     int batch_scan_start;
361     int batch_scan_loop;
362     int batch_scan_end;
363     int batch_scan_next_tl_y;
364   }
365 WellKnownOptions;
366 
367 /* ---------------------------------------------------------------------------------------------------------------------- */
368 
369 typedef struct
370   {
371     gchar *label;
372     struct DialogElement *elem;
373     gint index;
374   }
375 MenuItem;
376 
377 /* ---------------------------------------------------------------------------------------------------------------------- */
378 
379 typedef struct DialogElement
380   {
381     GtkWidget *widget;
382     GtkWidget *widget2;
383     GtkObject *data;
384     int menu_size;		/* # of items in menu (if any) */
385     MenuItem *menu;
386   }
387 DialogElement;
388 
389 /* ---------------------------------------------------------------------------------------------------------------------- */
390 
391 typedef struct Image_info
392   {
393     int image_width;
394     int image_height;
395 
396     int depth;
397     int channels;
398 
399     double resolution_x;
400     double resolution_y;
401 
402     double gamma;
403     double gamma_red;
404     double gamma_green;
405     double gamma_blue;
406 
407     double brightness;
408     double brightness_red;
409     double brightness_green;
410     double brightness_blue;
411 
412     double contrast;
413     double contrast_red;
414     double contrast_green;
415     double contrast_blue;
416 
417     double threshold;
418 
419     int reduce_to_lineart;
420 
421     int enable_color_management;
422     int cms_function;
423     int cms_intent;
424     int cms_bpc;
425 
426     char icm_profile[PATH_MAX];
427   }
428 Image_info;
429 
430 /* ---------------------------------------------------------------------------------------------------------------------- */
431 #include "xsane-preferences.h"
432 #include "xsane-preview.h"
433 
434 /* ---------------------------------------------------------------------------------------------------------------------- */
435 
436 #ifdef HAVE_ANY_GIMP
437 # include <libgimp/gimp.h>
438 
439 # ifdef HAVE_GIMP_2
440 #     define GIMP_HAVE_RESOLUTION_INFO
441 # else
442 #  ifdef HAVE_LIBGIMP_GIMPFEATURES_H
443 #   include <libgimp/gimpfeatures.h>
444 #  else
445 #   define GIMP_CHECK_VERSION(major, minor, micro) 0
446 #  endif /* HAVE_LIBGIMP_GIMPFEATURES_H */
447 # endif
448 
449 # ifdef GIMP_CHECK_VERSION
450 #  if GIMP_CHECK_VERSION(1,1,25)
451 /* ok, we have the gimp-1.2 or gimp-2.0 interface */
452 #  else
453 /* we have the gimp-1.0 interface and need the compatibility header file */
454 #   include "xsane-gimp-1_0-compat.h"
455 #  endif
456 # else
457 /* we have the gimp-1.0 interface and need the compatibility header file */
458 #  include "xsane-gimp-1_0-compat.h"
459 # endif
460 
461   extern GimpPlugInInfo PLUG_IN_INFO; /* needed for win32 */
462 
463 #endif /* HAVE_ANY_GIMP */
464 
465 /* ---------------------------------------------------------------------------------------------------------------------- */
466 
467 enum
468 {
469   XSANE_VIEWER,
470   XSANE_SAVE,
471   XSANE_COPY,
472   XSANE_MULTIPAGE,
473   XSANE_FAX,
474   XSANE_EMAIL
475 };
476 
477 enum
478 {
479   XSANE_LINEART_STANDARD,
480   XSANE_LINEART_XSANE,
481   XSANE_LINEART_GRAYSCALE
482 };
483 
484 enum
485 {
486   EMAIL_AUTH_NONE = 0,
487   EMAIL_AUTH_POP3,
488   EMAIL_AUTH_ASMTP_PLAIN,
489   EMAIL_AUTH_ASMTP_LOGIN,
490   EMAIL_AUTH_ASMTP_CRAM_MD5
491 };
492 
493 enum
494 {
495   XSANE_CMS_FUNCTION_EMBED_SCANNER_ICM_PROFILE = 0,
496   XSANE_CMS_FUNCTION_CONVERT_TO_SRGB,
497   XSANE_CMS_FUNCTION_CONVERT_TO_WORKING_CS
498 };
499 
500 /* ---------------------------------------------------------------------------------------------------------------------- */
501 
502 extern void xsane_pref_save(void);
503 extern void xsane_interface(int argc, char **argv);
504 extern void xsane_batch_scan_add(void);
505 
506 /* ---------------------------------------------------------------------------------------------------------------------- */
507 #ifndef TEMP_PATH
508 # define TEMP_PATH		/tmp/
509 #endif
510 
511 #define OUT_FILENAME     	"out.pnm"
512 #define PRINTERNAME	  	"new printer"
513 #define PRINTERCOMMAND  	"lpr"
514 #define PRINTERCOPYNUMBEROPTION "-#"
515 #define FAXPROJECT 	    	"faxproject"
516 #define FAXCOMMAND 	 	"sendfax"
517 #define FAXRECEIVEROPT		"-d"
518 #define FAXPOSTSCRIPTOPT	""
519 #define FAXNORMALOPT		"-l"
520 #define FAXFINEOPT		"-m"
521 #define FAXVIEWER		"ghostscript"
522 #define FAXCONVERTPSTOPNM  	"gs -dNOPAUSE -dBATCH -q -r204 -sDEVICE=pnm -sOutputFile="
523 #define EMAILPROJECT 	    	"emailproject"
524 #define EMAILCOMMAND 	 	"sendmail"
525 #define MULTIPAGEPROJECT    	"multipageproject"
526 #define MULTIPAGEFILETYPE    	XSANE_FILETYPE_PDF
527 #define OCRCOMMAND 	 	"gocr"
528 #define OCRINPUTFILEOPT	 	"-i"
529 #define OCROUTPUTFILEOPT	"-o"
530 #define OCROUTFDOPT		"-x"
531 #define OCRPROGRESSKEY		""
532 #define BROWSER_NETSCAPE	"netscape"
533 
534 #define XSANE_MEDIUM_CALIB_BRIGHTNESS_MIN	-1000.0
535 #define XSANE_MEDIUM_CALIB_BRIGHTNESS_MAX	 1000.0
536 #define XSANE_MEDIUM_CALIB_CONTRAST_MIN	 	-1000.0
537 #define XSANE_MEDIUM_CALIB_CONTRAST_MAX	 	 1000.0
538 
539 #define XSANE_BRIGHTNESS_MIN	-100.0
540 #define XSANE_BRIGHTNESS_MAX	 100.0
541 #define XSANE_CONTRAST_GRAY_MIN	-100.0
542 #define XSANE_CONTRAST_MIN	-100.0
543 #define XSANE_CONTRAST_MAX	 100.0
544 
545 #define XSANE_GAMMA_MIN		0.3
546 #define XSANE_GAMMA_MAX		3.0
547 
548 #define HIST_WIDTH			256
549 #define HIST_HEIGHT			100
550 #define XSANE_DIALOG_WIDTH		296
551 #define XSANE_DIALOG_HEIGHT		451
552 #define XSANE_DIALOG_POS_X		1
553 #define XSANE_DIALOG_POS_Y		50
554 #define XSANE_HISTOGRAM_DIALOG_POS_X	280
555 #define XSANE_HISTOGRAM_DIALOG_POS_Y	50
556 #define XSANE_PROJECT_DIALOG_POS_X	280
557 #define XSANE_PROJECT_DIALOG_POS_Y	425
558 #define XSANE_GAMMA_DIALOG_POS_X	280
559 #define XSANE_GAMMA_DIALOG_POS_Y	420
560 #define XSANE_BATCH_DIALOG_POS_X	480
561 #define XSANE_BATCH_DIALOG_POS_Y	420
562 #define XSANE_STD_OPTIONS_DIALOG_POS_X	1
563 #define XSANE_STD_OPTIONS_DIALOG_POS_Y	400
564 #define XSANE_ADV_OPTIONS_DIALOG_POS_X	280
565 #define XSANE_ADV_OPTIONS_DIALOG_POS_Y	420
566 #define XSANE_PREVIEW_DIALOG_POS_X	560
567 #define XSANE_PREVIEW_DIALOG_POS_Y	50
568 #define XSANE_PREVIEW_DIALOG_WIDTH	100
569 #define XSANE_PREVIEW_DIALOG_HEIGHT	100
570 
571 #define XSANE_SLIDER_ACTIVE	0
572 #define XSANE_SLIDER_INACTIVE	4
573 #define XSANE_SLIDER_WIDTH	260
574 #define XSANE_SLIDER_HEIGHT	10
575 #define XSANE_SLIDER_OFFSET	2
576 #define XSANE_SLIDER_EVENTS	GDK_EXPOSURE_MASK | GDK_ENTER_NOTIFY_MASK | \
577 				GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | \
578 				GDK_BUTTON1_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK
579 #define INF			5.0e9
580 #define MM_PER_INCH		25.4
581 
582 /* ---------------------------------------------------------------------------------------------------------------------- */
583 
584 #define STRINGIFY1(x)   #x
585 #define STRINGIFY(x)    STRINGIFY1(x)
586 
587 #define NELEMS(a)       ((int)(sizeof (a) / sizeof (a[0])))
588 
589 /* ---------------------------------------------------------------------------------------------------------------------- */
590 
591 enum
592 {
593  XSANE_UNKNOWN, XSANE_PNM, XSANE_JPEG, XSANE_PNG, XSANE_PS, XSANE_TIFF, XSANE_RGBA,
594  XSANE_RAW16, XSANE_PNM16, XSANE_TEXT, XSANE_PDF
595 };
596 
597 /* ---------------------------------------------------------------------------------------------------------------------- */
598 
599 enum
600 {
601  XSANE_STANDALONE, XSANE_GIMP_EXTENSION
602 };
603 
604 /* ---------------------------------------------------------------------------------------------------------------------- */
605 
606 typedef struct XsanePixmap
607 {
608   GtkWidget *frame;
609   GdkPixmap *pixmap;
610   GtkWidget *pixmapwid;
611 } XsanePixmap;
612 
613 /* ---------------------------------------------------------------------------------------------------------------------- */
614 
615 typedef struct XsaneSlider
616 {
617   int position[3];
618   double value[3];
619   double min, max;
620   int active;
621   GtkWidget *preview;
622   int r, g, b;
623 } XsaneSlider;
624 
625 /* ---------------------------------------------------------------------------------------------------------------------- */
626 
627 typedef struct XsaneChildprocess
628 {
629   pid_t pid;
630   struct XsaneChildprocess *next;
631 } XsaneChildprocess;
632 
633 /* ---------------------------------------------------------------------------------------------------------------------- */
634 
635 typedef struct Xsane
636 {
637     SANE_Int sane_backend_versioncode;
638     char *backend;
639     char *backend_translation;
640     char *device_set_filename;
641     char *xsane_rc_set_filename;
642     char *output_filename;
643     char *dummy_filename;
644 
645     SANE_Int sensitivity;
646 
647     GtkWidget *xsane_window;
648     GtkWidget *standard_window;
649     GtkWidget *advanced_window;
650     GtkWidget *gamma_window;
651     GtkWidget *xsane_hbox;
652     GtkWidget *standard_hbox;
653     GtkWidget *advanced_hbox;
654     GtkWidget *xsanemode_widget;
655 
656     GtkAccelGroup *accelerator_group;
657     GtkTooltips *tooltips;
658     GdkColor tooltips_fg;
659     GdkColor tooltips_bg;
660 
661     SANE_Handle *dev;
662     const char *dev_name;
663     WellKnownOptions well_known;
664     int num_elements;
665     DialogElement *element;
666     u_int rebuild : 1;
667     int pixelcolor;
668     int scanning;
669     int reading_data;
670     int cancel_scan;
671 
672     int batch_scan_load_default_list;	/* load default list at program startup flag */
673     int batch_loop; /* is set when batch scanning and not last scan */
674     int batch_scan_use_stored_scanmode;
675     int batch_scan_use_stored_resolution;
676     int batch_scan_use_stored_bit_depth;
677     SANE_Status status_of_last_scan;
678 
679 /* free gamma curve widgets */
680     GtkWidget *gamma_curve_gray;
681     GtkWidget *gamma_curve_red;
682     GtkWidget *gamma_curve_green;
683     GtkWidget *gamma_curve_blue;
684 
685 /* previous global stand alone varaibales */
686     const char   *prog_name;      /* name of this program, normally "xsane" */
687     const char   *device_text;      /* name of the selected device */
688     GtkWidget    *choose_device_dialog;      /* the widget of the device selection dialog */
689     const SANE_Device **devlist;      /* the list of available devices */
690     int          selected_dev;        /* the selected device */
691     int          num_of_devs;
692     int          back_gtk_message_dialog_active;
693 
694 
695     /* dialogs */
696     GtkWidget *dialog;
697     GtkWidget *menubar;
698     GtkWidget *standard_options_dialog;
699     GtkWidget *advanced_options_dialog;
700     GtkWidget *main_dialog_scrolled;
701     GtkWidget *histogram_dialog;
702     GtkWidget *gamma_dialog;
703 
704     GtkWidget *batch_scan_dialog;
705     GtkWidget *batch_scan_button_box;
706     GtkWidget *batch_scan_action_box;
707     GtkWidget *batch_scan_list;
708     GtkAdjustment *batch_scan_vadjustment;
709 
710     GtkWidget *project_dialog;
711     GtkWidget *project_list;
712     GtkWidget *project_box;
713     GtkWidget *project_exists;
714     GtkWidget *project_not_exists;
715     GtkWidget *project_entry;
716     GtkWidget *project_entry_box;
717     GtkProgressBar *project_progress_bar;
718 
719     GtkWidget *fax_receiver_entry;
720 
721     GtkWidget *email_receiver_entry;
722     GtkWidget *email_subject_entry;
723     GtkWidget *email_text_widget;
724     GtkWidget *email_html_mode_widget;
725 
726     GdkPixmap *window_icon_pixmap;
727     GdkBitmap *window_icon_mask;
728 
729     GtkWidget *hruler;
730     GtkWidget *vruler;
731     GtkWidget *info_label;
732     GtkObject *start_button;
733     GtkObject *cancel_button;
734     GtkSignalFunc cancel_callback;
735     Viewer    *viewer_list;
736     Preview   *preview;
737     int preview_gamma_size;
738     int mode;
739 
740     int main_window_fixed;
741     int mode_selection;
742 
743 #ifndef USE_GTK2_WINDOW_GET_POSITION
744     int get_deskrelative_origin;
745 #endif
746 
747     /* various scanning related state: */
748     SANE_Int depth;
749     size_t num_bytes;
750     size_t bytes_read;
751     int read_offset_16;
752     char last_offset_16_byte;
753     int  lineart_to_grayscale_x;
754     GtkProgressBar *progress_bar;
755     int input_tag;
756     SANE_Parameters param;
757     int adf_page_counter;
758     int scan_rotation;
759 
760     /* for standalone mode: */
761     GtkWidget *filename_entry;
762     GtkWidget *filetype_option_menu;
763 
764     /* for all modes */
765     GtkWidget *cms_function_option_menu;
766 
767     /* saving and transformation values: */
768     FILE *out;
769     int xsane_mode;
770     int xsane_output_format;
771     long header_size;
772     int expand_lineart_to_grayscale;
773     int reduce_16bit_to_8bit;
774 
775     /* histogram window */
776     struct XsanePixmap histogram_raw;
777     struct XsanePixmap histogram_enh;
778 
779     struct XsaneSlider slider_gray;
780     struct XsaneSlider slider_red;
781     struct XsaneSlider slider_green;
782     struct XsaneSlider slider_blue;
783     guint  batch_scan_gamma_timer; /* has to be guint */
784     guint  slider_timer; /* has to be guint */
785     int    slider_timer_restart;
786 
787     double auto_white;
788     double auto_gray;
789     double auto_black;
790     double auto_white_red;
791     double auto_gray_red;
792     double auto_black_red;
793     double auto_white_green;
794     double auto_gray_green;
795     double auto_black_green;
796     double auto_white_blue;
797     double auto_gray_blue;
798     double auto_black_blue;
799 
800     int histogram_red;
801     int histogram_green;
802     int histogram_blue;
803     int histogram_int;
804     int histogram_lines;
805     int histogram_log;
806 
807     int no_preview_medium_gamma; /* disable preview medium gamma */
808     int medium_calibration; /* enable calibration mode for medium */
809     int brightness_min;
810     int brightness_max;
811     int contrast_gray_min;
812     int contrast_min;
813     int contrast_max;
814 
815     /* colors */
816     GdkGC *gc_red;
817     GdkGC *gc_green;
818     GdkGC *gc_blue;
819     GdkGC *gc_black;
820     GdkGC *gc_trans;
821     GdkGC *gc_backg;
822     GdkColor *bg_trans;
823 
824     int copy_number;
825     double zoom;
826     double resolution;
827     double resolution_x;
828     double resolution_y;
829 
830     GtkWidget *medium_widget;
831     GtkWidget *length_unit_mm;
832     GtkWidget *length_unit_cm;
833     GtkWidget *length_unit_in;
834     GtkWidget *update_policy_continu;
835     GtkWidget *update_policy_discont;
836     GtkWidget *update_policy_delayed;
837     GtkWidget *show_preview_widget;
838     GtkWidget *show_histogram_widget;
839     GtkWidget *show_gamma_widget;
840     GtkWidget *show_batch_scan_widget;
841     GtkWidget *show_standard_options_widget;
842     GtkWidget *show_advanced_options_widget;
843     GtkWidget *show_resolution_list_widget;
844     GtkWidget *enable_color_management_widget;
845     GtkWidget *edit_medium_definition_widget;
846     GtkWidget *zoom_widget;
847     GtkWidget *gamma_widget;
848     GtkWidget *gamma_red_widget;
849     GtkWidget *gamma_green_widget;
850     GtkWidget *gamma_blue_widget;
851     GtkWidget *brightness_widget;
852     GtkWidget *brightness_red_widget;
853     GtkWidget *brightness_green_widget;
854     GtkWidget *brightness_blue_widget;
855     GtkWidget *contrast_widget;
856     GtkWidget *contrast_red_widget;
857     GtkWidget *contrast_green_widget;
858     GtkWidget *contrast_blue_widget;
859     GtkWidget *threshold_widget;
860 
861     SANE_Int xsane_channels;
862     SANE_Bool scanner_gamma_color;
863     SANE_Bool scanner_gamma_gray;
864 
865     int email_project_save;
866     int email_html_mode;
867 
868     GtkWidget *outputfilename_entry;
869     GtkWidget *adf_pages_max_entry;
870     GtkWidget *copy_number_entry;
871 
872     gfloat *free_gamma_data, *free_gamma_data_red, *free_gamma_data_green, *free_gamma_data_blue;
873     SANE_Int *gamma_data, *gamma_data_red, *gamma_data_green, *gamma_data_blue;
874     u_char *preview_gamma_data_red, *preview_gamma_data_green, *preview_gamma_data_blue;
875     u_char *histogram_gamma_data_red, *histogram_gamma_data_green, *histogram_gamma_data_blue;
876     u_char *histogram_medium_gamma_data_red, *histogram_medium_gamma_data_green, *histogram_medium_gamma_data_blue;
877 
878     char *fax_status;
879     char *fax_filename;
880     char *fax_receiver;
881 
882     float email_progress_val;
883     int   email_progress_size;
884     int   email_progress_bytes;
885     char *email_status;
886     char *email_filename;
887     char *email_receiver;
888     char *email_subject;
889 
890     char *multipage_status;
891     char *multipage_filename;
892 
893     int block_update_param;
894     int block_enhancement_update;
895 
896     int broken_pipe; /* for printercommand pipe */
897 
898     int cancel_save;
899 
900 /* -------------------------------------------------- */
901 
902 /* device preferences: */
903 
904 /* we have to use double and int here, gint or SANE_Word
905    is not allowed because we need a defined size for
906    rc_io-routintes that are based on double, int, ... */
907 
908     /* window position and geometry */
909     int dialog_posx;
910     int dialog_posy;
911     int dialog_height;
912     int dialog_width;
913     int project_dialog_posx;
914     int project_dialog_posy;
915     int standard_options_dialog_posx;
916     int standard_options_dialog_posy;
917     int advanced_options_dialog_posx;
918     int advanced_options_dialog_posy;
919     int histogram_dialog_posx;
920     int histogram_dialog_posy;
921     int gamma_dialog_posx;
922     int gamma_dialog_posy;
923     int batch_dialog_posx;
924     int batch_dialog_posy;
925     int preview_dialog_posx;
926     int preview_dialog_posy;
927     int preview_dialog_width;
928     int preview_dialog_height;
929 
930     double medium_gamma_gray;
931     double medium_gamma_red;
932     double medium_gamma_green;
933     double medium_gamma_blue;
934 
935     double medium_shadow_gray;
936     double medium_shadow_red;
937     double medium_shadow_green;
938     double medium_shadow_blue;
939 
940     double medium_highlight_gray;
941     double medium_highlight_red;
942     double medium_highlight_green;
943     double medium_highlight_blue;
944 
945     int medium_negative;
946 
947     int medium_changed;
948 
949     double gamma;
950     double gamma_red;
951     double gamma_green;
952     double gamma_blue;
953 
954     double brightness;
955     double brightness_red;
956     double brightness_green;
957     double brightness_blue;
958 
959     double contrast;
960     double contrast_red;
961     double contrast_green;
962     double contrast_blue;
963 
964     int lineart_mode;
965     double threshold;
966     double threshold_min;
967     double threshold_max;
968     double threshold_mul;
969     double threshold_off;
970     char *grayscale_scanmode;
971 
972     int enhancement_rgb_default;
973     int negative;
974     int show_preview;
975 
976     int enable_color_management;
977     char *scanner_active_icm_profile;
978     char *scanner_default_color_icm_profile;
979     char *scanner_default_gray_icm_profile;
980 
981     int print_filenames;
982     int force_filename;
983     char *external_filename;
984 
985 
986 /* -------------------------------------------------- */
987 
988     int ipc_pipefd[2]; /* for inter process communication error messages */
989     XsaneChildprocess *childprocess_list;
990 
991 } Xsane;
992 
993 extern struct Xsane xsane;
994 
995 /* ---------------------------------------------------------------------------------------------------------------------- */
996 
997 typedef struct XsaneSetup
998 {
999   GtkWidget *printer_name_entry;
1000   GtkWidget *printer_command_entry;
1001   GtkWidget *printer_copy_number_option_entry;
1002   GtkWidget *printer_lineart_resolution_entry;
1003   GtkWidget *printer_grayscale_resolution_entry;
1004   GtkWidget *printer_color_resolution_entry;
1005   GtkWidget *printer_leftoffset_entry;
1006   GtkWidget *printer_bottomoffset_entry;
1007   GtkWidget *printer_gamma_entry;
1008   GtkWidget *printer_gamma_red_entry;
1009   GtkWidget *printer_gamma_green_entry;
1010   GtkWidget *printer_gamma_blue_entry;
1011   GtkWidget *printer_icm_profile_entry;
1012   GtkWidget *printer_embed_csa_button;
1013   GtkWidget *printer_embed_crd_button;
1014   GtkWidget *printer_cms_bpc_button;
1015   GtkWidget *printer_width_entry;
1016   GtkWidget *printer_height_entry;
1017   GtkWidget *printer_ps_flatedecoded_button;
1018 
1019   GtkWidget *jpeg_image_quality_scale;
1020   GtkWidget *png_image_compression_scale;
1021   GtkWidget *tiff_image_zip_compression_scale;
1022   GtkWidget *save_devprefs_at_exit_button;
1023   GtkWidget *overwrite_warning_button;
1024   GtkWidget *increase_filename_counter_button;
1025   GtkWidget *skip_existing_numbers_button;
1026   GtkWidget *save_ps_flatedecoded_button;
1027   GtkWidget *save_pdf_flatedecoded_button;
1028   GtkWidget *save_pnm16_as_ascii_button;
1029   GtkWidget *reduce_16bit_to_8bit_button;
1030 
1031   GtkWidget *main_window_fixed_button;
1032 
1033   GtkWidget *preview_gamma_entry;
1034   GtkWidget *preview_gamma_red_entry;
1035   GtkWidget *preview_gamma_green_entry;
1036   GtkWidget *preview_gamma_blue_entry;
1037   GtkWidget *preview_lineart_mode_entry;
1038   GtkWidget *preview_grayscale_scanmode_widget;
1039   GtkWidget *preview_threshold_min_entry;
1040   GtkWidget *preview_threshold_max_entry;
1041   GtkWidget *preview_threshold_mul_entry;
1042   GtkWidget *preview_threshold_off_entry;
1043   GtkWidget *auto_enhance_gamma_button;
1044   GtkWidget *preselect_scan_area_button;
1045   GtkWidget *auto_correct_colors_button;
1046   GtkWidget *disable_gimp_preview_gamma_button;
1047   GtkWidget *preview_oversampling_entry;
1048   GtkWidget *preview_own_cmap_button;
1049   GtkWidget *browser_entry;
1050 
1051   GtkWidget *fax_command_entry;
1052   GtkWidget *fax_receiver_option_entry;
1053   GtkWidget *fax_postscript_option_entry;
1054   GtkWidget *fax_normal_option_entry;
1055   GtkWidget *fax_fine_option_entry;
1056   GtkWidget *fax_viewer_entry;
1057   GtkWidget *fax_width_entry;
1058   GtkWidget *fax_leftoffset_entry;
1059   GtkWidget *fax_bottomoffset_entry;
1060   GtkWidget *fax_height_entry;
1061   GtkWidget *fax_ps_flatedecoded_button;
1062 
1063   GtkWidget *tmp_path_entry;
1064 
1065   GtkWidget *email_smtp_server_entry;
1066   GtkWidget *email_smtp_port_entry;
1067   GtkWidget *email_from_entry;
1068   GtkWidget *email_reply_to_entry;
1069   GtkWidget *email_auth_user_entry;
1070   GtkWidget *email_auth_pass_entry;
1071   GtkWidget *email_pop3_server_entry;
1072   GtkWidget *email_pop3_port_entry;
1073   GtkWidget *pop3_vbox;
1074 
1075   GtkWidget *ocr_command_entry;
1076   GtkWidget *ocr_inputfile_option_entry;
1077   GtkWidget *ocr_outputfile_option_entry;
1078   GtkWidget *ocr_use_gui_pipe_entry;
1079   GtkWidget *ocr_gui_outfd_option_entry;
1080   GtkWidget *ocr_progress_keyword_entry;
1081 
1082   GtkWidget *cms_intent_option_menu;
1083   GtkWidget *cms_bpc_button;
1084   GtkWidget *embed_scanner_icm_profile_for_gimp_button;
1085   GtkWidget *scanner_default_color_icm_profile_entry;
1086   GtkWidget *scanner_default_gray_icm_profile_entry;
1087   GtkWidget *display_icm_profile_entry;
1088   GtkWidget *custom_proofing_icm_profile_entry;
1089   GtkWidget *working_color_space_icm_profile_entry;
1090 
1091   int filename_counter_len;
1092 
1093   int tiff_compression16_nr;
1094   int tiff_compression8_nr;
1095   int tiff_compression1_nr;
1096 
1097   int email_authentication;
1098 
1099   int show_range_mode;
1100   int lineart_mode;
1101 
1102   int image_permissions;
1103   int directory_permissions;
1104 
1105   int preview_pipette_range;
1106 
1107   char *grayscale_scanmode;
1108   char *adf_scansource;
1109 
1110 } XsaneSetup;
1111 
1112 extern struct XsaneSetup xsane_setup;
1113 
1114 /* ---------------------------------------------------------------------------------------------------------------------- */
1115 
1116 extern int DBG_LEVEL;
1117 
1118 #ifdef __GNUC__
1119 # define DBG(level, msg, args...)                \
1120   {                                              \
1121     if (DBG_LEVEL >= (level))                    \
1122     {                                            \
1123       fprintf (stderr, "[xsane] " msg, ##args);  \
1124       fflush(stderr);                            \
1125     }                                            \
1126   }
1127 #else
1128   extern void xsane_debug_message(int level, const char *fmt, ...);
1129 # define DBG xsane_debug_message
1130 #endif
1131 
1132 # define DBG_init()                                          \
1133   {                                                          \
1134    char *dbg_level_string = getenv(XSANE_DEBUG_ENVIRONMENT); \
1135                                                              \
1136     if (dbg_level_string)                                    \
1137     {                                                        \
1138       DBG_LEVEL = atoi(dbg_level_string);                    \
1139       DBG(1, "Setting debug level to %d\n", DBG_LEVEL);      \
1140     }                                                        \
1141   }
1142 
1143 #define DBG_error0    0
1144 #define DBG_error     1
1145 #define DBG_warning   2
1146 #define DBG_info      3
1147 #define DBG_info2     4
1148 #define DBG_proc      5
1149 #define DBG_proc2     50
1150 #define DBG_optdesc   70	/* xsane_get_option_descriptor */
1151 #define DBG_proc3     100	/* for routines that are called very very often */
1152 #define DBG_wire      100	/* rc_io_w routines */
1153 
1154 /* ---------------------------------------------------------------------------------------------------------------------- */
1155 
1156 #endif
1157