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