summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJörg Frings-Fürst <debian@jff-webhosting.net>2015-10-08 12:32:49 +0200
committerJörg Frings-Fürst <debian@jff-webhosting.net>2015-10-08 12:32:49 +0200
commitcfd27ef2ad8b005fd47ab41ef29b71d9e3d48201 (patch)
tree56cb8849a5df91b19b72fd4f48c79c343cd9bc5e
parentba8d09abe681600aad991f4a75e904615b7ed29f (diff)
Imported Upstream version 1.0.25upstream/1.0.25
-rw-r--r--AUTHORS5
-rw-r--r--ChangeLog1011
-rw-r--r--Makefile.in19
-rw-r--r--NEWS17
-rw-r--r--README.linux24
-rw-r--r--acinclude.m429
-rw-r--r--aclocal.m4154
-rw-r--r--backend/Makefile.am42
-rw-r--r--backend/Makefile.in412
-rw-r--r--backend/abaton.c7
-rw-r--r--backend/agfafocus.c5
-rw-r--r--backend/apple.c6
-rw-r--r--backend/artec.c4
-rw-r--r--backend/artec_eplus48u.c18
-rw-r--r--backend/avision.c399
-rw-r--r--backend/avision.h84
-rw-r--r--backend/bh.c10
-rw-r--r--backend/canon_dr-cmd.h41
-rw-r--r--backend/canon_dr.c1258
-rw-r--r--backend/canon_dr.conf.in65
-rw-r--r--backend/canon_dr.h36
-rw-r--r--backend/coolscan.c8
-rw-r--r--backend/dll.c6
-rw-r--r--backend/dll.conf.in1
-rw-r--r--backend/dmc.c5
-rw-r--r--backend/epjitsu-cmd.h282
-rw-r--r--backend/epjitsu.c1423
-rw-r--r--backend/epjitsu.conf.in37
-rw-r--r--backend/epjitsu.h49
-rw-r--r--backend/epson.c38
-rw-r--r--backend/epson2-commands.c9
-rw-r--r--backend/epson2-io.c9
-rw-r--r--backend/epson2-ops.c82
-rw-r--r--backend/epson2-ops.h1
-rw-r--r--backend/epson2.c142
-rw-r--r--backend/epson2.conf.in2
-rw-r--r--backend/epson2.h2
-rw-r--r--backend/epson2_net.c45
-rw-r--r--backend/epson2_net.h3
-rw-r--r--backend/epson2_usb.c182
-rw-r--r--backend/epson_usb.c115
-rw-r--r--backend/epsonds-cmd.c908
-rw-r--r--backend/epsonds-cmd.h29
-rw-r--r--backend/epsonds-io.c177
-rw-r--r--backend/epsonds-io.h33
-rw-r--r--backend/epsonds-jpeg.c226
-rw-r--r--backend/epsonds-jpeg.h19
-rw-r--r--backend/epsonds-ops.c481
-rw-r--r--backend/epsonds-ops.h41
-rw-r--r--backend/epsonds-usb.c33
-rw-r--r--backend/epsonds-usb.h24
-rw-r--r--backend/epsonds.c1364
-rw-r--r--backend/epsonds.conf.in12
-rw-r--r--backend/epsonds.h199
-rw-r--r--backend/fujitsu-scsi.h24
-rw-r--r--backend/fujitsu.c839
-rw-r--r--backend/fujitsu.conf.in25
-rw-r--r--backend/fujitsu.h50
-rw-r--r--backend/genesys.c720
-rw-r--r--backend/genesys.conf.in9
-rw-r--r--backend/genesys.h36
-rw-r--r--backend/genesys_conv.c44
-rw-r--r--backend/genesys_conv_hlp.c90
-rw-r--r--backend/genesys_devices.c541
-rw-r--r--backend/genesys_gl124.c344
-rw-r--r--backend/genesys_gl124.h75
-rw-r--r--backend/genesys_gl646.c219
-rw-r--r--backend/genesys_gl646.h54
-rw-r--r--backend/genesys_gl841.c1939
-rw-r--r--backend/genesys_gl841.h84
-rw-r--r--backend/genesys_gl843.c145
-rw-r--r--backend/genesys_gl843.h16
-rw-r--r--backend/genesys_gl846.c186
-rw-r--r--backend/genesys_gl846.h20
-rw-r--r--backend/genesys_gl847.c150
-rw-r--r--backend/genesys_gl847.h20
-rw-r--r--backend/genesys_low.c175
-rw-r--r--backend/genesys_low.h98
-rw-r--r--backend/hp3900_debug.c2
-rw-r--r--backend/hp3900_sane.c2
-rw-r--r--backend/hp5590.c8
-rw-r--r--backend/hs2p-scsi.c4
-rw-r--r--backend/ibm.c12
-rw-r--r--backend/kodakaio.c418
-rw-r--r--backend/kodakaio.h5
-rw-r--r--backend/lexmark_low.c2
-rw-r--r--backend/magicolor.c27
-rw-r--r--backend/microtek2.c4
-rw-r--r--backend/mustek_pp_ccd300.c12
-rw-r--r--backend/mustek_pp_cis.c2
-rw-r--r--backend/net.c21
-rw-r--r--backend/niash.c78
-rw-r--r--backend/pieusb.c1422
-rw-r--r--backend/pieusb.conf.in9
-rw-r--r--backend/pieusb.h105
-rw-r--r--backend/pieusb_buffer.c644
-rw-r--r--backend/pieusb_buffer.h93
-rw-r--r--backend/pieusb_scancmd.c1329
-rw-r--r--backend/pieusb_scancmd.h378
-rw-r--r--backend/pieusb_specific.c2509
-rw-r--r--backend/pieusb_specific.h346
-rw-r--r--backend/pieusb_usb.c679
-rw-r--r--backend/pieusb_usb.h114
-rw-r--r--backend/pixma.c2
-rw-r--r--backend/pixma.h4
-rw-r--r--backend/pixma_bjnp.c529
-rw-r--r--backend/pixma_bjnp.h2
-rw-r--r--backend/pixma_bjnp_private.h46
-rw-r--r--backend/pixma_common.c17
-rw-r--r--backend/pixma_common.h4
-rw-r--r--backend/pixma_imageclass.c132
-rw-r--r--backend/pixma_io_sanei.c5
-rw-r--r--backend/pixma_mp150.c206
-rw-r--r--backend/pixma_mp730.c2
-rw-r--r--backend/pixma_mp750.c2
-rw-r--r--backend/pixma_mp810.c28
-rw-r--r--backend/plustek-pp_dac.c4
-rw-r--r--backend/plustek-pp_scan.h2
-rw-r--r--backend/plustek-usbcalfile.c2
-rw-r--r--backend/pnm.c2
-rw-r--r--backend/ricoh.c17
-rw-r--r--backend/rts8891.c16
-rw-r--r--backend/s9036.c5
-rw-r--r--backend/snapscan-options.c2
-rw-r--r--backend/snapscan-scsi.c2
-rw-r--r--backend/snapscan-sources.c2
-rw-r--r--backend/snapscan-sources.h2
-rw-r--r--backend/snapscan.c2
-rw-r--r--backend/snapscan.h2
-rw-r--r--backend/sp15c.c4
-rw-r--r--backend/sp15c.h1
-rw-r--r--backend/tamarack.c5
-rw-r--r--backend/test.c19
-rw-r--r--backend/umax-uc630.c12
-rw-r--r--backend/umax.c2
-rw-r--r--backend/umax_pp_low.c2
-rw-r--r--backend/v4l.c14
-rw-r--r--[-rwxr-xr-x]config.guess236
-rw-r--r--[-rwxr-xr-x]config.sub56
-rwxr-xr-xconfigure581
-rw-r--r--configure.in85
-rw-r--r--doc/Makefile.am11
-rw-r--r--doc/Makefile.in23
-rw-r--r--doc/descriptions-external/epkowa.desc487
-rw-r--r--doc/descriptions/avision.desc10
-rw-r--r--doc/descriptions/canon_dr.desc99
-rw-r--r--doc/descriptions/epjitsu.desc19
-rw-r--r--doc/descriptions/epson.desc3
-rw-r--r--doc/descriptions/epson2.desc1665
-rw-r--r--doc/descriptions/epsonds.desc97
-rw-r--r--doc/descriptions/fujitsu.desc72
-rw-r--r--doc/descriptions/genesys.desc22
-rw-r--r--doc/descriptions/hp.desc15
-rw-r--r--doc/descriptions/kodakaio.desc11
-rw-r--r--doc/descriptions/kvs40xx.desc1
-rw-r--r--doc/descriptions/magicolor.desc6
-rw-r--r--[-rwxr-xr-x]doc/descriptions/mustek_usb2.desc0
-rw-r--r--doc/descriptions/pieusb.desc86
-rw-r--r--doc/descriptions/pixma.desc258
-rw-r--r--[-rwxr-xr-x]doc/descriptions/stv680.desc0
-rw-r--r--doc/descriptions/u12.desc1
-rw-r--r--doc/descriptions/unsupported.desc21
-rw-r--r--doc/releases.txt15
-rw-r--r--doc/sane-apple.man5
-rw-r--r--doc/sane-avision.man4
-rw-r--r--doc/sane-canon_dr.man4
-rw-r--r--doc/sane-cardscan.man2
-rw-r--r--doc/sane-coolscan.man2
-rw-r--r--doc/sane-epjitsu.man13
-rw-r--r--doc/sane-epson.man4
-rw-r--r--doc/sane-epson2.man4
-rw-r--r--doc/sane-epsonds.man101
-rw-r--r--doc/sane-fujitsu.man8
-rw-r--r--doc/sane-genesys.man35
-rw-r--r--doc/sane-gt68xx.man2
-rw-r--r--doc/sane-kodakaio.man2
-rw-r--r--doc/sane-mustek_pp.man2
-rw-r--r--doc/sane-pieusb.man111
-rw-r--r--doc/sane-pixma.man111
-rw-r--r--doc/sane-scsi.man2
-rw-r--r--doc/sane-test.man8
-rw-r--r--doc/sane-umax_pp.man4
-rw-r--r--doc/sane-usb.man2
-rw-r--r--doc/sane.man2
-rw-r--r--doc/saned.man98
-rw-r--r--doc/scanimage.man19
-rw-r--r--frontend/Makefile.am2
-rw-r--r--frontend/Makefile.in12
-rw-r--r--frontend/scanimage.c506
-rw-r--r--frontend/stiff.c10
-rw-r--r--frontend/stiff.h2
-rw-r--r--frontend/tstbackend.c27
-rw-r--r--include/Makefile.am2
-rw-r--r--include/Makefile.in9
-rw-r--r--include/sane/config.h.in12
-rw-r--r--include/sane/sanei_ir.h393
-rw-r--r--japi/Makefile.in10
-rw-r--r--lib/Makefile.in10
-rw-r--r--lib/snprintf.c1139
-rw-r--r--po/LINGUAS1
-rw-r--r--po/Makefile.am2
-rw-r--r--po/Makefile.in8
-rw-r--r--po/bg.po963
-rw-r--r--po/cs.po955
-rw-r--r--po/da.po955
-rw-r--r--po/de.po431
-rw-r--r--po/en_GB.po966
-rw-r--r--po/eo.po977
-rw-r--r--po/es.po962
-rw-r--r--po/fi.po963
-rw-r--r--po/fr.po962
-rw-r--r--po/gl.po962
-rw-r--r--po/hu.po5570
-rw-r--r--po/it.po965
-rw-r--r--po/ja.po966
-rw-r--r--po/nb.po955
-rw-r--r--po/nl.po1058
-rw-r--r--po/pl.po970
-rw-r--r--po/pt.po2099
-rw-r--r--po/ru.po959
-rw-r--r--po/sane-backends.pot399
-rw-r--r--po/sv.po606
-rw-r--r--po/uk.po429
-rw-r--r--sanei/Makefile.am2
-rw-r--r--sanei/Makefile.in17
-rw-r--r--sanei/sanei_ab306.c3
-rw-r--r--sanei/sanei_ir.c1205
-rw-r--r--sanei/sanei_pa4s2.c5
-rw-r--r--sanei/sanei_pio.c3
-rw-r--r--sanei/sanei_pp.c3
-rw-r--r--sanei/sanei_thread.c14
-rw-r--r--sanei/sanei_usb.c171
-rw-r--r--testsuite/Makefile.in6
-rw-r--r--testsuite/sanei/Makefile.in10
-rw-r--r--testsuite/sanei/sanei_config_test.c3
-rw-r--r--testsuite/tools/Makefile.am2
-rw-r--r--testsuite/tools/Makefile.in8
-rw-r--r--testsuite/tools/data/html-backends-split.ref2
-rw-r--r--testsuite/tools/data/html-mfgs.ref2
-rw-r--r--testsuite/tools/data/hwdb.ref1336
-rw-r--r--testsuite/tools/data/udev+acl.ref3
-rw-r--r--testsuite/tools/data/udev+hwdb.ref5
-rw-r--r--testsuite/tools/data/udev.ref3
-rw-r--r--tools/Makefile.am7
-rw-r--r--tools/Makefile.in21
-rw-r--r--tools/check-usb-chip.c210
-rw-r--r--tools/sane-desc.c11
-rw-r--r--tools/sane-find-scanner.c2
248 files changed, 44044 insertions, 14511 deletions
diff --git a/AUTHORS b/AUTHORS
index 0f553ac..53a0ba3 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -35,6 +35,7 @@ Backends:
epjitsu: m. allan noah (*)
epson: Karl Heinz Kremer (*)
epson2: Alessandro Zummo (*)
+ epsonds: Alessandro Zummo (*)
fujitsu: Randolph Bentson, Frederik Ramm, Oliver Schirrmeister (*),
m. allan noah (*)
gphoto2: Peter Fales (*)
@@ -76,6 +77,7 @@ Backends:
niash: Ullrich Sigwanz (*), Bertrik Sikken
p5: Stéphane Voltz (*)
pie: Simon Munton (*)
+ pieusb: Jan Vleeshouwers, Michael Rickmann, Klaus Kmpf
pint: Gordon Matzigkeit
pixma: Wittawat Yamwong (*)
Nicolas Martin (*)
@@ -195,12 +197,14 @@ Jon Chambers <jon@jon.demon.co.uk>
Jonathan Bravo Lopez <jkdsoft@gmail.com>
Juergen G. Schimmer <schimmi@nbgm.siemens.de>
Julien Blache <jb@jblache.org>
+Jan Vleeshouwers <J.M.Vleeshouwers@tue.nl>
Karl Anders Øygard <karlo@opera.no>
Karl Heinz Kremer <khk@khk.net>
Karsten Festag <karsten.festag@gmx.de>
Kazuhiro Sasayama <kaz@hypercore.co.jp>
Kazuya Fukuda <kaafuu@mug.biglobe.ne.jp>
Kevin Charter <charter@cs.rice.edu>
+Klaus Kmpf <kkaempf@suse.com>
Louis Lagendijk <llagendijk-guest at users.alioth.debian.org>
M.F. <massifr@tiscalinet.it>
Manuel Panea <Manuel.Panea@rzg.mpg.de>
@@ -215,6 +219,7 @@ Max Vorobiev <pcwizard@yandex.ru>
Meino Christian Cramer <mccramer@s.netic.de>
Michael Herder <crapmail@nurfuerspam.de>
Michael K. Johnson <johnsonm@redhat.com>
+Michael Rickmann <mrickma@gwdg.de>
Michel Roelofs <michelr@stack.nl>
Milon Firikis <milonf@ariadne-t.gr>
Mitsuru Okaniwa <m-okaniwa@bea.hi-ho.ne.jp>
diff --git a/ChangeLog b/ChangeLog
index 45053b8..06efddb 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,602 +1,507 @@
-****** Release of sane-backends 1.0.24. End of code freeze ******
+****** Release of sane-backends 1.0.25. End of code freeze ******
-2013-09-30 m. allan noah <kitno455 at gmail dot com>
- * po/nl.po: updated translation from Martin Kho.
+2015-09-30 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon PIXMA MG5600 Series is working, reported by Gavin Falconer.
-2013-09-30 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp810.c: fix button support for Canon CS8800F.
+2015-09-26 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.23
-2013-09-24 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_imageclass.c, doc/descriptions/pixma.desc,
- doc/sane-pixma.man: New scanner Canon imageCLASS MF4770n
- reported by Ralph Little.
+2015-06-22 Louis Lagendijk <louis dot lagendijk at gmail dot com>
+ * doc/saned.man: updated to clarify systemd integration and
+ configuration for thecase where saned is compiled with systemd
+ glue.
-2013-09-18 Alex Belkin <abc at telekom.ru>
- * backend/xerox_mfp.conf.in doc/descriptions/xerox_mfp.desc: usb id
- for dell 1235cn, reported by Jean-Francois Labrousse.
+2015-09-18 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_imageclass.c: for all adf scanners restrict maximum page
+ height at flatbed scans
-2013-09-17 m. allan noah <kitno455 at gmail dot com>
- * sanei/sanei_init_debug.c: do our own upcasing to allow backend
- debugging in Turkish. Revert prior set_locale() patch.
- * po/uk.po: updated by Yuri Chornoivan
- * backend/microtek.c: add missing break (#314408)
+2015-09-16 Stphane Voltz <stef.dev@free.fr>
+ * backend/niash.c: merged pu/protect-niash-option-access-315132 and
+ ifdef'ed unused code
-2013-09-16 Gerhard Jaeger <gerhard@gjaeger.de>
- * backend/plustek-usbdevs.c: Tweaked motor settings for CanoScan N650U
- * backend/plustek.c: Bumped build number
+2015-09-16 Stphane Voltz <stef.dev@free.fr>
+ * backend/pieusb.c: include sane/config.h first
-2013-09-13 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- New scanners Canon Pixma MG2400, MG2500, MG3500, MG5500, MG64000, MG6500
- and MG7100. All scanners need further testing.
- * backend/pixma_imageclass.c, doc/descriptions/pixma.desc,
- doc/sane-pixma.man: New scanners Canon imageCLASS MF4570dw and
- imageRUNNER 1133. All scanners need further testing.
- * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.4
-
-2013-09-08 paul newall
- * kodakaio.desc: Added hero 4.1 model, marked some scanners as staus basic
-
-2013-08-27 m. allan noah <kitno455 at gmail dot com>
- * acinclude.m4, configure: enable pthread on Linux by default
- * sanei/sanei_init_debug.c: use C locale when building debug
- env vars, to allow backend debugging in Turkish. Patch from
- Olaf Meeuwissen.
-
-2013-08-26 Chris Bagwell <chris@cnpbagwell.com>
- * sanei/sanei_usb.c: Treat errno of EACCES as access denied.
- This is what libusb is return on my Linux box. This will help
- give more helpful error messages to user during debugging.
- * testsuite/sanie/sanie_usb_test.c: Do not treat open failures
- because of permission errors or already opened by other processes
- as test failures since this is expected in some cases (such as
- network devices that use vendor specific class).
-
-2013-08-16 Chris Bagwell <chris@cnpbagwell.com>
- * testsuite/sanei/Makefile.am: Add missing data files to distribution.
- Pass in $srcdir to sanei_config_test so it knows were data files are
- regardless of were ran from.
- * testsuite/sanei/sanei_config_test.c: Use full path for config
- file. This allows "make distcheck" to work for this testcase
- since it uses a different build directory then source directory
- and also runs it from build directory.
- * testsuite/sanei/sanei_usb_test.c: add a fake name string
- when creating MAX_DEVICE fake devices so that strcmp() won't
- crash.
- * testsuite/tools/Makefile.am: Add missing data files to distribution.
- Make use of $srcdir so test case can base when build directory
- is not same as source directory.
-
-2013-08-15 Chris Bagwell <chris@cnpbagwell.com>
- * sanei/sanei_thread.c: Add support for winpthreads used by
- mingw64 in addition to preexisting support for pthread-win32 used
- by mingw32. Based on work from Michael Cronenworth for
- Fedora's mingw64 sane-backends package.
-
-2013-08-15 Chris Bagwell <chris@cnpbagwell.com>
- * configure.in: Make snmp detection work better when cross conmpiling;
- such as mingw builds on Fedora host. Most likely, net-snmp-config
- values are for local host so ignore them if matching library isn't
- also found. Required updated all autofoo's generated files to newer
- version by running 'autoreconf -i -f' and repatching ltmain.sh.
- * test-driver: Added missing test-driver that automake installs.
- Its expected to exist by the Makefile.in that we also checkin.
-
-2013-08-11 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys_low.[ch] backend/genesys_conv.c backend/genesys.c
- backend/genesys_gl841.c backend/genesys_gl646.c: make use of hardware
- gamma tables to implement constrast and brightness correction.
-
-2013-08-07 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys.[ch] backend/genesys_conv.c doc/sane-genesys.man
- po/fr.po: add digital brightness and contrast options.
- Add an option to set calibration cache file name.
-
-2013-08-07 Stphane Voltz <stef.dev@free.fr>
- * frontend/tstbackend.c: add argument to get verbose messages during
- checks.
-
-2013-08-04 Stphane Voltz <stef.dev@free.fr>
- * sanei/sanei_constrain_value.c
- testsuite/sanei/sanei_constrain_test.c: fixed the case where the
- rounding in sanei_constrain_value computes a value higher than the
- range maximum, spotted and proposed by viresh_shirol@yahoo.co.uk .
- Added testcase for the bug in testsuite.
-
-2013-08-02 Stphane Voltz <stef.dev@free.fr>
- * configure configure.in testsuite/Makefile.* testsuite/tools/*: add
- a testsuite for sane-desc, then merge hwdb support for sane-desc by
- Tom Gundersen <teg@jklm.no> .
-
-2013-07-31 m. allan noah <kitno455 at gmail dot com>
- * backend/canon_dr*: backend version 41
- - initial P-208 and P-215 support
- - bug fix for calibration of scanners with duplex_offset
- - allow duplex_offset to be controlled from config file
-
-2013-07-30 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys.c: fixed typo when defining OPT_SWDEROTATE cap
- (#314339).
-
-2013-07-19 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp150.c: Canon Pixma MX920 has duplex ADF and supports
- max. 600 dpi @ ADF.
-
-2013-07-18 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp810.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- Canon PIXMA MG8200 is working now.
- * backend/pixma.[ch], backend/pixma_mp150.c, backend/pixma_mp810.c,
- backend/pixma_sane_options.[ch], doc/sane-pixma.man, po/de.po:
- - New button option --scan-resolution. Scan resolution is provided from
- some multi function devices.
- - Add some detailed button option description to the pixma man page.
- * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.3
-
-2013-06-26 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys.[ch] backend/genesys_devices.c backend/genesys_gl124.[ch]
- backend/genesys_low.[ch]: improve scanning speed and quality for GL124
- based scanner by implementing half ccd mode below 600 dpi,
- thanks for an hardware donation from Dany Qumsiyeh.
-
-2013-07-03 Rolf Bensch <rolf at bensch hyphen online dot de>
- * doc/descriptions/pixma.desc, doc/sane-pixma.man:
- Canon PIXMA MG5200 Series support reported by Dimitri Fellous.
- * .gitignore: ignore all .* files
-
-2013-06-27 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma.c: fix mode list for infrared scans
-
-2013-06-27 m. allan noah <kitno455 at gmail dot com>
- * backend/fujitsu*: backend v117
- - default buffer-mode to off
- - improved error handling in sane_start
- - image width must be multiple of 8 when swcrop is used before binarization (iX500)
- - check hopper sensor before calling object_position(load) on iX500
- * .gitignore: ignore .deps directories
-
-2013-06-26 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys.c backend/genesys.conf.in backend/genesys_devices.c
- backend/genesys_gl846.c backend/genesys_gl846.h backend/genesys_low.c
- backend/genesys_low.h: add experimental description and code for the
- GL845 based Opticbook 3800.
-
-2013-06-22 Alex Belkin <abc at telekom.ru>
- * backend/xerox_mfp.conf.in doc/descriptions/xerox_mfp.desc: multiple
- usb ids for Samsung models, reported by Mikhail Elhimov.
-
-2013-06-21 Rolf Bensch <rolf at bensch hyphen online dot de>
- * doc/descriptions/pixma.desc: Canon PIXMA MG3100 Series WLAN support
- reported by Torben Nielsen.
-
-2013-06-19 Stphane Voltz <stef.dev@free.fr>
- * frontend/scanimage.c: protect for group option with incorrect
- capabilites.
- * frontend/tstbackend.c: add test to check is group option are
- settable. Fix test_getdevices() function.
-
-2013-06-18 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys.c: add missing cap to 2 option group tp fix long
- argument option bug in scanimage.
-
-2013-06-15 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp810.c: fix test mode
-
-2013-06-10 Stphane Voltz <stef.dev@free.fr>
- * tools/check-usb-chip.c: add genesys GL128, GT-68xx usb chip
- detection.
-
-2013-06-10 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp810.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- New scanner Canon CanoScan 9000F Mark II.
- * backend/pixma_mp810.c: Disable TPU negatives scan for CS8800F and CS9000F.
- Negatives scan has no benefit for the user and disabling avoids confusion.
-
-2013-06-03 Stphane Voltz <stef.dev@free.fr>
- * tools/sane-find-scanner.c tools/check-usb-chip.c: add genesys usb
- chip detection when compiled for libusb-1.0 .
-
-2013-06-03 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys_gl646.c: #314293 fix
-
-2013-05-29 Rolf Bensch <rolf at bensch hyphen online dot de>
- * doc/sane-pixma.man:
- - HTML parseable name section (bug #314283)
- - typo in device names
-
-2013-05-27 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys_gl646.c: #314261 fix
-
-2013-05-11 Rolf Bensch <rolf at bensch hyphen online dot de>
- * README.linux: some distros need libusb-1_0-devel.
-
-2013-05-11 Jonathan Bravo Lopez <jkdsoft@gmail.com>
- * backend/hp3900_rts8822.c: fix compilation warnings.
-
-2013-04-26 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma.[ch], backend/pixma_common.[ch], backend/pixma_imageclass.c,
- backend/pixma_io_sanei.c, backend/pixma_mp150.c, backend/pixma_mp7[35]0.c,
- backend/pixma_mp810.c: update copyright.
+2015-09-14 Stphane Voltz <stef.dev@free.fr>
+ * backend/bh.c: replace mktemp by mkstemp #300134
-2013-04-24 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- New scanners Canon Pixma E510, E610 and MX720. All scanners need further
- testing.
+2015-09-13 Paul Newall <p dot newalls at ntlworld dot com>
+ * backend/kodakaio.c:
+ redundant variable bitposn and redundant function kodakaio_rxflush
+ commented out.
-2013-04-19 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_imageclass.c, doc/descriptions/pixma.desc,
- doc/sane-pixma.man: New scanner Canon i-SENSYS MF3010 reported by
- Nathan Stewart.
+2015-09-09 Stphane Voltz <stef.dev@free.fr>
+ * doc/sane-genesys.man, doc/descriptions/genesys.desc: No LiDE 120
+ support.
-2013-04-11 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- New scanners Canon Pixma MG2200, MG3200, MG5400, MX390, MX450, MX520 and
- MX920. All scanners need further testing.
-
-2012-04-03 Alex Belkin <abc at telekom.ru>
- * doc/descriptions/xerox_mfp.desc: add Samsung SCX-4835FD networked
- support, reported by Dave Lewis. USB mode doesn't work.
-
-2013-04-02 Stphane Voltz <stef.dev@free.fr>
- * backend/lexmark.c backend/lexmark.h: fix device detection to
- handle hotplugging and unplugging of USB devices. USe
- sanei_usb_exit().
-
-2013-03-29 Stphane Voltz <stef.dev@free.fr>
- * backend/gt68xx.c backend/gt68xx_low.h: fix device detection to
- handle hotplugging and unplugging of USB devices.
- * frontend/tstbackend.c: a test to loop over snae_get_devices to
- check if a backend handle hotplugging correctly
-
-2013-03-27 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys.c backend/genesys_low.h backend/genesys_gl846.c:
- warning fixes, SANE option correctness fixes.
-
-2013-03-25 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp150.c: fix button support for Canon Pixma MG6300.
-
-2013-03-24 Stphane Voltz <stef.dev@free.fr>
- * sanei/test_wire.c, testsuite/sanei/sanei_*test.c: move test program
- to testsuite/sanei. Add unit test programs for sanei_check_*,
- sanei_constrain_*, sanei_config_* and sanei_usb_* functions.
-
-2013-03-24 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys.c: make use of the new sanei_usb_scan_devices function
- in sane_get_devices.
-
-2013-03-24 Stphane Voltz <stef.dev@free.fr>
- * sanei/sanei_usb.c include/sane/sanei_usb.h:
- separate device search logic from usb init by creating a
- sanei_usb_scan_devices. Add a sanei_usb_exit function to free
- allocated resources by sanei_usb_init.
-
-2013-03-21 Rolf Bensch <rolf at bensch hyphen online dot de>
+2015-09-08 m. allan noah <kitno455 at gmail dot com>
+ * backend/artec_eplus48u.c: fix HOME env bug #315071 (from Jrg Frings-Frst)
+
+2015-09-03 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_mp810.c: Canon Pixma MP990 needs specific reordering pixels
+ for 4800 dpi, patch from Guillaume Courtois.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.22
+
+2015-08-20 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * README.linux: add mandatory and optional development environment to
+ install description
+ * frontend/scanimage.c: remove atexit() function. In some cases atexit()
+ doesn't work with libusb-compat.
+
+2015-08-10 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_io_sanei.c: EOF is a bjnp timeout error.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.21
+
+2015-08-10 Stphane Voltz <stef.dev@free.fr>
+ * backend/abaton.c, backend/agfafocus.c, backend/apple.c,
+ backend/bh.c, backend/coolscan.c, backend/dmc.c, backend/ricoh.c,
+ backend/s9036.c, backend/sp15c.[ch], backend/tamarack.c:
+ fix for memleak in sane_get_devices (bugs #300132 #300131 #300130 #300129
+ #300127 #300126 #300124 #300122 #300121 #300120)
+
+2015-08-10 Klaus Kmpf <kkaempf@suse.com>
+ * backend/pieusb.c, doc/descriptions/pieusb.desc, doc/sane-pieusb.man,
+ backend/pieusb_buffer.c, backend/pieusb_scancmd.c, backend/pieusb_specific.c,
+ backend/pieusb_usb.c:
+ New scanners PIE PowerSlide 3600,3650,4000,5000 / Reflecta DigitDia 3600,
+ 4000, 5000, 6000; ProScan 7200; CrystalScan 7200. These scanners need
+ further testing.
+
+2015-08-08 Stphane Voltz <stef.dev@free.fr>
+ * backend/test.c: fix memleaks (#313553)
+ * configure.in, configure: don not harcode -I/usr/local/include
+ (#315060)
+
+ open/close tests.
+2015-08-07 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * README.linux: update development packages list. OpenSuse needs
+ libusb-compat-devel. Sane doesn't support libusb 1.0.
+ * backend/pixma_io_sanei.c: EOF isn't an usb timeout error; this fixes usb
+ communication problems, e.g. with OpenSuse.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.20
+
+2015-08-06 Stphane Voltz <stef.dev@free.fr>
+ * backend/genesys_devices.c, backend/genesys_gl841.c, backend/genesys_low.c:
+ fix GPIO setup for LiDE 33/40/50, add more usleep() for GL847
+ scanning issues. Some GL841 LEDADD improvements.
+
+2015-07-31 Stphane Voltz <stef.dev@free.fr>
+ * frontend/tstbackend.c: add an option to do tests scans during
+ open/close tests.
+ * backend/genesys.c, backend/genesys_low.c: fixes for
+ - #315104
+ - #315105
+ And a timing issue on USB3 hardware debugged and tracked by John S.
+ Weber <jweber53@gmail.com>
+
+2015-07-29 Rolf Bensch <rolf at bensch hyphen online dot de>
* backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- New scanner Canon Pixma MP230 reported by Petar Dodev.
-
-2013-03-18 Stphane Voltz <stef.dev@free.fr>
- * backend/hp5590.c backend/nec.c backend/sharp.c backend/stv680:
- apply use after free fixes, bugs #314035, #314036, #314037 and
- #314038
- * backend/hp4200.c: fix a potential division by O, bug #314042
- All five patches for these bugs were provided by Nickolai Zeldovich
- <nickolai@csail.mit.edu>
+ New scanner Canon PIXMA MG3600 Series. This scanner needs further testing.
+ * backend/pixma_mp150.c: Canon PIXMA MG7500 Series doesn't need special
+ image format post processing.
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon PIXMA MG7500 Series is working, reported by Jonathan Anderson.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.19
-2013-03-15 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- New scanner Canon Pixma MG6300 reported by Theo van Rijn.
+2015-07-24 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon PIXMA MX470 Series is working, bug #314894.
-2013-02-28 Stphane Voltz <stef.dev@free.fr>
- * configure.in configure: restored HAVE_USBCALLS like initially
- committed for OS/2 support
+2015-06-27 Louis Lagendijk <louis dot lagendijk at gmail dot com>
+ * backend/pixma_bjnp.c: added missing return in case of no error
-2013-03-04 Oliver Schwartz <oliverschwartz@users.sf.net>
- * backend/snapscan-options.c backend/snapscan-scsi.c backend/snapscan.c
- backend/snapscan-sources.c backend/snapscan.h
- doc/descriptions/snapscan.desc: Added support for Acer Scanwit 2720S
- implemented by Andrew Goddbody.
+2015-06-27 Louis Lagendijk <louis dot lagendijk at gmail dot com>
+ * backend/pixma_bjnp.c Added backend version in bjnp debug output
-2013-02-28 Stphane Voltz <stef.dev@free.fr>
- * sanei/sanei_usb.c: only free devanme when reusing a device slot in
- device list
+2015-06-11 Stphane Voltz <stef.dev@free.fr>
+ * backend/genesys.c backend/genesys_gl124.h: LiDE 120 support
+ improvement.
-2013-02-28 Rolf Bensch <rolf at bensch hyphen online dot de>
- * README.linux: ease installation procedure.
+2015-05-18 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_imageclass.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ New scanner Canon i-SENSYS MF8300 Series, reported by Florian Nierhaus.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.18
-2013-02-27 Stphane Voltz <stef.dev@free.fr>
- * doc/descriptions/genesys.desc: update G2410 status to basic
+2015-04-12 Stphane Voltz <stef.dev@free.fr>
+ * doc/sane-genesys.man backend/genesys.[ch] backend/genesys_low.c:
+ fix calibration cleared when calibration file loaded,
+ add expiration time option for cache.
-2013-02-27 Stphane Voltz <stef.dev@free.fr>
- * backend/rts8891.c backend/rts88xx_lib.c backend/lexmark.c
- backend/lexmark_low.c backend/rts8891_low.c: cppcheck errors and
- warnings fixes
+2015-04-07 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_mp810.c: Canon Pixma MP990 TPU scan patch from Guillaume
+ Courtois.
+ * doc/descriptions/pixma.desc: remove unmaintained websites
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.17
-2013-02-27 Rolf Bensch <rolf at bensch hyphen online dot de>
- * README.linux: fix installation path for libsane.la.
+2015-04-03 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_imageclass.c, doc/descriptions/pixma.desc,
+ doc/sane-pixma.man: New Canon scanners i-SENSYS MF210 Series, MF220 Series,
+ MF5900 Series, MF6100 Series and imageCLASS MF810/820. All scanners need
+ further testing.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.16
+ * backend/pixma.[ch], backend/pixma_common.[ch], backend/pixma_imageclass.c,
+ backend/pixma_io_sanei.c, backend/pixma_mp150.c, backend/pixma_mp7[35]0.c,
+ backend/pixma_mp810.c: update copyright.
+
+2015-03-17 Stphane Voltz <stef.dev@free.fr>
+ * backend/genesys.c, backend/genesys.conf.in,
+ backend/genesys_devices.c, backend/genesys_gl124.c,
+ backend/genesys_gl124.h, backend/genesys_low.h,
+ doc/descriptions/genesys.desc, doc/sane-genesys.man: add support for
+ Canon LiDE 120
+
+2015-03-14 René Rebe <rene@exactcode.de>
+ * backend/avision.h backend/avision.c:
+ fixed 32-bit build regression due new feature_type and
+ reverted 4d38523bdacd18186857ee8a93daaa0f8721c89b
+
+2015-03-13 René Rebe <rene@exactcode.de>
+ * doc/sane-avision.man, backend/avision.h, backend/avision.c:
+ fixed newer avision scanner duplex scanning, and removed unnecessary
+ feature_type2 clutter by using a uint64_t to share all bits
+
+2015-03-12 René Rebe <rene@exactcode.de>
+ * doc/descriptions/avision.desc, backend/avision.c:
+ fixed multiple regressions (range initilaizer, clobbering
+ paper-length window bits, ...) introduced over the past years, added
+ support for newer ASIC gamma table size, added AV220D2+ ID
+2015-03-04 Stphane Voltz <stef.dev@free.fr>
+ * doc/descriptions/genesys.desc: mark LiDE 120 as unsupported.
+
+2015-03-02 Stphane Voltz <stef.dev@free.fr>
+ * backend/genesys_low.c, backend/genesys_gl124.[ch]:
+ improve parking reliability for LiDE 210
+
+2015-03-01 Stphane Voltz <stef.dev@free.fr>
+ * backend/genesys_devices.c, backend/genesys_gl124.c:
+ final tuning for Canon LiDE 220
+
+2015-02-26 Stphane Voltz <stef.dev@free.fr>
+ * backend/genesys.c, backend/genesys.conf.in,
+ backend/genesys_devices.c, backend/genesys_gl124.c,
+ backend/genesys_gl124.h, backend/genesys_low.h,
+ doc/descriptions/genesys.desc, doc/sane-genesys.man: add support for
+ Canon LiDE 220
+
+2015-02-21 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_mp150.c: Canon PIXMA MG6400 Series doesn't need special
+ image format post processing.
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon PIXMA MG6400 Series is working, reported by Christian Spielberger.
+ * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ New scanners Canon PIXMA MX490 Series and E480 Series. All scanners need
+ further testing.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.15
-2013-02-22 Gerhard Jaeger <gerhard@gjaeger.de>
- * tools/sane-find-scanner.c: Fix another bug in the libusb1
- part of function check_libusb_device() that prevents sanner
- detection for certain devices.
+2015-02-09 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * doc/descriptions/pixma.desc: Canon PIXMA MX920 Series supports Ethernet
+ and WiFi interfaces.
-2013-02-20 Gerhard Jaeger <gerhard@gjaeger.de>
- * tools/sane-find-scanner.c: Setup libusb1 debugging after
- initialization otherwise a segfault appears in triple -v mode
- * sanei/sanei_usb.c: Free heap memory, acquired via strdup for
- devname, in sanei_usb_close()
- * po/de.po: Fixed typo
+2015-02-06 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon PIXMA MG2500 Series is working, reported by Brenda Ruch.
-2013-02-18 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma.[ch], backend/pixma_common.[ch], backend/pixma_imageclass.c,
- backend/pixma_mp150.c, backend/pixma_mp7[35]0.c, backend/pixma_mp810.c,
- doc/descriptions/pixma.desc, doc/sane-pixma.man, po/de.po:
- - add infrared scan support for Canon Canoscan 9000F
- - Pixma backend version 0.17.2
-
-2013-02-13 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys*.[ch]: cppcheck errors fixes
-
-2013-02-13 Gerhard Jaeger <gerhard@gjaeger.de>
- * backend/plustek_pp.c: Bumped build number
- * backend/plustek-pp*: Fixed kernel module build for recent kernels
- Defined internal "ULong" types to be in fact 32 bit wide,
- this should fix issues on 64 bit machines.
- * doc/plustek/Plustek-PARPORT.changes: Update
-
-2013-02-13 Gerhard Jaeger <gerhard@gjaeger.de>
- * backend/plustek.c: Bumped build number
- * backend/plustek-usbscan.c backend/plustek-usbshading.c: Cleanup
- * backend/plustek-usb.h backend/plustek-usbdevs.c backend/plustek-usbhw.c:
- Added support for Q-Scan A6 portable scanner
- * doc/descriptions/plustek.desc: Added entry for Q-Scan A6
- Q-Scan A6 Patch submitted and tested by Hiroshi Miura. Bug #312073.
- * doc/sane-plustek.man doc/plustek/Plustek-USB.changes: Update
-
-2013-02-11 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_common.c, backend/pixma_imageclass.c,
- doc/descriptions/pixma.desc: fixed adf paper empty for Canon i-SENSYS
- MF4550d. Bug #313674.
-
-2013-02-11 Stphane Voltz <stef.dev@free.fr>
- * tools/sane-desc.c: fix minor memleaks and whitespace at end of line.
-
-2013-02-09 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma.c, backend/pixma_mp750.c, backend/pixma_mp810.c,
- backend/pixma_sane_options.c: fixed compiler warnings.
- * backend/pixma.c, backend/pixma_io_sanei.c, backend/pixma_mp150.c,
- backend/pixma_mp7[35]0.c, backend/pixma_mp810.c: fixed cppcheck warnings.
-
-2013-02-06 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp150.c: fixed button support for Canon Pixma MG6200
- by Matthias Thon.
-
-2013-02-01 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys_low.c backend/genesys_gl843.c
- backend/genesys_gl846.c: minor usb firmware setup changes
-
-2013-01-31 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys.[ch] backend/genesys_devices.c
- backend/genesys_gl124.c backend/genesys_low.h: add support for LIDE
- 210 fifth button.
-
-2013-01-29 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys*.[ch] : ASIC init refactor. Groundwork for GL846
- support.
+2015-01-20 Ilia Sotnikov <hostcc at gmail dot com>
+ * backend/hp5590.c:
+ Invert pixels in case of TMA Negatives source has been selected.
+ Thanks for Will Kranz who reported this.
-2013-01-24 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp150.c: fixed 1200 dpi scan for Canon Pixma MG2100.
- * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- Canon Pixma MG2100 support reported by David Durgee.
- * backend/pixma_imageclass.c: fixed usb checksums for MF4100.
+2015-01-17 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon PIXMA MG2200 Series is working (bug #314944).
-2013-01-19 Paul Newall <quandry@ntlworld.com>
- * backends/kodakaio.c:
- Hero 4.1 added.
+2014-12-31 Paul Newall <p dot newalls at ntlworld dot com>
+ * backend/kodakaio.c:
+ connection to device moved from sane_open to sane_start
+ disconnection move from sane_close to sane_cancel
+ in order to fix bug where scanner disconnected after 30s idle.
-2013-01-18 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma.c, backend/pixma_mp810.c: fixed button support for Canon
- Canoscan CS9000F.
- * doc/sane-pixma-man: additional description for button support.
+2014-12-19 Paul Newall <p dot newalls at ntlworld dot com>
+ * backend/kodakaio.c:
+ param.depth corrected for lineart mode, was 8 now 1
+ sequence of modes changed to make the color mode the default.
+
+2014-12-16 m. allan noah <kitno455 at gmail dot com>
+ * sanei/sanei_usb.c: add calls to sanei_usb_set_altinterface in
+ sanei_usb_close and sanei_usb_clear_halt- hopefully work around
+ USB3/xhci problems in Linux.
+
+2014-11-18 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_imageclass.c:
+ - Canon i-SENSYS MF8200C and MF8500C use generation 2 protocols.
+ - Also use has_paper() for generation 2 scanners.
+ * backend/pixma_imageclass.c, doc/descriptions/pixma.desc: Canon i-SENSYS
+ MF8200C: ADF supports max. 300DPI.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.14
+
+2014-11-15 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/avision.c:
+ - Remove firmware checking for HP5370c scanners. Launchpad bug #1080787,
+ reported by Night Train.
+ - Build version 297.
+
+2014-10-29 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ New Canon scanners MAXIFY MB5000, MB5300, MB2000 and MB2300;
+ PIXMA MG7500, MG6600, MG5600, MG2900 and E460. All scanners need further
+ testing.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.13
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon PIXMA MG2900 Series is working, reported by Yannick Dirou.
-2013-01-16 Paul Newall <quandry@ntlworld.com>
- * doc/descriptions/kodakaio.desc:
- Desc file updated.
+2014-10-27 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_mp150.c: Canon PIXMA MG3500 Series doesn't need special
+ image post processing.
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon PIXMA MG3500 Series is working.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.12
-2013-01-14 Rolf Bensch <rolf at bensch hyphen online dot de>
+2014-10-20 Rolf Bensch <rolf at bensch hyphen online dot de>
* backend/pixma_imageclass.c, doc/descriptions/pixma.desc,
- doc/sane-pixma.man:
- - new scanner Canon i-SENSYS MF4550d. Bug #313674.
- - new scanner Canon i-SENSYS MF5880dn. Bug #313613.
- - new scanner Canon i-SENSYS MF6680dn. Bug #313922.
-
-2013-01-11 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp810.c:
- - formatted white space
- - Canon Pixma MP970 & MP990: fix for broken post_process_image_data.
- * doc/descriptions/pixma.desc, doc/sane-pixma.man:
- Canon Pixma MG5100 support reported by Patrick Viola.
-
-2013-01-10 Louis Lagendijk <louis dot lagendijk at gmail dot com>
- * Changed the pixma_bjnp.c implementation to use its own debug environment
- variable (SANE_DEBUG_BJNP) so debugging for the bjnp protocol and the
- backend proper can be controlled independently.
- Updated manpage for sane-pixma to document the above changes as well
- as the changed scannner buttjn options and the fact the bjnp protocol
- has added support for IPv6
-
-2013-01-10 Louis Lagendijk <louis dot lagendijk at gmail dot com>
- * Added optional support in sanedi.c for systemd socket activation. This
- will allow for using backend debugging using SANE_DEBUG_xxx to be used
- for saned controlled scanning when using socket activation. When only the
- socket is received we use the existing code path.
-
-2013-01-08 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp810.c: fix for broken tpu scan.
-
-2013-01-03 Paul Newall <quandry@ntlworld.com>
- * backend/kodakaio.c kodakaio.h:
- Detecting end of paper when using adf is now an option.
- Alternatively the image is padded with the background colour to make up
- the specified image size.
-
-2012-12-31 Paul Newall <quandry@ntlworld.com>
- * backend/kodakaio.c kodakaio.h kodakaio.conf kodakaio.conf.in:
- better fix for bug where adf could not scan more than 1 page with net connection
- end of paper now detected with adf, if it is less than the selected size
- ESP 2170 and Hero 9.1 can now do 1200dpi
-
-2012-12-31 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- New scanner Canon Pixma MG4200 reported by nuxer.
+ doc/sane-pixma.man: New Scanner Canon imageCLASS D530.
+ * backend/pixma_mp150.c:
+ - increase calibration timeout
+ - calibration can finish with 0x01 or 0x02
-2012-12-28 Alex Belkin <abc at telekom.ru>
- * backend/xerox_mfp.conf.in doc/descriptions/xerox_mfp.desc: usb id
- for Samsung CLX-3300 Series, reported by Jarkko A-L.
+2014-09-18 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon Pixma MG5500 Series is working, bug #314819.
-2012-12-23 Paul Newall <quandry@ntlworld.com>
- * backend/kodakaio.c:
- fix bug where adf could not scan more than 1 page with net connection
+2014-09-16 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man: Canon Pixma MG2400 Series
+ is working, reported by Marcus Wellnitz.
+ * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon Pixma MX530 Series is working, reported by Stephen Weston.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.11
-2012-12-13 Rolf Bensch <rolf at bensch hyphen online dot de>
- * README.linux: Installation description moved to top and some editing.
+2014-09-13 Paul Newall <p dot newalls at ntlworld dot com>
+ * backend/kodakaio.c, backend/kodakaio.h:
+ * Added lineart mode with threshold option.
-2012-12-09 Paul Newall <quandry@ntlworld.com>
+2014-09-07 Paul Newall <p dot newalls at ntlworld dot com>
* backend/kodakaio.c:
- add adf to ESP2170. Reduce the default adf y length to 11.3 inch
-
-2012-12-09 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys*.c backend/genesys_low.h: reworked gamma table
- handling. Compute gamma table outside send_gamma_table so default
- gamma table use device specific gamma values defined in device
- description.
+ * Fixed error where the colour compensation curves did not have enough
+ elements and this caused speckles in areas of very low or high colour.
+
+2014-08-23 Louis Lagendijk <louis dot lagendijk at gmail dot com>
+ * backend/pixma_bjnp.c:
+ * Keep TCP-connection closed untill we really need it. This avoids
+ the scanner closing the TCP-connection when idle
+ * Add an explicit error message when we detect that the scanner
+ closed the TCP-connection
+
+2014-08-16 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_imageclass.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ New scanners Canon i-SENSYS MF8200C Series and MF8500C Series. MF8500C
+ Series need further testing.
+ * doc/sane-pixma.man: add up to now undocumented verbose debug-level
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.10
+ * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
+ Canon PIXMA MX720 Series scanner is working (bug #314787).
-2012-12-07 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma.h: Pixma backend version 0.17.1
+2014-07-25 Rolf Bensch <rolf at bensch hyphen online dot de>
* backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- - Canon Pixma MG3100 support reported by Madis Lhmus.
- - Canon Pixma MG6200 support reported by Matthias Thon.
- - Canon Pixma MX890 support reported by Henry Ptasinski.
+ New scanners Canon Pixma E400, E560, MX470 and MX530. All scanners need
+ further testing.
+
+2014-07-14 m. allan noah <kitno455 at gmail dot com>
+ * frontend/scanimage.c: batch-print option and exit value changes
+ from Jeff Breidenbach jeff@jab.org
+
+2014-07-01 Stphane Voltz <stef.dev@free.fr>
+ * testsuite/sanei/sanei_config_test.c: fix #314694 by exporting a
+ specific SANE_CONFIG_DIR env dir for tests
+
+2014-06-29 Stphane Voltz <stef.dev@free.fr>
+ * backend/genesys_gl646.c: fix regression in coarse gain calibration
+
+2014-06-05 Tom Callaway <spot@fedoraproject.org>
+ * lib/snprintf.c: update to newer version from LPRng. The old version is
+ licensed under the Artistic License 1.0 which isn't compatible with the
+ GPL and arguably non-free.
+
+2014-06-02 Stphane Voltz <stef.dev@free.fr>
+ * backend/genesys_*.[ch]: add internal ini_scan_regs_api. Add proper
+ target speed for LiDE 110/210 grey mode motor tables.
+
+2014-05-29 Paul Newall <quandry@ntlworld.com>
+ * backend/kodakaio.c: change to comment on ./configure parameters
+
+2014-05-26 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_mp150.c: fix ADF paper empty @ start scanning for Canon
+ Pixma MP150 based ADF scanners
+ * backend/pixma_common.c: remove unused variable
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.9
+
+2014-05-08 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_mp150.c: fix MG7100 image data post processing @ high
+ resolutions > 600dpi.
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man: Canon Pixma MG7100
+ Series scanner is working, reported by Gert Cauwenberg.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.8
+
+2014-05-13 Stphane Voltz <stef.dev@free.fr>
+ * backend/genesys_gl646.[ch] backend/genesys.c backend/genesys_low.c:
+ fix bug #314663. Set gamma for gl646 devices only at scan time. Reset
+ endpoint each time before leaving.
+
+2014-05-08 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.7
+ * backend/pixma_mp150.c:
+ - all Canon Pixma MP150 based ADF scanners support 14" legal paper size
+ - fix ADF paper empty bug for Canon Pixma MP150 based ADF scanners
+ * doc/descriptions/pixma.desc: remove comments for Canon Pixma MP150 based
+ ADF scanners: adf empty buggy
+ * doc/sane-pixma.man: Canon Pixma MX360 shouldn't hang anymore (@ ADF paper
+ empty)
+
+2014-04-07 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man: Canon Pixma MX410
+ is working, reported from Javier Gorostiza.
+
+2014-03-21 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man: Canon Pixma MG3200
+ is working, reported in ubuntuforums.org/showthread.php?t=2072162.
+ * doc/descriptions/pixma.desc: rename WLAN to WiFi
+ * backend/pixma_mp150.c:
+ - Canon Pixma MX520 Series supports 14" legal paper size in ADF mode.
+ - MX520 has button support.
+ * backend/pixma_common.c: Clamp minimum image size to 16 px x 16 px. Some
+ new scanners need minimum 16 px height.
+ * doc/descriptions/pixma.desc, doc/sane-pixma.man: Canon Pixma MX520 Series
+ is working, reported by Trygve Flathen.
+
+2014-02-28 Rolf Bensch <rolf at bensch hyphen online dot de>
* backend/pixma_imageclass.c, doc/descriptions/pixma.desc,
- doc/sane-pixma.man:
- - Canon imageCLASS MF4430 support reported by Michael Mik. This device is
- a MF4410 with ADF.
-
-2012-12-05 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys.c backend/genesys_gl124.c: add binary data logging
- for gl124 based scanners. Issue park command as early as possible to
- speed up batch scans
-
-2012-11-28 Paul Newall <quandry@ntlworld.com>
- * backend/kodakaio.c backend/kodakaio.h backend/kodakaio.conf.in
- backend/Makefile.am backend/Makefile.in docs/descriptions/kodakaio.desc:
- Use avahi instead of cups for network autodetection
-
-2012-11-24 Stphane Voltz <stef.dev@free.fr>
- * backend/rts9918.c backend/rts8891_low.c backend/rts8891_low.h:
- fix batch scan by adding asynchronous head parking. Fix 600 and 1200
- dpi scan mode for sensor type 1
-
-2012-11-11 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys.c backend/genesys_gl124.c: improve calibration for
- gl124 based scanners. Fix head parking issue at 1200 dpi.
-
-2012-11-02 Stphane Voltz <stef.dev@free.fr>
- * doc/descriptions/unsupported.desc: add USB ID 0x07b3, 0x0802
-
-2012-11-02 Stphane Voltz <stef.dev@free.fr>
- * configure configure.in doc/Makefile.am doc/Makefile.in: add optional
- doxygen documentation generation for genesys backend.
-
-2012-10-31 Louis Lagendijk <louis.lagendijk at gmail dot com>
- * backend/scripts/pixma_gen_options.py
- Updated formatting of produced files to match pixma.c formatting
- without need for manual editing
- * pixma.[ch] pixma_mp810.c pixma_mp150.c
- Rewrite of button option handling. Button options can now be read
- without triggering through the button-update option. Buton-update
- options is left for ease of use with xsane
- Options are cached so that only when an option is read again all
- options are re-read.
-
-2012-10-29 Alex Belkin <abc at telekom.ru>
- * backend/xerox_mfp.conf.in doc/descriptions/xerox_mfp.desc: usb id
- for Samsung SCX-4833FD, reported by Frank Pennycook; description for
- SCX-3405W working in networking mode, reported by Patrick Mackinlay.
-
-2012-10-24 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys_*.[ch]: Lide 35 improvements, doxygen fixes,
- experimental 100 dpi support for Canoscan 4400F and 8400F
-
-2012-10-24 Mattias Ellert <mattias.ellert@fysast.uu.se>
- * configure.in, configure: Unset VERSION during the SCSI header check
- (Check fails on MacOS X if VERSION is defined)
-
-2012-10-22 Mattias Ellert <mattias.ellert@fysast.uu.se>
- * po/sv.po: Updated Swedish translation
- * backend/pixma_bjnp.c: Fix arguments to IPv6 macros
-
-2012-10-18 m. allan noah <kitno455 at gmail dot com>
- * backend/canon*: IX-4015 support by Ondrej Zary
-
-2012-10-17 Alex Belkin <abc at telekom.ru>
- * backend/xerox_mfp.conf.in doc/descriptions/xerox_mfp.desc: usb id
- for Samsung SCX-4100, reported by Antonello Lobianco.
-
-2012-09-18 Alex Belkin <abc at telekom.ru>
- * backend/xerox_mfp.conf.in doc/descriptions/xerox_mfp.desc: usb id
- for Samsung SCX-4729FD, reported by wom balton.
-
-2012-09-12 Rolf Bensch <rolf at bensch hyphen online dot de>
+ doc/sane-pixma.man: Rename Canon i-SENSYS MF4550d to Canon i-SENSYS MF4500
+ Series. This fixes ethernet problems. Patch from chrysn.
+
+2014-02-24 Stphane Voltz <stef.dev@free.fr>
+ * doc/sane-genesys.man backend/genesys.[ch]:
+ avoid calibration file name collision in case of several identical
+ scanners
+
+2014-02-10 Louis Lagendijk <louis.lagendijk at gmail.com>
+ * backend/pixma_bjnp.c backend/pixma_bjnp.h backend/pixma_bjnp_private.h:
+ - Added support for Canon laser multi-functionals using the MFNP protocol over port 8610
+ - Improved debug-logging to be more readable
+
+2014-02-08 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_mp150.c:
+ - Canon Pixma MX510 Series supports 14" legal paper size in ADF mode.
* doc/descriptions/pixma.desc, doc/sane-pixma.man:
- Canon imageCLASS MF5730 support reported by Ondrej Zary.
+ - Canon Pixma MX510 Series is working, reported by sebastien_gd.
+
+2014-01-29 m. allan noah <kitno455 at gmail dot com>
+ * backend/umax-uc630.c: updates from Ondrej Zary
+
+2014-01-21 Stphane Voltz <stef.dev@free.fr>
+ * doc/descriptions/unsupported.desc doc/descriptions/genesys.desc:
+ update status of the HP Scanjet 4850C
-2012-09-10 Rolf Bensch <rolf at bensch hyphen online dot de>
- * doc/descriptions/unsupported.desc: Removed Canon Multipass 390 from
- unsupported device list.
+2014-01-17 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * doc/descriptions/pixma.desc: Update specification file for
+ Canon i-SENSYS MF4800 Series:
+ - Ethernet is buggy.
+ - ADF is working.
-2012-09-08 Louis Lagendijk <louis.lagendijk at gmail dot com>
- * backend/pixma_bjnp.c, backend/pixma_bjnp_private.h
- bulk reading rewritten and solved the case where the scanner returns
- a 0 length payload.
- Use MDL string instead of DES as it is mre fool proof when matching
- the model string from the backend
+2014-01-09 Gerhard Jaeger <gerhard@gjaeger.de>
+ * tools/sane-find-scanner.c tools/check-usb-chip.c: Add LM983x usb
+ chip detection when compiled for libusb-1.0.
-2012-09-06 Stphane Voltz <stef.dev@free.fr>
- * backend/genesys_gl646.c backend/genesys.c: enable hardware lineart
- for Strobe XP200
+2014-01-02 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * doc/descriptions/pixma.desc: ADF is working for Canon i-SENSYS MF4800
+ Series, reported by Yvan L. Glinas.
-2012-09-05 Rolf Bensch <rolf at bensch hyphen online dot de>
+2014-01-02 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma.[ch], backend/pixma_common.[ch], backend/pixma_imageclass.c,
+ backend/pixma_io_sanei.c, backend/pixma_mp150.c, backend/pixma_mp7[35]0.c,
+ backend/pixma_mp810.c: update copyright.
* backend/pixma_imageclass.c, doc/descriptions/pixma.desc,
- doc/sane-pixma.man: New scanner reported by Eric Schwartz. Bug #313761.
- * backend/pixma_mp150.c: 14" (ADF) / A4 (Flatbed) exception for Pixma MX420
- reported by D.Mller. Same exception also added for Pixma MX410.
+ doc/sane-pixma.man: bug #314411, Canon imageCLASS MF4570dw is working.
-2012-09-04 Rolf Bensch <rolf at bensch hyphen online dot de>
- * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- Pixma MG5300 support reported by Gernot Hassenpflug.
+2013-12-27 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_imageclass.c, doc/descriptions/pixma.desc,
+ doc/sane-pixma.man:
+ - Canon i-SENSYS MF4800 Series has ADF and supports 14" legal paper size
+ in ADF mode.
+ - Canon i-SENSYS MF4800 Series is working, reported by Yvan L. Glinas.
-2012-09-03 Rolf Bensch <rolf at bensch hyphen online dot de>
- * README.linux: Installation description updated for sane-backends
- 1.0.24git.
- * doc/descriptions/pixma.desc, doc/sane-pixma.man:
- Canon imageRunner 1020/1024/1025 support reported by Yuri Kirin.
- Bug #313203.
- * backend/pixma_mp150.c: Use xdpi to check for 14" / A4 scan.
- * backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- Pixma MX370 support reported by Daniel Lehmann. Bug #313750.
- * backend/pixma_mp150.c: PIXMA_CAP_EXPERIMENT removed from new scanners.
+2013-12-23 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_common.c: fix usb cmd transaction timeout
-2012-08-27 Louis Lagendijk <louis.lagendijk at gmail dot com>
- * pixma_bjnp.c pixma_bjnp_private.h
- Added working scan-button support
- Added IPv6 support
- Some clean up and refactoring
+2013-12-23 Stphane Voltz <stef.dev@free.fr>
+ * backend/genesys_devices.c backend/genesys.c backend/genesys_low.h
+ backend/genesys_gl841.[ch]: color calibration improvement for LiDE80,
+ working LEDADD for gl841 CIS scanners
-2012-08-27 Rolf Bensch <rolf at bensch hyphen online dot de>
+2013-12-16 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_imageclass.c, doc/descriptions/pixma.desc,
+ doc/sane-pixma.man:
+ - rename Canon imageCLASS MF4770n to i-SENSYS MF4700 Series
+ - rename Canon i-SENSYS MF4890dw to MF4800 Series
* backend/pixma_mp150.c, doc/descriptions/pixma.desc, doc/sane-pixma.man:
- Pixma MG6100 support reported by Yann Bonnamy. Bug #313471.
+ - Canon MX920 reported as working; ADF is still buggy
+ - MX920 has 14" ADF paper length
+ - MX920 has button support
+ - fix vertical stripe shifting for MX920
+ - tidy function calc_shifting()
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.6
+
+2013-12-16 Stphane Voltz <stef.dev@free.fr>
+ * doc/descriptions/genesys.desc: update LiDE 80
+ * backend/genesys_devices.c backend/genesys.c backend/genesys_low.h
+ backend/genesys_gl841.[ch]: basic support for LiDE 80
+
+2013-12-10 m. allan noah <kitno455 at gmail dot com>
+ * backend/fujitsu*: fujitsu backend v118
+ - support fi-7160, fi-7260, fi-7180 and fi-7280
+ - remove unused var from do_scsi_cmd()
+ - added more request_sense options
+ - add adv_paper_protect option
+ - enable paper protection by default
+ - increase max_x_fb for fi-6240 and fi-6230
+
+2013-12-09 m. allan noah <kitno455 at gmail dot com>
+ * backend/canon_dr*: canon_dr backend v42
+ - initial DR-G1100 support
+ - add support for paper sensors (P-215 & P-208)
+ - add initial support for card reader (P-215)
+ - removed unused var from do_scsi_cmd()
+
+2013-11-21 Stphane Voltz <stef.dev@free.fr>
+ * testsuite/tools/Makefile.*: handle sane git version change in tests.
+
+2013-10-19 Stphane Voltz <stef.dev@free.fr>
+ * doc/descriptions/genesys.desc doc/Descriptions/unsupported.desc:
+ update LiDE 80 and HP2400 information
+ * backend/genesys_devices.c backend/genesys.conf.in backend/genesys.c
+ backend/genesys_low.h backend/genesys_gl841.[ch]: add first element of
+ LiDE 80 support.
+
+2013-10-15 Paul Newall <quandry@ntlworld.com>
+ * configure.in: detection of cups was commented out. Avahi is now used
+ for autodetection in kodakaio so the detection of cups is no longer required.
+
+2013-10-14 Paul Newall <quandry@ntlworld.com>
+ * backend/kodakaio.c: fix bug #314301,
+ Segfault when unexpected data returned by avahi auto discovery.
+
+2013-10-11 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * backend/pixma_imageclass.c: Use generation variable instead of single
+ defines of scanner pid's. Now new scanners should work without extensive
+ code editing.
+ * backend/pixma_imageclass.c, doc/descriptions/pixma.desc,
+ doc/sane-pixma.man: New scanner Canon i-SENSYS MF4890dw. This scanner needs
+ further testing.
+ * backend/pixma.h, doc/descriptions/pixma.desc: Pixma backend version 0.17.5
+
+2013-10-02 Rolf Bensch <rolf at bensch hyphen online dot de>
+ * README.linux: Update Installation description for 1.0.25git.
-2012-08-26 m. allan noah <kitno455 at gmail dot com>
- * ChangeLog*, configure*, Makefile.in, doc/desc/{kodakaio,kvs40xx}.desc:
- Various updates related to starting 1.0.24git
+2013-09-30 m. allan noah <kitno455 at gmail dot com>
+ * ChangeLog*, configure*, doc/releases.txt:
+ Various updates related to starting 1.0.25git
-Older entries can be found in ChangeLog-1.0.23.
+Older entries can be found in ChangeLog-1.0.24.
diff --git a/Makefile.in b/Makefile.in
index bee0461..141a15f 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -317,6 +317,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -328,11 +329,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -456,8 +460,8 @@ $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
$(am__aclocal_m4_deps):
include/sane/config.h: include/sane/stamp-h1
- @if test ! -f $@; then rm -f include/sane/stamp-h1; else :; fi
- @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) include/sane/stamp-h1; else :; fi
+ @test -f $@ || rm -f include/sane/stamp-h1
+ @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) include/sane/stamp-h1
include/sane/stamp-h1: $(top_srcdir)/include/sane/config.h.in $(top_builddir)/config.status
@rm -f include/sane/stamp-h1
@@ -687,10 +691,16 @@ dist-xz: distdir
$(am__post_remove_distdir)
dist-tarZ: distdir
+ @echo WARNING: "Support for shar distribution archives is" \
+ "deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z
$(am__post_remove_distdir)
dist-shar: distdir
+ @echo WARNING: "Support for distribution archives compressed with" \
+ "legacy program 'compress' is deprecated." >&2
+ @echo WARNING: "It will be removed altogether in Automake 2.0" >&2
shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz
$(am__post_remove_distdir)
@@ -732,9 +742,10 @@ distcheck: dist
&& dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \
&& am__cwd=`pwd` \
&& $(am__cd) $(distdir)/_build \
- && ../configure --srcdir=.. --prefix="$$dc_install_base" \
+ && ../configure \
$(AM_DISTCHECK_CONFIGURE_FLAGS) \
$(DISTCHECK_CONFIGURE_FLAGS) \
+ --srcdir=.. --prefix="$$dc_install_base" \
&& $(MAKE) $(AM_MAKEFLAGS) \
&& $(MAKE) $(AM_MAKEFLAGS) dvi \
&& $(MAKE) $(AM_MAKEFLAGS) check \
diff --git a/NEWS b/NEWS
index 6e39bf8..31b46ba 100644
--- a/NEWS
+++ b/NEWS
@@ -1,5 +1,20 @@
-*-Mode: outline-*-
-New with 1.0.24, released 2012-09-30:
+New with 1.0.25, released 2015-10-03:
+
+* New backends: epsonds (Epson DS, PX and WF series),
+ pieusb (PIE and Reflecta film/slide scanners).
+* Support for JPG and PNG output format in scanimage.
+* Significant enhancements to avision, canon_dr, epjitsu, fujitsu, genesys,
+ kodakaio and pixma backends.
+* Minor updates, bugfixes or scanners added in several backends.
+* 300 new scanner models supported.
+* Workaround for USB3 problems in Linux kernel.
+* Added code for IR functionality.
+* Documentation and translation updates.
+* Bugfixes (threading, networking, udev rules).
+
+
+New with 1.0.24, released 2013-09-30:
* Significant enhancements to pixma, genesys, kodakaio, fujitsu, canon_dr.
* Minor updates, bugfixes or scanners added in several backends.
diff --git a/README.linux b/README.linux
index d650d48..6f7aec0 100644
--- a/README.linux
+++ b/README.linux
@@ -55,8 +55,12 @@ $ make install
Step by step install on Linux 2.6.* and 3.*, both with udev:
------------------------------------------------------------
-1. Install missing development packages with your prefered package manager:
- - libusb-dev or libusb-devel or libusb-1_0-devel
+1. Install with your preferred package manager:
+ (a) the development environment for your Linux distibution
+ - mandatory: gcc, make, kernel header files
+ - optional: git
+ (b) missing development packages
+ - libusb-dev or libusb-devel or libusb-compat-devel
2. Get the latest SANE backend from git:
You can download "daily git snapshot" from here:
@@ -86,10 +90,10 @@ Step by step install on Linux 2.6.* and 3.*, both with udev:
Register new installed SANE dynamically linked shared object library.
$ sudo ldconfig -v | grep libsane
- libsane.so.1 -> libsane.so.1.0.24
- libsane.so.1 -> libsane.so.1.0.22
+ libsane.so.1 -> libsane.so.1.0.25
+ libsane.so.1 -> libsane.so.1.0.23
- This example shows that the system first find version 1.0.24 and then 1.0.22.
+ This example shows that the system first find version 1.0.25 and then 1.0.23.
This is the correct order.
If your system first find the old version and then the new installed one,
@@ -133,17 +137,17 @@ Step by step install on Linux 2.6.* and 3.*, both with udev:
4.1. Check the used backend version:
- The programs must use the installed SANE backend version, e.g. 1.0.24.
+ The programs must use the installed SANE backend version, e.g. 1.0.25.
$ scanimage -V
- scanimage (sane-backends) 1.0.24git; backend version 1.0.24
+ scanimage (sane-backends) 1.0.25git; backend version 1.0.25
- This example shows that backend and scanimage are version 1.0.24.
+ This example shows that backend and scanimage are version 1.0.25.
$ /usr/bin/scanimage -V
- scanimage (sane-backends) 1.0.20; backend version 1.0.24
+ scanimage (sane-backends) 1.0.23; backend version 1.0.25
- This example shows that an old scanimage (1.0.20) uses the backend 1.0.24.
+ This example shows that an old scanimage (1.0.23) uses the backend 1.0.25.
If you want to use xsane, start xsane and check the used version with
CTRL - i.
diff --git a/acinclude.m4 b/acinclude.m4
index 013c032..7a86a0b 100644
--- a/acinclude.m4
+++ b/acinclude.m4
@@ -48,6 +48,7 @@ if test "${ac_cv_c_compiler_gnu}" = "yes"; then
ANSI_FLAG=
;;
esac
+ NORMAL_CFLAGS="${NORMAL_CFLAGS} ${ANSI_FLAG}"
WARN_CFLAGS="${WARN_CFLAGS} ${ANSI_FLAG}"
AC_ARG_ENABLE(warnings,
@@ -312,6 +313,19 @@ AC_DEFUN([SANE_CHECK_TIFF],
AC_SUBST(TIFF_LIBS)
])
+AC_DEFUN([SANE_CHECK_PNG],
+[
+ AC_CHECK_LIB(png,png_init_io,
+ [
+ AC_CHECK_HEADER(png.h,
+ [sane_cv_use_libpng="yes"; PNG_LIBS="-lpng"],)
+ ],)
+ if test "$sane_cv_use_libpng" = "yes" ; then
+ AC_DEFINE(HAVE_LIBPNG,1,[Define to 1 if you have the libpng library.])
+ fi
+ AC_SUBST(PNG_LIBS)
+])
+
#
# Checks for pthread support
AC_DEFUN([SANE_CHECK_LOCKING],
@@ -592,14 +606,21 @@ for be in ${BACKENDS}; do
mustek_pp)
if test "${sane_cv_use_libieee1284}" != "yes" && test "${enable_parport_directio}" != "yes"; then
- echo "*** $be backend requires libieee1284 and paraport-directio libraries - $DISABLE_MSG"
+ echo "*** $be backend requires libieee1284 or parport-directio libraries - $DISABLE_MSG"
backend_supported="no"
fi
;;
dell1600n_net)
if test "${sane_cv_use_libjpeg}" != "yes" || test "${sane_cv_use_libtiff}" != "yes"; then
- echo "*** $be backend requires JPEG and/or TIFF library - $DISABLE_MSG"
+ echo "*** $be backend requires JPEG and TIFF library - $DISABLE_MSG"
+ backend_supported="no"
+ fi
+ ;;
+
+ epsonds)
+ if test "${sane_cv_use_libjpeg}" != "yes"; then
+ echo "*** $be backend requires JPEG library - $DISABLE_MSG"
backend_supported="no"
fi
;;
@@ -620,9 +641,9 @@ for be in ${BACKENDS}; do
;;
qcam)
- if test "${ac_cv_func_ioperm}" = "no" \
+ if ( test "${ac_cv_func_ioperm}" = "no" || test "${sane_cv_have_sys_io_h_with_inb_outb}" = "no" )\
&& test "${ac_cv_func__portaccess}" = "no"; then
- echo "*** $be backend requires ioperm and portaccess functions - $DISABLE_MSG"
+ echo "*** $be backend requires (ioperm, inb and outb) or portaccess functions - $DISABLE_MSG"
backend_supported="no"
fi
;;
diff --git a/aclocal.m4 b/aclocal.m4
index bf1b3c1..0b29a4c 100644
--- a/aclocal.m4
+++ b/aclocal.m4
@@ -1,4 +1,4 @@
-# generated automatically by aclocal 1.13.4 -*- Autoconf -*-
+# generated automatically by aclocal 1.14.1 -*- Autoconf -*-
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
@@ -232,10 +232,10 @@ m4_popdef([pkg_description])
# generated from the m4 files accompanying Automake X.Y.
# (This private macro should not be called outside this file.)
AC_DEFUN([AM_AUTOMAKE_VERSION],
-[am__api_version='1.13'
+[am__api_version='1.14'
dnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to
dnl require some minimum version. Point them to the right macro.
-m4_if([$1], [1.13.4], [],
+m4_if([$1], [1.14.1], [],
[AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl
])
@@ -251,7 +251,7 @@ m4_define([_AM_AUTOCONF_VERSION], [])
# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.
# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.
AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],
-[AM_AUTOMAKE_VERSION([1.13.4])dnl
+[AM_AUTOMAKE_VERSION([1.14.1])dnl
m4_ifndef([AC_AUTOCONF_VERSION],
[m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl
_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])
@@ -618,6 +618,12 @@ AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],
# This macro actually does too much. Some checks are only needed if
# your package does certain things. But this isn't really a big deal.
+dnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.
+m4_define([AC_PROG_CC],
+m4_defn([AC_PROG_CC])
+[_AM_PROG_CC_C_O
+])
+
# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])
# AM_INIT_AUTOMAKE([OPTIONS])
# -----------------------------------------------
@@ -726,7 +732,48 @@ dnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.
AC_CONFIG_COMMANDS_PRE(dnl
[m4_provide_if([_AM_COMPILER_EXEEXT],
[AM_CONDITIONAL([am__EXEEXT], [test -n "$EXEEXT"])])])dnl
-])
+
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ AC_MSG_ERROR([Your 'rm' program is bad, sorry.])
+ fi
+fi])
dnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion. Do not
dnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further
@@ -734,7 +781,6 @@ dnl mangled by Autoconf and run in a shell conditional statement.
m4_define([_AC_COMPILER_EXEEXT],
m4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])
-
# When config.status generates a header, we must update the stamp-h file.
# This file resides in the same directory as the config header
# that is generated. The stamp files are numbered to have different names.
@@ -882,38 +928,6 @@ AC_MSG_RESULT([$_am_result])
rm -f confinc confmf
])
-# Copyright (C) 1999-2013 Free Software Foundation, Inc.
-#
-# This file is free software; the Free Software Foundation
-# gives unlimited permission to copy and/or distribute it,
-# with or without modifications, as long as this notice is preserved.
-
-# AM_PROG_CC_C_O
-# --------------
-# Like AC_PROG_CC_C_O, but changed for automake.
-AC_DEFUN([AM_PROG_CC_C_O],
-[AC_REQUIRE([AC_PROG_CC_C_O])dnl
-AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
-AC_REQUIRE_AUX_FILE([compile])dnl
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
- # Losing compiler, so override with the script.
- # FIXME: It is wrong to rewrite CC.
- # But if we don't then we get into trouble of one sort or another.
- # A longer-term fix would be to have automake use am__CC in this case,
- # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
- CC="$am_aux_dir/compile $CC"
-fi
-dnl Make sure AC_PROG_CC is never called again, or it will override our
-dnl setting of CC.
-m4_define([AC_PROG_CC],
- [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])])
-])
-
# Fake the existence of programs that GNU maintainers use. -*- Autoconf -*-
# Copyright (C) 1997-2013 Free Software Foundation, Inc.
@@ -984,6 +998,70 @@ AC_DEFUN([_AM_SET_OPTIONS],
AC_DEFUN([_AM_IF_OPTION],
[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])
+# Copyright (C) 1999-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# _AM_PROG_CC_C_O
+# ---------------
+# Like AC_PROG_CC_C_O, but changed for automake. We rewrite AC_PROG_CC
+# to automatically call this.
+AC_DEFUN([_AM_PROG_CC_C_O],
+[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl
+AC_REQUIRE_AUX_FILE([compile])dnl
+AC_LANG_PUSH([C])dnl
+AC_CACHE_CHECK(
+ [whether $CC understands -c and -o together],
+ [am_cv_prog_cc_c_o],
+ [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i])
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+AC_LANG_POP([C])])
+
+# For backward compatibility.
+AC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])
+
+# Copyright (C) 2001-2013 Free Software Foundation, Inc.
+#
+# This file is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# AM_RUN_LOG(COMMAND)
+# -------------------
+# Run COMMAND, save the exit status in ac_status, and log it.
+# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)
+AC_DEFUN([AM_RUN_LOG],
+[{ echo "$as_me:$LINENO: $1" >&AS_MESSAGE_LOG_FD
+ ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&AS_MESSAGE_LOG_FD
+ (exit $ac_status); }])
+
# Check to make sure that the build environment is sane. -*- Autoconf -*-
# Copyright (C) 1996-2013 Free Software Foundation, Inc.
diff --git a/backend/Makefile.am b/backend/Makefile.am
index f84d23e..b672490 100644
--- a/backend/Makefile.am
+++ b/backend/Makefile.am
@@ -24,7 +24,7 @@ USB_LIBS = @USB_LIBS@
SCSI_LIBS = @SCSI_LIBS@
PTHREAD_LIBS = @PTHREAD_LIBS@
-AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -DLIBDIR="$(libdir)/sane"
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -DLIBDIR="\"$(libdir)/sane\""
V_MAJOR = @V_MAJOR@
V_MINOR = @V_MINOR@
@@ -83,14 +83,14 @@ BACKEND_CONFS= abaton.conf agfafocus.conf apple.conf artec.conf \
canon_pp.conf cardscan.conf coolscan2.conf coolscan3.conf \
coolscan.conf dc210.conf dc240.conf dc25.conf \
dell1600n_net.conf dmc.conf epjitsu.conf epson2.conf \
- epson.conf fujitsu.conf genesys.conf gphoto2.conf \
+ epson.conf epsonds.conf fujitsu.conf genesys.conf gphoto2.conf \
gt68xx.conf hp3900.conf hp4200.conf hp5400.conf \
hp.conf hpsj5s.conf hs2p.conf ibm.conf kodak.conf kodakaio.conf\
leo.conf lexmark.conf ma1509.conf magicolor.conf \
matsushita.conf microtek2.conf microtek.conf mustek.conf \
mustek_pp.conf mustek_usb.conf nec.conf net.conf \
p5.conf \
- pie.conf pixma.conf plustek.conf plustek_pp.conf \
+ pie.conf pieusb.conf pixma.conf plustek.conf plustek_pp.conf \
qcam.conf ricoh.conf rts8891.conf s9036.conf sceptre.conf \
sharp.conf sm3840.conf snapscan.conf sp15c.conf \
st400.conf stv680.conf tamarack.conf \
@@ -171,7 +171,7 @@ be_convenience_libs = libabaton.la libagfafocus.la \
libcoolscan2.la libcoolscan3.la libdc25.la \
libdc210.la libdc240.la libdell1600n_net.la \
libdmc.la libdll.la libdll_preload.la libepjitsu.la libepson.la \
- libepson2.la libfujitsu.la libgenesys.la \
+ libepson2.la libepsonds.la libfujitsu.la libgenesys.la \
libgphoto2_i.la libgt68xx.la libhp.la \
libhp3500.la libhp3900.la libhp4200.la \
libhp5400.la libhp5590.la libhpljm1005.la \
@@ -182,7 +182,7 @@ be_convenience_libs = libabaton.la libagfafocus.la \
libmustek.la libmustek_pp.la libmustek_usb.la \
libmustek_usb2.la libnec.la libnet.la \
libniash.la libp5.la \
- libpie.la libpint.la libpixma.la \
+ libpie.la libpieusb.la libpint.la libpixma.la \
libplustek.la libplustek_pp.la libpnm.la \
libqcam.la libricoh.la librts8891.la \
libs9036.la libsceptre.la libsharp.la \
@@ -204,7 +204,7 @@ be_dlopen_libs = libsane-abaton.la libsane-agfafocus.la \
libsane-coolscan2.la libsane-coolscan3.la libsane-dc25.la \
libsane-dc210.la libsane-dc240.la libsane-dell1600n_net.la \
libsane-dmc.la libsane-epjitsu.la libsane-epson.la \
- libsane-epson2.la libsane-fujitsu.la libsane-genesys.la \
+ libsane-epson2.la libsane-epsonds.la libsane-fujitsu.la libsane-genesys.la \
libsane-gphoto2.la libsane-gt68xx.la libsane-hp.la \
libsane-hp3500.la libsane-hp3900.la libsane-hp4200.la \
libsane-hp5400.la libsane-hp5590.la libsane-hpljm1005.la \
@@ -216,7 +216,7 @@ be_dlopen_libs = libsane-abaton.la libsane-agfafocus.la \
libsane-mustek.la libsane-mustek_pp.la libsane-mustek_usb.la \
libsane-mustek_usb2.la libsane-nec.la libsane-net.la \
libsane-niash.la libsane-p5.la \
- libsane-pie.la libsane-pint.la libsane-pixma.la \
+ libsane-pie.la libsane-pieusb.la libsane-pint.la libsane-pixma.la \
libsane-plustek.la libsane-plustek_pp.la libsane-pnm.la \
libsane-qcam.la libsane-ricoh.la libsane-rts8891.la \
libsane-s9036.la libsane-sceptre.la libsane-sharp.la \
@@ -462,7 +462,7 @@ libsane_epson_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_epson_la_LIBADD = $(COMMON_LIBS) libepson.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_pio.lo $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS)
EXTRA_DIST += epson.conf.in
-libepson2_la_SOURCES = epson2.c epson2.h epson2_scsi.c epson2_scsi.h epson_usb.c epson2_net.c epson2_net.h epson2-io.c epson2-io.h epson2-commands.c epson2-commands.h epson2-ops.c epson2-ops.h epson2-cct.c
+libepson2_la_SOURCES = epson2.c epson2.h epson2_scsi.c epson2_scsi.h epson2_usb.c epson2_net.c epson2_net.h epson2-io.c epson2-io.h epson2-commands.c epson2-commands.h epson2-ops.c epson2-ops.h epson2-cct.c
libepson2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epson2
nodist_libsane_epson2_la_SOURCES = epson2-s.c
@@ -471,6 +471,19 @@ libsane_epson2_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_epson2_la_LIBADD = $(COMMON_LIBS) libepson2.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_pio.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo $(SCSI_LIBS) $(USB_LIBS) $(SOCKET_LIBS) $(MATH_LIB) $(RESMGR_LIBS)
EXTRA_DIST += epson2.conf.in
+libepsonds_la_SOURCES = epsonds.c epsonds.h epsonds-usb.c epsonds-usb.h epsonds-io.c epsonds-io.h \
+ epsonds-cmd.c epsonds-cmd.h epsonds-ops.c epsonds-ops.h epsonds-jpeg.c epsonds-jpeg.h
+libepsonds_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epsonds
+
+nodist_libsane_epsonds_la_SOURCES = epsonds-s.c
+libsane_epsonds_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epsonds
+libsane_epsonds_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
+libsane_epsonds_la_LIBADD = $(COMMON_LIBS) libepsonds.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \
+ ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo \
+ ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo \
+ @SANEI_SANEI_JPEG_LO@ $(JPEG_LIBS) $(USB_LIBS) $(MATH_LIB) $(RESMGR_LIBS)
+EXTRA_DIST += epsonds.conf.in
+
libfujitsu_la_SOURCES = fujitsu.c fujitsu.h fujitsu-scsi.h
libfujitsu_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=fujitsu
@@ -687,12 +700,12 @@ libsane_ma1509_la_LIBADD = $(COMMON_LIBS) libma1509.la ../sanei/sanei_init_debug
EXTRA_DIST += ma1509.conf.in
libmagicolor_la_SOURCES = magicolor.c magicolor.h
-libmagicolor_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=magicolor
+libmagicolor_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=magicolor $(SNMP_CFLAGS)
nodist_libsane_magicolor_la_SOURCES = magicolor-s.c
libsane_magicolor_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=magicolor
libsane_magicolor_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
-libsane_magicolor_la_LIBADD = $(COMMON_LIBS) libmagicolor.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo $(USB_LIBS) $(SOCKET_LIBS) $(MATH_LIB) $(RESMGR_LIBS)
+libsane_magicolor_la_LIBADD = $(COMMON_LIBS) libmagicolor.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo $(USB_LIBS) $(SOCKET_LIBS) $(MATH_LIB) $(RESMGR_LIBS) $(SNMP_LIBS)
EXTRA_DIST += magicolor.conf.in
libmatsushita_la_SOURCES = matsushita.c matsushita.h
@@ -802,6 +815,15 @@ libsane_pie_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_pie_la_LIBADD = $(COMMON_LIBS) libpie.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_scsi.lo ../sanei/sanei_thread.lo $(SCSI_LIBS) $(PTHREAD_LIBS) $(RESMGR_LIBS)
EXTRA_DIST += pie.conf.in
+libpieusb_la_SOURCES = pieusb.h pieusb_buffer.c pieusb_buffer.h pieusb_scancmd.c pieusb_scancmd.h pieusb_specific.c pieusb_specific.h pieusb_usb.c pieusb_usb.h pieusb.c
+libpieusb_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pieusb
+
+nodist_libsane_pieusb_la_SOURCES = pieusb-s.c
+libsane_pieusb_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pieusb
+libsane_pieusb_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
+libsane_pieusb_la_LIBADD = $(COMMON_LIBS) libpieusb.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_scsi.lo ../sanei/sanei_thread.lo ../sanei/sanei_usb.lo ../sanei/sanei_ir.lo ../sanei/sanei_magic.lo $(PTHREAD_LIBS) $(RESMGR_LIBS) $(USB_LIBS) $(MATH_LIB)
+EXTRA_DIST += pieusb.conf.in
+
libp5_la_SOURCES = p5.c p5.h p5_device.h
libp5_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=p5
diff --git a/backend/Makefile.in b/backend/Makefile.in
index 3f7fa12..1860295 100644
--- a/backend/Makefile.in
+++ b/backend/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -206,11 +206,17 @@ am_libepson_la_OBJECTS = libepson_la-epson.lo \
libepson_la_OBJECTS = $(am_libepson_la_OBJECTS)
libepson2_la_LIBADD =
am_libepson2_la_OBJECTS = libepson2_la-epson2.lo \
- libepson2_la-epson2_scsi.lo libepson2_la-epson_usb.lo \
+ libepson2_la-epson2_scsi.lo libepson2_la-epson2_usb.lo \
libepson2_la-epson2_net.lo libepson2_la-epson2-io.lo \
libepson2_la-epson2-commands.lo libepson2_la-epson2-ops.lo \
libepson2_la-epson2-cct.lo
libepson2_la_OBJECTS = $(am_libepson2_la_OBJECTS)
+libepsonds_la_LIBADD =
+am_libepsonds_la_OBJECTS = libepsonds_la-epsonds.lo \
+ libepsonds_la-epsonds-usb.lo libepsonds_la-epsonds-io.lo \
+ libepsonds_la-epsonds-cmd.lo libepsonds_la-epsonds-ops.lo \
+ libepsonds_la-epsonds-jpeg.lo
+libepsonds_la_OBJECTS = $(am_libepsonds_la_OBJECTS)
libfujitsu_la_LIBADD =
am_libfujitsu_la_OBJECTS = libfujitsu_la-fujitsu.lo
libfujitsu_la_OBJECTS = $(am_libfujitsu_la_OBJECTS)
@@ -327,6 +333,11 @@ libp5_la_OBJECTS = $(am_libp5_la_OBJECTS)
libpie_la_LIBADD =
am_libpie_la_OBJECTS = libpie_la-pie.lo
libpie_la_OBJECTS = $(am_libpie_la_OBJECTS)
+libpieusb_la_LIBADD =
+am_libpieusb_la_OBJECTS = libpieusb_la-pieusb_buffer.lo \
+ libpieusb_la-pieusb_scancmd.lo libpieusb_la-pieusb_specific.lo \
+ libpieusb_la-pieusb_usb.lo libpieusb_la-pieusb.lo
+libpieusb_la_OBJECTS = $(am_libpieusb_la_OBJECTS)
libpint_la_LIBADD =
am_libpint_la_OBJECTS = libpint_la-pint.lo
libpint_la_OBJECTS = $(am_libpint_la_OBJECTS)
@@ -654,6 +665,18 @@ libsane_epson2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(AM_CFLAGS) $(CFLAGS) $(libsane_epson2_la_LDFLAGS) $(LDFLAGS) \
-o $@
+libsane_epsonds_la_DEPENDENCIES = $(COMMON_LIBS) libepsonds.la \
+ ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \
+ ../sanei/sanei_config.lo ../sanei/sanei_config2.lo \
+ sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+nodist_libsane_epsonds_la_OBJECTS = libsane_epsonds_la-epsonds-s.lo
+libsane_epsonds_la_OBJECTS = $(nodist_libsane_epsonds_la_OBJECTS)
+libsane_epsonds_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(AM_CFLAGS) $(CFLAGS) $(libsane_epsonds_la_LDFLAGS) \
+ $(LDFLAGS) -o $@
libsane_fujitsu_la_DEPENDENCIES = $(COMMON_LIBS) libfujitsu.la \
../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \
../sanei/sanei_config.lo ../sanei/sanei_config2.lo \
@@ -915,7 +938,8 @@ libsane_magicolor_la_DEPENDENCIES = $(COMMON_LIBS) libmagicolor.la \
sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo \
../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo \
$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
- $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1)
nodist_libsane_magicolor_la_OBJECTS = \
libsane_magicolor_la-magicolor-s.lo
libsane_magicolor_la_OBJECTS = $(nodist_libsane_magicolor_la_OBJECTS)
@@ -1070,6 +1094,20 @@ libsane_pie_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
$(AM_CFLAGS) $(CFLAGS) $(libsane_pie_la_LDFLAGS) $(LDFLAGS) -o \
$@
+libsane_pieusb_la_DEPENDENCIES = $(COMMON_LIBS) libpieusb.la \
+ ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \
+ ../sanei/sanei_config.lo ../sanei/sanei_config2.lo \
+ sane_strstatus.lo ../sanei/sanei_scsi.lo \
+ ../sanei/sanei_thread.lo ../sanei/sanei_usb.lo \
+ ../sanei/sanei_ir.lo ../sanei/sanei_magic.lo \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+ $(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+nodist_libsane_pieusb_la_OBJECTS = libsane_pieusb_la-pieusb-s.lo
+libsane_pieusb_la_OBJECTS = $(nodist_libsane_pieusb_la_OBJECTS)
+libsane_pieusb_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+ $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+ $(AM_CFLAGS) $(CFLAGS) $(libsane_pieusb_la_LDFLAGS) $(LDFLAGS) \
+ -o $@
libsane_pint_la_DEPENDENCIES = $(COMMON_LIBS) libpint.la \
../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \
../sanei/sanei_config.lo sane_strstatus.lo
@@ -1505,24 +1543,25 @@ SOURCES = $(libabaton_la_SOURCES) $(libagfafocus_la_SOURCES) \
$(libdll_la_SOURCES) $(libdll_preload_la_SOURCES) \
$(libdmc_la_SOURCES) $(libepjitsu_la_SOURCES) \
$(libepson_la_SOURCES) $(libepson2_la_SOURCES) \
- $(libfujitsu_la_SOURCES) $(libgenesys_la_SOURCES) \
- $(libgphoto2_i_la_SOURCES) $(libgt68xx_la_SOURCES) \
- $(libhp_la_SOURCES) $(libhp3500_la_SOURCES) \
- $(libhp3900_la_SOURCES) $(libhp4200_la_SOURCES) \
- $(libhp5400_la_SOURCES) $(libhp5590_la_SOURCES) \
- $(libhpljm1005_la_SOURCES) $(libhpsj5s_la_SOURCES) \
- $(libhs2p_la_SOURCES) $(libibm_la_SOURCES) \
- $(libkodak_la_SOURCES) $(libkodakaio_la_SOURCES) \
- $(libkvs1025_la_SOURCES) $(libkvs20xx_la_SOURCES) \
- $(libkvs40xx_la_SOURCES) $(libleo_la_SOURCES) \
- $(liblexmark_la_SOURCES) $(libma1509_la_SOURCES) \
- $(libmagicolor_la_SOURCES) $(libmatsushita_la_SOURCES) \
- $(libmicrotek_la_SOURCES) $(libmicrotek2_la_SOURCES) \
- $(libmustek_la_SOURCES) $(libmustek_pp_la_SOURCES) \
- $(libmustek_usb_la_SOURCES) $(libmustek_usb2_la_SOURCES) \
- $(libnec_la_SOURCES) $(libnet_la_SOURCES) \
- $(libniash_la_SOURCES) $(libp5_la_SOURCES) \
- $(libpie_la_SOURCES) $(libpint_la_SOURCES) \
+ $(libepsonds_la_SOURCES) $(libfujitsu_la_SOURCES) \
+ $(libgenesys_la_SOURCES) $(libgphoto2_i_la_SOURCES) \
+ $(libgt68xx_la_SOURCES) $(libhp_la_SOURCES) \
+ $(libhp3500_la_SOURCES) $(libhp3900_la_SOURCES) \
+ $(libhp4200_la_SOURCES) $(libhp5400_la_SOURCES) \
+ $(libhp5590_la_SOURCES) $(libhpljm1005_la_SOURCES) \
+ $(libhpsj5s_la_SOURCES) $(libhs2p_la_SOURCES) \
+ $(libibm_la_SOURCES) $(libkodak_la_SOURCES) \
+ $(libkodakaio_la_SOURCES) $(libkvs1025_la_SOURCES) \
+ $(libkvs20xx_la_SOURCES) $(libkvs40xx_la_SOURCES) \
+ $(libleo_la_SOURCES) $(liblexmark_la_SOURCES) \
+ $(libma1509_la_SOURCES) $(libmagicolor_la_SOURCES) \
+ $(libmatsushita_la_SOURCES) $(libmicrotek_la_SOURCES) \
+ $(libmicrotek2_la_SOURCES) $(libmustek_la_SOURCES) \
+ $(libmustek_pp_la_SOURCES) $(libmustek_usb_la_SOURCES) \
+ $(libmustek_usb2_la_SOURCES) $(libnec_la_SOURCES) \
+ $(libnet_la_SOURCES) $(libniash_la_SOURCES) \
+ $(libp5_la_SOURCES) $(libpie_la_SOURCES) \
+ $(libpieusb_la_SOURCES) $(libpint_la_SOURCES) \
$(libpixma_la_SOURCES) $(libplustek_la_SOURCES) \
$(libplustek_pp_la_SOURCES) $(libpnm_la_SOURCES) \
$(libqcam_la_SOURCES) $(libricoh_la_SOURCES) \
@@ -1552,6 +1591,7 @@ SOURCES = $(libabaton_la_SOURCES) $(libagfafocus_la_SOURCES) \
$(nodist_libsane_epjitsu_la_SOURCES) \
$(nodist_libsane_epson_la_SOURCES) \
$(nodist_libsane_epson2_la_SOURCES) \
+ $(nodist_libsane_epsonds_la_SOURCES) \
$(nodist_libsane_fujitsu_la_SOURCES) \
$(nodist_libsane_genesys_la_SOURCES) \
$(nodist_libsane_gphoto2_la_SOURCES) \
@@ -1587,6 +1627,7 @@ SOURCES = $(libabaton_la_SOURCES) $(libagfafocus_la_SOURCES) \
$(nodist_libsane_niash_la_SOURCES) \
$(nodist_libsane_p5_la_SOURCES) \
$(nodist_libsane_pie_la_SOURCES) \
+ $(nodist_libsane_pieusb_la_SOURCES) \
$(nodist_libsane_pint_la_SOURCES) \
$(nodist_libsane_pixma_la_SOURCES) \
$(nodist_libsane_plustek_la_SOURCES) \
@@ -1638,24 +1679,25 @@ DIST_SOURCES = $(libabaton_la_SOURCES) $(libagfafocus_la_SOURCES) \
$(libdll_la_SOURCES) $(libdll_preload_la_SOURCES) \
$(libdmc_la_SOURCES) $(libepjitsu_la_SOURCES) \
$(libepson_la_SOURCES) $(libepson2_la_SOURCES) \
- $(libfujitsu_la_SOURCES) $(libgenesys_la_SOURCES) \
- $(libgphoto2_i_la_SOURCES) $(libgt68xx_la_SOURCES) \
- $(libhp_la_SOURCES) $(libhp3500_la_SOURCES) \
- $(libhp3900_la_SOURCES) $(libhp4200_la_SOURCES) \
- $(libhp5400_la_SOURCES) $(libhp5590_la_SOURCES) \
- $(libhpljm1005_la_SOURCES) $(libhpsj5s_la_SOURCES) \
- $(libhs2p_la_SOURCES) $(libibm_la_SOURCES) \
- $(libkodak_la_SOURCES) $(libkodakaio_la_SOURCES) \
- $(libkvs1025_la_SOURCES) $(libkvs20xx_la_SOURCES) \
- $(libkvs40xx_la_SOURCES) $(libleo_la_SOURCES) \
- $(liblexmark_la_SOURCES) $(libma1509_la_SOURCES) \
- $(libmagicolor_la_SOURCES) $(libmatsushita_la_SOURCES) \
- $(libmicrotek_la_SOURCES) $(libmicrotek2_la_SOURCES) \
- $(libmustek_la_SOURCES) $(libmustek_pp_la_SOURCES) \
- $(libmustek_usb_la_SOURCES) $(libmustek_usb2_la_SOURCES) \
- $(libnec_la_SOURCES) $(libnet_la_SOURCES) \
- $(libniash_la_SOURCES) $(libp5_la_SOURCES) \
- $(libpie_la_SOURCES) $(libpint_la_SOURCES) \
+ $(libepsonds_la_SOURCES) $(libfujitsu_la_SOURCES) \
+ $(libgenesys_la_SOURCES) $(libgphoto2_i_la_SOURCES) \
+ $(libgt68xx_la_SOURCES) $(libhp_la_SOURCES) \
+ $(libhp3500_la_SOURCES) $(libhp3900_la_SOURCES) \
+ $(libhp4200_la_SOURCES) $(libhp5400_la_SOURCES) \
+ $(libhp5590_la_SOURCES) $(libhpljm1005_la_SOURCES) \
+ $(libhpsj5s_la_SOURCES) $(libhs2p_la_SOURCES) \
+ $(libibm_la_SOURCES) $(libkodak_la_SOURCES) \
+ $(libkodakaio_la_SOURCES) $(libkvs1025_la_SOURCES) \
+ $(libkvs20xx_la_SOURCES) $(libkvs40xx_la_SOURCES) \
+ $(libleo_la_SOURCES) $(liblexmark_la_SOURCES) \
+ $(libma1509_la_SOURCES) $(libmagicolor_la_SOURCES) \
+ $(libmatsushita_la_SOURCES) $(libmicrotek_la_SOURCES) \
+ $(libmicrotek2_la_SOURCES) $(libmustek_la_SOURCES) \
+ $(libmustek_pp_la_SOURCES) $(libmustek_usb_la_SOURCES) \
+ $(libmustek_usb2_la_SOURCES) $(libnec_la_SOURCES) \
+ $(libnet_la_SOURCES) $(libniash_la_SOURCES) \
+ $(libp5_la_SOURCES) $(libpie_la_SOURCES) \
+ $(libpieusb_la_SOURCES) $(libpint_la_SOURCES) \
$(libpixma_la_SOURCES) $(libplustek_la_SOURCES) \
$(libplustek_pp_la_SOURCES) $(libpnm_la_SOURCES) \
$(libqcam_la_SOURCES) $(libricoh_la_SOURCES) \
@@ -1789,6 +1831,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -1800,11 +1843,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -1868,7 +1914,7 @@ target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
-AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -DLIBDIR="$(libdir)/sane"
+AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include -DLIBDIR="\"$(libdir)/sane\""
AM_LDFLAGS = @STRICT_LDFLAGS@
# The -rpath option is added because we are creating _LTLIBRARIES based
# on configure substitution. This causes automake to not know the
@@ -1916,65 +1962,67 @@ EXTRA_DIST = sane_strstatus.c stubs.c saned.conf.in abaton.conf.in \
cardscan.conf.in coolscan.conf.in coolscan2.conf.in \
coolscan3.conf.in dc25.conf.in dc210.conf.in dc240.conf.in \
dell1600n_net.conf.in dmc.conf.in epjitsu.conf.in \
- epson.conf.in epson2.conf.in fujitsu.conf.in genesys.conf.in \
- genesys_conv.c genesys_conv_hlp.c genesys_devices.c \
- gphoto2.conf.in gt68xx.conf.in gt68xx_devices.c \
- gt68xx_generic.c gt68xx_generic.h gt68xx_gt6801.c \
- gt68xx_gt6801.h gt68xx_gt6816.c gt68xx_gt6816.h gt68xx_high.c \
- gt68xx_high.h gt68xx_low.c gt68xx_low.h gt68xx_mid.c \
- gt68xx_mid.h gt68xx_shm_channel.c gt68xx_shm_channel.h \
- hp.conf.in hp.README hp.TODO hp3900.conf.in hp3900_config.c \
- hp3900_debug.c hp3900_rts8822.c hp3900_sane.c hp3900_types.c \
- hp3900_usb.c hp4200.conf.in hp4200_lm9830.c hp4200_lm9830.h \
- hp5400.conf.in hp5400_debug.c hp5400_debug.h hp5400_internal.c \
- hp5400_internal.h hp5400_sane.c hp5400_sanei.c hp5400_sanei.h \
- hp5400_xfer.h hp5590_cmds.c hp5590_cmds.h hp5590_low.c \
- hp5590_low.h hpsj5s.conf.in hs2p.conf.in hs2p-scsi.c \
- hs2p-scsi.h ibm.conf.in ibm-scsi.c kodak.conf.in \
- kodakaio.conf.in leo.conf.in lexmark.conf.in lexmark_models.c \
- lexmark_sensors.c ma1509.conf.in magicolor.conf.in \
- matsushita.conf.in microtek.conf.in microtek2.conf.in \
- mustek.conf.in mustek_scsi_pp.c mustek_scsi_pp.h \
- mustek_pp.conf.in mustek_pp_ccd300.c mustek_pp_ccd300.h \
- mustek_pp_cis.c mustek_pp_cis.h mustek_pp_null.c \
- mustek_usb.conf.in mustek_usb_high.c mustek_usb_high.h \
- mustek_usb_low.c mustek_usb_low.h mustek_usb_mid.c \
- mustek_usb_mid.h mustek_usb2_asic.c mustek_usb2_asic.h \
- mustek_usb2_high.c mustek_usb2_high.h mustek_usb2_reflective.c \
+ epson.conf.in epson2.conf.in epsonds.conf.in fujitsu.conf.in \
+ genesys.conf.in genesys_conv.c genesys_conv_hlp.c \
+ genesys_devices.c gphoto2.conf.in gt68xx.conf.in \
+ gt68xx_devices.c gt68xx_generic.c gt68xx_generic.h \
+ gt68xx_gt6801.c gt68xx_gt6801.h gt68xx_gt6816.c \
+ gt68xx_gt6816.h gt68xx_high.c gt68xx_high.h gt68xx_low.c \
+ gt68xx_low.h gt68xx_mid.c gt68xx_mid.h gt68xx_shm_channel.c \
+ gt68xx_shm_channel.h hp.conf.in hp.README hp.TODO \
+ hp3900.conf.in hp3900_config.c hp3900_debug.c hp3900_rts8822.c \
+ hp3900_sane.c hp3900_types.c hp3900_usb.c hp4200.conf.in \
+ hp4200_lm9830.c hp4200_lm9830.h hp5400.conf.in hp5400_debug.c \
+ hp5400_debug.h hp5400_internal.c hp5400_internal.h \
+ hp5400_sane.c hp5400_sanei.c hp5400_sanei.h hp5400_xfer.h \
+ hp5590_cmds.c hp5590_cmds.h hp5590_low.c hp5590_low.h \
+ hpsj5s.conf.in hs2p.conf.in hs2p-scsi.c hs2p-scsi.h \
+ ibm.conf.in ibm-scsi.c kodak.conf.in kodakaio.conf.in \
+ leo.conf.in lexmark.conf.in lexmark_models.c lexmark_sensors.c \
+ ma1509.conf.in magicolor.conf.in matsushita.conf.in \
+ microtek.conf.in microtek2.conf.in mustek.conf.in \
+ mustek_scsi_pp.c mustek_scsi_pp.h mustek_pp.conf.in \
+ mustek_pp_ccd300.c mustek_pp_ccd300.h mustek_pp_cis.c \
+ mustek_pp_cis.h mustek_pp_null.c mustek_usb.conf.in \
+ mustek_usb_high.c mustek_usb_high.h mustek_usb_low.c \
+ mustek_usb_low.h mustek_usb_mid.c mustek_usb_mid.h \
+ mustek_usb2_asic.c mustek_usb2_asic.h mustek_usb2_high.c \
+ mustek_usb2_high.h mustek_usb2_reflective.c \
mustek_usb2_transparent.c nec.conf.in net.conf.in niash_core.c \
- niash_core.h niash_xfer.c niash_xfer.h pie.conf.in p5.conf.in \
- p5_device.c pixma.conf.in pixma_sane_options.c \
- pixma_sane_options.h plustek.conf.in plustek-usb.c \
- plustek-usb.h plustek-usbcal.c plustek-usbcalfile.c \
- plustek-usbdevs.c plustek-usbhw.c plustek-usbimg.c \
- plustek-usbio.c plustek-usbmap.c plustek-usbscan.c \
- plustek-usbshading.c plustek_pp.conf.in plustek-pp_dac.c \
- plustek-pp_dbg.h plustek-pp_detect.c plustek-pp_genericio.c \
- plustek-pp_hwdefs.h plustek-pp_image.c plustek-pp_io.c \
- plustek-pp_map.c plustek-pp_misc.c plustek-pp_models.c \
- plustek-pp_motor.c plustek-pp_p12.c plustek-pp_p12ccd.c \
- plustek-pp_p48xx.c plustek-pp_p9636.c plustek-pp_procfs.c \
- plustek-pp_procs.h plustek-pp_ptdrv.c plustek-pp_scale.c \
- plustek-pp_scan.h plustek-pp_scandata.h plustek-pp_sysdep.h \
- plustek-pp_tpa.c plustek-pp_types.h plustek-pp_wrapper.c \
- qcam.conf.in ricoh.conf.in ricoh-scsi.c rts8891.conf.in \
- rts8891_devices.c rts8891_low.c rts8891_low.h s9036.conf.in \
- sceptre.conf.in sharp.conf.in sm3600-color.c sm3600-gray.c \
- sm3600-homerun.c sm3600-scanmtek.c sm3600-scantool.h \
- sm3600-scanusb.c sm3600-scanutil.c sm3840.conf.in sm3840_lib.c \
- sm3840_lib.h sm3840_scan.c snapscan.conf.in snapscan-data.c \
- snapscan-mutex.c snapscan-options.c snapscan-scsi.c \
- snapscan-sources.c snapscan-sources.h snapscan-usb.c \
- snapscan-usb.h sp15c.conf.in st400.conf.in stv680.conf.in \
- tamarack.conf.in test.conf.in test-picture.c teco1.conf.in \
- teco2.conf.in teco3.conf.in u12.conf.in u12-ccd.c u12-hw.c \
- u12-hwdef.h u12-if.c u12-image.c u12-io.c u12-map.c \
- u12-motor.c u12-scanner.h u12-shading.c u12-tpa.c umax.conf.in \
- umax-scanner.c umax-scanner.h umax-scsidef.h umax-uc1200s.c \
- umax-uc1200se.c umax-uc1260.c umax-uc630.c umax-uc840.c \
- umax-ug630.c umax-ug80.c umax-usb.c umax1220u.conf.in \
- umax1220u-common.c umax_pp.conf.in v4l.conf.in \
- xerox_mfp.conf.in dll.conf.in dll.aliases
+ niash_core.h niash_xfer.c niash_xfer.h pie.conf.in \
+ pieusb.conf.in p5.conf.in p5_device.c pixma.conf.in \
+ pixma_sane_options.c pixma_sane_options.h plustek.conf.in \
+ plustek-usb.c plustek-usb.h plustek-usbcal.c \
+ plustek-usbcalfile.c plustek-usbdevs.c plustek-usbhw.c \
+ plustek-usbimg.c plustek-usbio.c plustek-usbmap.c \
+ plustek-usbscan.c plustek-usbshading.c plustek_pp.conf.in \
+ plustek-pp_dac.c plustek-pp_dbg.h plustek-pp_detect.c \
+ plustek-pp_genericio.c plustek-pp_hwdefs.h plustek-pp_image.c \
+ plustek-pp_io.c plustek-pp_map.c plustek-pp_misc.c \
+ plustek-pp_models.c plustek-pp_motor.c plustek-pp_p12.c \
+ plustek-pp_p12ccd.c plustek-pp_p48xx.c plustek-pp_p9636.c \
+ plustek-pp_procfs.c plustek-pp_procs.h plustek-pp_ptdrv.c \
+ plustek-pp_scale.c plustek-pp_scan.h plustek-pp_scandata.h \
+ plustek-pp_sysdep.h plustek-pp_tpa.c plustek-pp_types.h \
+ plustek-pp_wrapper.c qcam.conf.in ricoh.conf.in ricoh-scsi.c \
+ rts8891.conf.in rts8891_devices.c rts8891_low.c rts8891_low.h \
+ s9036.conf.in sceptre.conf.in sharp.conf.in sm3600-color.c \
+ sm3600-gray.c sm3600-homerun.c sm3600-scanmtek.c \
+ sm3600-scantool.h sm3600-scanusb.c sm3600-scanutil.c \
+ sm3840.conf.in sm3840_lib.c sm3840_lib.h sm3840_scan.c \
+ snapscan.conf.in snapscan-data.c snapscan-mutex.c \
+ snapscan-options.c snapscan-scsi.c snapscan-sources.c \
+ snapscan-sources.h snapscan-usb.c snapscan-usb.h sp15c.conf.in \
+ st400.conf.in stv680.conf.in tamarack.conf.in test.conf.in \
+ test-picture.c teco1.conf.in teco2.conf.in teco3.conf.in \
+ u12.conf.in u12-ccd.c u12-hw.c u12-hwdef.h u12-if.c \
+ u12-image.c u12-io.c u12-map.c u12-motor.c u12-scanner.h \
+ u12-shading.c u12-tpa.c umax.conf.in umax-scanner.c \
+ umax-scanner.h umax-scsidef.h umax-uc1200s.c umax-uc1200se.c \
+ umax-uc1260.c umax-uc630.c umax-uc840.c umax-ug630.c \
+ umax-ug80.c umax-usb.c umax1220u.conf.in umax1220u-common.c \
+ umax_pp.conf.in v4l.conf.in xerox_mfp.conf.in dll.conf.in \
+ dll.aliases
# Backends are not required to have a config file. Any backend
# that wants to install a config file should list it here.
@@ -1984,14 +2032,14 @@ BACKEND_CONFS = abaton.conf agfafocus.conf apple.conf artec.conf \
canon_pp.conf cardscan.conf coolscan2.conf coolscan3.conf \
coolscan.conf dc210.conf dc240.conf dc25.conf \
dell1600n_net.conf dmc.conf epjitsu.conf epson2.conf \
- epson.conf fujitsu.conf genesys.conf gphoto2.conf \
+ epson.conf epsonds.conf fujitsu.conf genesys.conf gphoto2.conf \
gt68xx.conf hp3900.conf hp4200.conf hp5400.conf \
hp.conf hpsj5s.conf hs2p.conf ibm.conf kodak.conf kodakaio.conf\
leo.conf lexmark.conf ma1509.conf magicolor.conf \
matsushita.conf microtek2.conf microtek.conf mustek.conf \
mustek_pp.conf mustek_usb.conf nec.conf net.conf \
p5.conf \
- pie.conf pixma.conf plustek.conf plustek_pp.conf \
+ pie.conf pieusb.conf pixma.conf plustek.conf plustek_pp.conf \
qcam.conf ricoh.conf rts8891.conf s9036.conf sceptre.conf \
sharp.conf sm3840.conf snapscan.conf sp15c.conf \
st400.conf stv680.conf tamarack.conf \
@@ -2020,7 +2068,7 @@ be_convenience_libs = libabaton.la libagfafocus.la \
libcoolscan2.la libcoolscan3.la libdc25.la \
libdc210.la libdc240.la libdell1600n_net.la \
libdmc.la libdll.la libdll_preload.la libepjitsu.la libepson.la \
- libepson2.la libfujitsu.la libgenesys.la \
+ libepson2.la libepsonds.la libfujitsu.la libgenesys.la \
libgphoto2_i.la libgt68xx.la libhp.la \
libhp3500.la libhp3900.la libhp4200.la \
libhp5400.la libhp5590.la libhpljm1005.la \
@@ -2031,7 +2079,7 @@ be_convenience_libs = libabaton.la libagfafocus.la \
libmustek.la libmustek_pp.la libmustek_usb.la \
libmustek_usb2.la libnec.la libnet.la \
libniash.la libp5.la \
- libpie.la libpint.la libpixma.la \
+ libpie.la libpieusb.la libpint.la libpixma.la \
libplustek.la libplustek_pp.la libpnm.la \
libqcam.la libricoh.la librts8891.la \
libs9036.la libsceptre.la libsharp.la \
@@ -2054,7 +2102,7 @@ be_dlopen_libs = libsane-abaton.la libsane-agfafocus.la \
libsane-coolscan2.la libsane-coolscan3.la libsane-dc25.la \
libsane-dc210.la libsane-dc240.la libsane-dell1600n_net.la \
libsane-dmc.la libsane-epjitsu.la libsane-epson.la \
- libsane-epson2.la libsane-fujitsu.la libsane-genesys.la \
+ libsane-epson2.la libsane-epsonds.la libsane-fujitsu.la libsane-genesys.la \
libsane-gphoto2.la libsane-gt68xx.la libsane-hp.la \
libsane-hp3500.la libsane-hp3900.la libsane-hp4200.la \
libsane-hp5400.la libsane-hp5590.la libsane-hpljm1005.la \
@@ -2066,7 +2114,7 @@ be_dlopen_libs = libsane-abaton.la libsane-agfafocus.la \
libsane-mustek.la libsane-mustek_pp.la libsane-mustek_usb.la \
libsane-mustek_usb2.la libsane-nec.la libsane-net.la \
libsane-niash.la libsane-p5.la \
- libsane-pie.la libsane-pint.la libsane-pixma.la \
+ libsane-pie.la libsane-pieusb.la libsane-pint.la libsane-pixma.la \
libsane-plustek.la libsane-plustek_pp.la libsane-pnm.la \
libsane-qcam.la libsane-ricoh.la libsane-rts8891.la \
libsane-s9036.la libsane-sceptre.la libsane-sharp.la \
@@ -2238,12 +2286,24 @@ nodist_libsane_epson_la_SOURCES = epson-s.c
libsane_epson_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epson
libsane_epson_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_epson_la_LIBADD = $(COMMON_LIBS) libepson.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_pio.lo $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS)
-libepson2_la_SOURCES = epson2.c epson2.h epson2_scsi.c epson2_scsi.h epson_usb.c epson2_net.c epson2_net.h epson2-io.c epson2-io.h epson2-commands.c epson2-commands.h epson2-ops.c epson2-ops.h epson2-cct.c
+libepson2_la_SOURCES = epson2.c epson2.h epson2_scsi.c epson2_scsi.h epson2_usb.c epson2_net.c epson2_net.h epson2-io.c epson2-io.h epson2-commands.c epson2-commands.h epson2-ops.c epson2-ops.h epson2-cct.c
libepson2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epson2
nodist_libsane_epson2_la_SOURCES = epson2-s.c
libsane_epson2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epson2
libsane_epson2_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_epson2_la_LIBADD = $(COMMON_LIBS) libepson2.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_pio.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo $(SCSI_LIBS) $(USB_LIBS) $(SOCKET_LIBS) $(MATH_LIB) $(RESMGR_LIBS)
+libepsonds_la_SOURCES = epsonds.c epsonds.h epsonds-usb.c epsonds-usb.h epsonds-io.c epsonds-io.h \
+ epsonds-cmd.c epsonds-cmd.h epsonds-ops.c epsonds-ops.h epsonds-jpeg.c epsonds-jpeg.h
+
+libepsonds_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epsonds
+nodist_libsane_epsonds_la_SOURCES = epsonds-s.c
+libsane_epsonds_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epsonds
+libsane_epsonds_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
+libsane_epsonds_la_LIBADD = $(COMMON_LIBS) libepsonds.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \
+ ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo \
+ ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo \
+ @SANEI_SANEI_JPEG_LO@ $(JPEG_LIBS) $(USB_LIBS) $(MATH_LIB) $(RESMGR_LIBS)
+
libfujitsu_la_SOURCES = fujitsu.c fujitsu.h fujitsu-scsi.h
libfujitsu_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=fujitsu
nodist_libsane_fujitsu_la_SOURCES = fujitsu-s.c
@@ -2383,11 +2443,11 @@ libsane_ma1509_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=ma1509
libsane_ma1509_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_ma1509_la_LIBADD = $(COMMON_LIBS) libma1509.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(USB_LIBS) $(RESMGR_LIBS)
libmagicolor_la_SOURCES = magicolor.c magicolor.h
-libmagicolor_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=magicolor
+libmagicolor_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=magicolor $(SNMP_CFLAGS)
nodist_libsane_magicolor_la_SOURCES = magicolor-s.c
libsane_magicolor_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=magicolor
libsane_magicolor_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
-libsane_magicolor_la_LIBADD = $(COMMON_LIBS) libmagicolor.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo $(USB_LIBS) $(SOCKET_LIBS) $(MATH_LIB) $(RESMGR_LIBS)
+libsane_magicolor_la_LIBADD = $(COMMON_LIBS) libmagicolor.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo $(USB_LIBS) $(SOCKET_LIBS) $(MATH_LIB) $(RESMGR_LIBS) $(SNMP_LIBS)
libmatsushita_la_SOURCES = matsushita.c matsushita.h
libmatsushita_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=matsushita
nodist_libsane_matsushita_la_SOURCES = matsushita-s.c
@@ -2454,6 +2514,12 @@ nodist_libsane_pie_la_SOURCES = pie-s.c
libsane_pie_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pie
libsane_pie_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
libsane_pie_la_LIBADD = $(COMMON_LIBS) libpie.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_scsi.lo ../sanei/sanei_thread.lo $(SCSI_LIBS) $(PTHREAD_LIBS) $(RESMGR_LIBS)
+libpieusb_la_SOURCES = pieusb.h pieusb_buffer.c pieusb_buffer.h pieusb_scancmd.c pieusb_scancmd.h pieusb_specific.c pieusb_specific.h pieusb_usb.c pieusb_usb.h pieusb.c
+libpieusb_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pieusb
+nodist_libsane_pieusb_la_SOURCES = pieusb-s.c
+libsane_pieusb_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pieusb
+libsane_pieusb_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS)
+libsane_pieusb_la_LIBADD = $(COMMON_LIBS) libpieusb.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_scsi.lo ../sanei/sanei_thread.lo ../sanei/sanei_usb.lo ../sanei/sanei_ir.lo ../sanei/sanei_magic.lo $(PTHREAD_LIBS) $(RESMGR_LIBS) $(USB_LIBS) $(MATH_LIB)
libp5_la_SOURCES = p5.c p5.h p5_device.h
libp5_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=p5
nodist_libsane_p5_la_SOURCES = p5-s.c
@@ -2848,6 +2914,9 @@ libepson.la: $(libepson_la_OBJECTS) $(libepson_la_DEPENDENCIES) $(EXTRA_libepson
libepson2.la: $(libepson2_la_OBJECTS) $(libepson2_la_DEPENDENCIES) $(EXTRA_libepson2_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libepson2_la_OBJECTS) $(libepson2_la_LIBADD) $(LIBS)
+libepsonds.la: $(libepsonds_la_OBJECTS) $(libepsonds_la_DEPENDENCIES) $(EXTRA_libepsonds_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(LINK) $(libepsonds_la_OBJECTS) $(libepsonds_la_LIBADD) $(LIBS)
+
libfujitsu.la: $(libfujitsu_la_OBJECTS) $(libfujitsu_la_DEPENDENCIES) $(EXTRA_libfujitsu_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libfujitsu_la_OBJECTS) $(libfujitsu_la_LIBADD) $(LIBS)
@@ -2953,6 +3022,9 @@ libp5.la: $(libp5_la_OBJECTS) $(libp5_la_DEPENDENCIES) $(EXTRA_libp5_la_DEPENDEN
libpie.la: $(libpie_la_OBJECTS) $(libpie_la_DEPENDENCIES) $(EXTRA_libpie_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libpie_la_OBJECTS) $(libpie_la_LIBADD) $(LIBS)
+libpieusb.la: $(libpieusb_la_OBJECTS) $(libpieusb_la_DEPENDENCIES) $(EXTRA_libpieusb_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(LINK) $(libpieusb_la_OBJECTS) $(libpieusb_la_LIBADD) $(LIBS)
+
libpint.la: $(libpint_la_OBJECTS) $(libpint_la_DEPENDENCIES) $(EXTRA_libpint_la_DEPENDENCIES)
$(AM_V_CCLD)$(LINK) $(libpint_la_OBJECTS) $(libpint_la_LIBADD) $(LIBS)
@@ -3055,6 +3127,9 @@ libsane-epson.la: $(libsane_epson_la_OBJECTS) $(libsane_epson_la_DEPENDENCIES) $
libsane-epson2.la: $(libsane_epson2_la_OBJECTS) $(libsane_epson2_la_DEPENDENCIES) $(EXTRA_libsane_epson2_la_DEPENDENCIES)
$(AM_V_CCLD)$(libsane_epson2_la_LINK) $(libsane_epson2_la_OBJECTS) $(libsane_epson2_la_LIBADD) $(LIBS)
+libsane-epsonds.la: $(libsane_epsonds_la_OBJECTS) $(libsane_epsonds_la_DEPENDENCIES) $(EXTRA_libsane_epsonds_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libsane_epsonds_la_LINK) $(libsane_epsonds_la_OBJECTS) $(libsane_epsonds_la_LIBADD) $(LIBS)
+
libsane-fujitsu.la: $(libsane_fujitsu_la_OBJECTS) $(libsane_fujitsu_la_DEPENDENCIES) $(EXTRA_libsane_fujitsu_la_DEPENDENCIES)
$(AM_V_CCLD)$(libsane_fujitsu_la_LINK) $(libsane_fujitsu_la_OBJECTS) $(libsane_fujitsu_la_LIBADD) $(LIBS)
@@ -3160,6 +3235,9 @@ libsane-p5.la: $(libsane_p5_la_OBJECTS) $(libsane_p5_la_DEPENDENCIES) $(EXTRA_li
libsane-pie.la: $(libsane_pie_la_OBJECTS) $(libsane_pie_la_DEPENDENCIES) $(EXTRA_libsane_pie_la_DEPENDENCIES)
$(AM_V_CCLD)$(libsane_pie_la_LINK) $(libsane_pie_la_OBJECTS) $(libsane_pie_la_LIBADD) $(LIBS)
+libsane-pieusb.la: $(libsane_pieusb_la_OBJECTS) $(libsane_pieusb_la_DEPENDENCIES) $(EXTRA_libsane_pieusb_la_DEPENDENCIES)
+ $(AM_V_CCLD)$(libsane_pieusb_la_LINK) $(libsane_pieusb_la_OBJECTS) $(libsane_pieusb_la_LIBADD) $(LIBS)
+
libsane-pint.la: $(libsane_pint_la_OBJECTS) $(libsane_pint_la_DEPENDENCIES) $(EXTRA_libsane_pint_la_DEPENDENCIES)
$(AM_V_CCLD)$(libsane_pint_la_LINK) $(libsane_pint_la_OBJECTS) $(libsane_pint_la_LIBADD) $(LIBS)
@@ -3343,10 +3421,16 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepson2_la-epson2.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepson2_la-epson2_net.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepson2_la-epson2_scsi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepson2_la-epson_usb.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepson2_la-epson2_usb.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepson_la-epson.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepson_la-epson_scsi.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepson_la-epson_usb.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepsonds_la-epsonds-cmd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepsonds_la-epsonds-io.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepsonds_la-epsonds-jpeg.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepsonds_la-epsonds-ops.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepsonds_la-epsonds-usb.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libepsonds_la-epsonds.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libfujitsu_la-fujitsu.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgenesys_la-genesys.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgenesys_la-genesys_gl124.Plo@am__quote@
@@ -3403,6 +3487,11 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libniash_la-niash.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libp5_la-p5.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpie_la-pie.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpieusb_la-pieusb.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpieusb_la-pieusb_buffer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpieusb_la-pieusb_scancmd.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpieusb_la-pieusb_specific.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpieusb_la-pieusb_usb.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpint_la-pint.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpixma_la-pixma.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpixma_la-pixma_bjnp.Plo@am__quote@
@@ -3446,6 +3535,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_epjitsu_la-epjitsu-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_epson2_la-epson2-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_epson_la-epson-s.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_epsonds_la-epsonds-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_fujitsu_la-fujitsu-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_genesys_la-genesys-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_gphoto2_la-gphoto2-s.Plo@am__quote@
@@ -3482,6 +3572,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_niash_la-niash-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_p5_la-p5-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_pie_la-pie-s.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_pieusb_la-pieusb-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_pint_la-pint-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_pixma_la-pixma-s.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libsane_plustek_la-plustek-s.Plo@am__quote@
@@ -3539,14 +3630,14 @@ distclean-compile:
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
@@ -3772,12 +3863,12 @@ libepson2_la-epson2_scsi.lo: epson2_scsi.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepson2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libepson2_la-epson2_scsi.lo `test -f 'epson2_scsi.c' || echo '$(srcdir)/'`epson2_scsi.c
-libepson2_la-epson_usb.lo: epson_usb.c
-@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepson2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libepson2_la-epson_usb.lo -MD -MP -MF $(DEPDIR)/libepson2_la-epson_usb.Tpo -c -o libepson2_la-epson_usb.lo `test -f 'epson_usb.c' || echo '$(srcdir)/'`epson_usb.c
-@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libepson2_la-epson_usb.Tpo $(DEPDIR)/libepson2_la-epson_usb.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='epson_usb.c' object='libepson2_la-epson_usb.lo' libtool=yes @AMDEPBACKSLASH@
+libepson2_la-epson2_usb.lo: epson2_usb.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepson2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libepson2_la-epson2_usb.lo -MD -MP -MF $(DEPDIR)/libepson2_la-epson2_usb.Tpo -c -o libepson2_la-epson2_usb.lo `test -f 'epson2_usb.c' || echo '$(srcdir)/'`epson2_usb.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libepson2_la-epson2_usb.Tpo $(DEPDIR)/libepson2_la-epson2_usb.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='epson2_usb.c' object='libepson2_la-epson2_usb.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepson2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libepson2_la-epson_usb.lo `test -f 'epson_usb.c' || echo '$(srcdir)/'`epson_usb.c
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepson2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libepson2_la-epson2_usb.lo `test -f 'epson2_usb.c' || echo '$(srcdir)/'`epson2_usb.c
libepson2_la-epson2_net.lo: epson2_net.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepson2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libepson2_la-epson2_net.lo -MD -MP -MF $(DEPDIR)/libepson2_la-epson2_net.Tpo -c -o libepson2_la-epson2_net.lo `test -f 'epson2_net.c' || echo '$(srcdir)/'`epson2_net.c
@@ -3814,6 +3905,48 @@ libepson2_la-epson2-cct.lo: epson2-cct.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepson2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libepson2_la-epson2-cct.lo `test -f 'epson2-cct.c' || echo '$(srcdir)/'`epson2-cct.c
+libepsonds_la-epsonds.lo: epsonds.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libepsonds_la-epsonds.lo -MD -MP -MF $(DEPDIR)/libepsonds_la-epsonds.Tpo -c -o libepsonds_la-epsonds.lo `test -f 'epsonds.c' || echo '$(srcdir)/'`epsonds.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libepsonds_la-epsonds.Tpo $(DEPDIR)/libepsonds_la-epsonds.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='epsonds.c' object='libepsonds_la-epsonds.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libepsonds_la-epsonds.lo `test -f 'epsonds.c' || echo '$(srcdir)/'`epsonds.c
+
+libepsonds_la-epsonds-usb.lo: epsonds-usb.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libepsonds_la-epsonds-usb.lo -MD -MP -MF $(DEPDIR)/libepsonds_la-epsonds-usb.Tpo -c -o libepsonds_la-epsonds-usb.lo `test -f 'epsonds-usb.c' || echo '$(srcdir)/'`epsonds-usb.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libepsonds_la-epsonds-usb.Tpo $(DEPDIR)/libepsonds_la-epsonds-usb.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='epsonds-usb.c' object='libepsonds_la-epsonds-usb.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libepsonds_la-epsonds-usb.lo `test -f 'epsonds-usb.c' || echo '$(srcdir)/'`epsonds-usb.c
+
+libepsonds_la-epsonds-io.lo: epsonds-io.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libepsonds_la-epsonds-io.lo -MD -MP -MF $(DEPDIR)/libepsonds_la-epsonds-io.Tpo -c -o libepsonds_la-epsonds-io.lo `test -f 'epsonds-io.c' || echo '$(srcdir)/'`epsonds-io.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libepsonds_la-epsonds-io.Tpo $(DEPDIR)/libepsonds_la-epsonds-io.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='epsonds-io.c' object='libepsonds_la-epsonds-io.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libepsonds_la-epsonds-io.lo `test -f 'epsonds-io.c' || echo '$(srcdir)/'`epsonds-io.c
+
+libepsonds_la-epsonds-cmd.lo: epsonds-cmd.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libepsonds_la-epsonds-cmd.lo -MD -MP -MF $(DEPDIR)/libepsonds_la-epsonds-cmd.Tpo -c -o libepsonds_la-epsonds-cmd.lo `test -f 'epsonds-cmd.c' || echo '$(srcdir)/'`epsonds-cmd.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libepsonds_la-epsonds-cmd.Tpo $(DEPDIR)/libepsonds_la-epsonds-cmd.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='epsonds-cmd.c' object='libepsonds_la-epsonds-cmd.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libepsonds_la-epsonds-cmd.lo `test -f 'epsonds-cmd.c' || echo '$(srcdir)/'`epsonds-cmd.c
+
+libepsonds_la-epsonds-ops.lo: epsonds-ops.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libepsonds_la-epsonds-ops.lo -MD -MP -MF $(DEPDIR)/libepsonds_la-epsonds-ops.Tpo -c -o libepsonds_la-epsonds-ops.lo `test -f 'epsonds-ops.c' || echo '$(srcdir)/'`epsonds-ops.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libepsonds_la-epsonds-ops.Tpo $(DEPDIR)/libepsonds_la-epsonds-ops.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='epsonds-ops.c' object='libepsonds_la-epsonds-ops.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libepsonds_la-epsonds-ops.lo `test -f 'epsonds-ops.c' || echo '$(srcdir)/'`epsonds-ops.c
+
+libepsonds_la-epsonds-jpeg.lo: epsonds-jpeg.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libepsonds_la-epsonds-jpeg.lo -MD -MP -MF $(DEPDIR)/libepsonds_la-epsonds-jpeg.Tpo -c -o libepsonds_la-epsonds-jpeg.lo `test -f 'epsonds-jpeg.c' || echo '$(srcdir)/'`epsonds-jpeg.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libepsonds_la-epsonds-jpeg.Tpo $(DEPDIR)/libepsonds_la-epsonds-jpeg.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='epsonds-jpeg.c' object='libepsonds_la-epsonds-jpeg.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libepsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libepsonds_la-epsonds-jpeg.lo `test -f 'epsonds-jpeg.c' || echo '$(srcdir)/'`epsonds-jpeg.c
+
libfujitsu_la-fujitsu.lo: fujitsu.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libfujitsu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libfujitsu_la-fujitsu.lo -MD -MP -MF $(DEPDIR)/libfujitsu_la-fujitsu.Tpo -c -o libfujitsu_la-fujitsu.lo `test -f 'fujitsu.c' || echo '$(srcdir)/'`fujitsu.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libfujitsu_la-fujitsu.Tpo $(DEPDIR)/libfujitsu_la-fujitsu.Plo
@@ -4206,6 +4339,41 @@ libpie_la-pie.lo: pie.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpie_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libpie_la-pie.lo `test -f 'pie.c' || echo '$(srcdir)/'`pie.c
+libpieusb_la-pieusb_buffer.lo: pieusb_buffer.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libpieusb_la-pieusb_buffer.lo -MD -MP -MF $(DEPDIR)/libpieusb_la-pieusb_buffer.Tpo -c -o libpieusb_la-pieusb_buffer.lo `test -f 'pieusb_buffer.c' || echo '$(srcdir)/'`pieusb_buffer.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpieusb_la-pieusb_buffer.Tpo $(DEPDIR)/libpieusb_la-pieusb_buffer.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pieusb_buffer.c' object='libpieusb_la-pieusb_buffer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libpieusb_la-pieusb_buffer.lo `test -f 'pieusb_buffer.c' || echo '$(srcdir)/'`pieusb_buffer.c
+
+libpieusb_la-pieusb_scancmd.lo: pieusb_scancmd.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libpieusb_la-pieusb_scancmd.lo -MD -MP -MF $(DEPDIR)/libpieusb_la-pieusb_scancmd.Tpo -c -o libpieusb_la-pieusb_scancmd.lo `test -f 'pieusb_scancmd.c' || echo '$(srcdir)/'`pieusb_scancmd.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpieusb_la-pieusb_scancmd.Tpo $(DEPDIR)/libpieusb_la-pieusb_scancmd.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pieusb_scancmd.c' object='libpieusb_la-pieusb_scancmd.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libpieusb_la-pieusb_scancmd.lo `test -f 'pieusb_scancmd.c' || echo '$(srcdir)/'`pieusb_scancmd.c
+
+libpieusb_la-pieusb_specific.lo: pieusb_specific.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libpieusb_la-pieusb_specific.lo -MD -MP -MF $(DEPDIR)/libpieusb_la-pieusb_specific.Tpo -c -o libpieusb_la-pieusb_specific.lo `test -f 'pieusb_specific.c' || echo '$(srcdir)/'`pieusb_specific.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpieusb_la-pieusb_specific.Tpo $(DEPDIR)/libpieusb_la-pieusb_specific.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pieusb_specific.c' object='libpieusb_la-pieusb_specific.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libpieusb_la-pieusb_specific.lo `test -f 'pieusb_specific.c' || echo '$(srcdir)/'`pieusb_specific.c
+
+libpieusb_la-pieusb_usb.lo: pieusb_usb.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libpieusb_la-pieusb_usb.lo -MD -MP -MF $(DEPDIR)/libpieusb_la-pieusb_usb.Tpo -c -o libpieusb_la-pieusb_usb.lo `test -f 'pieusb_usb.c' || echo '$(srcdir)/'`pieusb_usb.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpieusb_la-pieusb_usb.Tpo $(DEPDIR)/libpieusb_la-pieusb_usb.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pieusb_usb.c' object='libpieusb_la-pieusb_usb.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libpieusb_la-pieusb_usb.lo `test -f 'pieusb_usb.c' || echo '$(srcdir)/'`pieusb_usb.c
+
+libpieusb_la-pieusb.lo: pieusb.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libpieusb_la-pieusb.lo -MD -MP -MF $(DEPDIR)/libpieusb_la-pieusb.Tpo -c -o libpieusb_la-pieusb.lo `test -f 'pieusb.c' || echo '$(srcdir)/'`pieusb.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpieusb_la-pieusb.Tpo $(DEPDIR)/libpieusb_la-pieusb.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pieusb.c' object='libpieusb_la-pieusb.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libpieusb_la-pieusb.lo `test -f 'pieusb.c' || echo '$(srcdir)/'`pieusb.c
+
libpint_la-pint.lo: pint.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libpint_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libpint_la-pint.lo -MD -MP -MF $(DEPDIR)/libpint_la-pint.Tpo -c -o libpint_la-pint.lo `test -f 'pint.c' || echo '$(srcdir)/'`pint.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpint_la-pint.Tpo $(DEPDIR)/libpint_la-pint.Plo
@@ -4507,6 +4675,13 @@ libsane_epson2_la-epson2-s.lo: epson2-s.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_epson2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsane_epson2_la-epson2-s.lo `test -f 'epson2-s.c' || echo '$(srcdir)/'`epson2-s.c
+libsane_epsonds_la-epsonds-s.lo: epsonds-s.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_epsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsane_epsonds_la-epsonds-s.lo -MD -MP -MF $(DEPDIR)/libsane_epsonds_la-epsonds-s.Tpo -c -o libsane_epsonds_la-epsonds-s.lo `test -f 'epsonds-s.c' || echo '$(srcdir)/'`epsonds-s.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsane_epsonds_la-epsonds-s.Tpo $(DEPDIR)/libsane_epsonds_la-epsonds-s.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='epsonds-s.c' object='libsane_epsonds_la-epsonds-s.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_epsonds_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsane_epsonds_la-epsonds-s.lo `test -f 'epsonds-s.c' || echo '$(srcdir)/'`epsonds-s.c
+
libsane_fujitsu_la-fujitsu-s.lo: fujitsu-s.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_fujitsu_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsane_fujitsu_la-fujitsu-s.lo -MD -MP -MF $(DEPDIR)/libsane_fujitsu_la-fujitsu-s.Tpo -c -o libsane_fujitsu_la-fujitsu-s.lo `test -f 'fujitsu-s.c' || echo '$(srcdir)/'`fujitsu-s.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsane_fujitsu_la-fujitsu-s.Tpo $(DEPDIR)/libsane_fujitsu_la-fujitsu-s.Plo
@@ -4752,6 +4927,13 @@ libsane_pie_la-pie-s.lo: pie-s.c
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_pie_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsane_pie_la-pie-s.lo `test -f 'pie-s.c' || echo '$(srcdir)/'`pie-s.c
+libsane_pieusb_la-pieusb-s.lo: pieusb-s.c
+@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_pieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsane_pieusb_la-pieusb-s.lo -MD -MP -MF $(DEPDIR)/libsane_pieusb_la-pieusb-s.Tpo -c -o libsane_pieusb_la-pieusb-s.lo `test -f 'pieusb-s.c' || echo '$(srcdir)/'`pieusb-s.c
+@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsane_pieusb_la-pieusb-s.Tpo $(DEPDIR)/libsane_pieusb_la-pieusb-s.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pieusb-s.c' object='libsane_pieusb_la-pieusb-s.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_pieusb_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o libsane_pieusb_la-pieusb-s.lo `test -f 'pieusb-s.c' || echo '$(srcdir)/'`pieusb-s.c
+
libsane_pint_la-pint-s.lo: pint-s.c
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsane_pint_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT libsane_pint_la-pint-s.lo -MD -MP -MF $(DEPDIR)/libsane_pint_la-pint-s.Tpo -c -o libsane_pint_la-pint-s.lo `test -f 'pint-s.c' || echo '$(srcdir)/'`pint-s.c
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libsane_pint_la-pint-s.Tpo $(DEPDIR)/libsane_pint_la-pint-s.Plo
diff --git a/backend/abaton.c b/backend/abaton.c
index 10f5c21..4008c62 100644
--- a/backend/abaton.c
+++ b/backend/abaton.c
@@ -82,6 +82,7 @@
+static const SANE_Device **devlist = 0;
static int num_devices;
static Abaton_Device *first_dev;
static Abaton_Scanner *first_handle;
@@ -905,12 +906,14 @@ sane_exit (void)
free ((void *) dev->sane.model);
free (dev);
}
+
+ if (devlist)
+ free (devlist);
}
SANE_Status
sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
{
- static const SANE_Device **devlist = 0;
Abaton_Device *dev;
int i;
@@ -1455,7 +1458,7 @@ sane_cancel (SANE_Handle handle)
if (s->AbortedByUser)
{
DBG (FLOW_CONTROL, "sane_cancel: Scan has not been initiated yet."
- "we probably recieved a signal while writing data.\n");
+ "we probably received a signal while writing data.\n");
s->AbortedByUser = SANE_FALSE;
}
else
diff --git a/backend/agfafocus.c b/backend/agfafocus.c
index bc21558..45d103f 100644
--- a/backend/agfafocus.c
+++ b/backend/agfafocus.c
@@ -51,6 +51,7 @@
#undef Byte
#define Byte SANE_Byte
+static const SANE_Device **devlist = 0;
static int num_devices;
static AgfaFocus_Device *agfafocus_devices;
@@ -1323,12 +1324,14 @@ sane_exit (void)
sane_close (dev->handle);
free (dev);
}
+
+ if (devlist)
+ free (devlist);
}
SANE_Status
sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
{
- static const SANE_Device **devlist = 0;
AgfaFocus_Device *dev;
int i;
diff --git a/backend/apple.c b/backend/apple.c
index c806983..a8e9979 100644
--- a/backend/apple.c
+++ b/backend/apple.c
@@ -136,6 +136,7 @@
#include "apple.h"
+static const SANE_Device **devlist = 0;
static int num_devices;
static Apple_Device *first_dev;
static Apple_Scanner *first_handle;
@@ -1596,7 +1597,7 @@ init_options (Apple_Scanner * s)
s->opt[OPT_WAIT].title = "Wait";
s->opt[OPT_WAIT].desc = "You may issue the scan command but the actual "
"scan will not start unless you press the button in the front of the "
- "scanner. It is usefull feature when you want to make a network scan (?) "
+ "scanner. It is a useful feature when you want to make a network scan (?) "
"In the mean time you may halt your computer waiting for the SCSI bus "
"to be free. If this happens just press the scanner button.";
s->opt[OPT_WAIT].type = SANE_TYPE_BOOL;
@@ -1921,12 +1922,13 @@ sane_exit (void)
free ((void *) dev->sane.model);
free (dev);
}
+ if (devlist)
+ free (devlist);
}
SANE_Status
sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
{
- static const SANE_Device **devlist = 0;
Apple_Device *dev;
int i;
diff --git a/backend/artec.c b/backend/artec.c
index 212de34..46aa8b6 100644
--- a/backend/artec.c
+++ b/backend/artec.c
@@ -607,7 +607,7 @@ sense_handler (int fd, u_char * sense, void *arg)
return SANE_STATUS_IO_ERROR;
}
default:
- DBG (2, "sense: Unkown Error Code Qualifier (%02x)\n", sense[0]);
+ DBG (2, "sense: Unknown Error Code Qualifier (%02x)\n", sense[0]);
return SANE_STATUS_IO_ERROR;
}
@@ -1305,7 +1305,7 @@ artec_set_scan_window (SANE_Handle handle)
{
/* top left X value */
/* the select area is flipped across the page, so we have to do some */
- /* calculation here to get the the real starting X value */
+ /* calculation here to get the real starting X value */
max_x = (int) ((SANE_UNFIX (s->hw->x_range.max) / MM_PER_INCH) *
s->x_resolution);
reversed_x = max_x - s->tl_x - s->params.pixels_per_line;
diff --git a/backend/artec_eplus48u.c b/backend/artec_eplus48u.c
index c26fbb0..bc3b2f8 100644
--- a/backend/artec_eplus48u.c
+++ b/backend/artec_eplus48u.c
@@ -67,7 +67,7 @@ Updates (C) 2001 by Henning Meier-Geinitz.
whether to permit this exception to apply to your modifications.
If you do not wish that, delete this exception notice. */
-#define BUILD 11
+#define BUILD 12
#include "../include/sane/config.h"
@@ -3580,6 +3580,14 @@ load_calibration_data (Artec48U_Scanner * s)
s->calibrated = SANE_FALSE;
path[0] = 0;
+
+ /* return SANE_STATUS_INVAL if HOME environment variable is not set */
+ if (getenv ("HOME") == NULL)
+ {
+ XDBG ((1, "Environment variable HOME not set\n"));
+ return SANE_STATUS_INVAL;
+ }
+
if (strlen (getenv ("HOME")) < (PATH_MAX - 1))
strcat (path, getenv ("HOME"));
else
@@ -3690,6 +3698,14 @@ save_calibration_data (Artec48U_Scanner * s)
mode_t mode = S_IRUSR | S_IWUSR;
path[0] = 0;
+
+ /* return SANE_STATUS_INVAL if HOME environment variable is not set */
+ if (getenv ("HOME") == NULL)
+ {
+ XDBG ((1, "Environment variable HOME not set\n"));
+ return SANE_STATUS_INVAL;
+ }
+
if (strlen (getenv ("HOME")) < (PATH_MAX - 1))
strcat (path, getenv ("HOME"));
else
diff --git a/backend/avision.c b/backend/avision.c
index 31b0a58..146125c 100644
--- a/backend/avision.c
+++ b/backend/avision.c
@@ -39,25 +39,22 @@
*****************************************************************************
- This backend is based upon the Tamarack backend and adapted to the Avision
- scanners by René Rebe and Meino Cramer.
-
This file implements a SANE backend for the Avision SCSI Scanners (like the
AV 630 / 620 (CS) ...) and some Avision (OEM) USB scanners (like the HP 53xx,
74xx, Minolta FS-V1 ...) or Fujitsu ScanPartner with the AVISION SCSI-2/3
- or USB command set.
+ or USB command set and written by René Rebe and Meino Cramer.
+
+ Copyright 2002 - 2015 by
+ "Ren Rebe" <rene@exactcode.de>
+
Copyright 1999, 2000, 2001 by
"René Rebe" <rene@exactcode.de>
"Meino Christian Cramer" <mccramer@s.netic.de>
Copyright 2002 by
- "René Rebe" <rene@exactcode.de>
"Jose Paulo Moitinho de Almeida" <moitinho@civil.ist.utl.pt>
- Copyright 2003, 2004, 2005, 2006, 2007 by
- "René Rebe" <rene@exactcode.de>
-
Copyright 2010, 2011 by
"Mike Kelly" <mike@piratehaven.org>
@@ -137,7 +134,7 @@
#include <math.h>
#define BACKEND_NAME avision
-#define BACKEND_BUILD 296 /* avision backend BUILD version */
+#define BACKEND_BUILD 297 /* avision backend BUILD version */
#include "../include/sane/sane.h"
#include "../include/sane/sanei.h"
@@ -167,444 +164,451 @@ static Avision_HWEntry Avision_Device_List [] =
{ "AVISION", "AV100CS",
0, 0,
"Avision", "AV100CS",
- 0,0},
+ 0},
/* status="untested" */
{ "AVISION", "AV100IIICS",
0, 0,
"Avision", "AV100IIICS",
- 0,0},
+ 0},
/* status="untested" */
{ "AVISION", "AV100S",
0, 0,
"Avision", "AV100S",
- 0,0},
+ 0},
/* status="untested" */
{ NULL, NULL,
0x0638, 0x0A27,
"Avision", "AV120",
- AV_INT_STATUS,0},
+ AV_INT_STATUS},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A3C,
"Avision", "AV121",
- AV_INT_BUTTON | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA,0},
+ AV_INT_BUTTON | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA},
/* comment="sheetfed scanner" */
/* status="good" */
{ NULL, NULL,
0x0638, 0x0A33,
"Avision", "AV122",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET,0},
+ AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET},
/* comment="sheetfed duplex scanner" */
/* status="good" */
{ NULL, NULL,
0x0638, 0x0A93,
"Avision", "AV122 C2",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_NOT_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET,0},
+ AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_NOT_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET},
/* comment="sheetfed duplex scanner" */
/* status="good" */
{ NULL, NULL,
0x0638, 0x0A24,
"Avision", "AV210",
- AV_INT_BUTTON | AV_ACCEL_TABLE,0},
+ AV_INT_BUTTON | AV_ACCEL_TABLE},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A25,
"Avision", "AV210",
- AV_INT_BUTTON | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN,0},
+ AV_INT_BUTTON | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A3A,
"Avision", "AV210C2",
- AV_INT_BUTTON | AV_GRAY_MODES,0},
+ AV_INT_BUTTON | AV_GRAY_MODES},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A2F,
"Avision", "AV210C2-G",
- AV_INT_BUTTON | AV_GRAY_MODES,0},
+ AV_INT_BUTTON | AV_GRAY_MODES},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x1A35,
"Avision", "AV210D2+",
- AV_INT_BUTTON, AV_USE_GRAY_FILTER},
+ AV_INT_BUTTON | AV_USE_GRAY_FILTER},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A23,
"Avision", "AV220",
- AV_INT_BUTTON | AV_GRAY_MODES,0},
+ AV_INT_BUTTON | AV_GRAY_MODES},
/* comment="duplex! sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A2A,
"Avision", "AV220C2",
- AV_INT_BUTTON | AV_CANCEL_BUTTON,0},
+ AV_INT_BUTTON | AV_CANCEL_BUTTON},
/* comment="duplex! sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A2B,
"Avision", "AV220D2",
- AV_INT_BUTTON | AV_CANCEL_BUTTON,0},
+ AV_INT_BUTTON | AV_CANCEL_BUTTON},
+ /* comment="duplex! sheetfed scanner" */
+ /* status="complete" */
+
+ { NULL, NULL,
+ 0x0638, 0x1A31,
+ "Avision", "AV220D2+",
+ AV_INT_BUTTON | AV_CANCEL_BUTTON | AV_USE_GRAY_FILTER},
/* comment="duplex! sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A2C,
"Avision", "AV220+",
- AV_INT_BUTTON | AV_CANCEL_BUTTON,0},
+ AV_INT_BUTTON | AV_CANCEL_BUTTON},
/* comment="duplex! sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A2D,
"Avision", "AV220C2-G",
- AV_INT_BUTTON | AV_CANCEL_BUTTON,0},
+ AV_INT_BUTTON | AV_CANCEL_BUTTON},
/* comment="duplex! sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A2E,
"Avision", "AV220C2-B",
- AV_INT_BUTTON | AV_CANCEL_BUTTON,0},
+ AV_INT_BUTTON | AV_CANCEL_BUTTON},
/* comment="duplex! sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A94,
"Avision", "AV220-G",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED, AV_FIRMWARE},
+ AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_FIRMWARE},
/* comment="duplex! sheetfed scanner" */
/* status="complete" */
{ "AVISION", "AV240SC",
0, 0,
"Avision", "AV240SC",
- 0,0},
+ 0},
/* status="untested" */
{ "AVISION", "AV260CS",
0, 0,
"Avision", "AV260CS",
- 0,0},
+ 0},
/* status="untested" */
{ "AVISION", "AV360CS",
0, 0,
"Avision", "AV360CS",
- 0,0},
+ 0},
/* status="untested" */
{ "AVISION", "AV363CS",
0, 0,
"Avision", "AV363CS",
- 0,0},
+ 0},
/* status="untested" */
{ "AVISION", "AV420CS",
0, 0,
"Avision", "AV420CS",
- 0,0},
+ 0},
/* status="untested" */
{ "AVISION", "AV6120",
0, 0,
"Avision", "AV6120",
- 0,0},
+ 0},
/* status="untested" */
{ NULL, "AV610",
0x0638, 0x0a18,
"Avision", "AV610",
- AV_GRAY_CALIB_BLUE | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN | AV_INT_BUTTON, 0},
+ AV_GRAY_CALIB_BLUE | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN | AV_INT_BUTTON},
/* status="good" */
{ NULL, NULL,
0x0638, 0x0a18,
"Avision", "AV600U Plus",
/* If this unit requires the AV_INT_STATUS flag, then we'll need to alter the code to deal with two different devices with the same USB id (AV610 above) */
- AV_GRAY_CALIB_BLUE | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN | /* AV_INT_STATUS | */ AV_INT_BUTTON,0},
+ AV_GRAY_CALIB_BLUE | AV_ACCEL_TABLE | AV_NO_64BYTE_ALIGN | /* AV_INT_STATUS | */ AV_INT_BUTTON},
/* status="good" */
{ NULL, NULL,
0x0638, 0x0a5e,
"Avision", "AV610C2",
- AV_NO_BACKGROUND | AV_INT_BUTTON,0}, /* cancel button -> sense abort! */
+ AV_NO_BACKGROUND | AV_INT_BUTTON}, /* cancel button -> sense abort! */
/* status="good" */
{ NULL, NULL,
0x0638, 0x0a41,
"Avision", "AM3000 Series",
- 0,0},
+ 0},
/* comment="MFD" */
/* status="basic" */
{ NULL, NULL,
0x0638, 0x0a16,
"Avision", "DS610CU Scancopier",
- AV_INT_STATUS,0},
+ AV_INT_STATUS},
/* comment="1 pass, 600 dpi, A4" */
/* status="good" */
{ "AVISION", "AV620CS",
0, 0,
"Avision", "AV620CS",
- 0,0},
+ 0},
/* comment="1 pass, 600 dpi" */
/* status="complete" */
{ "AVISION", "AV620CS Plus",
0, 0,
"Avision", "AV620CS Plus",
- 0,0},
+ 0},
/* comment="1 pass, 1200 dpi" */
/* status="complete" */
{ "AVISION", "AV630CS",
0, 0,
"Avision", "AV630CS",
- 0,0},
+ 0},
/* comment="1 pass, 1200 dpi" */
/* status="complete" */
{ "AVISION", "AV630CSL",
0, 0,
"Avision", "AV630CSL",
- 0,0},
+ 0},
/* comment="1 pass, 1200 dpi" */
/* status="untested" */
{ "AVISION", "AV6240",
0, 0,
"Avision", "AV6240",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A13,
"Avision", "AV600U",
- AV_MULTI_CALIB_CMD | AV_ADF_BGR_ORDER_INVERT | AV_SOFT_SCALE | AV_INT_STATUS | AV_NO_BUTTON,0},
+ AV_MULTI_CALIB_CMD | AV_ADF_BGR_ORDER_INVERT | AV_SOFT_SCALE | AV_INT_STATUS | AV_NO_BUTTON},
/* comment="1 pass, 600 dpi" */
/* status="good" */
{ "AVISION", "AV660S",
0, 0,
"Avision", "AV660S",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="untested" */
{ "AVISION", "AV680S",
0, 0,
"Avision", "AV680S",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="untested" */
{ "AVISION", "AV690U",
0, 0,
"Avision", "AV690U",
- 0,0},
+ 0},
/* comment="1 pass, 2400 dpi" */
/* status="untested" */
{ "AVISION", "AV800S",
0, 0,
"Avision", "AV800S",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="untested" */
{ "AVISION", "AV810C",
0, 0,
"Avision", "AV810C",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="untested" */
{ "AVISION", "AV820",
0, 0,
"Avision", "AV820",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="untested" */
{ "AVISION", "AV820C",
0, 0,
"Avision", "AV820C",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="complete" */
{ "AVISION", "AV820C Plus",
0, 0,
"Avision", "AV820C Plus",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="complete" */
{ "AVISION", "AV830C",
0, 0,
"Avision", "AV830C",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="complete" */
{ "AVISION", "AV830C Plus",
0, 0,
"Avision", "AV830C Plus",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="untested" */
{ "AVISION", "AV880",
0, 0,
"Avision", "AV880",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="untested" */
{ "AVISION", "AV880C",
0, 0,
"Avision", "AV880C",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="untested" */
{ "AVISION", "AV3200C",
0, 0,
"Avision", "AV3200C",
- AV_NON_INTERLACED_DUPLEX_300 | AV_FASTER_WITH_FILTER,0},
+ AV_NON_INTERLACED_DUPLEX_300 | AV_FASTER_WITH_FILTER},
/* comment="1 pass, ??? dpi" */
/* status="complete" */
{ "AVISION", "AV3200SU",
0x0638, 0x0A4E,
"Avision", "AV3200SU",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="complete" */
{ "AVISION", "AV3730SU",
0x0638, 0x0A4F,
"Avision", "AV3730SU",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="complete" */
{ "AVISION", "AV3750SU",
0x0638, 0x0A65,
"Avision", "AV3750SU",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="complete" */
{ "AVISION", "AV3800C",
0, 0,
"Avision", "AV3800C",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="complete" */
{ "AVISION", "AV3850SU",
0x0638, 0x0a66,
"Avision", "AV3850SU",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi" */
/* status="complete" */
{ "AVISION", "FB6000E",
0, 0,
"Avision", "FB6000E",
- AV_NON_INTERLACED_DUPLEX_300,0},
+ AV_NON_INTERLACED_DUPLEX_300},
/* comment="1 pass, 1200 dpi, A3 - duplex! - zero edge!" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0a82,
"Avision", "FB6080E",
- AV_NON_INTERLACED_DUPLEX_300,0},
+ AV_NON_INTERLACED_DUPLEX_300},
/* comment="1 pass, 1200 dpi, A3 - duplex! - zero edge!" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0a84,
"Avision", "FB2080E",
- 0,0},
+ 0},
/* comment="1 pass, 600 dpi, zero-edge" ASIC 7 */
/* status="basic" */
{ "AVISION", "AV8000S",
0, 0,
"Avision", "AV8000S",
- AV_DOES_NOT_KEEP_WINDOW,0},
+ AV_DOES_NOT_KEEP_WINDOW},
/* comment="1 pass, 1200 dpi, A3" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0a4d,
"Avision", "AV8050U",
- AV_NON_INTERLACED_DUPLEX_300 | AV_DOES_NOT_KEEP_GAMMA,0},
+ AV_NON_INTERLACED_DUPLEX_300 | AV_DOES_NOT_KEEP_GAMMA},
/* comment="1 pass, 1200 dpi, A3 - duplex!" */
/* status="complete" */
{ "AVISION", "AV8300",
0x0638, 0x0A40,
"Avision", "AV8300",
- AV_NON_INTERLACED_DUPLEX_300 | AV_DOES_NOT_KEEP_GAMMA,0},
+ AV_NON_INTERLACED_DUPLEX_300 | AV_DOES_NOT_KEEP_GAMMA},
/* comment="1 pass, 1200 dpi, A3 - duplex!" */
/* status="complete" */
{ "AVISION", "AV8350",
0x0638, 0x0A68,
"Avision", "AV8350",
- AV_NON_INTERLACED_DUPLEX_300 | AV_DOES_NOT_KEEP_GAMMA,0},
+ AV_NON_INTERLACED_DUPLEX_300 | AV_DOES_NOT_KEEP_GAMMA},
/* comment="1 pass, 1200 dpi, A3 - duplex!" */
/* status="complete" */
{ NULL, NULL,
0x0638, 0x0A61,
"Avision", "IT8300",
- AV_NON_INTERLACED_DUPLEX_300 | AV_ACCEL_TABLE,0},
+ AV_NON_INTERLACED_DUPLEX_300 | AV_ACCEL_TABLE},
/* comment="1 pass, 1200 dpi, A3 - duplex!, LCD screen, paper sensors" */
/* status="good" */
{ NULL, NULL,
0x0638, 0x0AA1,
"Avision", "@V2500",
- 0,0},
+ 0},
/* comment="" */
/* status="untested" */
{ NULL, NULL,
0x0638, 0x0A45,
"Avision", "@V5100",
- 0,0},
+ 0},
/* comment="1 pass, 1200 dpi, A3 - duplex!, LCD screen, paper sensors" */
/* status="good" */
{ "AVISION", "AVA3",
0, 0,
"Avision", "AVA3",
- AV_FORCE_A3,0},
+ AV_FORCE_A3},
/* comment="1 pass, 600 dpi, A3" */
/* status="basic" */
@@ -613,21 +617,21 @@ static Avision_HWEntry Avision_Device_List [] =
{ "HP", "ScanJet 5300C",
0x03f0, 0x0701,
"Hewlett-Packard", "ScanJet 5300C",
- AV_INT_STATUS,0},
+ AV_INT_STATUS},
/* comment="1 pass, 2400 dpi - some FW revisions have x-axis image scaling problems over 1200 dpi" */
/* status="complete" */
{ "HP", "ScanJet 5370C",
0x03f0, 0x0701,
"Hewlett-Packard", "ScanJet 5370C",
- AV_MULTI_CALIB_CMD | AV_INT_STATUS, AV_FIRMWARE },
+ AV_MULTI_CALIB_CMD | AV_INT_STATUS},
/* comment="1 pass, 2400 dpi - some FW revisions have x-axis image scaling problems over 1200 dpi" */
/* status="good" */
{ "hp", "scanjet 7400c",
0x03f0, 0x0801,
"Hewlett-Packard", "ScanJet 7400c",
- AV_LIGHT_CHECK_BOGUS | AV_NO_64BYTE_ALIGN | AV_INT_STATUS,0},
+ AV_LIGHT_CHECK_BOGUS | AV_NO_64BYTE_ALIGN | AV_INT_STATUS},
/* comment="1 pass, 2400 dpi - dual USB/SCSI interface" */
/* status="good" */
@@ -635,14 +639,14 @@ static Avision_HWEntry Avision_Device_List [] =
{ "hp", "scanjet 7450c",
0x03f0, 0x0801,
"Hewlett-Packard", "ScanJet 7450c",
- AV_NO_64BYTE_ALIGN | AV_INT_STATUS,0},
+ AV_NO_64BYTE_ALIGN | AV_INT_STATUS},
/* comment="1 pass, 2400 dpi - dual USB/SCSI interface" */
/* status="good" */
{ "hp", "scanjet 7490c",
0x03f0, 0x0801,
"Hewlett-Packard", "ScanJet 7490c",
- AV_NO_64BYTE_ALIGN | AV_INT_STATUS,0},
+ AV_NO_64BYTE_ALIGN | AV_INT_STATUS},
/* comment="1 pass, 1200 dpi - dual USB/SCSI interface" */
/* status="good" */
@@ -650,7 +654,7 @@ static Avision_HWEntry Avision_Device_List [] =
{ "HP", "C9930A",
0x03f0, 0x0b01,
"Hewlett-Packard", "ScanJet 8200",
- 0, AV_ADF_FLIPPING_DUPLEX | AV_FIRMWARE },
+ AV_ADF_FLIPPING_DUPLEX | AV_FIRMWARE},
/* comment="1 pass, 4800 (?) dpi - USB 2.0" */
/* status="good" */
@@ -658,7 +662,7 @@ static Avision_HWEntry Avision_Device_List [] =
{ "HP", "C9930A",
0x03f0, 0x0b01,
"Hewlett-Packard", "ScanJet 8250",
- 0, AV_ADF_FLIPPING_DUPLEX | AV_FIRMWARE },
+ AV_ADF_FLIPPING_DUPLEX | AV_FIRMWARE},
/* comment="1 pass, 4800 (?) dpi - USB 2.0" */
/* status="good" */
#endif
@@ -666,7 +670,7 @@ static Avision_HWEntry Avision_Device_List [] =
{ "HP", "C9930A",
0x03f0, 0x3905,
"Hewlett-Packard", "ScanJet 8270",
- 0, AV_ADF_FLIPPING_DUPLEX | AV_FIRMWARE },
+ AV_ADF_FLIPPING_DUPLEX | AV_FIRMWARE},
/* comment="1 pass, 4800 (?) dpi - USB 2.0" */
/* status="good" */
@@ -674,7 +678,7 @@ static Avision_HWEntry Avision_Device_List [] =
{ "HP", "C9930A",
0x03f0, 0x0b01,
"Hewlett-Packard", "ScanJet 8290",
- 0, AV_ADF_FLIPPING_DUPLEX | AV_FIRMWARE },
+ AV_ADF_FLIPPING_DUPLEX | AV_FIRMWARE},
/* comment="1 pass, 4800 (?) dpi - USB 2.0 and SCSI - only SCSI tested so far" */
/* status="good" */
@@ -682,7 +686,7 @@ static Avision_HWEntry Avision_Device_List [] =
{ "HP", "C9930A",
0x03f0, 0x3805,
"Hewlett-Packard", "ScanJet 8300",
- 0,0},
+ 0},
/* comment="1 pass, 4800 (?) dpi - USB 2.0" */
/* status="good" */
@@ -690,14 +694,14 @@ static Avision_HWEntry Avision_Device_List [] =
{ "HP", "C9930A",
0x03f0, 0x3805,
"Hewlett-Packard", "ScanJet 8350",
- 0,0},
+ 0},
/* comment="1 pass, 4800 (?) dpi - USB 2.0" */
/* status="good" */
{ "HP", "C9930A",
0x03f0, 0x3805,
"Hewlett-Packard", "ScanJet 8390",
- 0,0},
+ 0},
/* comment="1 pass, 4800 (?) dpi - USB 2.0" */
/* status="good" */
@@ -705,79 +709,79 @@ static Avision_HWEntry Avision_Device_List [] =
{ "Minolta", "#2882",
0, 0,
"Minolta", "Dimage Scan Dual I",
- AV_FORCE_FILM | AV_NO_START_SCAN,0}, /* not AV_FILMSCANNER (no frame control) */
+ AV_FORCE_FILM | AV_NO_START_SCAN}, /* not AV_FILMSCANNER (no frame control) */
/* status="basic" */
{ "Minolta", "#2887",
0, 0,
"Minolta", "Scan Multi Pro",
- AV_FORCE_FILM | AV_NO_START_SCAN,0}, /* AV_FILMSCANNER (frame control)? */
+ AV_FORCE_FILM | AV_NO_START_SCAN}, /* AV_FILMSCANNER (frame control)? */
/* status="untested" */
{ "MINOLTA", "FS-V1",
0x0638, 0x026a,
"Minolta", "Dimage Scan Dual II",
- AV_FILMSCANNER | AV_ONE_CALIB_CMD | AV_12_BIT_MODE,0},
+ AV_FILMSCANNER | AV_ONE_CALIB_CMD | AV_12_BIT_MODE},
/* comment="1 pass, film-scanner" */
/* status="good" */
{ "MINOLTA", "Elite II",
0x0686, 0x4004,
"Minolta", "Elite II",
- AV_FILMSCANNER | AV_ONE_CALIB_CMD,0},
+ AV_FILMSCANNER | AV_ONE_CALIB_CMD},
/* comment="1 pass, film-scanner" */
/* status="untested" */
{ "MINOLTA", "FS-V3",
0x0686, 0x400d,
"Minolta", "Dimage Scan Dual III",
- AV_FILMSCANNER | AV_ONE_CALIB_CMD | AV_ACCEL_TABLE ,0},
+ AV_FILMSCANNER | AV_ONE_CALIB_CMD | AV_ACCEL_TABLE},
/* comment="1 pass, film-scanner" */
/* status="good" */
{ "MINOLTA", "FS-V4",
0x0686, 0x400e,
"Minolta", "Dimage Scan Elite 5400",
- AV_FILMSCANNER | AV_ONE_CALIB_CMD | /*AV_ACCEL_TABLE |*/ AV_NO_START_SCAN,0},
+ AV_FILMSCANNER | AV_ONE_CALIB_CMD | /*AV_ACCEL_TABLE |*/ AV_NO_START_SCAN},
/* comment="1 pass, film-scanner" */
/* status="good" */
{ "QMS", "SC-110",
0x0638, 0x0a15,
"Minolta-QMS", "SC-110",
- 0,0},
+ 0},
/* comment="" */
/* status="untested" */
{ "QMS", "SC-215",
0x0638, 0x0a16,
"Minolta-QMS", "SC-215",
- 0,0},
+ 0},
/* comment="" */
/* status="good" */
{ "MITSBISH", "MCA-ADFC",
0, 0,
"Mitsubishi", "MCA-ADFC",
- 0,0},
+ 0},
/* status="untested" */
{ "MITSBISH", "MCA-S1200C",
0, 0,
"Mitsubishi", "S1200C",
- 0,0},
+ 0},
/* status="untested" */
{ "MITSBISH", "MCA-S600C",
0, 0,
"Mitsubishi", "S600C",
- 0,0},
+ 0},
/* status="untested" */
{ "MITSBISH", "SS600",
0, 0,
"Mitsubishi", "SS600",
- 0,0},
+ 0},
/* status="good" */
/* The next are all untested ... */
@@ -785,209 +789,209 @@ static Avision_HWEntry Avision_Device_List [] =
{ "FCPA", "ScanPartner",
0, 0,
"Fujitsu", "ScanPartner",
- AV_FUJITSU,0},
+ AV_FUJITSU},
/* status="untested" */
{ "FCPA", "ScanPartner 10",
0, 0,
"Fujitsu", "ScanPartner 10",
- AV_FUJITSU,0},
+ AV_FUJITSU},
/* status="untested" */
{ "FCPA", "ScanPartner 10C",
0, 0,
"Fujitsu", "ScanPartner 10C",
- AV_FUJITSU,0},
+ AV_FUJITSU},
/* status="untested" */
{ "FCPA", "ScanPartner 15C",
0, 0,
"Fujitsu", "ScanPartner 15C",
- AV_FUJITSU,0},
+ AV_FUJITSU},
/* status="untested" */
{ "FCPA", "ScanPartner 300C",
0, 0,
"Fujitsu", "ScanPartner 300C",
- 0,0},
+ 0},
/* status="untested" */
{ "FCPA", "ScanPartner 600C",
0, 0,
"Fujitsu", "ScanPartner 600C",
- 0,0},
+ 0},
/* status="untested" */
{ "FCPA", "ScanPartner 620C",
0, 0,
"Fujitsu", "ScanPartner 620C",
- AV_LIGHT_CHECK_BOGUS,0},
+ AV_LIGHT_CHECK_BOGUS},
/* status="good" */
{ "FCPA", "ScanPartner Jr",
0, 0,
"Fujitsu", "ScanPartner Jr",
- 0,0},
+ 0},
/* status="untested" */
{ "FCPA", "ScanStation",
0, 0,
"Fujitsu", "ScanStation",
- 0,0},
+ 0},
/* status="untested" */
{ NULL, NULL,
0x04c5, 0x1029,
"Fujitsu", "fi-4010CU",
- 0,0},
+ 0},
/* status="untested" */
{ NULL, NULL,
0x04c5, 0x10ef,
"Fujitsu", "fi-5015C",
- 0,0},
+ 0},
/* status="good" */
{ NULL, NULL,
0x040a, 0x6001,
"Kodak", "i30",
- AV_INT_BUTTON | AV_GRAY_MODES,0},
+ AV_INT_BUTTON | AV_GRAY_MODES},
/* status="untested" */
{ NULL, NULL,
0x040a, 0x6002,
"Kodak", "i40",
- AV_INT_BUTTON | AV_GRAY_MODES,0},
+ AV_INT_BUTTON | AV_GRAY_MODES},
/* status="basic" */
{ NULL, NULL,
0x040a, 0x6003,
"Kodak", "i50",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
#ifdef FAKE_ENTRIES_FOR_DESC_GENERATION
{ NULL, NULL,
0x040a, 0x6003,
"Kodak", "i55",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
#endif
{ NULL, NULL,
0x040a, 0x6004,
"Kodak", "i60",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
#ifdef FAKE_ENTRIES_FOR_DESC_GENERATION
{ NULL, NULL,
0x040a, 0x6004,
"Kodak", "i65",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
#endif
{ NULL, NULL,
0x040a, 0x6005,
"Kodak", "i80",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="good" */
{ "iVina", "1200U",
0x0638, 0x0268,
"iVina", "1200U",
- 0,0},
+ 0},
/* status="untested" */
{ NULL, NULL,
0x04a7, 0x0424,
"Visioneer", "Strobe XP 450",
- AV_INT_BUTTON | AV_ACCEL_TABLE,0},
+ AV_INT_BUTTON | AV_ACCEL_TABLE},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x0491,
"Visioneer", "Strobe XP 450-G",
- AV_INT_BUTTON | AV_ACCEL_TABLE,0},
+ AV_INT_BUTTON | AV_ACCEL_TABLE},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x0479,
"Visioneer", "Strobe XP 470",
- AV_INT_BUTTON | AV_ACCEL_TABLE,0},
+ AV_INT_BUTTON | AV_ACCEL_TABLE},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x048F,
"Visioneer", "Strobe XP 470-G",
- AV_INT_BUTTON | AV_ACCEL_TABLE,0},
+ AV_INT_BUTTON | AV_ACCEL_TABLE},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x0420,
"Visioneer", "9320",
- 0,0},
+ 0},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x0421,
"Visioneer", "9450",
- AV_MULTI_CALIB_CMD | AV_ADF_BGR_ORDER_INVERT | AV_NO_BUTTON, AV_NO_TUNE_SCAN_LENGTH},
+ AV_MULTI_CALIB_CMD | AV_ADF_BGR_ORDER_INVERT | AV_NO_BUTTON | AV_NO_TUNE_SCAN_LENGTH},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x047A,
"Visioneer", "9450-G",
- 0,0},
+ 0},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x0422,
"Visioneer", "9550",
- 0,0},
+ 0},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x0390,
"Visioneer", "9650",
- 0,0},
+ 0},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x047B,
"Visioneer", "9650-G",
- 0,0},
+ 0},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x0423,
"Visioneer", "9750",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x0493,
"Visioneer", "9750-G",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x0497,
"Visioneer", "Patriot 430",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET,0},
+ AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET},
/* comment="sheetfed scanner" */
/* status="complete" */
@@ -995,7 +999,7 @@ static Avision_HWEntry Avision_Device_List [] =
{ NULL, NULL,
0x04a7, 0x048F,
"Visioneer", "Patriot 470",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* comment="sheetfed scanner" */
/* status="complete" */
#endif
@@ -1003,150 +1007,150 @@ static Avision_HWEntry Avision_Device_List [] =
{ NULL, NULL,
0x04a7, 0x0498,
"Visioneer", "Patriot 680",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x0499,
"Visioneer", "Patriot 780",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* comment="sheetfed scanner" */
/* status="complete" */
{ NULL, NULL,
0x04a7, 0x049C,
"Xerox", "DocuMate150",
- AV_INT_BUTTON | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_BACKGROUND_QUIRK,0},
+ AV_INT_BUTTON | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_BACKGROUND_QUIRK},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x0477,
"Xerox", "DocuMate152",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET | AV_BACKGROUND_QUIRK,0},
+ AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET | AV_BACKGROUND_QUIRK},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x049D,
"Xerox", "DocuMate162",
- AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET | AV_BACKGROUND_QUIRK,0},
+ AV_INT_BUTTON | AV_2ND_LINE_INTERLACED | AV_NO_REAR | AV_SOFT_SCALE | AV_DOES_KEEP_WINDOW | AV_DOES_KEEP_GAMMA | AV_REAR_OFFSET | AV_BACKGROUND_QUIRK},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x0448,
"Xerox", "DocuMate250",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x0490,
"Xerox", "DocuMate250-G",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x0449,
"Xerox", "DocuMate252",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x048C,
"Xerox", "DocuMate252-G",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x0476,
"Xerox", "DocuMate232",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x044c,
"Xerox", "DocuMate262",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x048D,
"Xerox", "DocuMate262-G",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x04a7,
"Xerox", "DocuMate262i",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="good" */
{ NULL, NULL,
0x04a7, 0x0475,
"Xerox", "DocuMate272",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
{ NULL, NULL,
0x04a7, 0x048E,
"Xerox", "DocuMate272-G",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
{ NULL, NULL,
0x04a7, 0x0446,
"Xerox", "DocuMate510",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
{ NULL, NULL,
0x04a7, 0x0495,
"Xerox", "DocuMate512",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
{ NULL, NULL,
0x04a7, 0x047c,
"Xerox", "DocuMate510-G",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
{ NULL, NULL,
0x04a7, 0x0447,
"Xerox", "DocuMate520",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
{ NULL, NULL,
0x04a7, 0x0492,
"Xerox", "DocuMate520-G",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
#ifdef FAKE_ENTRIES_FOR_DESC_GENERATION
{ NULL, NULL,
0x04a7, 0x0498,
"Xerox", "DocuMate632",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
#endif
{ NULL, NULL,
0x04a7, 0x0478,
"Xerox", "DocuMate752",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
{ NULL, NULL,
0x04a7, 0x049A,
"Xerox", "DocuMate752",
- AV_INT_BUTTON,0},
+ AV_INT_BUTTON},
/* status="untested" */
#ifdef FAKE_ENTRIES_FOR_DESC_GENERATION
{ NULL, NULL,
0x0638, 0x0a16,
"OKI", "S700 Scancopier",
- 0,0},
+ 0},
/* comment="1 pass, 600 dpi, A4" */
/* status="good" */
#endif
@@ -1154,14 +1158,14 @@ static Avision_HWEntry Avision_Device_List [] =
{ "B+H", "2000F",
0, 0,
"Bell+Howell", "2000F",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi, A4" */
/* status="basic" */
{ NULL, NULL,
0x0482, 0x0335,
"Kyocera", "FS-1016MFP",
- 0,0},
+ 0},
/* comment="1 pass, ??? dpi, A4" */
/* status="untested" */
@@ -1203,7 +1207,7 @@ Lexmark X4500 MFP
{ NULL, NULL,
0, 0,
NULL, NULL,
- 0,0}
+ 0}
};
#if 0
@@ -3208,7 +3212,7 @@ get_accessories_info (Avision_Scanner* s)
dev->inquiry_adf |= result [0];
- if (dev->hw->feature_type2 & AV_ADF_FLIPPING_DUPLEX)
+ if (dev->hw->feature_type & AV_ADF_FLIPPING_DUPLEX)
{
if (result[0] == 1)
{
@@ -3765,14 +3769,14 @@ attach (SANE_String_Const devname, Avision_ConnectionType con_type,
if (!found) {
DBG (0, "attach: \"%s\" - \"%s\" not yet in whitelist!\n", mfg, model);
DBG (0, "attach: You might want to report this output.\n");
- DBG (0, "attach: To: mike@piratehaven.org (the Avision backend maintainer)\n");
+ DBG (0, "attach: To: rene@exactcode.de (the Avision backend author)\n");
status = SANE_STATUS_INVAL;
goto close_scanner_and_return;
}
/* second: maybe ask for the firmware status and flash ram info */
- if (Avision_Device_List [model_num].feature_type2 & AV_FIRMWARE)
+ if (Avision_Device_List [model_num].feature_type & AV_FIRMWARE)
{
DBG (3, "attach: reading firmware status\n");
status = get_firmware_status (&av_con);
@@ -4211,7 +4215,7 @@ get_double ( &(result[48] ) ));
}
dev->inquiry_tune_scan_length = BIT(result[94],2);
- if (Avision_Device_List [model_num].feature_type2 & AV_NO_TUNE_SCAN_LENGTH)
+ if (Avision_Device_List [model_num].feature_type & AV_NO_TUNE_SCAN_LENGTH)
dev->inquiry_tune_scan_length = 0;
dev->inquiry_background_raster = BIT(result[95],2);
@@ -4278,7 +4282,9 @@ get_double ( &(result[48] ) ));
else
dev->scsi_buffer_size = sanei_scsi_max_request_size;
- if (dev->inquiry_asic_type >= AV_ASIC_C5)
+ if (dev->inquiry_asic_type > AV_ASIC_C7 && dev->inquiry_asic_type < AV_ASIC_OA980)
+ dev->read_stripe_size = 16;
+ else if (dev->inquiry_asic_type >= AV_ASIC_C5)
dev->read_stripe_size = 32;
else /* tested on AV3200 with it's max of 300dpi @color */
dev->read_stripe_size = 8; /* maybe made dynamic on scan res ... */
@@ -5142,7 +5148,7 @@ send_gamma (Avision_Scanner* s)
switch (dev->inquiry_asic_type)
{
case AV_ASIC_Cx:
- case AV_ASIC_C1: /* from avision code */
+ case AV_ASIC_C1:
gamma_table_raw_size = 4096;
gamma_table_size = 2048;
break;
@@ -5150,10 +5156,6 @@ send_gamma (Avision_Scanner* s)
gamma_table_raw_size = 256;
gamma_table_size = 256;
break;
- case AV_ASIC_C6: /* SPEC claims: 256 ... ? */
- case AV_ASIC_C7:
- gamma_table_raw_size = 512;
- gamma_table_size = 512;
break;
case AV_ASIC_OA980:
gamma_table_raw_size = 4096;
@@ -5164,7 +5166,8 @@ send_gamma (Avision_Scanner* s)
gamma_table_size = 256;
break;
default:
- gamma_table_raw_size = gamma_table_size = 4096;
+ gamma_table_raw_size = 512; /* SPEC claims: 256 ... ? */
+ gamma_table_size = 512;
}
gamma_values = gamma_table_size / 256;
@@ -5678,8 +5681,9 @@ set_window (Avision_Scanner* s)
}
}
- if (s->val[OPT_PAPERLEN].w)
+ if (s->val[OPT_PAPERLEN].w != SANE_FALSE) {
set_double (cmd.window.descriptor.paper_length, (int)((double)30.0*1200));
+ }
if ( !(dev->hw->feature_type & AV_FUJITSU) )
{
@@ -5780,7 +5784,7 @@ set_window (Avision_Scanner* s)
else {
if (dev->hw->feature_type & AV_FASTER_WITH_FILTER)
cmd.window.avision.bitset1 |= AVISION_FILTER_GREEN;
- else if (dev->hw->feature_type2 & AV_USE_GRAY_FILTER)
+ else if (dev->hw->feature_type & AV_USE_GRAY_FILTER)
cmd.window.avision.bitset1 |= AVISION_FILTER_GRAY;
else
cmd.window.avision.bitset1 |= AVISION_FILTER_NONE;
@@ -6182,7 +6186,7 @@ do_eof (Avision_Scanner *s)
/* we can now mark the rear data as valid */
if (s->avdimen.interlaced_duplex ||
- (s->hw->hw->feature_type2 & AV_ADF_FLIPPING_DUPLEX && s->source_mode == AV_ADF_DUPLEX)) {
+ (s->hw->hw->feature_type & AV_ADF_FLIPPING_DUPLEX && s->source_mode == AV_ADF_DUPLEX)) {
DBG (3, "do_eof: toggling duplex rear data valid\n");
s->duplex_rear_valid = !s->duplex_rear_valid;
DBG (3, "do_eof: duplex rear data valid: %x\n",
@@ -6262,11 +6266,6 @@ init_options (Avision_Scanner* s)
/* Init the SANE option from the scanner inquiry data */
- dev->x_range.max = SANE_FIX ( (int)dev->inquiry_x_ranges[s->source_mode_dim]);
- dev->x_range.quant = 0;
- dev->y_range.max = SANE_FIX ( (int)dev->inquiry_y_ranges[s->source_mode_dim]);
- dev->y_range.quant = 0;
-
switch (dev->inquiry_asic_type) {
case AV_ASIC_C2:
dev->dpi_range.min = 100;
@@ -6331,6 +6330,11 @@ init_options (Avision_Scanner* s)
s->source_mode = match_source_mode (dev, s->val[OPT_SOURCE].s);
s->source_mode_dim = match_source_mode_dim (s->source_mode);
+ dev->x_range.max = SANE_FIX ( (int)dev->inquiry_x_ranges[s->source_mode_dim]);
+ dev->x_range.quant = 0;
+ dev->y_range.max = SANE_FIX ( (int)dev->inquiry_y_ranges[s->source_mode_dim]);
+ dev->y_range.quant = 0;
+
/* resolution */
s->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
s->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
@@ -6667,7 +6671,7 @@ init_options (Avision_Scanner* s)
/* ADF page flipping */
s->opt[OPT_ADF_FLIP].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_AUTOMATIC | SANE_CAP_ADVANCED;
- if (!(s->hw->hw->feature_type2 & AV_ADF_FLIPPING_DUPLEX && s->source_mode == AV_ADF_DUPLEX))
+ if (!(s->hw->hw->feature_type & AV_ADF_FLIPPING_DUPLEX && s->source_mode == AV_ADF_DUPLEX))
s->opt[OPT_ADF_FLIP].cap |= SANE_CAP_INACTIVE;
s->opt[OPT_ADF_FLIP].name = "flip-page";
s->opt[OPT_ADF_FLIP].title = "Flip document after duplex scanning";
@@ -6782,7 +6786,7 @@ reader_process (void *data)
return SANE_STATUS_NO_MEM;
/* start scan ? */
- if ((deinterlace == NONE && !((dev->hw->feature_type2 & AV_ADF_FLIPPING_DUPLEX) && s->source_mode == AV_ADF_DUPLEX && s->duplex_rear_valid)) ||
+ if ((deinterlace == NONE && !((dev->hw->feature_type & AV_ADF_FLIPPING_DUPLEX) && s->source_mode == AV_ADF_DUPLEX && s->duplex_rear_valid)) ||
(deinterlace != NONE && !s->duplex_rear_valid))
{
/* reserve unit - in the past we did this in open - but the
@@ -6820,7 +6824,7 @@ reader_process (void *data)
/* setup file i/o for deinterlacing scans or if we are the back page with a flipping duplexer */
if (deinterlace != NONE ||
- (dev->hw->feature_type2 & AV_ADF_FLIPPING_DUPLEX && s->source_mode == AV_ADF_DUPLEX && !(s->page % 2)))
+ (dev->hw->feature_type & AV_ADF_FLIPPING_DUPLEX && s->source_mode == AV_ADF_DUPLEX && !(s->page % 2)))
{
if (!s->duplex_rear_valid) { /* create new file for writing */
DBG (3, "reader_process: opening duplex rear file for writing.\n");
@@ -6954,11 +6958,15 @@ reader_process (void *data)
/* only EOF on the second stripe, as otherwise the rear page
is shorter */
if (status == SANE_STATUS_EOF && deinterlace == STRIPE) {
- static int already_eof = 0;
- if (!already_eof) {
- DBG (5, "reader_process: first EOF on stripe interlace: hiding.\n");
- status = SANE_STATUS_GOOD;
- already_eof = 1;
+ if (dev->inquiry_asic_type > AV_ASIC_C7 && dev->inquiry_asic_type < AV_ASIC_OA980) {
+ this_read = 0;
+ } else {
+ static int already_eof = 0;
+ if (!already_eof) {
+ DBG (5, "reader_process: first EOF on stripe interlace: hiding.\n");
+ status = SANE_STATUS_GOOD;
+ already_eof = 1;
+ }
}
}
@@ -7047,7 +7055,7 @@ reader_process (void *data)
DBG (9, "reader_process: after deinterlacing: useful_bytes: %d, stripe_fill: %d\n",
useful_bytes, stripe_fill);
}
- if (dev->hw->feature_type2 & AV_ADF_FLIPPING_DUPLEX && s->source_mode == AV_ADF_DUPLEX && !(s->page % 2) && !s->duplex_rear_valid) {
+ if (dev->hw->feature_type & AV_ADF_FLIPPING_DUPLEX && s->source_mode == AV_ADF_DUPLEX && !(s->page % 2) && !s->duplex_rear_valid) {
/* Here we flip the image by writing the lines from the end of the file to the beginning. */
unsigned int absline = (processed_bytes - stripe_fill) / s->avdimen.hw_bytes_per_line;
unsigned int abslines = absline + useful_bytes / s->avdimen.hw_bytes_per_line;
@@ -7454,7 +7462,7 @@ reader_process (void *data)
/* Eject film holder and/or release_unit - but only for
non-duplex-rear / non-virtual scans. */
if ((deinterlace != NONE && s->duplex_rear_valid) ||
- ((dev->hw->feature_type2 & AV_ADF_FLIPPING_DUPLEX) && s->source_mode == AV_ADF_DUPLEX && !(s->page % 2) && s->duplex_rear_valid))
+ ((dev->hw->feature_type & AV_ADF_FLIPPING_DUPLEX) && s->source_mode == AV_ADF_DUPLEX && !(s->page % 2) && s->duplex_rear_valid))
{
DBG (1, "reader_process: virtual duplex scan - no device cleanup!\n");
}
@@ -7477,7 +7485,7 @@ reader_process (void *data)
}
}
- if ((dev->hw->feature_type2 & AV_ADF_FLIPPING_DUPLEX) && s->source_mode == AV_ADF_DUPLEX && s->page % 2) {
+ if ((dev->hw->feature_type & AV_ADF_FLIPPING_DUPLEX) && s->source_mode == AV_ADF_DUPLEX && s->page % 2) {
/* front page of flipping duplex */
if (exit_status == SANE_STATUS_EOF) {
if (s->val[OPT_ADF_FLIP].w) {
@@ -7891,7 +7899,7 @@ sane_open (SANE_String_Const devicename, SANE_Handle *handle)
init_options (s);
if (dev->inquiry_duplex_interlaced || dev->scanner_type == AV_FILM ||
- dev->hw->feature_type2 & AV_ADF_FLIPPING_DUPLEX) {
+ dev->hw->feature_type & AV_ADF_FLIPPING_DUPLEX) {
/* Might need at least *DOS (Windows flavour and OS/2) portability fix
However, I was told Cygwin (et al.) takes care of it. */
strncpy(s->duplex_rear_fname, "/tmp/avision-rear-XXXXXX", PATH_MAX);
@@ -8188,7 +8196,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
dev->y_range.max =
SANE_FIX ( dev->inquiry_y_ranges[s->source_mode_dim]);
- if (s->hw->hw->feature_type2 & AV_ADF_FLIPPING_DUPLEX && s->source_mode == AV_ADF_DUPLEX) {
+ if (s->hw->hw->feature_type & AV_ADF_FLIPPING_DUPLEX && s->source_mode == AV_ADF_DUPLEX) {
s->opt[OPT_ADF_FLIP].cap &= ~SANE_CAP_INACTIVE;
} else {
s->opt[OPT_ADF_FLIP].cap |= SANE_CAP_INACTIVE;
@@ -8284,16 +8292,9 @@ sane_get_parameters (SANE_Handle handle, SANE_Parameters* params)
}
if (params) {
+ *params = s->params;
/* add background raster lines */
- s->params.lines += s->val[OPT_BACKGROUND].w;
-
- /* copy structure members */
- params->format = s->params.format;
- params->last_frame = s->params.last_frame;
- params->bytes_per_line = s->params.bytes_per_line;
- params->pixels_per_line = s->params.pixels_per_line;
- params->lines = s->params.lines;
- params->depth = s->params.depth;
+ params->lines += s->val[OPT_BACKGROUND].w;
}
return SANE_STATUS_GOOD;
diff --git a/backend/avision.h b/backend/avision.h
index 14134e1..2122e09 100644
--- a/backend/avision.h
+++ b/backend/avision.h
@@ -93,123 +93,119 @@ typedef struct Avision_HWEntry {
/* feature overwrites - as embedded CPUs have 16bit enums - this
would need a change ... */
- enum {
/* force no calibration */
- AV_NO_CALIB = (1<<0),
+ #define AV_NO_CALIB ((uint64_t)1<<0)
/* force all in one command calibration */
- AV_ONE_CALIB_CMD = (1<<1),
+ #define AV_ONE_CALIB_CMD ((uint64_t)1<<1)
/* no gamma table */
- AV_NO_GAMMA = (1<<2),
+ #define AV_NO_GAMMA ((uint64_t)1<<2)
/* light check is bogus */
- AV_LIGHT_CHECK_BOGUS = (1<<3),
+ #define AV_LIGHT_CHECK_BOGUS ((uint64_t)1<<3)
/* no button though the device advertise it */
- AV_NO_BUTTON = (1<<4),
+ #define AV_NO_BUTTON ((uint64_t)1<<4)
/* if the scan area needs to be forced to A3 */
- AV_FORCE_A3 = (1<<5),
+ #define AV_FORCE_A3 ((uint64_t)1<<5)
/* if the scan area and resolution needs to be forced for films */
- AV_FORCE_FILM = (1<<6),
+ #define AV_FORCE_FILM ((uint64_t)1<<6)
/* does not suport, or very broken background (added for AV610C2) */
- AV_NO_BACKGROUND = (1<<7),
+ #define AV_NO_BACKGROUND ((uint64_t)1<<7)
/* is film scanner - no detection yet */
- AV_FILMSCANNER = (1<<8),
+ #define AV_FILMSCANNER ((uint64_t)1<<8)
/* fujitsu adaption */
- AV_FUJITSU = (1<<9),
+ #define AV_FUJITSU ((uint64_t)1<<9)
/* gray calibration data has to be uploaded on the blue channel ... ? */
- AV_GRAY_CALIB_BLUE = (1<<10),
+ #define AV_GRAY_CALIB_BLUE ((uint64_t)1<<10)
/* Interrupt endpoint button readout (so far AV220) */
- AV_INT_BUTTON = (1<<11),
+ #define AV_INT_BUTTON ((uint64_t)1<<11)
/* send acceleration table ... */
- AV_ACCEL_TABLE = (1<<12),
+ #define AV_ACCEL_TABLE ((uint64_t)1<<12)
/* non-interlaced scanns up to 300 dpi (AV32xx / AV83xx) */
- AV_NON_INTERLACED_DUPLEX_300 = (1<<13),
+ #define AV_NON_INTERLACED_DUPLEX_300 ((uint64_t)1<<13)
/* do not read multiples of 64 bytes - stalls the USB chip */
- AV_NO_64BYTE_ALIGN = (1<<14),
+ #define AV_NO_64BYTE_ALIGN ((uint64_t)1<<14)
/* force channel-by-channel calibration */
- AV_MULTI_CALIB_CMD = (1<<15),
+ #define AV_MULTI_CALIB_CMD ((uint64_t)1<<15)
/* non color scans are faster with a filter applied (AV32xx) */
- AV_FASTER_WITH_FILTER = (1<<16),
+ #define AV_FASTER_WITH_FILTER ((uint64_t)1<<16)
/* interlaced data with 1 line distance */
- AV_2ND_LINE_INTERLACED = (1<<17),
+ #define AV_2ND_LINE_INTERLACED ((uint64_t)1<<17)
/* does not keep the window though it advertices so */
- AV_DOES_NOT_KEEP_WINDOW = (1<<18),
+ #define AV_DOES_NOT_KEEP_WINDOW ((uint64_t)1<<18)
/* does not keep the gamma though it advertices so */
- AV_DOES_NOT_KEEP_GAMMA = (1<<19),
+ #define AV_DOES_NOT_KEEP_GAMMA ((uint64_t)1<<19)
/* advertises ADF is BGR order, but isn't (or vice versa) */
- AV_ADF_BGR_ORDER_INVERT = (1<<20),
+ #define AV_ADF_BGR_ORDER_INVERT ((uint64_t)1<<20)
/* allows 12bit mode, though not flagged */
- AV_12_BIT_MODE = (1<<21),
+ #define AV_12_BIT_MODE ((uint64_t)1<<21)
/* very broken background raster */
- AV_BACKGROUND_QUIRK = (1<<22),
+ #define AV_BACKGROUND_QUIRK ((uint64_t)1<<22)
/* though marked as GRAY only the scanner can do GRAY modes */
- AV_GRAY_MODES = (1<<23),
+ #define AV_GRAY_MODES ((uint64_t)1<<23)
/* no seperate, single REAR scan (AV122, DM152, ...) */
- AV_NO_REAR = (1<<24),
+ #define AV_NO_REAR ((uint64_t)1<<24)
/* only scan with some known good hardware resolutions, as the
scanner fails to properly interpoloate in between (e.g. AV121,
DM152 on duplex scans - but also the AV600), software scale and
interpolate to all the others */
- AV_SOFT_SCALE = (1<<25),
+ #define AV_SOFT_SCALE ((uint64_t)1<<25)
/* does keep window though it does not advertice it - the AV122/DM152
mess up image data if window is resend between ADF pages */
- AV_DOES_KEEP_WINDOW = (1<<26),
+ #define AV_DOES_KEEP_WINDOW ((uint64_t)1<<26)
/* does keep gamma though it does not advertice it */
- AV_DOES_KEEP_GAMMA = (1<<27),
+ #define AV_DOES_KEEP_GAMMA ((uint64_t)1<<27)
/* does the scanner contain a Cancel button? */
- AV_CANCEL_BUTTON = (1<<28),
+ #define AV_CANCEL_BUTTON ((uint64_t)1<<28)
/* is the rear image offset? */
- AV_REAR_OFFSET = (1<<29),
+ #define AV_REAR_OFFSET ((uint64_t)1<<29)
/* some devices do not need a START_SCAN, even hang with it */
- AV_NO_START_SCAN = (1<<30),
-
- AV_INT_STATUS = (1<<31)
+ #define AV_NO_START_SCAN ((uint64_t)1<<30)
- /* maybe more ...*/
- } feature_type;
-
- /*second enum cause 32 bit int above is full*/
- enum {
+ #define AV_INT_STATUS ((uint64_t)1<<31)
+
/* force no calibration */
- AV_NO_TUNE_SCAN_LENGTH = (1<<0),
+ #define AV_NO_TUNE_SCAN_LENGTH ((uint64_t)1<<32)
/* for gray scans, set grey filter */
- AV_USE_GRAY_FILTER = (1<<1),
+ #define AV_USE_GRAY_FILTER ((uint64_t)1<<33)
/* For (HP) scanners with flipping duplexers */
- AV_ADF_FLIPPING_DUPLEX = (1<<2),
+ #define AV_ADF_FLIPPING_DUPLEX ((uint64_t)1<<34)
/* For scanners which need to have their firmware read to properly function. */
- AV_FIRMWARE = (1<<3)
- } feature_type2;
+ #define AV_FIRMWARE ((uint64_t)1<<35)
+
+ /* maybe more ...*/
+ uint64_t feature_type;
} Avision_HWEntry;
diff --git a/backend/bh.c b/backend/bh.c
index 58c8caa..9424bd6 100644
--- a/backend/bh.c
+++ b/backend/bh.c
@@ -66,6 +66,7 @@
#define MIN(x,y) ((x)<(y) ? (x) : (y))
#define MAX(x,y) ((x)>(y) ? (x) : (y))
+static const SANE_Device **devlist = 0;
static int num_devices = 0;
static BH_Device *first_dev = NULL;
static BH_Scanner *first_handle = NULL;
@@ -1862,10 +1863,9 @@ start_scan (BH_Scanner *s)
strncpy(s->barfname, "/tmp/bhXXXXXX", sizeof(s->barfname));
s->barfname[sizeof(s->barfname)-1] = '\0';
+ fd = mkstemp(s->barfname);
- if ((mktemp(s->barfname) == NULL) &&
- ((fd = open(s->barfname, O_CREAT | O_EXCL | O_WRONLY, 0600)) != -1) &&
- ((fp = fdopen(fd, "w")) != NULL))
+ if (fd !=-1 && (fp = fdopen(fd, "w")) != NULL)
{
fprintf(fp, "<xml-stream>\n");
@@ -3231,7 +3231,6 @@ sane_init (SANE_Int *version_code, SANE_Auth_Callback authorize)
SANE_Status
sane_get_devices (const SANE_Device ***device_list, SANE_Bool local)
{
- static const SANE_Device **devlist = 0;
BH_Device *dev;
int i;
DBG(3, "sane_get_devices called\n");
@@ -3879,5 +3878,8 @@ sane_exit (void)
next = dev->next;
free (dev);
}
+
+ if (devlist)
+ free (devlist);
}
diff --git a/backend/canon_dr-cmd.h b/backend/canon_dr-cmd.h
index 64e6887..b969c3b 100644
--- a/backend/canon_dr-cmd.h
+++ b/backend/canon_dr-cmd.h
@@ -67,6 +67,10 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
}
/* ==================================================================== */
+/* extended status packet */
+#define get_ES_length(b) getnbyte(b+0x04, 4)
+
+/* ==================================================================== */
/* SCSI commands */
#define set_SCSI_opcode(out, val) out[0]=val
@@ -203,7 +207,9 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
/* READ/SEND page codes */
#define SR_datatype_image 0x00
#define SR_datatype_lut 0x03
+#define SR_datatype_pixelsize 0x80 /*DR-G1130*/
#define SR_datatype_panel 0x84
+#define SR_datatype_sensors 0x8b
#define SR_datatype_counters 0x8c
#define SR_datatype_endorser 0x90
#define SR_datatype_fineoffset 0x90
@@ -234,6 +240,11 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
#define get_R_PANEL_enable_led(in) getbitfield(in+2, 1, 0)
#define get_R_PANEL_counter(in) getnbyte(in + 0x04, 4)
+/*sensors*/
+#define R_SENSORS_len 0x01
+#define get_R_SENSORS_card(in) getbitfield(in, 1, 3)
+#define get_R_SENSORS_adf(in) getbitfield(in, 1, 0)
+
/*counters*/
#define R_COUNTERS_len 0x80
#define get_R_COUNTERS_scans(in) getnbyte(in + 0x04, 4)
@@ -334,6 +345,7 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
#define set_SSM_BUFF_async(sb, val) setbitfield(sb+0x0a, 1, 6, val)
#define set_SSM_BUFF_ald(sb, val) setbitfield(sb+0x0a, 1, 5, val)
#define set_SSM_BUFF_fb(sb, val) setbitfield(sb+0x0a, 1, 4, val)
+#define set_SSM_BUFF_card(sb, val) setbitfield(sb+0x0a, 1, 3, val)
/* for DO (0x36) page */
#define SSM_DO_none 0
@@ -415,18 +427,39 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
#define set_CC3_exp_b_b(sb, val) putnbyte(sb + 0x20, val, 2)
/* ==================================================================== */
+/* Page codes used by GET/SET SCAN MODE 2 */
+#define SM2_pc_df 0x00
+#define SM2_pc_ultra 0x01
+#define SM2_pc_buffer 0x02
+#define SM2_pc_dropout 0x06
+
+/* ==================================================================== */
/* SET SCAN MODE 2 */
#define SET_SCAN_MODE2_code 0xe5
-#define SET_SCAN_MODE2_len 10
+#define SET_SCAN_MODE2_len 12
#define set_SSM2_page_code(sb, val) sb[0x02] = val
#define set_SSM2_pay_len(sb, val) sb[0x08] = val
/* the payload */
#define SSM2_PAY_len 0x10
-#define set_SSM2_unk(sb, val) sb[0x02] = val
-#define set_SSM2_unk2(sb, val) sb[0x03] = val
-#define set_SSM2_unk3(sb, val) sb[0x04] = val
+
+/* for DF (0x00) page */
+#define set_SSM2_DF_thick(sb, val) setbitfield(sb+3, 1, 2, val)
+#define set_SSM2_DF_len(sb, val) setbitfield(sb+3, 1, 0, val)
+
+/* for ULTRA (0x01) page */
+#define set_SSM2_ULTRA_top(sb, val) putnbyte(sb + 0x07, val, 2)
+#define set_SSM2_ULTRA_bot(sb, val) putnbyte(sb + 0x09, val, 2)
+
+/* for BUFFER (0x02) page */
+#define set_SSM2_BUFF_unk(sb, val) sb[0x03] = val
+#define set_SSM2_BUFF_unk2(sb, val) sb[0x06] = val
+#define set_SSM2_BUFF_sync(sb, val) sb[0x09] = val
+
+/* for DROPOUT (0x06) page */
+#define set_SSM2_DO_do(sb, val) sb[0x09] = val
+#define set_SSM2_DO_en(sb, val) sb[0x0a] = val
/* ==================================================================== */
/* window descriptor macros for SET_WINDOW and GET_WINDOW */
diff --git a/backend/canon_dr.c b/backend/canon_dr.c
index 594aab2..381cfd6 100644
--- a/backend/canon_dr.c
+++ b/backend/canon_dr.c
@@ -276,10 +276,46 @@
- DR-2580C pads the backside of duplex scans
v40 2012-11-01, MAN
- initial DR-9050C, DR-7550C, DR-6050C and DR-3010C support
- v41 2013-07-31, MAN
+ v41 2013-07-31, MAN (SANE 1.0.24)
- initial P-208 and P-215 support
- bug fix for calibration of scanners with duplex_offset
- allow duplex_offset to be controlled from config file
+ v42 2013-12-09, MAN
+ - initial DR-G1100 support
+ - add support for paper sensors (P-215 & P-208)
+ - add initial support for card reader (P-215)
+ - removed unused var from do_scsi_cmd()
+ v43 2014-03-13, MAN
+ - initial DR-M140 support
+ - add extra_status config and code
+ - split status code into do_usb_status
+ - fix copy_line margin offset
+ - add new color interlacing modes and code
+ - comment out ssm2
+ - add timestamp to do_usb_cmd
+ v44 2014-03-26, MAN
+ - buffermode support for machines with ssm2 command
+ - DR-M140 needs always_op=0
+ v45 2014-03-29, MAN
+ - dropout support for machines with ssm2 command
+ - doublefeed support for machines with ssm2 command
+ v46 2014-04-09, MAN
+ - split debug level 30 into two levels
+ - simplify jpeg ifdefs
+ - add support for DR-M160
+ v47 2014-07-07, MAN
+ - initial DR-G1130 support
+ v48 2014-08-06, MAN
+ - set another unknown byte in buffermode for ssm2
+ - add another gettimeofday call at end of do_usb_cmd
+ - don't print 0 length line in hexdump
+ v49 2015-03-18, MAN
+ - initial support for DR-C125
+ v50 2015-08-23, MAN
+ - DR-C125 adds duplex padding on back side
+ - initial support for DR-C225
+ v51 2015-08-25, MAN
+ - DR-C125 does not invert_tly, does need sw_lut
SANE FLOW DIAGRAM
@@ -317,6 +353,7 @@
#include <ctype.h> /*isspace*/
#include <math.h> /*tan*/
#include <unistd.h> /*usleep*/
+#include <sys/time.h> /*gettimeofday*/
#include "../include/sane/sanei_backend.h"
#include "../include/sane/sanei_scsi.h"
@@ -328,7 +365,7 @@
#include "canon_dr.h"
#define DEBUG 1
-#define BUILD 41
+#define BUILD 51
/* values for SANE_DEBUG_CANON_DR env var:
- errors 5
@@ -336,15 +373,25 @@
- function detail 15
- get/setopt cmds 20
- scsi/usb trace 25
- - scsi/usb detail 30
+ - scsi/usb writes 30
+ - scsi/usb reads 31
- useless noise 35
*/
/* ------------------------------------------------------------------------- */
+/* if JPEG support is not enabled in sane.h, we setup our own defines */
+#ifndef SANE_FRAME_JPEG
+#define SANE_FRAME_JPEG 0x0B
+#define SANE_JPEG_DISABLED 1
+#endif
+/* ------------------------------------------------------------------------- */
#define STRING_FLATBED SANE_I18N("Flatbed")
#define STRING_ADFFRONT SANE_I18N("ADF Front")
#define STRING_ADFBACK SANE_I18N("ADF Back")
#define STRING_ADFDUPLEX SANE_I18N("ADF Duplex")
+#define STRING_CARDFRONT SANE_I18N("Card Front")
+#define STRING_CARDBACK SANE_I18N("Card Back")
+#define STRING_CARDDUPLEX SANE_I18N("Card Duplex")
#define STRING_LINEART SANE_VALUE_SCAN_MODE_LINEART
#define STRING_HALFTONE SANE_VALUE_SCAN_MODE_HALFTONE
@@ -366,6 +413,8 @@ static int global_buffer_size;
static int global_buffer_size_default = 2 * 1024 * 1024;
static int global_padded_read;
static int global_padded_read_default = 0;
+static int global_extra_status;
+static int global_extra_status_default = 0;
static int global_duplex_offset;
static int global_duplex_offset_default = 0;
static char global_vendor_name[9];
@@ -543,6 +592,32 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
global_padded_read = buf;
}
+ /* EXTRA STATUS: we clamp to 0 or 1 */
+ else if (!strncmp (lp, "extra-status", 12) && isspace (lp[12])) {
+
+ int buf;
+ lp += 12;
+ lp = sanei_config_skip_whitespace (lp);
+ buf = atoi (lp);
+
+ if (buf < 0) {
+ DBG (5, "sane_get_devices: config option \"extra-status\" "
+ "(%d) is < 0, ignoring!\n", buf);
+ continue;
+ }
+
+ if (buf > 1) {
+ DBG (5, "sane_get_devices: config option \"extra-status\" "
+ "(%d) is > 1, ignoring!\n", buf);
+ continue;
+ }
+
+ DBG (15, "sane_get_devices: setting \"extra-status\" to %d\n",
+ buf);
+
+ global_extra_status = buf;
+ }
+
/* DUPLEXOFFSET: < 1200 */
else if (!strncmp (lp, "duplex-offset", 13) && isspace (lp[13])) {
@@ -733,6 +808,7 @@ attach_one (const char *device_name, int connType)
/* config file settings */
s->buffer_size = global_buffer_size;
s->padded_read = global_padded_read;
+ s->extra_status = global_extra_status;
s->duplex_offset = global_duplex_offset;
/* copy the device name */
@@ -1160,6 +1236,9 @@ init_model (struct scanner *s)
s->reverse_by_mode[MODE_GRAYSCALE] = 0;
s->reverse_by_mode[MODE_COLOR] = 0;
+ s->color_interlace[SIDE_FRONT] = COLOR_INTERLACE_RGB;
+ s->color_interlace[SIDE_BACK] = COLOR_INTERLACE_RGB;
+
s->always_op = 1;
s->has_df = 1;
s->has_btc = 1;
@@ -1191,9 +1270,7 @@ init_model (struct scanner *s)
/* specific settings missing from vpd */
if (strstr (s->model_name,"DR-9080")
|| strstr (s->model_name,"DR-7580")){
-#ifdef SANE_FRAME_JPEG
s->has_comp_JPEG = 1;
-#endif
s->rgb_format = 2;
}
@@ -1203,7 +1280,10 @@ init_model (struct scanner *s)
else if (strstr (s->model_name,"DR-9050")
|| strstr (s->model_name,"DR-7550")
- || strstr (s->model_name,"DR-6050")){
+ || strstr (s->model_name,"DR-6050")
+ || strstr (s->model_name,"DR-G1100")
+ || strstr (s->model_name,"DR-G1130")
+ ){
/*missing*/
s->std_res_x[DPI_100]=1;
@@ -1367,6 +1447,7 @@ init_model (struct scanner *s)
s->has_ssm_pay_head_len = 1;
s->ppl_mod = 8;
s->ccal_version = 3;
+ s->can_read_sensors = 1;
}
else if (strstr (s->model_name, "P-215")) {
@@ -1382,6 +1463,150 @@ init_model (struct scanner *s)
s->has_ssm_pay_head_len = 1;
s->ppl_mod = 8;
s->ccal_version = 3;
+ s->can_read_sensors = 1;
+ s->has_card = 1;
+ }
+
+ else if (strstr (s->model_name,"DR-M160")){
+
+ /*missing*/
+ s->std_res_x[DPI_100]=1;
+ s->std_res_y[DPI_100]=1;
+ s->std_res_x[DPI_150]=1;
+ s->std_res_y[DPI_150]=1;
+ s->std_res_x[DPI_200]=1;
+ s->std_res_y[DPI_200]=1;
+ s->std_res_x[DPI_300]=1;
+ s->std_res_y[DPI_300]=1;
+ s->std_res_x[DPI_400]=1;
+ s->std_res_y[DPI_400]=1;
+ s->std_res_x[DPI_600]=1;
+ s->std_res_y[DPI_600]=1;
+
+ s->has_comp_JPEG = 1;
+ s->rgb_format = 1;
+ s->can_color = 1;
+ s->has_df_ultra = 1;
+
+ s->color_inter_by_res[DPI_100] = COLOR_INTERLACE_GBR;
+ s->color_inter_by_res[DPI_150] = COLOR_INTERLACE_GBR;
+ s->color_inter_by_res[DPI_200] = COLOR_INTERLACE_BRG;
+ s->color_inter_by_res[DPI_400] = COLOR_INTERLACE_GBR;
+
+ /*weirdness*/
+ s->always_op = 0;
+ s->fixed_width = 1;
+ s->invert_tly = 1;
+ s->can_write_panel = 0;
+ s->has_ssm = 0;
+ s->has_ssm2 = 1;
+ s->duplex_interlace = DUPLEX_INTERLACE_FFBB;
+ s->duplex_offset_side = SIDE_FRONT;
+
+ /*lies*/
+ s->can_halftone=0;
+ s->can_monochrome=0;
+ }
+
+ else if (strstr (s->model_name,"DR-M140")){
+
+ /*missing*/
+ s->std_res_x[DPI_100]=1;
+ s->std_res_y[DPI_100]=1;
+ s->std_res_x[DPI_150]=1;
+ s->std_res_y[DPI_150]=1;
+ s->std_res_x[DPI_200]=1;
+ s->std_res_y[DPI_200]=1;
+ s->std_res_x[DPI_300]=1;
+ s->std_res_y[DPI_300]=1;
+ s->std_res_x[DPI_400]=1;
+ s->std_res_y[DPI_400]=1;
+ s->std_res_x[DPI_600]=1;
+ s->std_res_y[DPI_600]=1;
+
+ s->has_comp_JPEG = 1;
+ s->rgb_format = 1;
+ s->can_color = 1;
+ s->has_df_ultra = 1;
+
+ s->color_inter_by_res[DPI_100] = COLOR_INTERLACE_GBR;
+ s->color_inter_by_res[DPI_150] = COLOR_INTERLACE_GBR;
+ s->color_inter_by_res[DPI_200] = COLOR_INTERLACE_BRG;
+ s->color_inter_by_res[DPI_400] = COLOR_INTERLACE_GBR;
+
+ /*weirdness*/
+ s->always_op = 0;
+ s->fixed_width = 1;
+ s->invert_tly = 1;
+ s->can_write_panel = 0;
+ s->has_ssm = 0;
+ s->has_ssm2 = 1;
+ s->duplex_interlace = DUPLEX_INTERLACE_FFBB;
+ s->duplex_offset_side = SIDE_BACK;
+
+ /*lies*/
+ s->can_halftone=0;
+ s->can_monochrome=0;
+ }
+
+ else if (strstr (s->model_name,"DR-C125")){
+
+ /*confirmed settings*/
+ s->gray_interlace[SIDE_FRONT] = GRAY_INTERLACE_2510;
+ s->gray_interlace[SIDE_BACK] = GRAY_INTERLACE_2510;
+ s->color_interlace[SIDE_FRONT] = COLOR_INTERLACE_2510;
+ s->color_interlace[SIDE_BACK] = COLOR_INTERLACE_2510;
+ s->duplex_interlace = DUPLEX_INTERLACE_2510;
+ s->duplex_offset_side = SIDE_BACK;
+ s->unknown_byte2 = 0x88;
+ s->need_ccal = 1;
+ s->ccal_version = 3;
+ s->need_fcal = 1;
+ s->sw_lut = 1;
+ s->can_color = 1;
+ s->rgb_format = 1;
+ /*s->duplex_offset = 400; now set in config file*/
+
+ /*only in Y direction, so we trash them in X*/
+ s->std_res_x[DPI_100]=0;
+ s->std_res_x[DPI_150]=0;
+ s->std_res_x[DPI_200]=0;
+ s->std_res_x[DPI_240]=0;
+ s->std_res_x[DPI_400]=0;
+
+ /*suspected settings*/
+ s->always_op = 0;
+ s->fixed_width = 1;
+ s->valid_x = 8.5 * 1200;
+ }
+
+ else if (strstr (s->model_name,"DR-C225")){
+
+ s->color_interlace[SIDE_FRONT] = COLOR_INTERLACE_RRGGBB;
+ s->color_interlace[SIDE_BACK] = COLOR_INTERLACE_rRgGbB;
+ s->gray_interlace[SIDE_BACK] = GRAY_INTERLACE_gG;
+ s->duplex_interlace = DUPLEX_INTERLACE_FBFB;
+
+ s->unknown_byte2 = 0x88;
+ s->need_ccal = 1;
+ s->ccal_version = 3;
+ s->need_fcal = 1;
+ s->invert_tly = 1;
+ s->can_color = 1;
+ s->rgb_format = 1;
+ /*s->duplex_offset = 400; now set in config file*/
+
+ /*only in Y direction, so we trash them in X*/
+ s->std_res_x[DPI_100]=0;
+ s->std_res_x[DPI_150]=0;
+ s->std_res_x[DPI_200]=0;
+ s->std_res_x[DPI_240]=0;
+ s->std_res_x[DPI_400]=0;
+
+ /*suspected settings*/
+ s->always_op = 0;
+ s->fixed_width = 1;
+ s->valid_x = 8.5 * 1200;
}
DBG (10, "init_model: finish\n");
@@ -1435,6 +1660,8 @@ init_user (struct scanner *s)
s->u.source = SOURCE_FLATBED;
else if(s->has_adf)
s->u.source = SOURCE_ADF_FRONT;
+ else if(s->has_card)
+ s->u.source = SOURCE_CARD_FRONT;
/* scan mode */
if(s->can_monochrome)
@@ -1628,6 +1855,16 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
s->source_list[i++]=STRING_ADFDUPLEX;
}
}
+ if(s->has_card){
+ s->source_list[i++]=STRING_CARDFRONT;
+
+ if(s->has_back){
+ s->source_list[i++]=STRING_CARDBACK;
+ }
+ if(s->has_duplex){
+ s->source_list[i++]=STRING_CARDDUPLEX;
+ }
+ }
s->source_list[i]=NULL;
opt->name = SANE_NAME_SCAN_SOURCE;
@@ -1841,7 +2078,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->constraint_type = SANE_CONSTRAINT_RANGE;
opt->constraint.range = &s->paper_x_range;
- if(s->has_adf){
+ if(s->has_adf || s->has_card){
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
if(s->u.source == SOURCE_FLATBED){
opt->cap |= SANE_CAP_INACTIVE;
@@ -1868,7 +2105,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->constraint_type = SANE_CONSTRAINT_RANGE;
opt->constraint.range = &s->paper_y_range;
- if(s->has_adf){
+ if(s->has_adf || s->has_card){
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
if(s->u.source == SOURCE_FLATBED){
opt->cap |= SANE_CAP_INACTIVE;
@@ -1985,7 +2222,9 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
s->compress_list[i++]=STRING_NONE;
if(s->has_comp_JPEG){
+#ifndef SANE_JPEG_DISABLED
s->compress_list[i++]=STRING_JPEG;
+#endif
}
s->compress_list[i]=NULL;
@@ -2306,6 +2545,28 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->cap = SANE_CAP_INACTIVE;
}
+ if(option==OPT_ADF_LOADED){
+ opt->name = "adf-loaded";
+ opt->title = "ADF Loaded";
+ opt->desc = "Paper available in ADF input hopper";
+ opt->type = SANE_TYPE_BOOL;
+ opt->unit = SANE_UNIT_NONE;
+ opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
+ if(!s->can_read_sensors)
+ opt->cap = SANE_CAP_INACTIVE;
+ }
+
+ if(option==OPT_CARD_LOADED){
+ opt->name = "card-loaded";
+ opt->title = "Card Loaded";
+ opt->desc = "Paper available in card reader";
+ opt->type = SANE_TYPE_BOOL;
+ opt->unit = SANE_UNIT_NONE;
+ opt->cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED;
+ if(!s->can_read_sensors || !s->has_card)
+ opt->cap = SANE_CAP_INACTIVE;
+ }
+
return opt;
}
@@ -2382,6 +2643,15 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
else if(s->u.source == SOURCE_ADF_DUPLEX){
strcpy (val, STRING_ADFDUPLEX);
}
+ else if(s->u.source == SOURCE_CARD_FRONT){
+ strcpy (val, STRING_CARDFRONT);
+ }
+ else if(s->u.source == SOURCE_CARD_BACK){
+ strcpy (val, STRING_CARDBACK);
+ }
+ else if(s->u.source == SOURCE_CARD_DUPLEX){
+ strcpy (val, STRING_CARDDUPLEX);
+ }
return SANE_STATUS_GOOD;
case OPT_MODE:
@@ -2581,6 +2851,15 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
*val_p = s->panel_counter;
return ret;
+ case OPT_ADF_LOADED:
+ ret = read_sensors(s,OPT_ADF_LOADED);
+ *val_p = s->sensor_adf_loaded;
+ return ret;
+
+ case OPT_CARD_LOADED:
+ ret = read_sensors(s,OPT_CARD_LOADED);
+ *val_p = s->sensor_card_loaded;
+ return ret;
}
}
else if (action == SANE_ACTION_SET_VALUE) {
@@ -2629,6 +2908,15 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
else if (!strcmp (val, STRING_ADFDUPLEX)) {
tmp = SOURCE_ADF_DUPLEX;
}
+ else if (!strcmp (val, STRING_CARDFRONT)) {
+ tmp = SOURCE_CARD_FRONT;
+ }
+ else if (!strcmp (val, STRING_CARDBACK)) {
+ tmp = SOURCE_CARD_BACK;
+ }
+ else if (!strcmp (val, STRING_CARDDUPLEX)) {
+ tmp = SOURCE_CARD_DUPLEX;
+ }
else{
tmp = SOURCE_FLATBED;
}
@@ -2837,54 +3125,85 @@ ssm_buffer (struct scanner *s)
{
SANE_Status ret = SANE_STATUS_GOOD;
- unsigned char cmd[SET_SCAN_MODE_len];
- size_t cmdLen = SET_SCAN_MODE_len;
-
- unsigned char out[SSM_PAY_len];
- size_t outLen = SSM_PAY_len;
-
DBG (10, "ssm_buffer: start\n");
- if(!s->has_ssm){
- DBG (10, "ssm_buffer: unsupported\n");
- return ret;
+ if(s->has_ssm){
+
+ unsigned char cmd[SET_SCAN_MODE_len];
+ size_t cmdLen = SET_SCAN_MODE_len;
+
+ unsigned char out[SSM_PAY_len];
+ size_t outLen = SSM_PAY_len;
+
+ memset(cmd,0,cmdLen);
+ set_SCSI_opcode(cmd, SET_SCAN_MODE_code);
+ set_SSM_pf(cmd, 1);
+ set_SSM_pay_len(cmd, outLen);
+
+ memset(out,0,outLen);
+ if(s->has_ssm_pay_head_len){
+ set_SSM_pay_head_len(out, SSM_PAY_HEAD_len);
+ }
+ set_SSM_page_code(out, SM_pc_buffer);
+ set_SSM_page_len(out, SSM_PAGE_len);
+
+ if(s->s.source == SOURCE_ADF_DUPLEX || s->s.source == SOURCE_CARD_DUPLEX){
+ set_SSM_BUFF_duplex(out, 1);
+ }
+ if(s->s.source == SOURCE_FLATBED){
+ set_SSM_BUFF_fb(out, 1);
+ }
+ else if(s->s.source >= SOURCE_CARD_FRONT){
+ set_SSM_BUFF_card(out, 1);
+ }
+ if(s->buffermode){
+ set_SSM_BUFF_async(out, 1);
+ }
+ if(0){
+ set_SSM_BUFF_ald(out, 1);
+ }
+ if(0){
+ set_SSM_BUFF_unk(out,1);
+ }
+
+ ret = do_cmd (
+ s, 1, 0,
+ cmd, cmdLen,
+ out, outLen,
+ NULL, NULL
+ );
}
- memset(cmd,0,cmdLen);
- set_SCSI_opcode(cmd, SET_SCAN_MODE_code);
- set_SSM_pf(cmd, 1);
- set_SSM_pay_len(cmd, outLen);
+ else if(s->has_ssm2){
- memset(out,0,outLen);
- if(s->has_ssm_pay_head_len){
- set_SSM_pay_head_len(out, SSM_PAY_HEAD_len);
+ unsigned char cmd[SET_SCAN_MODE2_len];
+ size_t cmdLen = SET_SCAN_MODE2_len;
+
+ unsigned char out[SSM2_PAY_len];
+ size_t outLen = SSM2_PAY_len;
+
+ memset(cmd,0,cmdLen);
+ set_SCSI_opcode(cmd, SET_SCAN_MODE2_code);
+ set_SSM2_page_code(cmd, SM2_pc_buffer);
+ set_SSM2_pay_len(cmd, outLen);
+
+ memset(out,0,outLen);
+ set_SSM2_BUFF_unk(out, !s->buffermode);
+ set_SSM2_BUFF_unk2(out, 0x40);
+ set_SSM2_BUFF_sync(out, !s->buffermode);
+
+ ret = do_cmd (
+ s, 1, 0,
+ cmd, cmdLen,
+ out, outLen,
+ NULL, NULL
+ );
}
- set_SSM_page_code(out, SM_pc_buffer);
- set_SSM_page_len(out, SSM_PAGE_len);
- if(s->s.source == SOURCE_ADF_DUPLEX){
- set_SSM_BUFF_duplex(out, 1);
- }
- else if(s->s.source == SOURCE_FLATBED){
- set_SSM_BUFF_fb(out, 1);
- }
- if(s->buffermode){
- set_SSM_BUFF_async(out, 1);
- }
- if(0){
- set_SSM_BUFF_ald(out, 1);
- }
- if(0){
- set_SSM_BUFF_unk(out,1);
+ else{
+ DBG (10, "ssm_buffer: unsupported\n");
}
- ret = do_cmd (
- s, 1, 0,
- cmd, cmdLen,
- out, outLen,
- NULL, NULL
- );
-
DBG (10, "ssm_buffer: finish\n");
return ret;
@@ -2895,57 +3214,118 @@ ssm_df (struct scanner *s)
{
SANE_Status ret = SANE_STATUS_GOOD;
- unsigned char cmd[SET_SCAN_MODE_len];
- size_t cmdLen = SET_SCAN_MODE_len;
-
- unsigned char out[SSM_PAY_len];
- size_t outLen = SSM_PAY_len;
-
DBG (10, "ssm_df: start\n");
-
- if(!s->has_ssm || !s->has_df){
+
+ if(!s->has_df){
DBG (10, "ssm_df: unsupported, finishing\n");
return ret;
}
+
+ if(s->has_ssm){
- memset(cmd,0,cmdLen);
- set_SCSI_opcode(cmd, SET_SCAN_MODE_code);
- set_SSM_pf(cmd, 1);
- set_SSM_pay_len(cmd, outLen);
+ unsigned char cmd[SET_SCAN_MODE_len];
+ size_t cmdLen = SET_SCAN_MODE_len;
+
+ unsigned char out[SSM_PAY_len];
+ size_t outLen = SSM_PAY_len;
+
+ memset(cmd,0,cmdLen);
+ set_SCSI_opcode(cmd, SET_SCAN_MODE_code);
+ set_SSM_pf(cmd, 1);
+ set_SSM_pay_len(cmd, outLen);
+
+ memset(out,0,outLen);
+ if(s->has_ssm_pay_head_len){
+ set_SSM_pay_head_len(out, SSM_PAY_HEAD_len);
+ }
+ set_SSM_page_code(out, SM_pc_df);
+ set_SSM_page_len(out, SSM_PAGE_len);
+
+ /* deskew by roller */
+ if(s->rollerdeskew){
+ set_SSM_DF_deskew_roll(out, 1);
+ }
+
+ /* staple detection */
+ if(s->stapledetect){
+ set_SSM_DF_staple(out, 1);
+ }
+
+ /* thickness */
+ if(s->df_thickness){
+ set_SSM_DF_thick(out, 1);
+ }
+
+ /* length */
+ if(s->df_length){
+ set_SSM_DF_len(out, 1);
+ }
+
+ ret = do_cmd (
+ s, 1, 0,
+ cmd, cmdLen,
+ out, outLen,
+ NULL, NULL
+ );
- memset(out,0,outLen);
- if(s->has_ssm_pay_head_len){
- set_SSM_pay_head_len(out, SSM_PAY_HEAD_len);
}
- set_SSM_page_code(out, SM_pc_df);
- set_SSM_page_len(out, SSM_PAGE_len);
- /* deskew by roller */
- if(s->rollerdeskew){
- set_SSM_DF_deskew_roll(out, 1);
- }
+ else if(s->has_ssm2){
+
+ unsigned char cmd[SET_SCAN_MODE2_len];
+ size_t cmdLen = SET_SCAN_MODE2_len;
- /* staple detection */
- if(s->stapledetect){
- set_SSM_DF_staple(out, 1);
- }
+ unsigned char out[SSM2_PAY_len];
+ size_t outLen = SSM2_PAY_len;
+
+ /* send ultrasonic offsets first */
+ if(s->df_thickness && s->has_df_ultra){
+ memset(cmd,0,cmdLen);
+ set_SCSI_opcode(cmd, SET_SCAN_MODE2_code);
+ set_SSM2_page_code(cmd, SM2_pc_ultra);
+ set_SSM2_pay_len(cmd, outLen);
+
+ memset(out,0,outLen);
+ set_SSM2_ULTRA_top(out, 0);
+ set_SSM2_ULTRA_bot(out, 0);
+
+ ret = do_cmd (
+ s, 1, 0,
+ cmd, cmdLen,
+ out, outLen,
+ NULL, NULL
+ );
+ }
- /* thickness */
- if(s->df_thickness){
- set_SSM_DF_thick(out, 1);
- }
+ memset(cmd,0,cmdLen);
+ set_SCSI_opcode(cmd, SET_SCAN_MODE2_code);
+ set_SSM2_page_code(cmd, SM2_pc_df);
+ set_SSM2_pay_len(cmd, outLen);
- /* length */
- if(s->df_length){
- set_SSM_DF_len(out, 1);
+ memset(out,0,outLen);
+
+ /* thickness */
+ if(s->df_thickness){
+ set_SSM2_DF_thick(out, 1);
+ }
+
+ /* length */
+ if(s->df_length){
+ set_SSM2_DF_len(out, 1);
+ }
+
+ ret = do_cmd (
+ s, 1, 0,
+ cmd, cmdLen,
+ out, outLen,
+ NULL, NULL
+ );
+
}
- ret = do_cmd (
- s, 1, 0,
- cmd, cmdLen,
- out, outLen,
- NULL, NULL
- );
+ else{
+ DBG (10, "ssm_df: unsupported\n");
+ }
DBG (10, "ssm_df: finish\n");
@@ -2957,140 +3337,203 @@ ssm_do (struct scanner *s)
{
SANE_Status ret = SANE_STATUS_GOOD;
- unsigned char cmd[SET_SCAN_MODE_len];
- size_t cmdLen = SET_SCAN_MODE_len;
+ DBG (10, "ssm_do: start\n");
- unsigned char out[SSM_PAY_len];
- size_t outLen = SSM_PAY_len;
+ if(!s->can_color){
+ DBG (10, "ssm_do: unsupported, finishing\n");
+ return ret;
+ }
+
+ if(s->has_ssm){
- DBG (10, "ssm_do: start\n");
+ unsigned char cmd[SET_SCAN_MODE_len];
+ size_t cmdLen = SET_SCAN_MODE_len;
+
+ unsigned char out[SSM_PAY_len];
+ size_t outLen = SSM_PAY_len;
+
+ memset(cmd,0,cmdLen);
+ set_SCSI_opcode(cmd, SET_SCAN_MODE_code);
+ set_SSM_pf(cmd, 1);
+ set_SSM_pay_len(cmd, outLen);
+
+ memset(out,0,outLen);
+ if(s->has_ssm_pay_head_len){
+ set_SSM_pay_head_len(out, SSM_PAY_HEAD_len);
+ }
+ set_SSM_page_code(out, SM_pc_dropout);
+ set_SSM_page_len(out, SSM_PAGE_len);
+
+ set_SSM_DO_unk1(out, 0x03);
+
+ switch(s->dropout_color_f){
+ case COLOR_RED:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_f_do(out,SSM_DO_red);
+ break;
+ case COLOR_GREEN:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_f_do(out,SSM_DO_green);
+ break;
+ case COLOR_BLUE:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_f_do(out,SSM_DO_blue);
+ break;
+ case COLOR_EN_RED:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_f_en(out,SSM_DO_red);
+ break;
+ case COLOR_EN_GREEN:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_f_en(out,SSM_DO_green);
+ break;
+ case COLOR_EN_BLUE:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_f_en(out,SSM_DO_blue);
+ break;
+ }
+
+ switch(s->dropout_color_b){
+ case COLOR_RED:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_b_do(out,SSM_DO_red);
+ break;
+ case COLOR_GREEN:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_b_do(out,SSM_DO_green);
+ break;
+ case COLOR_BLUE:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_b_do(out,SSM_DO_blue);
+ break;
+ case COLOR_EN_RED:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_b_en(out,SSM_DO_red);
+ break;
+ case COLOR_EN_GREEN:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_b_en(out,SSM_DO_green);
+ break;
+ case COLOR_EN_BLUE:
+ set_SSM_DO_unk2(out, 0x05);
+ set_SSM_DO_b_en(out,SSM_DO_blue);
+ break;
+ }
+
+ ret = do_cmd (
+ s, 1, 0,
+ cmd, cmdLen,
+ out, outLen,
+ NULL, NULL
+ );
- if(!s->has_ssm || !s->can_color){
- DBG (10, "ssm_do: unsupported, finishing\n");
- return ret;
}
- memset(cmd,0,cmdLen);
- set_SCSI_opcode(cmd, SET_SCAN_MODE_code);
- set_SSM_pf(cmd, 1);
- set_SSM_pay_len(cmd, outLen);
+ else if(s->has_ssm2){
- memset(out,0,outLen);
- if(s->has_ssm_pay_head_len){
- set_SSM_pay_head_len(out, SSM_PAY_HEAD_len);
- }
- set_SSM_page_code(out, SM_pc_dropout);
- set_SSM_page_len(out, SSM_PAGE_len);
-
- set_SSM_DO_unk1(out, 0x03);
+ unsigned char cmd[SET_SCAN_MODE2_len];
+ size_t cmdLen = SET_SCAN_MODE2_len;
+
+ unsigned char out[SSM2_PAY_len];
+ size_t outLen = SSM2_PAY_len;
+
+ memset(cmd,0,cmdLen);
+ set_SCSI_opcode(cmd, SET_SCAN_MODE2_code);
+ set_SSM2_page_code(cmd, SM2_pc_dropout);
+ set_SSM2_pay_len(cmd, outLen);
+
+ memset(out,0,outLen);
+
+ switch(s->dropout_color_f){
+ case COLOR_RED:
+ set_SSM2_DO_do(out,SSM_DO_red);
+ break;
+ case COLOR_GREEN:
+ set_SSM2_DO_do(out,SSM_DO_green);
+ break;
+ case COLOR_BLUE:
+ set_SSM2_DO_do(out,SSM_DO_blue);
+ break;
+ case COLOR_EN_RED:
+ set_SSM2_DO_en(out,SSM_DO_red);
+ break;
+ case COLOR_EN_GREEN:
+ set_SSM2_DO_en(out,SSM_DO_green);
+ break;
+ case COLOR_EN_BLUE:
+ set_SSM2_DO_en(out,SSM_DO_blue);
+ break;
+ }
- switch(s->dropout_color_f){
- case COLOR_RED:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_f_do(out,SSM_DO_red);
- break;
- case COLOR_GREEN:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_f_do(out,SSM_DO_green);
- break;
- case COLOR_BLUE:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_f_do(out,SSM_DO_blue);
- break;
- case COLOR_EN_RED:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_f_en(out,SSM_DO_red);
- break;
- case COLOR_EN_GREEN:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_f_en(out,SSM_DO_green);
- break;
- case COLOR_EN_BLUE:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_f_en(out,SSM_DO_blue);
- break;
+ ret = do_cmd (
+ s, 1, 0,
+ cmd, cmdLen,
+ out, outLen,
+ NULL, NULL
+ );
}
- switch(s->dropout_color_b){
- case COLOR_RED:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_b_do(out,SSM_DO_red);
- break;
- case COLOR_GREEN:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_b_do(out,SSM_DO_green);
- break;
- case COLOR_BLUE:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_b_do(out,SSM_DO_blue);
- break;
- case COLOR_EN_RED:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_b_en(out,SSM_DO_red);
- break;
- case COLOR_EN_GREEN:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_b_en(out,SSM_DO_green);
- break;
- case COLOR_EN_BLUE:
- set_SSM_DO_unk2(out, 0x05);
- set_SSM_DO_b_en(out,SSM_DO_blue);
- break;
+ else{
+ DBG (10, "ssm_do: unsupported\n");
}
- ret = do_cmd (
- s, 1, 0,
- cmd, cmdLen,
- out, outLen,
- NULL, NULL
- );
-
DBG (10, "ssm_do: finish\n");
return ret;
}
-/* used by recent scanners. meaning of payloads unknown */
static SANE_Status
-ssm2 (struct scanner *s)
+read_sensors(struct scanner *s,SANE_Int option)
{
- SANE_Status ret = SANE_STATUS_GOOD;
-
- unsigned char cmd[SET_SCAN_MODE2_len];
- size_t cmdLen = SET_SCAN_MODE2_len;
+ SANE_Status ret=SANE_STATUS_GOOD;
- unsigned char out[SSM2_PAY_len];
- size_t outLen = SSM2_PAY_len;
+ unsigned char cmd[READ_len];
+ size_t cmdLen = READ_len;
- DBG (10, "ssm2:start\n");
+ unsigned char in[R_SENSORS_len];
+ size_t inLen = R_SENSORS_len;
- if(!s->has_ssm2){
- DBG (10, "ssm2: unsupported, finishing\n");
+ DBG (10, "read_sensors: start %d\n", option);
+
+ if(!s->can_read_sensors){
+ DBG (10, "read_sensors: unsupported, finishing\n");
return ret;
}
- memset(cmd,0,cmdLen);
- set_SCSI_opcode(cmd, SET_SCAN_MODE2_code);
- /*FIXME: set this correctly */
- set_SSM2_page_code(cmd, 0);
- set_SSM2_pay_len(cmd, outLen);
+ /* only run this if frontend has already read the last time we got it */
+ /* or if we don't care for such bookkeeping (private use) */
+ if (!option || !s->sensors_read[option-OPT_ADF_LOADED]) {
- /*FIXME: set these correctly */
- memset(out,0,outLen);
- set_SSM2_unk(out, 0);
- set_SSM2_unk2(out, 0);
- set_SSM2_unk3(out, 0);
+ DBG (15, "read_sensors: running\n");
- /*
- ret = do_cmd (
+ memset(cmd,0,cmdLen);
+ set_SCSI_opcode(cmd, READ_code);
+ set_R_datatype_code (cmd, SR_datatype_sensors);
+ set_R_xfer_length (cmd, inLen);
+
+ ret = do_cmd (
s, 1, 0,
cmd, cmdLen,
- out, outLen,
- NULL, NULL
- );*/
+ NULL, 0,
+ in, &inLen
+ );
+
+ if (ret == SANE_STATUS_GOOD || ret == SANE_STATUS_EOF) {
+ /*set flags indicating there is data to read*/
+ memset(s->sensors_read,1,sizeof(s->sensors_read));
- DBG (10, "ssm2: finish\n");
+ s->sensor_adf_loaded = get_R_SENSORS_adf(in);
+ s->sensor_card_loaded = get_R_SENSORS_card(in);
+ ret = SANE_STATUS_GOOD;
+ }
+ }
+
+ if(option)
+ s->sensors_read[option-OPT_ADF_LOADED] = 0;
+
+ DBG (10, "read_sensors: finish\n");
+
return ret;
}
@@ -3112,9 +3555,9 @@ read_panel(struct scanner *s,SANE_Int option)
return ret;
}
- /* only run this if frontend has read previous value
- * or if the caller does not want the data stored */
- if (!option || !s->hw_read[option-OPT_START]) {
+ /* only run this if frontend has already read the last time we got it */
+ /* or if we don't care for such bookkeeping (private use) */
+ if (!option || !s->panel_read[option-OPT_START]) {
DBG (15, "read_panel: running\n");
@@ -3132,8 +3575,7 @@ read_panel(struct scanner *s,SANE_Int option)
if (ret == SANE_STATUS_GOOD || ret == SANE_STATUS_EOF) {
/*set flags indicating there is data to read*/
- if(option)
- memset(s->hw_read,1,sizeof(s->hw_read));
+ memset(s->panel_read,1,sizeof(s->panel_read));
s->panel_start = get_R_PANEL_start(in);
s->panel_stop = get_R_PANEL_stop(in);
@@ -3143,12 +3585,13 @@ read_panel(struct scanner *s,SANE_Int option)
s->panel_bypass_mode = get_R_PANEL_bypass_mode(in);
s->panel_enable_led = get_R_PANEL_enable_led(in);
s->panel_counter = get_R_PANEL_counter(in);
+
ret = SANE_STATUS_GOOD;
}
}
if(option)
- s->hw_read[option-OPT_START] = 0;
+ s->panel_read[option-OPT_START] = 0;
DBG (10, "read_panel: finish %d\n",s->panel_counter);
@@ -3294,14 +3737,12 @@ update_params(struct scanner *s, int calib)
/* round down to pixel boundary for some scanners */
s->u.width -= s->u.width % s->ppl_mod;
-#ifdef SANE_FRAME_JPEG
/* jpeg requires 8x8 squares */
if(s->compress == COMP_JPEG && s->u.mode >= MODE_GRAYSCALE){
s->u.format = SANE_FRAME_JPEG;
s->u.width -= s->u.width % 8;
s->u.height -= s->u.height % 8;
}
-#endif
s->u.Bpl = s->u.width * s->u.bpp / 8;
s->u.valid_Bpl = s->u.Bpl;
@@ -3396,7 +3837,8 @@ update_params(struct scanner *s, int calib)
}
/* some scanners need longer scans because front/back is offset */
- if(s->u.source == SOURCE_ADF_DUPLEX && s->duplex_offset && !calib)
+ if((s->u.source == SOURCE_ADF_DUPLEX || s->u.source == SOURCE_CARD_DUPLEX)
+ && s->duplex_offset && !calib)
s->s.height = (s->u.br_y-s->u.tl_y+s->duplex_offset) * s->u.dpi_y / 1200;
/* round lines up to even number */
@@ -3421,7 +3863,7 @@ update_params(struct scanner *s, int calib)
else{
memcpy(&s->i,&s->u,sizeof(struct img_params));
/*dumb scanners pad the top of front page in duplex*/
- if(s->i.source == SOURCE_ADF_DUPLEX)
+ if(s->i.source == SOURCE_ADF_DUPLEX || s->i.source == SOURCE_CARD_DUPLEX)
s->i.skip_lines[s->duplex_offset_side] = s->duplex_offset * s->i.dpi_y / 1200;
}
@@ -3485,7 +3927,7 @@ sane_start (SANE_Handle handle)
if(!s->started){
/* load side marker */
- if(s->u.source == SOURCE_ADF_BACK){
+ if(s->u.source == SOURCE_ADF_BACK || s->u.source == SOURCE_CARD_BACK){
s->side = SIDE_BACK;
}
else{
@@ -3549,7 +3991,7 @@ sane_start (SANE_Handle handle)
goto errors;
}
- /* buffer/duplex/ald command */
+ /* buffer/duplex/ald/fb/card command */
ret = ssm_buffer(s);
if (ret != SANE_STATUS_GOOD) {
DBG (5, "sane_start: ERROR: cannot ssm buffer\n");
@@ -3591,18 +4033,21 @@ sane_start (SANE_Handle handle)
goto errors;
}
- /* grab next page */
- ret = object_position (s, SANE_TRUE);
- if (ret != SANE_STATUS_GOOD) {
- DBG (5, "sane_start: ERROR: cannot load page\n");
- goto errors;
- }
-
- /* wait for scanner to finish load */
- ret = wait_scanner (s);
- if (ret != SANE_STATUS_GOOD) {
- DBG (5, "sane_start: ERROR: cannot wait scanner\n");
- goto errors;
+ /* card reader dislikes op? */
+ if(s->s.source < SOURCE_CARD_FRONT){
+ /* grab next page */
+ ret = object_position (s, SANE_TRUE);
+ if (ret != SANE_STATUS_GOOD) {
+ DBG (5, "sane_start: ERROR: cannot load page\n");
+ goto errors;
+ }
+
+ /* wait for scanner to finish load */
+ ret = wait_scanner (s);
+ if (ret != SANE_STATUS_GOOD) {
+ DBG (5, "sane_start: ERROR: cannot wait scanner\n");
+ goto errors;
+ }
}
/* start scanning */
@@ -3619,7 +4064,7 @@ sane_start (SANE_Handle handle)
else{
/* duplex needs to switch sides */
- if(s->s.source == SOURCE_ADF_DUPLEX){
+ if(s->s.source == SOURCE_ADF_DUPLEX || s->s.source == SOURCE_CARD_DUPLEX){
s->side = !s->side;
}
@@ -3635,7 +4080,7 @@ sane_start (SANE_Handle handle)
/* otherwise buffered back page will be lost */
/* ingest paper with adf (no-op for fb) */
/* dont call object pos or scan on back side of duplex scan */
- if(s->side == SIDE_FRONT || s->s.source == SOURCE_ADF_BACK){
+ if(s->side == SIDE_FRONT || s->s.source == SOURCE_ADF_BACK || s->s.source == SOURCE_CARD_BACK){
/* clean scan params for new scan */
ret = clean_params(s);
@@ -3694,9 +4139,7 @@ sane_start (SANE_Handle handle)
* API has no way to inform the frontend of this,
* so we block and buffer. yuck */
if( (s->swdeskew || s->swdespeck || s->swcrop)
-#ifdef SANE_FRAME_JPEG
&& s->s.format != SANE_FRAME_JPEG
-#endif
){
/* get image */
@@ -3772,23 +4215,26 @@ clean_params (struct scanner *s)
s->s.bytes_tot[1]=0;
/* store the number of front bytes */
- if ( s->u.source != SOURCE_ADF_BACK )
+ if ( s->u.source != SOURCE_ADF_BACK && s->u.source != SOURCE_CARD_BACK )
s->u.bytes_tot[SIDE_FRONT] = s->u.Bpl * s->u.height;
- if ( s->i.source != SOURCE_ADF_BACK )
+ if ( s->i.source != SOURCE_ADF_BACK && s->i.source != SOURCE_CARD_BACK )
s->i.bytes_tot[SIDE_FRONT] = s->i.Bpl * s->i.height;
- if ( s->s.source != SOURCE_ADF_BACK )
+ if ( s->s.source != SOURCE_ADF_BACK && s->s.source != SOURCE_CARD_BACK )
s->s.bytes_tot[SIDE_FRONT] = s->s.Bpl * s->s.height;
/* store the number of back bytes */
- if ( s->u.source == SOURCE_ADF_DUPLEX || s->u.source == SOURCE_ADF_BACK )
+ if ( s->u.source == SOURCE_ADF_DUPLEX || s->u.source == SOURCE_ADF_BACK
+ || s->u.source == SOURCE_CARD_DUPLEX || s->u.source == SOURCE_CARD_BACK )
s->u.bytes_tot[SIDE_BACK] = s->u.Bpl * s->u.height;
- if ( s->i.source == SOURCE_ADF_DUPLEX || s->i.source == SOURCE_ADF_BACK )
+ if ( s->i.source == SOURCE_ADF_DUPLEX || s->i.source == SOURCE_ADF_BACK
+ || s->i.source == SOURCE_CARD_DUPLEX || s->i.source == SOURCE_CARD_BACK )
s->i.bytes_tot[SIDE_BACK] = s->i.Bpl * s->i.height;
- if ( s->s.source == SOURCE_ADF_DUPLEX || s->s.source == SOURCE_ADF_BACK )
+ if ( s->s.source == SOURCE_ADF_DUPLEX || s->s.source == SOURCE_ADF_BACK
+ || s->s.source == SOURCE_CARD_DUPLEX || s->s.source == SOURCE_CARD_BACK )
s->s.bytes_tot[SIDE_BACK] = s->s.Bpl * s->s.height;
DBG (10, "clean_params: finish\n");
@@ -3863,7 +4309,7 @@ set_window (struct scanner *s)
set_WPDB_wdblen(header, SW_desc_len);
/* init the window block */
- if (s->s.source == SOURCE_ADF_BACK) {
+ if (s->s.source == SOURCE_ADF_BACK || s->s.source == SOURCE_CARD_BACK) {
set_WD_wid (desc1, WD_wid_back);
}
else{
@@ -3933,13 +4379,11 @@ set_window (struct scanner *s)
set_WD_compress_type(desc1, COMP_NONE);
set_WD_compress_arg(desc1, 0);
-#ifdef SANE_FRAME_JPEG
/* some scanners support jpeg image compression, for color/gs only */
if(s->s.format == SANE_FRAME_JPEG){
set_WD_compress_type(desc1, COMP_JPEG);
set_WD_compress_arg(desc1, s->compress_arg);
}
-#endif
/*build the command*/
memset(cmd,0,cmdLen);
@@ -3953,7 +4397,7 @@ set_window (struct scanner *s)
NULL, NULL
);
- if (!ret && s->s.source == SOURCE_ADF_DUPLEX) {
+ if (!ret && (s->s.source == SOURCE_ADF_DUPLEX || s->s.source == SOURCE_CARD_DUPLEX)) {
set_WD_wid (desc1, WD_wid_back);
ret = do_cmd (
s, 1, 0,
@@ -4037,9 +4481,9 @@ start_scan (struct scanner *s, int type)
out[1] = type;
}
- if (s->s.source != SOURCE_ADF_DUPLEX) {
+ if (s->s.source != SOURCE_ADF_DUPLEX && s->s.source != SOURCE_CARD_DUPLEX) {
outLen--;
- if(s->s.source == SOURCE_ADF_BACK) {
+ if(s->s.source == SOURCE_ADF_BACK || s->s.source == SOURCE_CARD_BACK) {
out[0] = WD_wid_back;
}
}
@@ -4100,7 +4544,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
s->reading = 1;
/* double width pnm interlacing */
- if(s->s.source == SOURCE_ADF_DUPLEX
+ if((s->s.source == SOURCE_ADF_DUPLEX || s->s.source == SOURCE_CARD_DUPLEX)
&& s->s.format <= SANE_FRAME_RGB
&& s->duplex_interlace != DUPLEX_INTERLACE_NONE
){
@@ -4225,7 +4669,6 @@ read_from_scanner(struct scanner *s, int side, int exact)
inLen = 0;
}
-#ifdef SANE_FRAME_JPEG
/* this is jpeg data, we need to fix the missing image size */
if(s->s.format == SANE_FRAME_JPEG){
@@ -4275,7 +4718,6 @@ read_from_scanner(struct scanner *s, int side, int exact)
}
}
}
-#endif
/*scanner may have sent more data than we asked for, chop it*/
if(inLen > remain){
@@ -4301,37 +4743,32 @@ read_from_scanner(struct scanner *s, int side, int exact)
if(ret == SANE_STATUS_EOF){
- switch (s->s.format){
+ /* this is jpeg data, we need to change the total size */
+ if(s->s.format == SANE_FRAME_JPEG){
+ s->s.bytes_tot[side] = s->s.bytes_sent[side];
+ s->i.bytes_tot[side] = s->i.bytes_sent[side];
+ s->u.bytes_tot[side] = s->i.bytes_sent[side];
+ }
-#ifdef SANE_FRAME_JPEG
- /* this is jpeg data, we need to change the total size */
- case SANE_FRAME_JPEG:
- s->s.bytes_tot[side] = s->s.bytes_sent[side];
- s->i.bytes_tot[side] = s->i.bytes_sent[side];
- s->u.bytes_tot[side] = s->i.bytes_sent[side];
- break;
-#endif
-
- /* this is non-jpeg data, fill remainder, change rx'd size */
- default:
+ /* this is non-jpeg data, fill remainder, change rx'd size */
+ else{
- DBG (15, "read_from_scanner: eof: %d %d\n", s->i.bytes_tot[side], s->i.bytes_sent[side]);
+ DBG (15, "read_from_scanner: eof: %d %d\n", s->i.bytes_tot[side], s->i.bytes_sent[side]);
- /* clone the last line repeatedly until the end */
- while(s->i.bytes_tot[side] > s->i.bytes_sent[side]){
- memcpy(
- s->buffers[side]+s->i.bytes_sent[side]-s->i.Bpl,
- s->buffers[side]+s->i.bytes_sent[side],
- s->i.Bpl
- );
- s->i.bytes_sent[side] += s->i.Bpl;
- }
+ /* clone the last line repeatedly until the end */
+ while(s->i.bytes_tot[side] > s->i.bytes_sent[side]){
+ memcpy(
+ s->buffers[side]+s->i.bytes_sent[side]-s->i.Bpl,
+ s->buffers[side]+s->i.bytes_sent[side],
+ s->i.Bpl
+ );
+ s->i.bytes_sent[side] += s->i.Bpl;
+ }
- DBG (15, "read_from_scanner: eof2: %d %d\n", s->i.bytes_tot[side], s->i.bytes_sent[side]);
+ DBG (15, "read_from_scanner: eof2: %d %d\n", s->i.bytes_tot[side], s->i.bytes_sent[side]);
- /* pretend we got all the data from scanner */
- s->s.bytes_sent[side] = s->s.bytes_tot[side];
- break;
+ /* pretend we got all the data from scanner */
+ s->s.bytes_sent[side] = s->s.bytes_tot[side];
}
s->i.eof[side] = 1;
@@ -4441,57 +4878,52 @@ read_from_scanner_duplex(struct scanner *s,int exact)
if(ret == SANE_STATUS_EOF){
- switch (s->s.format){
-
-#ifdef SANE_FRAME_JPEG
- /* this is jpeg data, we need to change the total size */
- case SANE_FRAME_JPEG:
- s->s.bytes_tot[SIDE_FRONT] = s->s.bytes_sent[SIDE_FRONT];
- s->s.bytes_tot[SIDE_BACK] = s->s.bytes_sent[SIDE_BACK];
- s->i.bytes_tot[SIDE_FRONT] = s->i.bytes_sent[SIDE_FRONT];
- s->i.bytes_tot[SIDE_BACK] = s->i.bytes_sent[SIDE_BACK];
- s->u.bytes_tot[SIDE_FRONT] = s->i.bytes_sent[SIDE_FRONT];
- s->u.bytes_tot[SIDE_BACK] = s->i.bytes_sent[SIDE_BACK];
- break;
-#endif
-
- /* this is non-jpeg data, fill remainder, change rx'd size */
- default:
+ /* this is jpeg data, we need to change the total size */
+ if(s->s.format == SANE_FRAME_JPEG){
+ s->s.bytes_tot[SIDE_FRONT] = s->s.bytes_sent[SIDE_FRONT];
+ s->s.bytes_tot[SIDE_BACK] = s->s.bytes_sent[SIDE_BACK];
+ s->i.bytes_tot[SIDE_FRONT] = s->i.bytes_sent[SIDE_FRONT];
+ s->i.bytes_tot[SIDE_BACK] = s->i.bytes_sent[SIDE_BACK];
+ s->u.bytes_tot[SIDE_FRONT] = s->i.bytes_sent[SIDE_FRONT];
+ s->u.bytes_tot[SIDE_BACK] = s->i.bytes_sent[SIDE_BACK];
+ }
- DBG (15, "read_from_scanner_duplex: eof: %d %d %d %d\n",
- s->i.bytes_tot[SIDE_FRONT], s->i.bytes_sent[SIDE_FRONT],
- s->i.bytes_tot[SIDE_BACK], s->i.bytes_sent[SIDE_BACK]
- );
+ /* this is non-jpeg data, fill remainder, change rx'd size */
+ else{
- /* clone the last line repeatedly until the end */
- while(s->i.bytes_tot[SIDE_FRONT] > s->i.bytes_sent[SIDE_FRONT]){
- memcpy(
- s->buffers[SIDE_FRONT]+s->i.bytes_sent[SIDE_FRONT]-s->i.Bpl,
- s->buffers[SIDE_FRONT]+s->i.bytes_sent[SIDE_FRONT],
- s->i.Bpl
- );
- s->i.bytes_sent[SIDE_FRONT] += s->i.Bpl;
- }
+ DBG (15, "read_from_scanner_duplex: eof: %d %d %d %d\n",
+ s->i.bytes_tot[SIDE_FRONT], s->i.bytes_sent[SIDE_FRONT],
+ s->i.bytes_tot[SIDE_BACK], s->i.bytes_sent[SIDE_BACK]
+ );
- /* clone the last line repeatedly until the end */
- while(s->i.bytes_tot[SIDE_BACK] > s->i.bytes_sent[SIDE_BACK]){
- memcpy(
- s->buffers[SIDE_BACK]+s->i.bytes_sent[SIDE_BACK]-s->i.Bpl,
- s->buffers[SIDE_BACK]+s->i.bytes_sent[SIDE_BACK],
- s->i.Bpl
- );
- s->i.bytes_sent[SIDE_BACK] += s->i.Bpl;
- }
+ /* clone the last line repeatedly until the end */
+ while(s->i.bytes_tot[SIDE_FRONT] > s->i.bytes_sent[SIDE_FRONT]){
+ memcpy(
+ s->buffers[SIDE_FRONT]+s->i.bytes_sent[SIDE_FRONT]-s->i.Bpl,
+ s->buffers[SIDE_FRONT]+s->i.bytes_sent[SIDE_FRONT],
+ s->i.Bpl
+ );
+ s->i.bytes_sent[SIDE_FRONT] += s->i.Bpl;
+ }
- DBG (15, "read_from_scanner_duplex: eof2: %d %d %d %d\n",
- s->i.bytes_tot[SIDE_FRONT], s->i.bytes_sent[SIDE_FRONT],
- s->i.bytes_tot[SIDE_BACK], s->i.bytes_sent[SIDE_BACK]
+ /* clone the last line repeatedly until the end */
+ while(s->i.bytes_tot[SIDE_BACK] > s->i.bytes_sent[SIDE_BACK]){
+ memcpy(
+ s->buffers[SIDE_BACK]+s->i.bytes_sent[SIDE_BACK]-s->i.Bpl,
+ s->buffers[SIDE_BACK]+s->i.bytes_sent[SIDE_BACK],
+ s->i.Bpl
);
+ s->i.bytes_sent[SIDE_BACK] += s->i.Bpl;
+ }
- /* pretend we got all the data from scanner */
- s->s.bytes_sent[SIDE_FRONT] = s->s.bytes_tot[SIDE_FRONT];
- s->s.bytes_sent[SIDE_BACK] = s->s.bytes_tot[SIDE_BACK];
- break;
+ DBG (15, "read_from_scanner_duplex: eof2: %d %d %d %d\n",
+ s->i.bytes_tot[SIDE_FRONT], s->i.bytes_sent[SIDE_FRONT],
+ s->i.bytes_tot[SIDE_BACK], s->i.bytes_sent[SIDE_BACK]
+ );
+
+ /* pretend we got all the data from scanner */
+ s->s.bytes_sent[SIDE_FRONT] = s->s.bytes_tot[SIDE_FRONT];
+ s->s.bytes_sent[SIDE_BACK] = s->s.bytes_tot[SIDE_BACK];
}
s->i.eof[SIDE_FRONT] = 1;
@@ -4522,6 +4954,7 @@ copy_simplex(struct scanner *s, unsigned char * buf, int len, int side)
unsigned char * line = NULL;
int line_next = 0;
+ int inter = get_color_inter(s,side,s->s.dpi_x);
/* jpeg data should not pass thru this function, so copy and bail out */
if(s->s.format > SANE_FRAME_RGB){
@@ -4592,7 +5025,7 @@ copy_simplex(struct scanner *s, unsigned char * buf, int len, int side)
else if (s->s.format == SANE_FRAME_RGB){
- switch (s->color_interlace[side]) {
+ switch (inter) {
/* scanner returns color data as bgrbgr... */
case COLOR_INTERLACE_BGR:
@@ -4604,6 +5037,26 @@ copy_simplex(struct scanner *s, unsigned char * buf, int len, int side)
}
break;
+ /* scanner returns color data as gbrgbr... */
+ case COLOR_INTERLACE_GBR:
+ DBG (17, "copy_simplex: color, GBR\n");
+ for (j=0; j<pwidth; j++){
+ line[line_next++] = buf[i+j*3+2];
+ line[line_next++] = buf[i+j*3];
+ line[line_next++] = buf[i+j*3+1];
+ }
+ break;
+
+ /* scanner returns color data as brgbrg... */
+ case COLOR_INTERLACE_BRG:
+ DBG (17, "copy_simplex: color, BRG\n");
+ for (j=0; j<pwidth; j++){
+ line[line_next++] = buf[i+j*3+1];
+ line[line_next++] = buf[i+j*3+2];
+ line[line_next++] = buf[i+j*3];
+ }
+ break;
+
/* one line has the following format: RRR...rrrGGG...gggBBB...bbb */
case COLOR_INTERLACE_RRGGBB:
DBG (17, "copy_simplex: color, RRGGBB\n");
@@ -4768,7 +5221,7 @@ copy_duplex(struct scanner *s, unsigned char * buf, int len)
}
}
- /* no scanners use this? */
+ /* full line of front, then full line of back */
else if(s->duplex_interlace == DUPLEX_INTERLACE_FFBB){
for(i=0; i<len; i+=dbwidth){
memcpy(front+flen,buf+i,bwidth);
@@ -4877,7 +5330,7 @@ copy_line(struct scanner *s, unsigned char * buff, int side)
/* scan is wider than user wanted, skip some pixels on left side */
if(s->i.width != s->s.width){
- offset = ((s->valid_x-s->i.page_x) / 2 + s->i.tl_x) * s->i.dpi_x/1200*3;
+ offset = ((s->valid_x-s->i.page_x) / 2 + s->i.tl_x) * s->i.dpi_x/1200;
}
/* change mode, store line in buffer */
@@ -4905,7 +5358,7 @@ copy_line(struct scanner *s, unsigned char * buff, int side)
/*loop over output bits*/
for(j=0;j<8;j++){
- int source = (offset+i)*24 + j*3;
+ int source = offset*3 + i*24 + j*3;
if( (line[source] + line[source+1] + line[source+2]) < thresh ){
curr |= 1 << (7-j);
}
@@ -5967,6 +6420,7 @@ default_globals(void)
{
global_buffer_size = global_buffer_size_default;
global_padded_read = global_padded_read_default;
+ global_extra_status = global_extra_status_default;
global_duplex_offset = global_duplex_offset_default;
global_vendor_name[0] = 0;
global_model_name[0] = 0;
@@ -6252,7 +6706,6 @@ do_scsi_cmd(struct scanner *s, int runRS, int shortTime,
)
{
int ret;
- size_t actLen = 0;
/*shut up compiler*/
runRS=runRS;
@@ -6270,7 +6723,6 @@ do_scsi_cmd(struct scanner *s, int runRS, int shortTime,
if (inBuff && inLen){
DBG(25, "in: reading %d bytes\n", (int)*inLen);
memset(inBuff,0,*inLen);
- actLen = *inLen;
}
ret = sanei_scsi_cmd2(s->fd, cmdBuff, cmdLen, outBuff, outLen, inBuff, inLen);
@@ -6285,7 +6737,7 @@ do_scsi_cmd(struct scanner *s, int runRS, int shortTime,
DBG(25, "in: short read, remainder %lu bytes\n", (u_long)s->rs_info);
*inLen -= s->rs_info;
}
- hexdump(30, "in: <<", inBuff, *inLen);
+ hexdump(31, "in: <<", inBuff, *inLen);
DBG(25, "in: read %d bytes\n", (int)*inLen);
}
@@ -6319,16 +6771,15 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime,
unsigned char * inBuffer = NULL;
int inTimeout = 0;
- size_t statOffset = 0;
- size_t statLength = 0;
- size_t statActual = 0;
- unsigned char * statBuffer = NULL;
- int statTimeout = 0;
+ size_t extraLength = 0;
int ret = 0;
int ret2 = 0;
- DBG (10, "do_usb_cmd: start\n");
+ struct timeval timer;
+ gettimeofday(&timer,NULL);
+
+ DBG (10, "do_usb_cmd: start %lu %lu\n", (long unsigned int)timer.tv_sec, (long unsigned int)timer.tv_usec);
/****************************************************************/
/* the command stage */
@@ -6376,6 +6827,20 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime,
}
/****************************************************************/
+ /* the extra status stage, used by few scanners */
+ /* this is like the regular status block, with an additional */
+ /* length component at the end */
+ if(s->extra_status){
+ ret2 = do_usb_status(s,runRS,shortTime,&extraLength);
+
+ /* bail out on bad RS status */
+ if(ret2){
+ DBG(5,"extra: bad RS status, %d\n", ret2);
+ return ret2;
+ }
+ }
+
+ /****************************************************************/
/* the output stage */
if(outBuff && outLen){
@@ -6432,6 +6897,12 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime,
inLength = inOffset+*inLen;
inActual = inLength;
+ /* use the extra length to alter the amount of in we request */
+ if(s->extra_status && extraLength && *inLen > extraLength){
+ DBG(5,"in: adjust extra, %d %d\n", (int)*inLen, (int)extraLength);
+ inActual = inOffset+extraLength;
+ }
+
/*blast caller's copy in case we error out*/
*inLen = 0;
@@ -6443,16 +6914,16 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime,
sanei_usb_set_timeout(inTimeout);
/* build inBuffer */
- inBuffer = calloc(inLength,1);
+ inBuffer = calloc(inActual,1);
if(!inBuffer){
DBG(5,"in: no mem\n");
return SANE_STATUS_NO_MEM;
}
- DBG(25, "in: reading %d bytes, timeout %d\n", (int)inLength, inTimeout);
+ DBG(25, "in: reading %d bytes, timeout %d\n", (int)inActual, inTimeout);
ret = sanei_usb_read_bulk(s->fd, inBuffer, &inActual);
DBG(25, "in: read %d bytes, retval %d\n", (int)inActual, ret);
- hexdump(30, "in: <<", inBuffer, inActual);
+ hexdump(31, "in: <<", inBuffer, inActual);
if(!inActual){
DBG(5,"in: got no data, clearing\n");
@@ -6474,49 +6945,8 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime,
}
/****************************************************************/
- /* the status stage */
- statOffset = 0;
- if(s->padded_read)
- statOffset = USB_HEADER_LEN;
-
- statLength = statOffset+USB_STATUS_LEN;
- statActual = statLength;
- statTimeout = USB_STATUS_TIME;
-
- /* change timeout */
- if(shortTime)
- statTimeout/=60;
- sanei_usb_set_timeout(statTimeout);
-
- /* build statBuffer */
- statBuffer = calloc(statLength,1);
- if(!statBuffer){
- DBG(5,"stat: no mem\n");
- if(inBuffer) free(inBuffer);
- return SANE_STATUS_NO_MEM;
- }
-
- DBG(25, "stat: reading %d bytes, timeout %d\n", (int)statLength, statTimeout);
- ret2 = sanei_usb_read_bulk(s->fd, statBuffer, &statActual);
- DBG(25, "stat: read %d bytes, retval %d\n", (int)statActual, ret2);
- hexdump(30, "stat: <<", statBuffer, statActual);
-
- /*weird status*/
- if(ret2 != SANE_STATUS_GOOD){
- DBG(5,"stat: clearing error '%s'\n",sane_strstatus(ret2));
- ret2 = do_usb_clear(s,1,runRS);
- }
- /*short read*/
- else if(statLength != statActual){
- DBG(5,"stat: clearing short %d/%d\n",(int)statLength,(int)statActual);
- ret2 = do_usb_clear(s,1,runRS);
- }
- /*inspect the last byte of the status response*/
- else if(statBuffer[statLength-1]){
- DBG(5,"stat: status %d\n",statBuffer[statLength-1]);
- ret2 = do_usb_clear(s,0,runRS);
- }
- free(statBuffer);
+ /* the normal status stage */
+ ret2 = do_usb_status(s,runRS,shortTime,&extraLength);
/* if status said EOF, adjust input with remainder count */
if(ret2 == SANE_STATUS_EOF && inBuffer){
@@ -6524,11 +6954,11 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime,
/* EOF is ok */
ret2 = SANE_STATUS_GOOD;
- if(inActual <= inLength - s->rs_info){
- DBG(5,"in: we read <= RS, ignoring RS: %d <= %d (%d-%d)\n",
+ if(inActual < inLength - s->rs_info){
+ DBG(5,"in: we read < RS, ignoring RS: %d < %d (%d-%d)\n",
(int)inActual,(int)(inLength-s->rs_info),(int)inLength,(int)s->rs_info);
}
- else if(s->rs_info){
+ else if(inActual > inLength - s->rs_info){
DBG(5,"in: we read > RS, using RS: %d to %d (%d-%d)\n",
(int)inActual,(int)(inLength-s->rs_info),(int)inLength,(int)s->rs_info);
inActual = inLength - s->rs_info;
@@ -6556,7 +6986,80 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime,
free(inBuffer);
}
- DBG (10, "do_usb_cmd: finish\n");
+ gettimeofday(&timer,NULL);
+
+ DBG (10, "do_usb_cmd: finish %lu %lu\n", (long unsigned int)timer.tv_sec, (long unsigned int)timer.tv_usec);
+
+ return ret;
+}
+
+static SANE_Status
+do_usb_status(struct scanner *s, int runRS, int shortTime, size_t * extraLength)
+{
+
+#define EXTRA_READ_len 4
+
+ size_t statPadding = 0;
+ size_t statOffset = 0;
+ size_t statLength = 0;
+ size_t statActual = 0;
+ unsigned char * statBuffer = NULL;
+ int statTimeout = 0;
+
+ int ret = 0;
+
+ if(s->padded_read)
+ statPadding = USB_HEADER_LEN;
+
+ statLength = statPadding+USB_STATUS_LEN;
+ statOffset = statLength-1;
+
+ if(s->extra_status)
+ statLength += EXTRA_READ_len;
+
+ statActual = statLength;
+ statTimeout = USB_STATUS_TIME;
+
+ /* change timeout */
+ if(shortTime)
+ statTimeout/=60;
+ sanei_usb_set_timeout(statTimeout);
+
+ /* build statBuffer */
+ statBuffer = calloc(statLength,1);
+ if(!statBuffer){
+ DBG(5,"stat: no mem\n");
+ return SANE_STATUS_NO_MEM;
+ }
+
+ DBG(25, "stat: reading %d bytes, timeout %d\n", (int)statLength, statTimeout);
+ ret = sanei_usb_read_bulk(s->fd, statBuffer, &statActual);
+ DBG(25, "stat: read %d bytes, retval %d\n", (int)statActual, ret);
+ hexdump(30, "stat: <<", statBuffer, statActual);
+
+ /*weird status*/
+ if(ret != SANE_STATUS_GOOD){
+ DBG(5,"stat: clearing error '%s'\n",sane_strstatus(ret));
+ ret = do_usb_clear(s,1,runRS);
+ }
+ /*short read*/
+ else if(statLength != statActual){
+ DBG(5,"stat: clearing short %d/%d\n",(int)statLength,(int)statActual);
+ ret = do_usb_clear(s,1,runRS);
+ }
+ /*inspect the status byte of the response*/
+ else if(statBuffer[statOffset]){
+ DBG(5,"stat: status %d\n",statBuffer[statLength-1-4]);
+ ret = do_usb_clear(s,0,runRS);
+ }
+
+ /*extract the extra length byte of the response*/
+ if(s->extra_status){
+ *extraLength = get_ES_length(statBuffer);
+ DBG(15,"stat: extra %d\n",(int)*extraLength);
+ }
+
+ free(statBuffer);
return ret;
}
@@ -6670,6 +7173,26 @@ wait_scanner(struct scanner *s)
return ret;
}
+/* Some scanners have per-resolution
+ * color interlacing values, but most
+ * don't. This helper can tell the
+ * difference.
+ */
+static int
+get_color_inter(struct scanner *s, int side, int res)
+{
+ int i;
+ for(i=0;i<DPI_1200;i++){
+ if(res == dpi_list[i])
+ break;
+ }
+
+ if(s->color_inter_by_res[i])
+ return s->color_inter_by_res[i];
+
+ return s->color_interlace[side];
+}
+
/* s->u.page_x stores the user setting
* for the paper width in adf. sometimes,
* we need a value that differs from this
@@ -6789,7 +7312,8 @@ hexdump (int level, char *comment, unsigned char *p, int l)
}
/* print last (partial) line */
- DBG (level, "%s\n", line);
+ if (i)
+ DBG (level, "%s\n", line);
}
/**
diff --git a/backend/canon_dr.conf.in b/backend/canon_dr.conf.in
index ef1dfdf..453065b 100644
--- a/backend/canon_dr.conf.in
+++ b/backend/canon_dr.conf.in
@@ -15,8 +15,9 @@
#######################################################################
# Set data buffer size, in bytes. The value ranges from 4096 - infinity
-# large values may cause timeouts, small causes slow scans. 4MB default
-#option buffer-size 4194304
+# Large values may cause timeouts, or long pauses at the end of each
+# page. Small values may cause slow scans. 2MB is the default.
+#option buffer-size 2097152
#######################################################################
# Most scanners dont pad their reads
@@ -138,9 +139,69 @@ usb 0x1083 0x1638
# CR-135i
usb 0x1083 0x1639
+# DR-M160
+option extra-status 1
+option duplex-offset 400
+usb 0x1083 0x163e
+
+# DR-M140
+option extra-status 1
+option duplex-offset 400
+usb 0x1083 0x163f
+
+# DR-C125
+option duplex-offset 400
+usb 0x1083 0x1640
+
+# DR-P215
+usb 0x1083 0x1641
+
# P-215
usb 0x1083 0x1646
+# FSU-201
+usb 0x1083 0x1648
+
+# DR-C130
+usb 0x1083 0x164a
+
+# DR-P208
+usb 0x1083 0x164b
+
# P-208
usb 0x1083 0x164c
+# DR-G1130
+option buffer-size 8000000
+usb 0x1083 0x164f
+
+# DR-G1100
+option buffer-size 8000000
+usb 0x1083 0x1650
+
+# DR-C120
+usb 0x1083 0x1651
+
+# P-201
+usb 0x1083 0x1652
+
+# DR-F120
+usb 0x1083 0x1654
+
+# DR-M1060
+usb 0x1083 0x1657
+
+# DR-C225
+usb 0x1083 0x1658
+
+# DR-P215II
+usb 0x1083 0x1659
+
+# P-215II
+usb 0x1083 0x165b
+
+# DR-P208II
+usb 0x1083 0x165d
+
+# P-208II
+usb 0x1083 0x165f
diff --git a/backend/canon_dr.h b/backend/canon_dr.h
index 1bf95a0..4a19f55 100644
--- a/backend/canon_dr.h
+++ b/backend/canon_dr.h
@@ -58,6 +58,8 @@ enum scanner_Option
OPT_COUNTONLY,
OPT_BYPASSMODE,
OPT_COUNTER,
+ OPT_ADF_LOADED,
+ OPT_CARD_LOADED,
/* must come last: */
NUM_OPTIONS
@@ -174,13 +176,16 @@ struct scanner
int has_flatbed;
int has_duplex;
int has_back; /* not all duplex scanners can do adf back side only */
+ int has_card; /* P215 has a card reader instead of fb */
int has_comp_JPEG;
int has_buffer;
int has_df;
+ int has_df_ultra;
int has_btc;
int has_ssm; /* older scanners use this set scan mode command */
int has_ssm2; /* newer scanners user this similar command */
int has_ssm_pay_head_len; /* newer scanners put the length twice in ssm */
+ int can_read_sensors;
int can_read_panel;
int can_write_panel;
int rgb_format; /* meaning unknown */
@@ -190,11 +195,13 @@ struct scanner
int invert_tly; /* weird bug in some smaller scanners */
int unknown_byte2; /* weird byte, required, meaning unknown */
int padded_read; /* some machines need extra 12 bytes on reads */
+ int extra_status; /* some machines need extra status read after cmd */
int fixed_width; /* some machines always scan full width */
int even_Bpl; /* some machines require even bytes per line */
int gray_interlace[2]; /* different models interlace heads differently */
int color_interlace[2]; /* different models interlace colors differently */
+ int color_inter_by_res[16]; /* and some even change by resolution */
int duplex_interlace; /* different models interlace sides differently */
int jpeg_interlace; /* different models interlace jpeg sides differently */
int duplex_offset; /* number of lines of padding added to front (1/1200)*/
@@ -224,7 +231,7 @@ struct scanner
/*mode group*/
SANE_String_Const mode_list[7];
- SANE_String_Const source_list[5];
+ SANE_String_Const source_list[8];
SANE_Int res_list[17];
SANE_Range res_range;
@@ -334,9 +341,12 @@ struct scanner
int panel_bypass_mode;
int panel_enable_led;
int panel_counter;
+ int sensor_adf_loaded;
+ int sensor_card_loaded;
/* values which are used to track the frontend's access to sensors */
- char hw_read[NUM_OPTIONS-OPT_START];
+ char panel_read[OPT_COUNTER - OPT_START + 1];
+ char sensors_read[OPT_CARD_LOADED - OPT_ADF_LOADED + 1];
};
#define CONNECTION_SCSI 0 /* SCSI interface */
@@ -353,6 +363,9 @@ struct scanner
#define SOURCE_ADF_FRONT 1
#define SOURCE_ADF_BACK 2
#define SOURCE_ADF_DUPLEX 3
+#define SOURCE_CARD_FRONT 4
+#define SOURCE_CARD_BACK 5
+#define SOURCE_CARD_DUPLEX 6
static const int dpi_list[] = {
60,75,100,120,150,160,180,200,
@@ -406,11 +419,14 @@ enum {
#define GRAY_INTERLACE_2510 1
#define GRAY_INTERLACE_gG 2
-#define COLOR_INTERLACE_RGB 0
-#define COLOR_INTERLACE_BGR 1
-#define COLOR_INTERLACE_RRGGBB 2
-#define COLOR_INTERLACE_rRgGbB 3
-#define COLOR_INTERLACE_2510 4
+#define COLOR_INTERLACE_UNK 0
+#define COLOR_INTERLACE_RGB 1
+#define COLOR_INTERLACE_BGR 2
+#define COLOR_INTERLACE_BRG 3
+#define COLOR_INTERLACE_GBR 4
+#define COLOR_INTERLACE_RRGGBB 5
+#define COLOR_INTERLACE_rRgGbB 6
+#define COLOR_INTERLACE_2510 7
#define DUPLEX_INTERLACE_NONE 0
#define DUPLEX_INTERLACE_FFBB 1
@@ -510,6 +526,9 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime,
unsigned char * inBuff, size_t * inLen
);
+static SANE_Status
+do_usb_status(struct scanner *s, int runRS, int shortTime, size_t * extraLength);
+
static SANE_Status do_usb_clear(struct scanner *s, int clear, int runRS);
static SANE_Status wait_scanner (struct scanner *s);
@@ -520,6 +539,8 @@ static SANE_Status ssm_buffer (struct scanner *s);
static SANE_Status ssm_do (struct scanner *s);
static SANE_Status ssm_df (struct scanner *s);
+static int get_color_inter(struct scanner *s, int side, int res);
+
static int get_page_width (struct scanner *s);
static int get_page_height (struct scanner *s);
@@ -528,6 +549,7 @@ static SANE_Status update_params (struct scanner *s, int calib);
static SANE_Status update_i_params (struct scanner *s);
static SANE_Status clean_params (struct scanner *s);
+static SANE_Status read_sensors(struct scanner *s, SANE_Int option);
static SANE_Status read_panel(struct scanner *s, SANE_Int option);
static SANE_Status send_panel(struct scanner *s);
diff --git a/backend/coolscan.c b/backend/coolscan.c
index 00a12e4..6828a16 100644
--- a/backend/coolscan.c
+++ b/backend/coolscan.c
@@ -179,7 +179,7 @@ request_sense_parse (unsigned char *sensed_data)
case 0x2:
if ((0x4 == asc) && (0x1 == ascq)) {
- DBG (10, "\t%d/%d/%d: Logical unit is in process of becomming ready\n",
+ DBG (10, "\t%d/%d/%d: Logical unit is in process of becoming ready\n",
sense, asc, ascq);
ret = SANE_STATUS_DEVICE_BUSY;
}
@@ -1987,6 +1987,7 @@ static const SANE_Range shift_range =
0
};
+static const SANE_Device **devlist = 0;
static int num_devices;
static Coolscan_t *first_dev;
@@ -3287,6 +3288,9 @@ sane_exit (void)
free (dev->obuffer);
free (dev);
}
+
+ if (devlist)
+ free (devlist);
}
/* ----------------------------- SANE GET DEVICES -------------------------- */
@@ -3294,8 +3298,6 @@ SANE_Status
sane_get_devices (const SANE_Device *** device_list,
SANE_Bool local_only)
{
-
- static const SANE_Device **devlist = 0;
Coolscan_t *dev;
int i;
diff --git a/backend/dll.c b/backend/dll.c
index 619ee55..5264f11 100644
--- a/backend/dll.c
+++ b/backend/dll.c
@@ -430,7 +430,7 @@ load (struct backend *be)
if (path)
{
- src_len = strlen (path) + strlen (STRINGIFY (LIBDIR)) + 1 + 1;
+ src_len = strlen (path) + strlen (LIBDIR) + 1 + 1;
src = malloc (src_len);
if (!src)
{
@@ -438,11 +438,11 @@ load (struct backend *be)
return SANE_STATUS_NO_MEM;
}
orig_src = src;
- snprintf (src, src_len, "%s:%s", path, STRINGIFY (LIBDIR));
+ snprintf (src, src_len, "%s:%s", path, LIBDIR);
}
else
{
- src = STRINGIFY (LIBDIR);
+ src = LIBDIR;
src = strdup (src);
if (!src)
{
diff --git a/backend/dll.conf.in b/backend/dll.conf.in
index a7e4b3e..ee6f2f1 100644
--- a/backend/dll.conf.in
+++ b/backend/dll.conf.in
@@ -24,6 +24,7 @@ dmc
epjitsu
#epson
epson2
+epsonds
fujitsu
#gphoto2
genesys
diff --git a/backend/dmc.c b/backend/dmc.c
index 96f9186..7fc2ae9 100644
--- a/backend/dmc.c
+++ b/backend/dmc.c
@@ -75,6 +75,7 @@
static DMC_Device *FirstDevice = NULL;
static DMC_Camera *FirstHandle = NULL;
static int NumDevices = 0;
+static SANE_Device const **devlist = NULL;
static SANE_String_Const ValidModes[] = { "Full frame", "Viewfinder",
"Raw", "Thumbnail",
@@ -867,6 +868,9 @@ sane_exit(void)
free(dev);
dev = next;
}
+
+ if (devlist)
+ free (devlist);
}
/**********************************************************************
@@ -882,7 +886,6 @@ sane_exit(void)
SANE_Status
sane_get_devices(SANE_Device const ***device_list, SANE_Bool local_only)
{
- static SANE_Device const **devlist = 0;
DMC_Device *dev;
int i = 0;
diff --git a/backend/epjitsu-cmd.h b/backend/epjitsu-cmd.h
index 2e914d9..77793df 100644
--- a/backend/epjitsu-cmd.h
+++ b/backend/epjitsu-cmd.h
@@ -38,31 +38,55 @@ static unsigned char coarseCalData_S300[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x24, 0x00, 0x28, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
+static unsigned char coarseCalData_S1300i[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x2d, 0x00, 0x2b, 0x00, 0x00, 0x00, 0x24, 0x00, 0x28, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+static unsigned char coarseCalData_S1100[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x00, 0x25, 0x00, 0x00, 0x00, 0x26, 0x00, 0x26, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
/*************** fi-60F 150dpi *************/
-/* 1b d1 (set window) before coarse cal (read 1 line of 0x____ bytes) */
+/* 1b d1 (set window) before coarse cal (read 1 line of 0x1c20 bytes) */
static unsigned char setWindowCoarseCal_FI60F_150[] = {
-0
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x60, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-/* 1b d1 (set window) before fine cal (read 16 lines of 0x____ bytes) */
+/* 1b d1 (set window) before fine cal (read 16 lines of 0x1c20 bytes) */
static unsigned char setWindowFineCal_FI60F_150[] = {
-0
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x03, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x00, 0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-/* 1b d1 (set window) before gain/offset tables (write 1 line of 0x____ bytes) */
+/* 1b d1 (set window) before gain/offset tables (write 1 line of 0x3840 bytes) */
static unsigned char setWindowSendCal_FI60F_150[] = {
-0
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x03, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x01, 0x10, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
/* 1b c3 (gain?) command header */
-static unsigned char sendCal1Header_FI60F_150[] = {
-0
+static unsigned char sendCal1Header_FI60F_150[] = { /* plus 0x3840 data bytes */
+0x8c, 0x0f, 0x8c, 0x0f, 0x8c, 0x0f, 0x8c, 0x0f, 0x8c, 0x0f, 0x8c, 0x0f, 0x00, 0x04
};
/* 1b c4 (offset?) command header */
static unsigned char sendCal2Header_FI60F_150[] = {
-0
+0x39, 0x3f, 0x39, 0x3f, 0x39, 0x3f, 0x07
};
/* 1b d1 (set window) before scan */
static unsigned char setWindowScan_FI60F_150[] = {
-0
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x01, 0x2c, 0x00, 0x96, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x60, 0x00, 0x00, 0x03, 0x6b, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x01, 0x48, 0x00, 0x08, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
/*************** fi-60F 300dpi *************/
@@ -323,8 +347,8 @@ static unsigned char setWindowScan_S300_600[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-/*S300 can also use a USB power cable, but it requires a different set of params?*/
-/*************** S300 150dpi USB *************/
+/*S300/S1300/S1300i can also use a USB power cable, but it requires a different set of params?*/
+/*************** S300/S1300/S1300i 150dpi USB *************/
/* 1b d1 (set window) before coarse cal (read 1 line of 0x63c0 bytes) */
static unsigned char setWindowCoarseCal_S300_150_U[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
@@ -338,7 +362,7 @@ static unsigned char setWindowFineCal_S300_150_U[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x03, 0x20, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x20, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
-0x00, 0x08, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
/* 1b d1 (set window) before gain/offset tables (write 1 line of 0xc780 bytes) */
@@ -368,7 +392,7 @@ static unsigned char setWindowScan_S300_150_U[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-/*************** S300 225dpi USB *************/
+/*************** S300/S1300/S1300i 225dpi USB *************/
/* 1b d1 (set window) before coarse cal (read 1 line of 0x63c0 bytes) */
static unsigned char setWindowCoarseCal_S300_225_U[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
@@ -412,7 +436,8 @@ static unsigned char setWindowScan_S300_225_U[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-/*************** S300 300dpi USB *************/
+/*************** S300/S1300/S1300i 300dpi USB *************/
+/* 1b d1 (set window) before coarse cal (read 1 line of 0x63c0 bytes) */
/* 1b d1 (set window) before coarse cal (read 1 line of 0x63c0 bytes) */
static unsigned char setWindowCoarseCal_S300_300_U[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
@@ -456,4 +481,229 @@ static unsigned char setWindowScan_S300_300_U[] = {
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};
-/*************** S300 600dpi USB is same as AC power *************/
+/*************** S300/S1300/S1300i USB is same as AC power *************/
+
+/*************** S1300i 150dpi *************/
+/* 1b d1 (set window) before coarse cal (read 1 line of 0x5e24 bytes) */
+static unsigned char setWindowCoarseCal_S1300i_150[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b d1 (set window) before fine cal (read 16 lines of 0x5e24 bytes) */
+static unsigned char setWindowFineCal_S1300i_150[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x03, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xa0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b d1 (set window) before gain/offset tables (write 1 line of 0xbc40 bytes) */
+static unsigned char setWindowSendCal_S1300i_150[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x03, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x60, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b c3 (gain?) command header */
+static unsigned char sendCal1Header_S1300i_150[] = { /* plus 0xc780 data bytes */
+0xc4, 0x06, 0xc4, 0x06, 0xc4, 0x06, 0xc4, 0x06, 0xc4, 0x06, 0xc4, 0x06, 0x00, 0x04
+};
+/* 1b c4 (offset?) command header */
+static unsigned char sendCal2Header_S1300i_150[] = { /* plus 0xc780 data bytes */
+0xd7, 0x3b, 0xd7, 0x3b, 0xd7, 0x3b, 0x07
+};
+/* 1b d1 (set window) before scan */
+static unsigned char setWindowScan_S1300i_150[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x96, 0x00, 0x96, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x50, 0x00, 0x00, 0x06, 0xe2, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x01, 0x2b, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/*************** S1300i 225dpi *************/
+/* 1b d1 (set window) before coarse cal (read 1 line of 0x63c0 bytes) */
+static unsigned char setWindowCoarseCal_S1300i_225[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b d1 (set window) before fine cal (read 16 lines of 0x63c0 bytes) */
+static unsigned char setWindowFineCal_S1300i_225[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x03, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b d1 (set window) before gain/offset tables (write 1 line of 0xc780 bytes) */
+static unsigned char setWindowSendCal_S1300i_225[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x03, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b c3 (gain?) command header */
+static unsigned char sendCal1Header_S1300i_225[] = { /* plus 0xc780 data bytes */
+0x2f, 0x07, 0x2f, 0x07, 0x2f, 0x07, 0x2f, 0x07, 0x2f, 0x07, 0x2f, 0x07, 0x00, 0x04
+};
+/* 1b c4 (offset?) command header */
+static unsigned char sendCal2Header_S1300i_225[] = { /* plus 0xc780 data bytes */
+0xa5, 0x3b, 0xa5, 0x3b, 0xa5, 0x3b, 0x07
+};
+/* 1b d1 (set window) before scan */
+static unsigned char setWindowScan_S1300i_225[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0xe1, 0x00, 0xc8, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x0c, 0x0c, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x01, 0x1c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/*************** S1300i 300dpi *************/
+/* 1b d1 (set window) before coarse cal (read 1 line of 0x5ee0 bytes) */
+static unsigned char setWindowCoarseCal_S1300i_300[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b d1 (set window) before fine cal (read 16 lines of 0x5ee0 bytes) */
+static unsigned char setWindowFineCal_S1300i_300[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x03, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b d1 (set window) before gain/offset tables (write 1 line of 0xbdc0 bytes) */
+static unsigned char setWindowSendCal_S1300i_300[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x03, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0xa0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b c3 (gain?) command header */
+static unsigned char sendCal1Header_S1300i_300[] = { /* plus 0xc000 data bytes */
+0xdd, 0x06, 0xdd, 0x06, 0xdd, 0x06, 0xdd, 0x06, 0xdd, 0x06, 0xdd, 0x06, 0x00, 0x04
+};
+/* 1b c4 (offset?) command header */
+static unsigned char sendCal2Header_S1300i_300[] = { /* plus 0xc000 data bytes */
+0x75, 0x3c, 0x75, 0x3c, 0x75, 0x3c, 0x07
+};
+/* 1b d1 (set window) before scan */
+static unsigned char setWindowScan_S1300i_300[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0a, 0xc0, 0x00, 0x00, 0x0d, 0xc4, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x01, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/*************** S1300i 600dpi AC power is same as S300 *************/
+/*************** except the calibration headers *************/
+
+/* 1b c3 (gain?) command header */
+static unsigned char sendCal1Header_S1300i_USB[] = {
+0x4d, 0x06, 0x4d, 0x06, 0x4d, 0x06, 0x4d, 0x06, 0x4d, 0x06, 0x4d, 0x06, 0x00, 0x04
+};
+/* 1b c4 (offset?) command header */
+static unsigned char sendCal2Header_S1300i_USB[] = {
+0x8f, 0x40, 0x8f, 0x40, 0x8f, 0x40, 0x07
+};
+
+/*************** S1300i all resolutions USB power is same as S300 *************/
+
+/*************** S1100 300dpi USB *************/
+/* 1b d1 (set window) before coarse cal (read 1 line of 0x45a0 bytes) */
+static unsigned char setWindowCoarseCal_S1100_300_U[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b d1 (set window) before fine cal (read 16 lines of 0x45a0 bytes) */
+static unsigned char setWindowFineCal_S1100_300_U[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x03, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b d1 (set window) before gain/offset tables (write 1 line of 0x45a0 bytes) */
+static unsigned char setWindowSendCal_S1100_300_U[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xd0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x01, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b c3 (gain?) command header */
+static unsigned char sendCal1Header_S1100_300_U[] = { /* plus 0x45a0 data bytes */
+0x1e, 0x10, 0x1e, 0x10, 0x1e, 0x10, 0x1e, 0x10, 0x1e, 0x10, 0x1e, 0x10, 0x00, 0x03
+};
+/* 1b c4 (offset?) command header */
+static unsigned char sendCal2Header_S1100_300_U[] = { /* plus 0x45a0 data bytes */
+0x63, 0x86, 0x63, 0x86, 0x63, 0x86, 0x07
+};
+/* 1b d1 (set window) before scan */
+static unsigned char setWindowScan_S1100_300_U[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x01, 0x2c, 0x01, 0x2c, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x58, 0x00, 0x00, 0x1b, 0xe1, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x01, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
+/*************** S1100 600dpi USB *************/
+/* 1b d1 (set window) before coarse cal (read 1 line of 0x3e20 bytes) */
+static unsigned char setWindowCoarseCal_S1100_600_U[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x58, 0x02, 0x58, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xf0, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b d1 (set window) before fine cal (read 16 lines of 0x3e20 bytes) */
+static unsigned char setWindowFineCal_S1100_600_U[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x58, 0x03, 0x20, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xf0, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b d1 (set window) before gain/offset tables (write 1 line of 0x7c40 bytes) */
+static unsigned char setWindowSendCal_S1100_600_U[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x58, 0x02, 0x58, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3e, 0x20, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x02, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+/* 1b c3 (gain?) command header */
+static unsigned char sendCal1Header_S1100_600_U[] = { /* plus 0x7c40 data bytes */
+0xff, 0x11, 0xff, 0x11, 0xff, 0x11, 0xff, 0x11, 0xff, 0x11, 0xff, 0x11, 0x00, 0x03
+};
+/* 1b c4 (offset?) command header */
+static unsigned char sendCal2Header_S1100_600_U[] = { /* plus 0x7c40 data bytes */
+0x4b, 0x81, 0x4b, 0x81, 0x4b, 0x81, 0x07
+};
+/* 1b d1 (set window) before scan */
+static unsigned char setWindowScan_S1100_600_U[] = {
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x02, 0x58, 0x02, 0x58, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0xf0, 0x00, 0x00, 0x37, 0xbf, 0x00, 0x00,
+0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x80, 0x80, 0x01, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
+
diff --git a/backend/epjitsu.c b/backend/epjitsu.c
index 3e102da..7d987dc 100644
--- a/backend/epjitsu.c
+++ b/backend/epjitsu.c
@@ -123,9 +123,34 @@
- dont export private symbols
v19 2009-08-31, RG
- rewritten calibration routines
- v20 2010-02-09, MAN (SANE 1.0.21 & 1.0.22)
+ v20 2010-02-09, MAN (SANE 1.0.21 to 1.0.24)
- cleanup #include lines & copyright
- add S1300
+ v21 2011-04-15, MAN
+ - unreleased attempt at S1100 support
+ v22 2014-05-15, MAN/Hiroshi Miura
+ - port some S1100 changes from v21
+ - add paper size support
+ v23 2014-05-20, MAN
+ - add S1300i support
+ - fix buffer overruns in read_from_scanner
+ - set default page width
+ - simplified the 225x200 resolution code
+ v24 2014-06-01, MAN
+ - enable fine calibration for S1300i 225 & 300 dpi, and S300 150 dpi
+ v25 2014-06-04, MAN
+ - initial support for fi-65F
+ - initial support for S1100
+ v26 2014-06-28, MAN
+ - add resolution scaling
+ - fix 150 dpi settings for fi-60F and fi-65F
+ - make adf_height_padding variable
+ - make white_factor variable
+ v27 2015-01-24, MAN
+ - don't override br_x and br_y
+ - call change_params after changing page_width
+ v28 2015-03-23, MAN
+ - call get_hardware_status before starting scan
SANE FLOW DIAGRAM
@@ -174,7 +199,7 @@
#include "epjitsu-cmd.h"
#define DEBUG 1
-#define BUILD 20
+#define BUILD 28
#ifndef MAX3
#define MAX3(a,b,c) ((a) > (b) ? ((a) > (c) ? a : c) : ((b) > (c) ? b : c))
@@ -197,7 +222,6 @@ unsigned char global_firmware_filename[PATH_MAX];
static int coarse_gain_min[3] = { 88, 88, 88 }; /* front, back, FI-60F 3rd plane */
static int coarse_gain_max[3] = { 92, 92, 92 };
static int fine_gain_target[3] = {185, 150, 170}; /* front, back, FI-60F is this ok? */
-static float white_factor[3] = {1.0, 0.93, 0.98}; /* Blue, Red, Green */
/* ------------------------------------------------------------------------- */
#define STRING_FLATBED SANE_I18N("Flatbed")
@@ -458,7 +482,39 @@ attach_one (const char *name)
DBG (15, "attach_one: Found %s scanner %s at %s\n",
s->sane.vendor, s->sane.model, s->sane.name);
- if (strstr (s->sane.model, "S300") || strstr (s->sane.model, "S1300")){
+ if (strstr (s->sane.model, "S1300i")){
+ unsigned char stat;
+
+ DBG (15, "attach_one: Found S1300i\n");
+
+ stat = get_stat(s);
+ if(stat & 0x01){
+ DBG (5, "attach_one: on USB power?\n");
+ s->usb_power=1;
+ }
+
+ s->model = MODEL_S1300i;
+
+ s->has_adf = 1;
+ s->has_adf_duplex = 1;
+ s->min_res = 50;
+ s->max_res = 600;
+ s->adf_height_padding = 600;
+ /* Blue, Red, Green */
+ s->white_factor[0] = 1.0;
+ s->white_factor[1] = 0.93;
+ s->white_factor[2] = 0.98;
+
+ s->source = SOURCE_ADF_FRONT;
+ s->mode = MODE_LINEART;
+ s->resolution = 300;
+ s->page_height = 11.5 * 1200;
+ s->page_width = 8.5 * 1200;
+
+ s->threshold = 120;
+ s->threshold_curve = 55;
+ }
+ else if (strstr (s->sane.model, "S300") || strstr (s->sane.model, "S1300")){
unsigned char stat;
DBG (15, "attach_one: Found S300/S1300\n");
@@ -472,46 +528,93 @@ attach_one (const char *name)
s->model = MODEL_S300;
s->has_adf = 1;
- s->x_res_150 = 1;
- s->x_res_225 = 1;
- s->x_res_300 = 1;
- s->x_res_600 = 1;
- s->y_res_150 = 1;
- s->y_res_225 = 1;
- s->y_res_300 = 1;
- s->y_res_600 = 1;
+ s->has_adf_duplex = 1;
+ s->min_res = 50;
+ s->max_res = 600;
+ s->adf_height_padding = 600;
+ /* Blue, Red, Green */
+ s->white_factor[0] = 1.0;
+ s->white_factor[1] = 0.93;
+ s->white_factor[2] = 0.98;
s->source = SOURCE_ADF_FRONT;
- s->mode = MODE_LINEART;
- s->resolution_x = 300;
+ s->mode = MODE_LINEART;
+ s->resolution = 300;
s->page_height = 11.5 * 1200;
+ s->page_width = 8.5 * 1200;
s->threshold = 120;
s->threshold_curve = 55;
}
+ else if (strstr (s->sane.model, "S1100")){
+ DBG (15, "attach_one: Found S1100\n");
+ s->model = MODEL_S1100;
+
+ s->usb_power = 1;
+ s->has_adf = 1;
+ s->has_adf_duplex = 0;
+ s->min_res = 50;
+ s->max_res = 600;
+ s->adf_height_padding = 450;
+ /* Blue, Red, Green */
+ s->white_factor[0] = 0.95;
+ s->white_factor[1] = 1.0;
+ s->white_factor[2] = 1.0;
+
+ s->source = SOURCE_ADF_FRONT;
+ s->mode = MODE_LINEART;
+ s->resolution = 300;
+ s->page_height = 11.5 * 1200;
+ s->page_width = 8.5 * 1200;
+ s->threshold = 120;
+ s->threshold_curve = 55;
+ }
else if (strstr (s->sane.model, "fi-60F")){
DBG (15, "attach_one: Found fi-60F\n");
s->model = MODEL_FI60F;
s->has_fb = 1;
- s->x_res_150 = 0;
- s->x_res_300 = 1;
- s->x_res_600 = 1;
- s->y_res_150 = 0;
- s->y_res_300 = 1;
- s->y_res_600 = 1;
+ s->min_res = 50;
+ s->max_res = 600;
+ /* Blue, Red, Green */
+ s->white_factor[0] = 1.0;
+ s->white_factor[1] = 0.93;
+ s->white_factor[2] = 0.98;
s->source = SOURCE_FLATBED;
- s->mode = MODE_COLOR;
- s->resolution_x = 300;
+ s->mode = MODE_COLOR;
+ s->resolution = 300;
s->page_height = 5.83 * 1200;
+ s->page_width = 4.1 * 1200;
s->threshold = 120;
s->threshold_curve = 55;
}
+ else if (strstr (s->sane.model, "fi-65F")){
+ DBG (15, "attach_one: Found fi-65F\n");
+
+ s->model = MODEL_FI65F;
+
+ s->has_fb = 1;
+ s->min_res = 50;
+ s->max_res = 600;
+ /* Blue, Red, Green */
+ s->white_factor[0] = 1.0;
+ s->white_factor[1] = 0.93;
+ s->white_factor[2] = 0.98;
+
+ s->source = SOURCE_FLATBED;
+ s->mode = MODE_COLOR;
+ s->resolution = 300;
+ s->page_height = 5.83 * 1200;
+ s->page_width = 4.1 * 1200;
+
+ s->threshold = 120;
+ s->threshold_curve = 55;
+ }
else{
DBG (15, "attach_one: Found other\n");
}
@@ -615,6 +718,7 @@ load_fw (struct scanner *s)
return SANE_STATUS_NO_DOCS;
}
+ /* skip first 256 (=0x100) bytes */
if(lseek(file,0x100,SEEK_SET) != 0x100){
DBG (5, "load_fw: failed to lseek file %s\n",global_firmware_filename);
close(file);
@@ -761,7 +865,7 @@ load_fw (struct scanner *s)
}
/*
- * try to load fw into scanner
+ * get status from scanner
*/
static unsigned char
get_stat(struct scanner *s)
@@ -795,6 +899,10 @@ get_stat(struct scanner *s)
return stat[0];
}
+/*
+ * get scanner identification
+ */
+
static SANE_Status
get_ident(struct scanner *s)
{
@@ -946,8 +1054,10 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
}
if(s->has_adf){
s->source_list[i++]=STRING_ADFFRONT;
- s->source_list[i++]=STRING_ADFBACK;
- s->source_list[i++]=STRING_ADFDUPLEX;
+ if(s->has_adf_duplex){
+ s->source_list[i++]=STRING_ADFBACK;
+ s->source_list[i++]=STRING_ADFDUPLEX;
+ }
}
s->source_list[i]=NULL;
@@ -983,33 +1093,19 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
}
}
- else if(option==OPT_X_RES){
- i=0;
- if(s->x_res_150){
- s->x_res_list[++i] = 150;
- }
- if(s->x_res_225){
- s->x_res_list[++i] = 225;
- }
- if(s->x_res_300){
- s->x_res_list[++i] = 300;
- }
- if(s->x_res_600){
- s->x_res_list[++i] = 600;
- }
- s->x_res_list[0] = i;
-
+ else if(option==OPT_RES){
opt->name = SANE_NAME_SCAN_RESOLUTION;
- opt->title = SANE_TITLE_SCAN_X_RESOLUTION;
- opt->desc = SANE_DESC_SCAN_X_RESOLUTION;
+ opt->title = SANE_TITLE_SCAN_RESOLUTION;
+ opt->desc = SANE_DESC_SCAN_RESOLUTION;
opt->type = SANE_TYPE_INT;
opt->unit = SANE_UNIT_DPI;
- if(i > 1){
- opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
- }
+ opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
- opt->constraint_type = SANE_CONSTRAINT_WORD_LIST;
- opt->constraint.word_list = s->x_res_list;
+ s->res_range.min = s->min_res;
+ s->res_range.max = s->max_res;
+ s->res_range.quant = 1;
+ opt->constraint_type = SANE_CONSTRAINT_RANGE;
+ opt->constraint.range = &s->res_range;
}
/* "Geometry" group ---------------------------------------------------- */
@@ -1056,7 +1152,6 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->constraint_type = SANE_CONSTRAINT_RANGE;
opt->constraint.range = &(s->tl_y_range);
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
- opt->cap = SANE_CAP_INACTIVE;
}
/* bottom-right x */
@@ -1122,7 +1217,6 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
else{
opt->cap = SANE_CAP_INACTIVE;
}
- opt->cap = SANE_CAP_INACTIVE;
}
/* page height */
@@ -1421,8 +1515,8 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
}
return SANE_STATUS_GOOD;
- case OPT_X_RES:
- *val_p = s->resolution_x;
+ case OPT_RES:
+ *val_p = s->resolution;
return SANE_STATUS_GOOD;
case OPT_TL_X:
@@ -1569,17 +1663,17 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
s->mode = tmp;
*info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
- return change_params(s);
+ return SANE_STATUS_GOOD;
- case OPT_X_RES:
+ case OPT_RES:
- if (s->resolution_x == val_c)
+ if (s->resolution == val_c)
return SANE_STATUS_GOOD;
- s->resolution_x = val_c;
+ s->resolution = val_c;
*info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
- return change_params(s);
+ return SANE_STATUS_GOOD;
/* Geometry Group */
case OPT_TL_X:
@@ -1598,7 +1692,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
s->tl_y = FIXED_MM_TO_SCANNER_UNIT(val_c);
*info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
- return SANE_STATUS_GOOD;
+ return change_params(s);
case OPT_BR_X:
if (s->br_x == FIXED_MM_TO_SCANNER_UNIT(val_c))
@@ -1623,8 +1717,8 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
return SANE_STATUS_GOOD;
s->page_width = FIXED_MM_TO_SCANNER_UNIT(val_c);
- *info |= SANE_INFO_RELOAD_OPTIONS;
- return SANE_STATUS_GOOD;
+ *info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
+ return change_params(s);
case OPT_PAGE_HEIGHT:
if (s->page_height == FIXED_MM_TO_SCANNER_UNIT(val_c))
@@ -1685,16 +1779,15 @@ struct model_res {
int max_y;
int min_y;
- int act_width; /* total data width output, in pixels per side (always 3 sides) */
- int req_width; /* stride in pixels per side between color planes (always 3 sides) */
- int head_width;
- int pad_width;
+ int line_stride; /* byte width of 1 raw side, with padding */
+ int plane_stride; /* byte width of 1 raw color plane, with padding */
+ int plane_width; /* byte width of 1 raw color plane, without padding */
int block_height;
- int cal_width;
- int cal_headwidth;
- int cal_reqwidth;
+ int cal_line_stride;
+ int cal_plane_stride;
+ int cal_plane_width;
unsigned char * sw_coarsecal;
unsigned char * sw_finecal;
@@ -1709,67 +1802,141 @@ struct model_res {
static struct model_res settings[] = {
/*S300 AC*/
-/* model xres yres u mxx mnx mxy mny actw reqw hedw padw bh calw cal_hedw cal_reqw */
- { MODEL_S300, 150, 150, 0, 1296, 32, 2662, 32, 4256, 1480, 1296, 184, 41, 8512, 2592, 2960,
+/* model xres yres u mxx mnx mxy mny lin_s pln_s pln_w bh cls cps cpw */
+ { MODEL_S300, 150, 150, 0, 1296, 32, 2662, 32, 4256*3, 1480*3, 1296, 41, 8512*3, 2960*3, 2592,
setWindowCoarseCal_S300_150, setWindowFineCal_S300_150,
setWindowSendCal_S300_150, sendCal1Header_S300_150,
sendCal2Header_S300_150, setWindowScan_S300_150 },
- { MODEL_S300, 225, 200, 0, 1944, 32, 3993, 32, 6144, 2100, 1944, 156, 28, 8192, 2592, 2800,
+ { MODEL_S300, 225, 200, 0, 1944, 32, 3993, 32, 6144*3, 2100*3, 1944, 28, 8192*3, 2800*3, 2592,
setWindowCoarseCal_S300_225, setWindowFineCal_S300_225,
setWindowSendCal_S300_225, sendCal1Header_S300_225,
sendCal2Header_S300_225, setWindowScan_S300_225 },
- { MODEL_S300, 300, 300, 0, 2592, 32, 5324, 32, 8192, 2800, 2592, 208, 21, 8192, 2592, 2800,
+ { MODEL_S300, 300, 300, 0, 2592, 32, 5324, 32, 8192*3, 2800*3, 2592, 21, 8192*3, 2800*3, 2592,
setWindowCoarseCal_S300_300, setWindowFineCal_S300_300,
setWindowSendCal_S300_300, sendCal1Header_S300_300,
sendCal2Header_S300_300, setWindowScan_S300_300 },
- { MODEL_S300, 600, 600, 0, 5184, 32, 10648, 32, 16064, 5440, 5184, 256, 10, 16064, 5184, 5440,
+ { MODEL_S300, 600, 600, 0, 5184, 32, 10648, 32, 16064*3, 5440*3, 5184, 10, 16064*3, 5440*3, 5184,
setWindowCoarseCal_S300_600, setWindowFineCal_S300_600,
setWindowSendCal_S300_600, sendCal1Header_S300_600,
sendCal2Header_S300_600, setWindowScan_S300_600 },
/*S300 USB*/
-/* model xres yres u mxx mnx mxy mny actw reqw hedw padw bh calw cal_hedw cal_reqw */
- { MODEL_S300, 150, 150, 1, 1296, 32, 2662, 32, 7216, 2960, 1296, 1664, 24, 14432, 2592, 5920,
+/* model xres yres u mxx mnx mxy mny lin_s pln_s pln_w bh cls cps cpw */
+ { MODEL_S300, 150, 150, 1, 1296, 32, 2662, 32, 7216*3, 2960*3, 1296, 24, 14432*3, 5920*3, 2592,
setWindowCoarseCal_S300_150_U, setWindowFineCal_S300_150_U,
setWindowSendCal_S300_150_U, sendCal1Header_S300_150_U,
sendCal2Header_S300_150_U, setWindowScan_S300_150_U },
- { MODEL_S300, 225, 200, 1, 1944, 32, 3993, 32, 10584, 4320, 1944, 2376, 16, 14112, 2592, 5760,
+ { MODEL_S300, 225, 200, 1, 1944, 32, 3993, 32, 10584*3, 4320*3, 1944, 16, 14112*3, 5760*3, 2592,
setWindowCoarseCal_S300_225_U, setWindowFineCal_S300_225_U,
setWindowSendCal_S300_225_U, sendCal1Header_S300_225_U,
sendCal2Header_S300_225_U, setWindowScan_S300_225_U },
- { MODEL_S300, 300, 300, 1, 2592, 32, 5324, 32, 15872, 6640, 2592, 4048, 11, 15872, 2592, 6640,
+ { MODEL_S300, 300, 300, 1, 2592, 32, 5324, 32, 15872*3, 6640*3, 2592, 11, 15872*3, 6640*3, 2592,
setWindowCoarseCal_S300_300_U, setWindowFineCal_S300_300_U,
setWindowSendCal_S300_300_U, sendCal1Header_S300_300_U,
sendCal2Header_S300_300_U, setWindowScan_S300_300_U },
- { MODEL_S300, 600, 600, 1, 5184, 32, 10648, 32, 16064, 5440, 5184, 256, 10, 16064, 5184, 5440,
+ { MODEL_S300, 600, 600, 1, 5184, 32, 10648, 32, 16064*3, 5440*3, 5184, 10, 16064*3, 5440*3, 5184,
+ setWindowCoarseCal_S300_600, setWindowFineCal_S300_600,
+ setWindowSendCal_S300_600, sendCal1Header_S300_600,
+ sendCal2Header_S300_600, setWindowScan_S300_600 },
+
+ /*S1300i AC*/
+/* model xres yres u mxx mnx mxy mny lin_s pln_s pln_w bh cls cps cpw */
+ { MODEL_S1300i, 150, 150, 0, 1296, 32, 2662, 32, 4016*3, 1360*3, 1296, 43, 8032*3, 2720*3, 2592,
+ setWindowCoarseCal_S1300i_150, setWindowFineCal_S1300i_150,
+ setWindowSendCal_S1300i_150, sendCal1Header_S1300i_150,
+ sendCal2Header_S1300i_150, setWindowScan_S1300i_150 },
+
+ { MODEL_S1300i, 225, 200, 0, 1944, 32, 3993, 32, 6072*3, 2063*3, 1944, 28, 8096*3, 2752*3, 2592,
+ setWindowCoarseCal_S1300i_225, setWindowFineCal_S1300i_225,
+ setWindowSendCal_S1300i_225, sendCal1Header_S1300i_225,
+ sendCal2Header_S1300i_225, setWindowScan_S1300i_225 },
+
+ { MODEL_S1300i, 300, 300, 0, 2592, 32, 5324, 32, 8096*3, 2751*3, 2592, 21, 8096*3, 2752*3, 2592,
+ setWindowCoarseCal_S1300i_300, setWindowFineCal_S1300i_300,
+ setWindowSendCal_S1300i_300, sendCal1Header_S1300i_300,
+ sendCal2Header_S1300i_300, setWindowScan_S1300i_300 },
+
+ /*NOTE: S1300i uses S300 data blocks for remainder*/
+ { MODEL_S1300i, 600, 600, 0, 5184, 32, 10648, 32, 16064*3, 5440*3, 5184, 10, 16064*3, 5440*3, 5184,
setWindowCoarseCal_S300_600, setWindowFineCal_S300_600,
setWindowSendCal_S300_600, sendCal1Header_S300_600,
sendCal2Header_S300_600, setWindowScan_S300_600 },
+ /*S1300i USB*/
+/* model xres yres u mxx mnx mxy mny lin_s pln_s pln_w bh cls cps cpw */
+ { MODEL_S1300i, 150, 150, 1, 1296, 32, 2662, 32, 7216*3, 2960*3, 1296, 24, 14432*3, 5920*3, 2592,
+ setWindowCoarseCal_S300_150_U, setWindowFineCal_S300_150_U,
+ setWindowSendCal_S300_150_U, sendCal1Header_S1300i_USB,
+ sendCal2Header_S1300i_USB, setWindowScan_S300_150_U },
+
+ { MODEL_S1300i, 225, 200, 1, 1944, 32, 3993, 32, 10584*3, 4320*3, 1944, 16, 14112*3, 5760*3, 2592,
+ setWindowCoarseCal_S300_225_U, setWindowFineCal_S300_225_U,
+ setWindowSendCal_S300_225_U, sendCal1Header_S1300i_USB,
+ sendCal2Header_S1300i_USB, setWindowScan_S300_225_U },
+
+ { MODEL_S1300i, 300, 300, 1, 2592, 32, 5324, 32, 15872*3, 6640*3, 2592, 11, 15872*3, 6640*3, 2592,
+ setWindowCoarseCal_S300_300_U, setWindowFineCal_S300_300_U,
+ setWindowSendCal_S300_300_U, sendCal1Header_S1300i_USB,
+ sendCal2Header_S1300i_USB, setWindowScan_S300_300_U },
+
+ { MODEL_S1300i, 600, 600, 1, 5184, 32, 10648, 32, 16064*3, 5440*3, 5184, 10, 16064*3, 5440*3, 5184,
+ setWindowCoarseCal_S300_600, setWindowFineCal_S300_600,
+ setWindowSendCal_S300_600, sendCal1Header_S1300i_USB,
+ sendCal2Header_S1300i_USB, setWindowScan_S300_600 },
+
/*fi-60F*/
-/* model xres yres u mxx mnx mxy mny actw reqw hedw padw bh calw cal_hedw cal_reqw */
- { MODEL_FI60F, 150, 150, 0, 648, 32, 875, 32, 1480, 632, 216, 416, 41, 1480, 216, 632,
+/* model xres yres u mxx mnx mxy mny lin_s pln_s pln_w bh cls cps cpw */
+ { MODEL_FI60F, 300, 150, 0, 1296, 32, 875, 32, 2400*3, 958*3, 432, 72, 2400*3, 958*3, 432,
setWindowCoarseCal_FI60F_150, setWindowFineCal_FI60F_150,
setWindowSendCal_FI60F_150, sendCal1Header_FI60F_150,
sendCal2Header_FI60F_150, setWindowScan_FI60F_150 },
- { MODEL_FI60F, 300, 300, 0, 1296, 32, 1749, 32, 2400, 958, 432, 526, 72, 2400, 432, 958,
+ { MODEL_FI60F, 300, 300, 0, 1296, 32, 1749, 32, 2400*3, 958*3, 432, 72, 2400*3, 958*3, 432,
setWindowCoarseCal_FI60F_300, setWindowFineCal_FI60F_300,
setWindowSendCal_FI60F_300, sendCal1Header_FI60F_300,
sendCal2Header_FI60F_300, setWindowScan_FI60F_300 },
- { MODEL_FI60F, 600, 600, 0, 2592, 32, 3498, 32, 2848, 978, 864, 114, 61, 2848, 864, 978,
+ { MODEL_FI60F, 600, 600, 0, 2592, 32, 3498, 32, 2848*3, 978*3, 864, 61, 2848*3, 978*3, 864,
setWindowCoarseCal_FI60F_600, setWindowFineCal_FI60F_600,
setWindowSendCal_FI60F_600, sendCal1Header_FI60F_600,
sendCal2Header_FI60F_600, setWindowScan_FI60F_600 },
- { MODEL_NONE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /*fi-65F*/
+/* model xres yres u mxx mnx mxy mny lin_s pln_s pln_w bh cls cps cpw */
+ { MODEL_FI65F, 300, 150, 0, 1296, 32, 875, 32, 2400*3, 958*3, 432, 72, 2400*3, 958*3, 432,
+ setWindowCoarseCal_FI60F_150, setWindowFineCal_FI60F_150,
+ setWindowSendCal_FI60F_150, sendCal1Header_FI60F_150,
+ sendCal2Header_FI60F_150, setWindowScan_FI60F_150 },
+
+ { MODEL_FI65F, 300, 300, 0, 1296, 32, 1749, 32, 2400*3, 958*3, 432, 72, 2400*3, 958*3, 432,
+ setWindowCoarseCal_FI60F_300, setWindowFineCal_FI60F_300,
+ setWindowSendCal_FI60F_300, sendCal1Header_FI60F_300,
+ sendCal2Header_FI60F_300, setWindowScan_FI60F_300 },
+
+ { MODEL_FI65F, 600, 600, 0, 2592, 32, 3498, 32, 2848*3, 978*3, 864, 61, 2848*3, 978*3, 864,
+ setWindowCoarseCal_FI60F_600, setWindowFineCal_FI60F_600,
+ setWindowSendCal_FI60F_600, sendCal1Header_FI60F_600,
+ sendCal2Header_FI60F_600, setWindowScan_FI60F_600 },
+
+ /*S1100 USB*/
+/* model xres yres u mxx mnx mxy mny lin_s pln_s pln_w bh cls cps cpw */
+ { MODEL_S1100, 300, 300, 1, 2592, 32, 5324, 32, 8912, 3160, 2592, 58, 8912, 3160, 2592,
+ setWindowCoarseCal_S1100_300_U, setWindowFineCal_S1100_300_U,
+ setWindowSendCal_S1100_300_U, sendCal1Header_S1100_300_U,
+ sendCal2Header_S1100_300_U, setWindowScan_S1100_300_U },
+
+ { MODEL_S1100, 600, 600, 1, 5184, 32, 10648, 32, 15904, 5360, 5184, 32, 15904, 5360, 5184,
+ setWindowCoarseCal_S1100_600_U, setWindowFineCal_S1100_600_U,
+ setWindowSendCal_S1100_600_U, sendCal1Header_S1100_600_U,
+ sendCal2Header_S1100_600_U, setWindowScan_S1100_600_U },
+
+ { MODEL_NONE, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
NULL, NULL, NULL, NULL, NULL, NULL },
};
@@ -1789,86 +1956,126 @@ change_params(struct scanner *s)
do {
if(settings[i].model == s->model
- && settings[i].x_res == s->resolution_x
- && settings[i].usb_power == s->usb_power){
-
- /*pull in closest y resolution*/
- s->resolution_y = settings[i].y_res;
+ && settings[i].x_res >= s->resolution
+ && settings[i].y_res >= s->resolution
+ && settings[i].usb_power == s->usb_power
+ ){
+ break;
+ }
+ i++;
+ } while (settings[i].model);
- /*1200 dpi*/
- s->max_x = settings[i].max_x * 1200/s->resolution_x;
- s->min_x = settings[i].min_x * 1200/s->resolution_x;
- s->max_y = settings[i].max_y * 1200/s->resolution_y;
- s->min_y = settings[i].min_y * 1200/s->resolution_y;
+ if (!settings[i].model){
+ return SANE_STATUS_INVAL;
+ }
- s->page_width = s->max_x;
- s->br_x = s->max_x;
- s->br_y = s->max_y;
+ /*1200 dpi*/
+ s->max_x = PIX_TO_SCANNER_UNIT( settings[i].max_x, settings[i].x_res );
+ s->min_x = PIX_TO_SCANNER_UNIT( settings[i].min_x, settings[i].x_res );
+ s->max_y = PIX_TO_SCANNER_UNIT( settings[i].max_y, settings[i].y_res );
+ s->min_y = PIX_TO_SCANNER_UNIT( settings[i].min_y, settings[i].y_res );
- /*current dpi*/
- s->setWindowCoarseCal = settings[i].sw_coarsecal;
- s->setWindowCoarseCalLen = SET_WINDOW_LEN;
+ /*current dpi*/
+ s->setWindowCoarseCal = settings[i].sw_coarsecal;
+ s->setWindowCoarseCalLen = SET_WINDOW_LEN;
- s->setWindowFineCal = settings[i].sw_finecal;
- s->setWindowFineCalLen = SET_WINDOW_LEN;
+ s->setWindowFineCal = settings[i].sw_finecal;
+ s->setWindowFineCalLen = SET_WINDOW_LEN;
- s->setWindowSendCal = settings[i].sw_sendcal;
- s->setWindowSendCalLen = SET_WINDOW_LEN;
+ s->setWindowSendCal = settings[i].sw_sendcal;
+ s->setWindowSendCalLen = SET_WINDOW_LEN;
- s->sendCal1Header = settings[i].head_cal1;
- s->sendCal1HeaderLen = 14;
+ s->sendCal1Header = settings[i].head_cal1;
+ s->sendCal1HeaderLen = 14;
- s->sendCal2Header = settings[i].head_cal2;
- s->sendCal2HeaderLen = 7;
+ s->sendCal2Header = settings[i].head_cal2;
+ s->sendCal2HeaderLen = 7;
- s->setWindowScan = settings[i].sw_scan;
- s->setWindowScanLen = SET_WINDOW_LEN;
+ s->setWindowScan = settings[i].sw_scan;
+ s->setWindowScanLen = SET_WINDOW_LEN;
- break;
- }
- i++;
- } while (settings[i].model);
-
- if (!settings[i].model)
- {
- return SANE_STATUS_INVAL;
- }
-
- if (s->model == MODEL_S300)
+ if (s->model == MODEL_S300 || s->model == MODEL_S1300i)
{
img_heads = 1; /* image width is the same as the plane width on the S300 */
img_pages = 2;
}
- else /* (s->model == MODEL_FI60F) */
+ else if (s->model == MODEL_S1100)
+ {
+ img_heads = 1; /* image width is the same as the plane width on the S1000 */
+ img_pages = 1;
+ }
+ else /* MODEL_FI60F or MODEL_FI65F */
{
img_heads = 3; /* image width is 3* the plane width on the FI-60F */
img_pages = 1;
}
+
+ /* height */
+ if (s->tl_y > s->max_y - s->min_y)
+ s->tl_y = s->max_y - s->min_y - s->adf_height_padding;
+ if (s->tl_y + s->page_height > s->max_y - s->adf_height_padding)
+ s->page_height = s->max_y - s->adf_height_padding - s->tl_y;
+ if (s->page_height < s->min_y && s->page_height > 0)
+ s->page_height = s->min_y;
+ if (s->tl_y + s->page_height > s->max_y)
+ s->tl_y = s->max_y - s->adf_height_padding - s->page_height;
+ if (s->tl_y < 0)
+ s->tl_y = 0;
+
+ if (s->page_height > 0) {
+ s->br_y = s->tl_y + s->page_height;
+ }
+ else {
+ s->br_y = s->max_y;
+ }
+
+ /*width*/
+ if (s->page_width > s->max_x)
+ s->page_width = s->max_x;
+ else if (s->page_width < s->min_x)
+ s->page_width = s->min_x;
+ s->tl_x = (s->max_x - s->page_width)/2;
+ s->br_x = (s->max_x + s->page_width)/2;
- /* set up the transfer structs */
- s->cal_image.plane_width = settings[i].cal_headwidth;
- s->cal_image.plane_stride = settings[i].cal_reqwidth * 3;
- s->cal_image.line_stride = settings[i].cal_width * 3;
+ /*=============================================================*/
+ /* set up the calibration structs */
+ /* generally full width, short height, full resolution */
+ s->cal_image.line_stride = settings[i].cal_line_stride;
+ s->cal_image.plane_stride = settings[i].cal_plane_stride;
+ s->cal_image.plane_width = settings[i].cal_plane_width;
+ s->cal_image.x_res = settings[i].x_res;
+ s->cal_image.y_res = settings[i].y_res;
s->cal_image.raw_data = NULL;
s->cal_image.image = NULL;
- s->cal_data.plane_width = settings[i].cal_headwidth; /* width is the same, but there are 2 bytes per pixel component */
- s->cal_data.plane_stride = settings[i].cal_reqwidth * 6;
- s->cal_data.line_stride = settings[i].cal_width * 6;
+ /* width is the same, but there are 2 bytes per pixel component */
+ s->cal_data.line_stride = settings[i].cal_line_stride * 2;
+ s->cal_data.plane_stride = settings[i].cal_plane_stride * 2;
+ s->cal_data.plane_width = settings[i].cal_plane_width;
+ s->cal_data.x_res = settings[i].x_res;
+ s->cal_data.y_res = settings[i].y_res;
s->cal_data.raw_data = NULL;
s->cal_data.image = &s->sendcal;
- s->block_xfr.plane_width = settings[i].head_width;
- s->block_xfr.plane_stride = settings[i].req_width * 3;
- s->block_xfr.line_stride = settings[i].act_width * 3;
+ /*=============================================================*/
+ /* set up the input scan structs */
+ s->block_xfr.line_stride = settings[i].line_stride;
+ s->block_xfr.plane_stride = settings[i].plane_stride;
+ s->block_xfr.plane_width = settings[i].plane_width;
+ s->block_xfr.x_res = settings[i].x_res;
+ s->block_xfr.y_res = settings[i].y_res;
s->block_xfr.raw_data = NULL;
s->block_xfr.image = &s->block_img;
/* set up the block image used during scanning operation */
- width = s->block_xfr.plane_width * img_heads;
+ /* note that this is the same width/x_res as the final output image */
+ /* but the height/y_res are the same as block_xfr */
+ width = (s->block_xfr.plane_width*s->resolution/settings[i].x_res) * img_heads;
s->block_img.width_pix = width;
s->block_img.width_bytes = width * 3;
s->block_img.height = settings[i].block_height;
+ s->block_img.x_res = s->resolution;
+ s->block_img.y_res = settings[i].y_res;
s->block_img.pages = img_pages;
s->block_img.buffer = NULL;
@@ -1877,6 +2084,8 @@ change_params(struct scanner *s)
s->coarsecal.width_pix = s->darkcal.width_pix = s->lightcal.width_pix = width;
s->coarsecal.width_bytes = s->darkcal.width_bytes = s->lightcal.width_bytes = width * 3;
s->coarsecal.height = 1;
+ s->coarsecal.x_res = s->darkcal.x_res = s->lightcal.x_res = settings[i].x_res;
+ s->coarsecal.y_res = s->darkcal.y_res = s->lightcal.y_res = settings[i].y_res;
s->darkcal.height = s->lightcal.height = 16;
s->coarsecal.pages = s->darkcal.pages = s->lightcal.pages = img_pages;
s->coarsecal.buffer = s->darkcal.buffer = s->lightcal.buffer = NULL;
@@ -1886,50 +2095,95 @@ change_params(struct scanner *s)
s->sendcal.width_pix = width;
s->sendcal.width_bytes = width * 6; /* 2 bytes of cal data per pixel component */
s->sendcal.height = 1;
+ s->sendcal.x_res = settings[i].x_res;
+ s->sendcal.y_res = settings[i].y_res;
s->sendcal.pages = img_pages;
s->sendcal.buffer = NULL;
/* set up the fullscan parameters */
s->fullscan.width_bytes = s->block_xfr.line_stride;
+ s->fullscan.x_res = settings[i].x_res;
+ s->fullscan.y_res = settings[i].y_res;
if(s->source == SOURCE_FLATBED || !s->page_height)
{
/* flatbed and adf in autodetect always ask for all*/
- s->fullscan.height = s->max_y * s->resolution_y / 1200;
+ s->fullscan.height = SCANNER_UNIT_TO_PIX(s->max_y, s->fullscan.y_res);
}
else
{
- /* adf with specified paper size requires padding (~1/2in) */
- s->fullscan.height = (s->page_height+600) * s->resolution_y / 1200;
+ /* adf with specified paper size requires padding on top of page_height (~1/2in) */
+ s->fullscan.height = SCANNER_UNIT_TO_PIX((s->page_height + s->tl_y + s->adf_height_padding), s->fullscan.y_res);
}
- /* fill in front settings */
+ /*=============================================================*/
+ /* set up the output image structs */
+ /* output image might be different from scan due to interpolation */
+ s->front.x_res = s->resolution;
+ s->front.y_res = s->resolution;
+ if(s->source == SOURCE_FLATBED)
+ {
+ /* flatbed ignores the tly */
+ s->front.height = SCANNER_UNIT_TO_PIX(s->max_y - s->tl_y, s->front.y_res);
+ }
+ else if(!s->page_height)
+ {
+ /* adf in autodetect always asks for all */
+ s->front.height = SCANNER_UNIT_TO_PIX(s->max_y, s->front.y_res);
+ }
+ else
+ {
+ /* adf with specified paper size */
+ s->front.height = SCANNER_UNIT_TO_PIX(s->page_height, s->front.y_res);
+ }
s->front.width_pix = s->block_img.width_pix;
+ s->front.x_start_offset = (s->block_xfr.image->width_pix - s->front.width_pix)/2;
switch (s->mode) {
case MODE_COLOR:
s->front.width_bytes = s->front.width_pix*3;
+ s->front.x_offset_bytes = s->front.x_start_offset *3;
break;
case MODE_GRAYSCALE:
s->front.width_bytes = s->front.width_pix;
+ s->front.x_offset_bytes = s->front.x_start_offset;
break;
default: /*binary*/
s->front.width_bytes = s->front.width_pix/8;
+ s->front.width_pix = s->front.width_bytes * 8;
+ /*s->page_width = PIX_TO_SCANNER_UNIT(s->front.width_pix, (img_heads * s->resolution_x));*/
+ s->front.x_offset_bytes = s->front.x_start_offset/8;
break;
}
- /*output image might be taller than scan due to interpolation*/
- s->front.height = s->fullscan.height * s->resolution_x / s->resolution_y;
+
+ /* ADF front need to remove padding header */
+ if (s->source != SOURCE_FLATBED)
+ {
+ s->front.y_skip_offset = SCANNER_UNIT_TO_PIX(s->tl_y+s->adf_height_padding, s->fullscan.y_res);
+ }
+ else
+ {
+ s->front.y_skip_offset = SCANNER_UNIT_TO_PIX(s->tl_y, s->fullscan.y_res);
+ }
+
s->front.pages = 1;
s->front.buffer = NULL;
/* back settings always same as front settings */
s->back.width_pix = s->front.width_pix;
s->back.width_bytes = s->front.width_bytes;
+ s->back.x_res = s->front.x_res;
+ s->back.y_res = s->front.y_res;
s->back.height = s->front.height;
+ s->back.x_start_offset = s->front.x_start_offset;
+ s->back.x_offset_bytes = s->front.x_offset_bytes;
+ s->back.y_skip_offset = SCANNER_UNIT_TO_PIX(s->tl_y, s->fullscan.y_res);
s->back.pages = 1;
s->back.buffer = NULL;
/* dynamic threshold temp buffer, in gray */
s->dt.width_pix = s->front.width_pix;
s->dt.width_bytes = s->front.width_pix;
+ s->dt.x_res = s->front.x_res;
+ s->dt.y_res = s->front.y_res;
s->dt.height = 1;
s->dt.pages = 1;
s->dt.buffer = NULL;
@@ -2117,10 +2371,13 @@ sane_start (SANE_Handle handle)
s->side = !s->side;
}
+ /* recent scanners need ghs called before scanning */
+ ret = get_hardware_status(s);
+
/* ingest paper with adf */
if( s->source == SOURCE_ADF_BACK || s->source == SOURCE_ADF_FRONT
|| (s->source == SOURCE_ADF_DUPLEX && s->side == SIDE_FRONT) ){
- ret = ingest(s);
+ ret = object_position(s,EPJITSU_PAPER_INGEST);
if (ret != SANE_STATUS_GOOD) {
DBG (5, "sane_start: ERROR: failed to ingest\n");
sane_cancel((SANE_Handle)s);
@@ -2222,6 +2479,9 @@ sane_start (SANE_Handle handle)
s->pages[i].bytes_total = page_img->width_bytes * page_img->height;
s->pages[i].bytes_scanned = 0;
s->pages[i].bytes_read = 0;
+ s->pages[i].lines_rx = 0;
+ s->pages[i].lines_pass = 0;
+ s->pages[i].lines_tx = 0;
s->pages[i].done = 0;
}
@@ -2343,43 +2603,123 @@ setup_buffers(struct scanner *s)
*/
static SANE_Status
-coarsecal(struct scanner *s)
+coarsecal_send_cal(struct scanner *s, unsigned char *pay)
{
SANE_Status ret = SANE_STATUS_GOOD;
-
- size_t cmdLen = 2;
unsigned char cmd[2];
-
- size_t statLen = 1;
unsigned char stat[1];
+ size_t cmdLen,statLen,payLen;
+
+ DBG (5, "coarsecal_send_cal: start\n");
+ /* send coarse cal (c6) */
+ cmd[0] = 0x1b;
+ cmd[1] = 0xc6;
+ cmdLen = 2;
+ stat[0] = 0;
+ statLen = 1;
+
+ ret = do_cmd(
+ s, 0,
+ cmd, cmdLen,
+ NULL, 0,
+ stat, &statLen
+ );
+ if(ret){
+ DBG (5, "coarsecal_send_cal: error sending c6 cmd\n");
+ return ret;
+ }
+ if(stat[0] != 6){
+ DBG (5, "coarsecal_send_cal: cmd bad c6 status?\n");
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /*send coarse cal payload*/
+ stat[0] = 0;
+ statLen = 1;
+ payLen = 28;
- size_t payLen = 28;
- unsigned char pay[28];
+ ret = do_cmd(
+ s, 0,
+ pay, payLen,
+ NULL, 0,
+ stat, &statLen
+ );
+ if(ret){
+ DBG (5, "coarsecal_send_cal: error sending c6 payload\n");
+ return ret;
+ }
+ if(stat[0] != 6){
+ DBG (5, "coarsecal_send_cal: c6 payload bad status?\n");
+ return SANE_STATUS_IO_ERROR;
+ }
- int try_count, cal_good[2], x, i, j;
- int param[2], zcount[2], high_param[2], low_param[2], avg[2], maxval[2];
- int rgb_avg[2][3], rgb_hicount[2][3];
+ DBG (5, "coarsecal_send_cal: finish\n");
+ return ret;
+}
- DBG (10, "coarsecal: start\n");
+static SANE_Status
+coarsecal_get_line(struct scanner *s, struct image *img)
+{
+ SANE_Status ret = SANE_STATUS_GOOD;
+ unsigned char cmd[2];
+ unsigned char stat[1];
+ size_t cmdLen,statLen;
- if(s->model == MODEL_S300){
- memcpy(pay,coarseCalData_S300,payLen);
- }
- else{
- memcpy(pay,coarseCalData_FI60F,payLen);
- }
+ DBG (5, "coarsecal_get_line: start\n");
- /* ask for 1 line */
- ret = set_window(s, WINDOW_COARSECAL);
+ /* send scan d2 command */
+ cmd[0] = 0x1b;
+ cmd[1] = 0xd2;
+ cmdLen = 2;
+ stat[0] = 0;
+ statLen = 1;
+
+ ret = do_cmd(
+ s, 0,
+ cmd, cmdLen,
+ NULL, 0,
+ stat, &statLen
+ );
if(ret){
- DBG (5, "coarsecal: error sending setwindow\n");
+ DBG (5, "coarsecal_get_line: error sending d2 cmd\n");
return ret;
}
+ if(stat[0] != 6){
+ DBG (5, "coarsecal_get_line: cmd bad d2 status?\n");
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ s->cal_image.image = img;
+ update_transfer_totals(&s->cal_image);
+
+ while(!s->cal_image.done){
+ ret = read_from_scanner(s,&s->cal_image);
+ if(ret){
+ DBG (5, "coarsecal_get_line: cant read from scanner\n");
+ return ret;
+ }
+ }
+ /* convert the raw data into normal packed pixel data */
+ descramble_raw(s, &s->cal_image);
+
+ DBG (5, "coarsecal_get_line: finish\n");
+ return ret;
+}
+
+static SANE_Status
+coarsecal_dark(struct scanner *s, unsigned char *pay)
+{
+ SANE_Status ret = SANE_STATUS_GOOD;
+
+ int try_count, cal_good[2], x, j;
+ int param[2], zcount[2], high_param[2], low_param[2], avg[2], maxval[2];
+
+ DBG (5, "coarsecal_dark: start\n");
/* dark cal, lamp off */
ret = lamp(s,0);
if(ret){
- DBG (5, "coarsecal: error lamp off\n");
+ DBG (5, "coarsecal_dark: error lamp off\n");
return ret;
}
@@ -2394,93 +2734,23 @@ coarsecal(struct scanner *s)
try_count--;
/* update the coarsecal payload to use our new dark offset parameters */
- if (s->model == MODEL_S300)
+ if (s->model == MODEL_S300 || s->model == MODEL_S1300i)
{
pay[5] = param[0];
pay[7] = param[1];
}
- else /* (s->model == MODEL_FI60F) */
+ else /* MODEL_S1100 or MODEL_FI60F or MODEL_FI65F */
{
pay[5] = param[0];
pay[7] = param[0];
pay[9] = param[0];
}
- /* send coarse cal (c6) */
- cmd[0] = 0x1b;
- cmd[1] = 0xc6;
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- cmd, cmdLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending c6 cmd\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: cmd bad c6 status?\n");
- return SANE_STATUS_IO_ERROR;
- }
-
- /*send coarse cal payload*/
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- pay, payLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending c6 payload\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: c6 payload bad status?\n");
- return SANE_STATUS_IO_ERROR;
- }
+ ret = coarsecal_send_cal(s, pay);
- DBG(15, "coarsecal offset: parameter front: %i back: %i\n", param[0], param[1]);
+ DBG(15, "coarsecal_dark offset: parameter front: %i back: %i\n", param[0], param[1]);
- /* send scan d2 command */
- cmd[0] = 0x1b;
- cmd[1] = 0xd2;
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- cmd, cmdLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending d2 cmd\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: cmd bad d2 status?\n");
- return SANE_STATUS_IO_ERROR;
- }
-
- s->cal_image.image = &s->coarsecal;
- update_transfer_totals(&s->cal_image);
-
- while(!s->cal_image.done){
- ret = read_from_scanner(s,&s->cal_image);
- if(ret){
- DBG (5, "coarsecal: cant read from scanner\n");
- return ret;
- }
- }
- /* convert the raw data into normal packed pixel data */
- descramble_raw(s, &s->cal_image);
+ ret = coarsecal_get_line(s, &s->coarsecal);
/* gather statistics: count the proportion of 0-valued pixels */
/* since the lamp is off, there's no point in looking at the green or blue data - they're all from the same sensor anyway */
@@ -2504,9 +2774,9 @@ coarsecal(struct scanner *s)
avg[j] /= s->coarsecal.width_bytes;
zcount[j] = zcount[j] * 1000 / s->coarsecal.width_bytes;
}
- DBG(15, "coarsecal offset: average pixel values front: %i back: %i\n", avg[0], avg[1]);
- DBG(15, "coarsecal offset: maximum pixel values front: %i back: %i\n", maxval[0], maxval[1]);
- DBG(15, "coarsecal offset: 0-valued pixel count front: %f%% back: %f%%\n", zcount[0] / 10.0f, zcount[1] / 10.0f);
+ DBG(15, "coarsecal_dark offset: average pixel values front: %i back: %i\n", avg[0], avg[1]);
+ DBG(15, "coarsecal_dark offset: maximum pixel values front: %i back: %i\n", maxval[0], maxval[1]);
+ DBG(15, "coarsecal_dark offset: 0-valued pixel count front: %f%% back: %f%%\n", zcount[0] / 10.0f, zcount[1] / 10.0f);
/* check the values, adjust parameters if they are not within the target range */
for (j = 0; j < s->coarsecal.pages; j++)
@@ -2530,10 +2800,25 @@ coarsecal(struct scanner *s)
} /* continue looping for up to 8 tries */
+ DBG (5, "coarsecal_dark: finish\n");
+ return ret;
+}
+
+static SANE_Status
+coarsecal_light(struct scanner *s, unsigned char *pay)
+{
+ SANE_Status ret = SANE_STATUS_GOOD;
+
+ int try_count, cal_good[2], x, i, j;
+ int param[2], zcount[2], high_param[2], low_param[2], avg[2];
+ int rgb_avg[2][3], rgb_hicount[2][3];
+
+ DBG (5, "coarsecal_light: start\n");
+
/* light cal, lamp on */
ret = lamp(s,1);
if(ret){
- DBG (5, "coarsecal: error lamp on\n");
+ DBG (5, "coarsecal_light: error lamp on\n");
return ret;
}
@@ -2547,82 +2832,12 @@ coarsecal(struct scanner *s)
while (try_count > 0){
try_count--;
- /* send coarse cal (c6) */
- cmd[0] = 0x1b;
- cmd[1] = 0xc6;
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- cmd, cmdLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending c6 cmd\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: cmd bad c6 status?\n");
- return SANE_STATUS_IO_ERROR;
- }
-
- /*send coarse cal payload*/
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- pay, payLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending c6 payload\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: c6 payload bad status?\n");
- return SANE_STATUS_IO_ERROR;
- }
-
- DBG(15, "coarsecal gain: parameter front: %i back: %i\n", param[0], param[1]);
+ ret = coarsecal_send_cal(s, pay);
- /* send scan d2 command */
- cmd[0] = 0x1b;
- cmd[1] = 0xd2;
- stat[0] = 0;
- statLen = 1;
-
- ret = do_cmd(
- s, 0,
- cmd, cmdLen,
- NULL, 0,
- stat, &statLen
- );
- if(ret){
- DBG (5, "coarsecal: error sending d2 cmd\n");
- return ret;
- }
- if(stat[0] != 6){
- DBG (5, "coarsecal: cmd bad d2 status?\n");
- return SANE_STATUS_IO_ERROR;
- }
+ DBG(15, "coarsecal_light gain: parameter front: %i back: %i\n", param[0], param[1]);
- s->cal_image.image = &s->coarsecal;
- update_transfer_totals(&s->cal_image);
+ ret = coarsecal_get_line(s, &s->coarsecal);
- while(!s->cal_image.done){
- ret = read_from_scanner(s,&s->cal_image);
- if(ret){
- DBG (5, "coarsecal: cant read from scanner\n");
- return ret;
- }
- }
- /* convert the raw data into normal packed pixel data */
- descramble_raw(s, &s->cal_image);
-
/* gather statistics: count the proportion of 255-valued pixels in each color channel */
/* count the average pixel value in each color channel */
for (i = 0; i < s->coarsecal.pages; i++)
@@ -2645,7 +2860,7 @@ coarsecal(struct scanner *s)
/* apply the color correction factors to the averages */
for (i = 0; i < s->coarsecal.pages; i++)
for (j = 0; j < 3; j++)
- rgb_avg[i][j] *= white_factor[j];
+ rgb_avg[i][j] *= s->white_factor[j];
/* set the gain so that none of the color channels are clipping, ie take the highest channel values */
for (i = 0; i < s->coarsecal.pages; i++)
{
@@ -2662,9 +2877,9 @@ coarsecal(struct scanner *s)
}
zcount[i] = MAX3(rgb_hicount[i][0], rgb_hicount[i][1], rgb_hicount[i][2]);
}
- DBG(15, "coarsecal gain: average RGB values front: (%i,%i,%i) back: (%i,%i,%i)\n",
+ DBG(15, "coarsecal_light gain: average RGB values front: (%i,%i,%i) back: (%i,%i,%i)\n",
rgb_avg[0][0], rgb_avg[0][1], rgb_avg[0][2], rgb_avg[1][0], rgb_avg[1][1], rgb_avg[1][2]);
- DBG(15, "coarsecal gain: 255-valued pixel count front: (%g,%g,%g) back: (%g,%g,%g)\n",
+ DBG(15, "coarsecal_light gain: 255-valued pixel count front: (%g,%g,%g) back: (%g,%g,%g)\n",
rgb_hicount[0][0]/10.0f, rgb_hicount[0][1]/10.0f, rgb_hicount[0][2]/10.0f,
rgb_hicount[1][0]/10.0f, rgb_hicount[1][1]/10.0f, rgb_hicount[1][2]/10.0f);
@@ -2689,12 +2904,12 @@ coarsecal(struct scanner *s)
if (cal_good[0] + cal_good[1] == s->coarsecal.pages) break;
/* update the coarsecal payload to use the new gain parameters */
- if (s->model == MODEL_S300)
+ if (s->model == MODEL_S300 || s->model == MODEL_S1300i)
{
pay[11] = param[0];
pay[13] = param[1];
}
- else /* (s->model == MODEL_FI60F) */
+ else /* MODEL_S1100 or MODEL_FI60F or MODEL_FI65F */
{
pay[11] = param[0];
pay[13] = param[0];
@@ -2702,6 +2917,49 @@ coarsecal(struct scanner *s)
}
}
+ DBG (5, "coarsecal_light: finish\n");
+ return ret;
+}
+
+static SANE_Status
+coarsecal(struct scanner *s)
+{
+ SANE_Status ret = SANE_STATUS_GOOD;
+ unsigned char pay[28];
+ size_t payLen;
+
+ DBG (10, "coarsecal: start\n");
+
+ payLen = sizeof(pay);
+
+ if(s->model == MODEL_S300){
+ memcpy(pay,coarseCalData_S300,payLen);
+ }
+ else if(s->model == MODEL_S1300i){
+ memcpy(pay,coarseCalData_S1300i,payLen);
+ }
+ else if(s->model == MODEL_S1100){
+ memcpy(pay,coarseCalData_S1100,payLen);
+ }
+ else{
+ memcpy(pay,coarseCalData_FI60F,payLen);
+ }
+
+ /* ask for 1 line */
+ ret = set_window(s, WINDOW_COARSECAL);
+ if(ret){
+ DBG (5, "coarsecal: error sending setwindow\n");
+ return ret;
+ }
+
+ if(s->model == MODEL_S1100){
+ ret = coarsecal_send_cal(s, pay);
+ }
+ else{
+ ret = coarsecal_dark(s, pay);
+ ret = coarsecal_light(s, pay);
+ }
+
DBG (10, "coarsecal: finish\n");
return ret;
}
@@ -2718,18 +2976,63 @@ finecal_send_cal(struct scanner *s)
unsigned char stat[2];
int i, j, k;
- unsigned short *p_out, *p_in = (unsigned short *) s->sendcal.buffer;
- int planes = (s->model == MODEL_S300) ? 2 : 3;
+ unsigned char *p_out, *p_in = s->sendcal.buffer;
+ int planes;
+
+ if(s->model == MODEL_FI60F || s->model == MODEL_FI65F)
+ planes = 3;
+ if(s->model == MODEL_S300 || s->model == MODEL_S1300i)
+ planes = 2;
/* scramble the raster buffer data into scanner raw format */
+ /* this is reverse of descramble_raw */
memset(s->cal_data.raw_data, 0, s->cal_data.line_stride);
- for (i = 0; i < planes; i++)
+
+ if(s->model == MODEL_S1100){
+ planes = 1;
+
+ for (k = 0; k < s->sendcal.width_pix; k++){ /* column (x) */
+
+ /* input is RrGgBb (capital is offset, small is gain) */
+ /* output is Bb...BbRr...RrGg...Gg*/
+
+ /*red*/
+ p_out = s->cal_data.raw_data + s->cal_data.plane_stride + k*2;
+ *p_out = *p_in;
+ p_out++;
+ p_in++;
+ *p_out = *p_in;
+ p_in++;
+
+ /*green*/
+ p_out = s->cal_data.raw_data + 2*s->cal_data.plane_stride + k*2;
+ *p_out = *p_in;
+ p_out++;
+ p_in++;
+ *p_out = *p_in;
+ p_in++;
+
+ /*blue*/
+ p_out = s->cal_data.raw_data + k*2;
+ *p_out = *p_in;
+ p_out++;
+ p_in++;
+ *p_out = *p_in;
+ p_in++;
+ }
+ }
+
+ else{
+ for (i = 0; i < planes; i++)
for (j = 0; j < s->cal_data.plane_width; j++)
for (k = 0; k < 3; k++)
{
- p_out = (unsigned short *) (s->cal_data.raw_data + k * s->cal_data.plane_stride + j * 6 + i * 2);
- *p_out = *p_in++; /* dark offset, gain */
+ p_out = (s->cal_data.raw_data + k * s->cal_data.plane_stride + j * 6 + i * 2);
+ *p_out = *p_in++; /* dark offset */
+ p_out++;
+ *p_out = *p_in++; /* gain */
}
+ }
ret = set_window(s, WINDOW_SENDCAL);
if(ret){
@@ -2906,13 +3209,21 @@ finecal(struct scanner *s)
{
SANE_Status ret = SANE_STATUS_GOOD;
- const int max_pages = (s->model == MODEL_S300 ? 2 : 1);
+ int max_pages;
int gain_delta = 0xff - 0xbf;
float *gain_slope, *last_error;
int i, j, k, idx, try_count, cal_good;
DBG (10, "finecal: start\n");
+ if (s->model == MODEL_S300 || s->model == MODEL_S1300i) { /* S300, S1300 */
+ max_pages = 2;
+ }
+ else /* fi-60f, S1100 */
+ {
+ max_pages = 1;
+ }
+
/* set fine dark offset to 0 and fix all fine gains to lowest parameter (0xFF) */
for (i = 0; i < s->sendcal.width_bytes * s->sendcal.pages / 2; i++)
{
@@ -3008,7 +3319,7 @@ finecal(struct scanner *s)
for (k = 0; k < 3; k++)
{
int pixvalue = s->lightcal.buffer[idx];
- float pixerror = (fine_gain_target[i] * white_factor[k] - pixvalue);
+ float pixerror = (fine_gain_target[i] * s->white_factor[k] - pixvalue);
int oldgain = s->sendcal.buffer[idx * 2 + 1];
int newgain;
/* if we overshot the last correction, reduce the gain_slope */
@@ -3084,6 +3395,9 @@ finecal(struct scanner *s)
return ret;
}
+/*
+ * set scanner lamp brightness
+ */
static SANE_Status
lamp(struct scanner *s, unsigned char set)
{
@@ -3247,16 +3561,36 @@ send_lut (struct scanner *s)
size_t cmdLen = 2;
unsigned char stat[1];
size_t statLen = 1;
- unsigned char out[0x6000];
- size_t outLen = 0x6000;
+ unsigned char *out;
+ size_t outLen;
int i, j;
double b, slope, offset;
- int width = outLen / 6; /* 3 colors, 2 bytes */
- int height = width; /* square table */
+ int width;
+ int height;
DBG (10, "send_lut: start\n");
+ if (s->model == MODEL_S1100){
+ outLen = 0x200;
+ width = outLen / 2; /* 1 color, 2 bytes */
+ height = width; /* square table */
+ }
+ else if (s->model == MODEL_FI65F){
+ outLen = 0x600;
+ width = outLen / 6; /* 3 color, 2 bytes */
+ height = width; /* square table */
+ }
+ else {
+ outLen = 0x6000;
+ width = outLen / 6; /* 3 colors, 2 bytes */
+ height = width; /* square table */
+ }
+ out = ( unsigned char *)malloc(outLen*sizeof(unsigned char));
+ if (out == NULL){
+ return SANE_STATUS_NO_MEM;
+ }
+
/* contrast is converted to a slope [0,90] degrees:
* first [-127,127] to [0,254] then to [0,1]
* then multiply by PI/2 to convert to radians
@@ -3287,18 +3621,38 @@ send_lut (struct scanner *s)
if(j>(height-1)){
j=height-1;
}
-
- /*first table, le order*/
- out[i*2] = j & 0xff;
- out[i*2+1] = (j >> 8) & 0x0f;
- /*second table, le order*/
- out[width*2 + i*2] = j & 0xff;
- out[width*2 + i*2+1] = (j >> 8) & 0x0f;
-
- /*third table, le order*/
- out[width*4 + i*2] = j & 0xff;
- out[width*4 + i*2+1] = (j >> 8) & 0x0f;
+ if (s->model == MODEL_S1100){
+ /*only one table, be order*/
+ out[i*2] = (j >> 8) & 0xff;
+ out[i*2+1] = j & 0xff;
+ }
+ else if (s->model == MODEL_FI65F){
+ /*first table, be order*/
+ out[i*2] = (j >> 8) & 0xff;
+ out[i*2+1] = j & 0xff;
+
+ /*second table, be order*/
+ out[width*2 + i*2] = (j >> 8) & 0xff;
+ out[width*2 + i*2+1] = j & 0xff;
+
+ /*third table, be order*/
+ out[width*4 + i*2] = (j >> 8) & 0xff;
+ out[width*4 + i*2+1] = j & 0xff;
+ }
+ else {
+ /*first table, le order*/
+ out[i*2] = j & 0xff;
+ out[i*2+1] = (j >> 8) & 0x0f;
+
+ /*second table, le order*/
+ out[width*2 + i*2] = j & 0xff;
+ out[width*2 + i*2+1] = (j >> 8) & 0x0f;
+
+ /*third table, le order*/
+ out[width*4 + i*2] = j & 0xff;
+ out[width*4 + i*2+1] = (j >> 8) & 0x0f;
+ }
}
ret = do_cmd(
@@ -3386,11 +3740,10 @@ get_hardware_status (struct scanner *s)
}
static SANE_Status
-ingest(struct scanner *s)
+object_position(struct scanner *s, int ingest)
{
SANE_Status ret = SANE_STATUS_GOOD;
int i;
-
unsigned char cmd[2];
size_t cmdLen = sizeof(cmd);
unsigned char stat[1];
@@ -3398,10 +3751,11 @@ ingest(struct scanner *s)
unsigned char pay[2];
size_t payLen = sizeof(pay);
- DBG (10, "ingest: start\n");
+ DBG (10, "object_position: start\n");
- for(i=0;i<5;i++){
-
+ i = (ingest)?5:1;
+
+ while(i--){
/*send paper load cmd*/
cmd[0] = 0x1b;
cmd[1] = 0xd4;
@@ -3414,18 +3768,18 @@ ingest(struct scanner *s)
stat, &statLen
);
if(ret){
- DBG (5, "ingest: error sending cmd\n");
+ DBG (5, "object_position: error sending cmd\n");
return ret;
}
if(stat[0] != 6){
- DBG (5, "ingest: cmd bad status? %d\n",stat[0]);
+ DBG (5, "object_position: cmd bad status? %d\n",stat[0]);
continue;
}
/*send payload*/
statLen = 1;
payLen = 1;
- pay[0] = 1;
+ pay[0] = ingest;
ret = do_cmd(
s, 0,
@@ -3434,25 +3788,25 @@ ingest(struct scanner *s)
stat, &statLen
);
if(ret){
- DBG (5, "ingest: error sending payload\n");
+ DBG (5, "object_position: error sending payload\n");
return ret;
}
if(stat[0] == 6){
- DBG (5, "ingest: found paper?\n");
+ DBG (5, "object_position: found paper?\n");
break;
}
else if(stat[0] == 0x15 || stat[0] == 0){
- DBG (5, "ingest: no paper?\n");
+ DBG (5, "object_position: no paper?\n");
ret=SANE_STATUS_NO_DOCS;
continue;
}
else{
- DBG (5, "ingest: payload bad status?\n");
+ DBG (5, "object_position: payload bad status?\n");
return SANE_STATUS_IO_ERROR;
}
}
- DBG (10, "ingest: finish\n");
+ DBG (10, "object_position: finish\n");
return ret;
}
@@ -3467,7 +3821,7 @@ scan(struct scanner *s)
DBG (10, "scan: start\n");
- if(s->model == MODEL_S300){
+ if(s->model == MODEL_S300 || s->model == MODEL_S1100 || s->model == MODEL_S1300i){
cmd[1] = 0xd6;
}
@@ -3525,9 +3879,29 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
page = &s->pages[s->side];
/* have sent all of current buffer */
- if(page->done){
+ if(s->fullscan.done && page->done){
DBG (10, "sane_read: returning eof\n");
- return SANE_STATUS_EOF;
+
+ /*S1100 needs help to turn off button*/
+ if(s->model == MODEL_S1100){
+ usleep(15000);
+
+ /* eject paper */
+ ret = object_position(s,EPJITSU_PAPER_EJECT);
+ if (ret != SANE_STATUS_GOOD && ret != SANE_STATUS_NO_DOCS) {
+ DBG (5, "sane_read: ERROR: failed to eject\n");
+ return ret;
+ }
+
+ /* reset flashing button? */
+ ret = six5(s);
+ if (ret != SANE_STATUS_GOOD) {
+ DBG (5, "sane_read: ERROR: failed to six5\n");
+ return ret;
+ }
+ }
+
+ return SANE_STATUS_EOF;
}
/* scan not finished, get more into block buffer */
@@ -3543,8 +3917,8 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
DBG (15, "sane_read: shrinking block to %lu\n", (unsigned long)remainTotal);
s->block_xfr.total_bytes = remainTotal;
}
- /* send d3 cmd for S300 */
- if(s->model == MODEL_S300)
+ /* send d3 cmd for S300, S1100, S1300 */
+ if(s->model == MODEL_S300 || s->model == MODEL_S1100 || s->model == MODEL_S1300i)
{
unsigned char cmd[] = {0x1b, 0xd3};
size_t cmdLen = 2;
@@ -3586,8 +3960,8 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
s->block_xfr.done = 0;
- /* get the 0x43 cmd for the S300 */
- if(s->model == MODEL_S300){
+ /* get the 0x43 cmd for the S300, S1100, S1300 */
+ if(s->model == MODEL_S300 || s->model == MODEL_S1100 || s->model == MODEL_S1300i){
unsigned char cmd[] = {0x1b, 0x43};
size_t cmdLen = 2;
@@ -3672,7 +4046,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
page->bytes_read += *len;
/* sent it all, return eof on next read */
- if(s->fullscan.done && page->bytes_read == page->bytes_scanned){
+ if(page->bytes_read == page->bytes_scanned && s->fullscan.done){
DBG (10, "sane_read: side done\n");
page->done = 1;
}
@@ -3683,36 +4057,180 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
return ret;
}
+static SANE_Status
+six5 (struct scanner *s)
+{
+ SANE_Status ret = SANE_STATUS_GOOD;
+
+ unsigned char cmd[2];
+ size_t cmdLen = sizeof(cmd);
+ unsigned char stat[1];
+ size_t statLen = sizeof(stat);
+
+ DBG (10, "six5: start\n");
+
+ cmd[0] = 0x1b;
+ cmd[1] = 0x65;
+ statLen = 1;
+
+ ret = do_cmd(
+ s, 0,
+ cmd, cmdLen,
+ NULL, 0,
+ stat, &statLen
+ );
+ if(ret){
+ DBG (5, "six5: error sending cmd\n");
+ return ret;
+ }
+ if(stat[0] != 6){
+ DBG (5, "six5: cmd bad status? %d\n",stat[0]);
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ DBG (10, "six5: finish\n");
+
+ return ret;
+}
+
/* de-scrambles the raw data from the scanner into the image buffer */
+/* the output image might be lower dpi than input image, so we scale horizontally */
static SANE_Status
descramble_raw(struct scanner *s, struct transfer * tp)
{
SANE_Status ret = SANE_STATUS_GOOD;
- unsigned char *p_in, *p_out = tp->image->buffer;
+ unsigned char *p_out = tp->image->buffer;
int height = tp->total_bytes / tp->line_stride;
- int i, j, k, l;
+ int i, j, k;
- if (s->model == MODEL_S300)
- {
- for (i = 0; i < 2; i++) /* page, front/back */
- for (j = 0; j < height; j++) /* row (y)*/
- for (k = 0; k < tp->plane_width; k++) /* column (x) */
- for (l = 0; l < 3; l++) /* color component */
- {
- p_in = (unsigned char *) tp->raw_data + (j * tp->line_stride) + (l * tp->plane_stride) + k * 3 + i;
- *p_out++ = *p_in;
- }
+ if (s->model == MODEL_S300 || s->model == MODEL_S1300i) {
+ for (i = 0; i < 2; i++){ /* page, front/back */
+ for (j = 0; j < height; j++){ /* row (y)*/
+ int curr_col = 0;
+ int r=0, g=0, b=0, ppc=0;
+
+ for (k = 0; k <= tp->plane_width; k++){ /* column (x) */
+ int this_col = k*tp->image->x_res/tp->x_res;
+
+ /* going to change output pixel, dump rgb and reset */
+ if(ppc && curr_col != this_col){
+ *p_out = r/ppc;
+ p_out++;
+
+ *p_out = g/ppc;
+ p_out++;
+
+ *p_out = b/ppc;
+ p_out++;
+
+ r = g = b = ppc = 0;
+
+ curr_col = this_col;
+ }
+
+ if(k == tp->plane_width || this_col >= tp->image->width_pix){
+ break;
+ }
+
+ /*red is first*/
+ r += tp->raw_data[j*tp->line_stride + k*3 + i];
+
+ /*green is second*/
+ g += tp->raw_data[j*tp->line_stride + tp->plane_stride + k*3 + i];
+
+ /*blue is third*/
+ b += tp->raw_data[j*tp->line_stride + 2*tp->plane_stride + k*3 + i];
+
+ ppc++;
+ }
+ }
+ }
}
- else /* MODEL_FI60F */
- {
- for (i = 0; i < height; i++) /* row (y)*/
- for (j = 0; j < 3; j++) /* read head */
- for (k = 0; k < tp->plane_width; k++) /* column within the read head */
- for (l = 0; l < 3; l++) /* color component */
- {
- p_in = (unsigned char *) tp->raw_data + (i * tp->line_stride) + (l * tp->plane_stride) + k * 3 + j;
- *p_out++ = *p_in;
- }
+ else if (s->model == MODEL_S1100){
+ for (j = 0; j < height; j++){ /* row (y)*/
+ int curr_col = 0;
+ int r=0, g=0, b=0, ppc=0;
+
+ for (k = 0; k <= tp->plane_width; k++){ /* column (x) */
+ int this_col = k*tp->image->x_res/tp->x_res;
+
+ /* going to change output pixel, dump rgb and reset */
+ if(ppc && curr_col != this_col){
+ *p_out = r/ppc;
+ p_out++;
+
+ *p_out = g/ppc;
+ p_out++;
+
+ *p_out = b/ppc;
+ p_out++;
+
+ r = g = b = ppc = 0;
+
+ curr_col = this_col;
+ }
+
+ if(k == tp->plane_width || this_col >= tp->image->width_pix){
+ break;
+ }
+
+ /*red is second*/
+ r += tp->raw_data[j*tp->line_stride + tp->plane_stride + k];
+
+ /*green is third*/
+ g += tp->raw_data[j*tp->line_stride + 2*tp->plane_stride + k];
+
+ /*blue is first*/
+ b += tp->raw_data[j*tp->line_stride + k];
+
+ ppc++;
+ }
+ }
+ }
+ else { /* MODEL_FI60F or MODEL_FI65F */
+
+ for (j = 0; j < height; j++){ /* row (y)*/
+ int curr_col = 0;
+
+ for (i = 0; i < 3; i++){ /* read head */
+ int r=0, g=0, b=0, ppc=0;
+
+ for (k = 0; k <= tp->plane_width; k++){ /* column (x) within the read head */
+ int this_col = (k+i*tp->plane_width)*tp->image->x_res/tp->x_res;
+
+ /* going to change output pixel, dump rgb and reset */
+ if(ppc && curr_col != this_col){
+ *p_out = r/ppc;
+ p_out++;
+
+ *p_out = g/ppc;
+ p_out++;
+
+ *p_out = b/ppc;
+ p_out++;
+
+ r = g = b = ppc = 0;
+
+ curr_col = this_col;
+ }
+
+ if(k == tp->plane_width || this_col >= tp->image->width_pix){
+ break;
+ }
+
+ /*red is first*/
+ r += tp->raw_data[j*tp->line_stride + k*3 + i];
+
+ /*green is second*/
+ g += tp->raw_data[j*tp->line_stride + tp->plane_stride + k*3 + i];
+
+ /*blue is third*/
+ b += tp->raw_data[j*tp->line_stride + 2*tp->plane_stride + k*3 + i];
+
+ ppc++;
+ }
+ }
+ }
}
return ret;
@@ -3725,9 +4243,11 @@ read_from_scanner(struct scanner *s, struct transfer * tp)
SANE_Status ret=SANE_STATUS_GOOD;
size_t bytes = MAX_IMG_PASS;
size_t remainBlock = tp->total_bytes - tp->rx_bytes + 8;
-
- /* determine amount to ask for */
- if(bytes > remainBlock){
+ unsigned char * buf;
+ size_t bufLen;
+
+ /* determine amount to ask for, S1300i wants big requests */
+ if(bytes > remainBlock && s->model != MODEL_S1300i){
bytes = remainBlock;
}
@@ -3745,70 +4265,141 @@ read_from_scanner(struct scanner *s, struct transfer * tp)
return SANE_STATUS_INVAL;
}
+ bufLen = bytes;
+ buf = malloc(bufLen);
+ if(!buf){
+ DBG (5, "read_from_scanner: failed to alloc mem\n");
+ return SANE_STATUS_NO_MEM;
+ }
+
ret = do_cmd(
s, 0,
NULL, 0,
NULL, 0,
- tp->raw_data + tp->rx_bytes, &bytes
+ buf, &bytes
);
-
+
/* full read or short read */
if (ret == SANE_STATUS_GOOD || (ret == SANE_STATUS_EOF && bytes) ) {
DBG(15,"read_from_scanner: got GOOD/EOF (%lu)\n",(unsigned long)bytes);
+ if(bytes > remainBlock){
+ DBG(15,"read_from_scanner: block too big?\n");
+ bytes = remainBlock;
+ }
+
if(bytes == remainBlock){
DBG(15,"read_from_scanner: block done, ignoring trailer\n");
bytes -= 8;
tp->done = 1;
}
- ret = SANE_STATUS_GOOD;
+ memcpy(tp->raw_data + tp->rx_bytes, buf, bytes);
tp->rx_bytes += bytes;
+
+ ret = SANE_STATUS_GOOD;
}
else {
DBG(5, "read_from_scanner: error reading status = %d\n", ret);
}
-
+
+ free(buf);
+
DBG (10, "read_from_scanner: finish rB:%lu len:%lu\n",
- (unsigned long)(tp->total_bytes - tp->rx_bytes), (unsigned long)bytes);
+ (unsigned long)(tp->total_bytes - tp->rx_bytes + 8), (unsigned long)bytes);
return ret;
}
/* copies block buffer into front or back image buffer */
/* converts pixel data from RGB Color to the output format */
+/* the output image might be lower dpi than input image, so we scale vertically */
static SANE_Status
copy_block_to_page(struct scanner *s,int side)
{
SANE_Status ret = SANE_STATUS_GOOD;
struct transfer * block = &s->block_xfr;
struct page * page = &s->pages[side];
- int height = block->total_bytes / block->line_stride;
- int width = block->image->width_pix;
+ int image_height = block->total_bytes / block->line_stride;
+ int page_height = SCANNER_UNIT_TO_PIX(s->page_height, s->resolution);
+ int page_width = page->image->width_pix;
int block_page_stride = block->image->width_bytes * block->image->height;
- int page_y_offset = page->bytes_scanned / page->image->width_bytes;
- int line_reverse = (side == SIDE_BACK) || (s->model == MODEL_FI60F);
- int i,j;
+ int line_reverse = (side == SIDE_BACK) || (s->model == MODEL_FI60F) || (s->model == MODEL_FI65F);
+ int i,j,k=0,l=0;
+
+ int curr_in_row = s->fullscan.rx_bytes/s->fullscan.width_bytes;
+ int last_out_row = (page->bytes_scanned / page->image->width_bytes) - 1;
DBG (10, "copy_block_to_page: start\n");
+ /* skip padding and tl_y */
+ if (s->fullscan.rx_bytes + s->block_xfr.rx_bytes < block->line_stride * page->image->y_skip_offset)
+ {
+ DBG (10, "copy_block_to_page: before the start? %d\n", side);
+ return ret;
+ }
+ else if (s->fullscan.rx_bytes < block->line_stride * page->image->y_skip_offset)
+ {
+ k = page->image->y_skip_offset - s->fullscan.rx_bytes / block->line_stride;
+ DBG (10, "copy_block_to_page: k start? %d\n", k);
+ }
+
+ /* skip trailer */
+ if (s->page_height)
+ {
+ DBG (10, "copy_block_to_page: ph %d\n", s->page_height);
+ if (s->fullscan.rx_bytes > block->line_stride * page->image->y_skip_offset + page_height * block->line_stride)
+ {
+ DBG (10, "copy_block_to_page: off the end? %d\n", side);
+ return ret;
+ }
+ else if (s->fullscan.rx_bytes + s->block_xfr.rx_bytes
+ > block->line_stride * page->image->y_skip_offset + page_height * block->line_stride)
+ {
+ l = (s->fullscan.rx_bytes + s->block_xfr.rx_bytes) / block->line_stride
+ - page_height - page->image->y_skip_offset;
+ }
+ }
+
/* loop over all the lines in the block */
- for (i = 0; i < height; i++)
+ for (i = k; i < image_height-l; i++)
{
- unsigned char * p_in = block->image->buffer + (side * block_page_stride) + (i * block->image->width_bytes);
- unsigned char * p_out = page->image->buffer + ((i + page_y_offset) * page->image->width_bytes);
+ /* determine source and dest rows (dpi scaling) */
+ int this_in_row = curr_in_row + i;
+ int this_out_row = (this_in_row - page->image->y_skip_offset) * page->image->y_res / s->fullscan.y_res;
+ DBG (15, "copy_block_to_page: in %d out %d lastout %d\n", this_in_row, this_out_row, last_out_row);
+ DBG (15, "copy_block_to_page: bs %d wb %d\n", page->bytes_scanned, page->image->width_bytes);
+
+ /* don't walk off the end of the output buffer */
+ if(this_out_row >= page->image->height || this_out_row < 0){
+ DBG (10, "copy_block_to_page: out of space? %d\n", side);
+ DBG (10, "copy_block_to_page: rx:%d tx:%d tot:%d line:%d\n",
+ page->bytes_scanned, page->bytes_read, page->bytes_total,page->image->width_bytes);
+ return ret;
+ }
+
+ /* ok, different output row, so we do the math */
+ if(this_out_row > last_out_row){
+
+ unsigned char * p_in = block->image->buffer + (side * block_page_stride)
+ + (i * block->image->width_bytes) + page->image->x_start_offset * 3;
+ unsigned char * p_out = page->image->buffer + this_out_row * page->image->width_bytes;
unsigned char * lineStart = p_out;
+
+ last_out_row = this_out_row;
+
/* reverse order for back side or FI-60F scanner */
if (line_reverse)
- p_in += (width - 1) * 3;
+ p_in += (page_width - 1) * 3;
+
/* convert all of the pixels in this row */
- for (j = 0; j < width; j++)
+ for (j = 0; j < page_width; j++)
{
unsigned char r, g, b;
- if (s->model == MODEL_S300)
+ if (s->model == MODEL_S300 || s->model == MODEL_S1300i)
{ r = p_in[1]; g = p_in[2]; b = p_in[0]; }
- else /* (s->model == MODEL_FI60F) */
+ else /* MODEL_FI60F or MODEL_FI65F or MODEL_S1100 */
{ r = p_in[0]; g = p_in[1]; b = p_in[2]; }
if (s->mode == MODE_COLOR)
{
@@ -3822,28 +4413,28 @@ copy_block_to_page(struct scanner *s,int side)
}
else if (s->mode == MODE_LINEART)
{
- s->dt.buffer[j] = (r + g + b) / 3;
+ s->dt.buffer[j] = (r + g + b) / 3; /* stores dt temp image buffer and binarize afterword */
}
if (line_reverse)
p_in -= 3;
else
p_in += 3;
}
- /* for MODE_LINEART, binarize the gray line stored in the temp image buffer */
+
+ /* skip non-transfer pixels in block image buffer */
+ if (line_reverse)
+ p_in -= page->image->x_offset_bytes;
+ else
+ p_in += page->image->x_offset_bytes;
+
+ /* for MODE_LINEART, binarize the gray line stored in the temp image buffer(dt) */
+ /* bacause dt.width = page_width, we pass page_width */
if (s->mode == MODE_LINEART)
- binarize_line(s, lineStart, width);
- /*add a periodic row because of non-square pixels*/
- /*FIXME: only works with 225x200*/
- if (s->resolution_x > s->resolution_y && (i + page_y_offset) % 9 == 8)
- {
- memcpy(lineStart + page->image->width_bytes, lineStart, page->image->width_bytes);
- page_y_offset += 1;
- page->bytes_scanned += page->image->width_bytes;
- }
- }
+ binarize_line(s, lineStart, page_width);
- /* update the page counter of bytes scanned */
- page->bytes_scanned += page->image->width_bytes * height;
+ page->bytes_scanned += page->image->width_bytes;
+ }
+ }
DBG (10, "copy_block_to_page: finish\n");
@@ -3858,7 +4449,7 @@ binarize_line(struct scanner *s, unsigned char *lineOut, int width)
int j, windowX, sum = 0;
/* ~1mm works best, but the window needs to have odd # of pixels */
- windowX = 6 * s->resolution_x / 150;
+ windowX = 6 * s->resolution / 150;
if (!(windowX % 2)) windowX++;
/*second, prefill the sliding sum*/
diff --git a/backend/epjitsu.conf.in b/backend/epjitsu.conf.in
index cabe6b2..155befc 100644
--- a/backend/epjitsu.conf.in
+++ b/backend/epjitsu.conf.in
@@ -17,6 +17,35 @@
# find them. They should be ~65K, and have the scanner's name as part of the
# file name. They are often inside a .cab file.
+# To extract .nal files from cabinet files on Linux, use the following steps:
+# (you need the "unshield" tool, which is - in Debian - in the unshield package)
+#
+# 1) Mount the ScanSnap installation DVD
+# (mount point e.g. /media/dvd)
+#
+# 2) Extract the .nal files c$ from the cabinet files on the DVD
+# using the following shell script:
+#
+# # loop over all cabinet files found on the DVD
+# for cab in $(find /media/dvd/ -name \*.cab); do
+# # search for .nal files in the cabinet files
+# nalinfo=$(unshield l $cab | grep '\.nal$')
+#
+# # we found something
+# if [ -n "$nalinfo" ]; then
+# #echo -e "=== $cab ===\n$nalinfo"
+#
+# # loop over all fields in $nalinfo
+# for nal in $nalinfo; do
+# # if the element of $nalinfo is a .nal file name
+# if echo "$nal" | grep -q '\.nal$' - 2>/dev/null; then
+# # extract .nal file form the cabinet file
+# unshield x "$cab" "${nal##*\\}"
+# fi
+# done
+# fi
+# done
+
# Copy the file someplace sane can reach it. Then update the line below.
# NOTE: the firmware line must occur BEFORE the usb line for your scanner
@@ -32,6 +61,14 @@ usb 0x04c5 0x1156
firmware @DATADIR@/sane/epjitsu/300M_0C00.nal
usb 0x04c5 0x117f
+# Fujitsu S1100
+firmware @DATADIR@/sane/epjitsu/1100_0B00.nal
+usb 0x04c5 0x1200
+
# Fujitsu S1300
firmware @DATADIR@/sane/epjitsu/1300_0C26.nal
usb 0x04c5 0x11ed
+
+# Fujitsu S1300i
+firmware @DATADIR@/sane/epjitsu/1300i_0D12.nal
+usb 0x04c5 0x128d
diff --git a/backend/epjitsu.h b/backend/epjitsu.h
index ed63504..7bb1ccc 100644
--- a/backend/epjitsu.h
+++ b/backend/epjitsu.h
@@ -18,8 +18,7 @@ enum scanner_Option
OPT_MODE_GROUP,
OPT_SOURCE, /*adffront/adfback/adfduplex/fb*/
OPT_MODE, /*mono/gray/color*/
- OPT_X_RES,
- OPT_Y_RES,
+ OPT_RES,
OPT_GEOMETRY_GROUP,
OPT_TL_X,
@@ -56,7 +55,11 @@ struct image {
int width_bytes;
int height;
int pages;
-
+ int x_res;
+ int y_res;
+ int x_start_offset;
+ int x_offset_bytes;
+ int y_skip_offset;
unsigned char * buffer;
};
@@ -68,6 +71,8 @@ struct transfer {
int total_bytes;
int rx_bytes;
int done;
+ int x_res;
+ int y_res;
unsigned char * raw_data;
struct image * image;
@@ -77,6 +82,9 @@ struct page {
int bytes_total;
int bytes_scanned;
int bytes_read;
+ int lines_rx; /* received from scanner */
+ int lines_pass; /* passed thru from scanner to user (might be smaller than tx for 225dpi) */
+ int lines_tx; /* transmitted to user */
int done;
struct image *image;
};
@@ -94,15 +102,13 @@ struct scanner
int has_fb;
int has_adf;
- int x_res_150;
- int x_res_225;
- int x_res_300;
- int x_res_600;
+ int has_adf_duplex;
+
+ int min_res;
+ int max_res;
- int y_res_150;
- int y_res_225;
- int y_res_300;
- int y_res_600;
+ float white_factor[3];
+ int adf_height_padding;
/* the scan size in 1/1200th inches, NOT basic_units or sane units */
int max_x;
@@ -127,8 +133,7 @@ struct scanner
/*mode group, room for lineart, gray, color, null */
SANE_String_Const source_list[5];
SANE_String_Const mode_list[4];
- SANE_Int x_res_list[4];
- SANE_Int y_res_list[4];
+ SANE_Range res_range;
/*geometry group*/
SANE_Range tl_x_range;
@@ -151,9 +156,7 @@ struct scanner
/*mode group*/
int source; /* adf or fb */
int mode; /* color,lineart,etc */
- int res; /* from a limited list, x and y same */
- int resolution_x; /* unused dummy */
- int resolution_y; /* unused dummy */
+ int resolution; /* dpi */
/*geometry group*/
/* The desired size of the scan, all in 1/1200 inch */
@@ -213,6 +216,8 @@ struct scanner
/* the scan struct holds these larger numbers, but image buffer is unused */
struct {
int done;
+ int x_res;
+ int y_res;
int height;
int rx_bytes;
int width_bytes;
@@ -257,6 +262,9 @@ struct scanner
#define MODEL_NONE 0
#define MODEL_S300 1
#define MODEL_FI60F 2
+#define MODEL_S1100 3
+#define MODEL_S1300i 4
+#define MODEL_FI65F 5
#define USB_COMMAND_TIME 10000
#define USB_DATA_TIME 10000
@@ -278,6 +286,9 @@ struct scanner
#define WINDOW_SENDCAL 2
#define WINDOW_SCAN 3
+#define EPJITSU_PAPER_INGEST 1
+#define EPJITSU_PAPER_EJECT 0
+
/* ------------------------------------------------------------------------- */
#define MM_PER_UNIT_UNFIX SANE_UNFIX(SANE_FIX(MM_PER_INCH / 1200.0))
@@ -286,6 +297,9 @@ struct scanner
#define SCANNER_UNIT_TO_FIXED_MM(number) SANE_FIX((number) * MM_PER_UNIT_UNFIX)
#define FIXED_MM_TO_SCANNER_UNIT(number) SANE_UNFIX(number) / MM_PER_UNIT_UNFIX
+#define PIX_TO_SCANNER_UNIT(number, dpi) SANE_UNFIX(SANE_FIX((number) * 1200 / dpi ))
+#define SCANNER_UNIT_TO_PIX(number, dpi) SANE_UNFIX(SANE_FIX((number) * dpi / 1200 ))
+
#define CONFIG_FILE "epjitsu.conf"
#ifndef PATH_MAX
@@ -354,7 +368,8 @@ static SANE_Status destroy(struct scanner *s);
static SANE_Status teardown_buffers(struct scanner *s);
static SANE_Status setup_buffers(struct scanner *s);
-static SANE_Status ingest(struct scanner *s);
+static SANE_Status object_position(struct scanner *s, int ingest);
+static SANE_Status six5 (struct scanner *s);
static SANE_Status coarsecal(struct scanner *s);
static SANE_Status finecal(struct scanner *s);
static SANE_Status send_lut(struct scanner *s);
diff --git a/backend/epson.c b/backend/epson.c
index 2cae65a..6b111f2 100644
--- a/backend/epson.c
+++ b/backend/epson.c
@@ -818,6 +818,12 @@ typedef struct
} EpsonIdentRec, *EpsonIdent;
+typedef union
+{
+ EpsonHdrRec hdr;
+ EpsonIdentRec ident;
+} EpsonHdrUnionRec, *EpsonHdrUnion;
+
typedef struct
{
@@ -843,7 +849,7 @@ typedef struct
*
*/
-static EpsonHdr command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
+static EpsonHdrUnion command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
SANE_Status * status);
static SANE_Status get_identity_information (SANE_Handle handle);
static SANE_Status get_identity2_information (SANE_Handle handle);
@@ -1844,21 +1850,24 @@ static Epson_Device *first_dev = NULL; /* first EPSON scanner in list */
static Epson_Scanner *first_handle = NULL;
-static EpsonHdr
+static EpsonHdrUnion
command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
SANE_Status * status)
{
+ EpsonHdrUnion hdrunion, hdrunion_bak;
EpsonHdr head;
u_char *buf;
int count;
- if (NULL == (head = walloc (EpsonHdrRec)))
+ if (NULL == (hdrunion = walloc (EpsonHdrUnionRec)))
{
DBG (1, "out of memory (line %d)\n", __LINE__);
*status = SANE_STATUS_NO_MEM;
- return (EpsonHdr) 0;
+ return (EpsonHdrUnion) 0;
}
+ head = &(hdrunion->hdr);
+
send (s, cmd, cmd_size, status);
if (SANE_STATUS_GOOD != *status)
@@ -1869,7 +1878,7 @@ command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
*status = SANE_STATUS_GOOD;
send (s, cmd, cmd_size, status);
if (SANE_STATUS_GOOD != *status)
- return (EpsonHdr) 0;
+ return (EpsonHdrUnion) 0;
}
buf = (u_char *) head;
@@ -1892,7 +1901,7 @@ command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
}
if (SANE_STATUS_GOOD != *status)
- return (EpsonHdr) 0;
+ return (EpsonHdrUnion) 0;
DBG (4, "code %02x\n", (int) head->code);
@@ -1921,25 +1930,30 @@ command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
}
if (SANE_STATUS_GOOD != *status)
- return (EpsonHdr) 0;
+ return (EpsonHdrUnion) 0;
DBG (4, "status %02x\n", (int) head->status);
count = head->count2 * 255 + head->count1;
DBG (4, "count %d\n", count);
- if (NULL == (head = realloc (head, sizeof (EpsonHdrRec) + count)))
+ hdrunion_bak = hdrunion;
+ if (NULL == (hdrunion = realloc (hdrunion,
+ sizeof (EpsonHdrUnionRec) + count)))
{
+ free(hdrunion_bak);
DBG (1, "out of memory (line %d)\n", __LINE__);
*status = SANE_STATUS_NO_MEM;
- return (EpsonHdr) 0;
+ return (EpsonHdrUnion) 0;
}
+ head = &(hdrunion->hdr);
+
buf = head->buf;
receive (s, buf, count, status);
if (SANE_STATUS_GOOD != *status)
- return (EpsonHdr) 0;
+ return (EpsonHdrUnion) 0;
break;
@@ -1953,7 +1967,7 @@ command (Epson_Scanner * s, u_char * cmd, size_t cmd_size,
break;
}
- return head;
+ return hdrunion;
}
@@ -2333,7 +2347,7 @@ attach (const char *dev_name, Epson_Device * *devp, int type)
/*
* Extended status flag request (ESC f).
- * this also requests the scanner device name from the the scanner
+ * this also requests the scanner device name from the scanner
*/
/*
* because we are also using the device name from this command,
diff --git a/backend/epson2-commands.c b/backend/epson2-commands.c
index a84630b..eccd4ba 100644
--- a/backend/epson2-commands.c
+++ b/backend/epson2-commands.c
@@ -333,7 +333,7 @@ esci_set_gamma_table(Epson_Scanner * s)
/* Print the gamma tables before sending them to the scanner */
- if (DBG_LEVEL >= 10) {
+ if (DBG_LEVEL >= 16) {
int c, i, j;
for (c = 0; c < 3; c++) {
@@ -347,7 +347,8 @@ esci_set_gamma_table(Epson_Scanner * s)
s->gamma_table[c][i + j]);
strcat(gammaValues, newValue);
}
- DBG(11, "gamma table[%d][%d] %s\n", c, i,
+
+ DBG(16, "gamma table[%d][%d] %s\n", c, i,
gammaValues);
}
}
@@ -679,8 +680,10 @@ esci_set_scanning_parameter(SANE_Handle handle, unsigned char *buf)
return status;
status = e2_cmd_simple(s, buf, 64);
- if (status != SANE_STATUS_GOOD)
+ if (status != SANE_STATUS_GOOD) {
+ DBG(1, "%s: invalid scanning parameters\n", __func__);
return status;
+ }
return SANE_STATUS_GOOD;
}
diff --git a/backend/epson2-io.c b/backend/epson2-io.c
index 13adef4..4477963 100644
--- a/backend/epson2-io.c
+++ b/backend/epson2-io.c
@@ -110,8 +110,8 @@ e2_send(Epson_Scanner * s, void *buf, size_t buf_size, size_t reply_len,
}
ssize_t
-e2_recv(Epson_Scanner * s, void *buf, ssize_t buf_size,
- SANE_Status * status)
+e2_recv(Epson_Scanner *s, void *buf, ssize_t buf_size,
+ SANE_Status *status)
{
ssize_t n = 0;
@@ -142,8 +142,9 @@ e2_recv(Epson_Scanner * s, void *buf, ssize_t buf_size,
}
if (n < buf_size) {
- DBG(1, "%s: expected = %lu, got = %ld\n", __func__,
- (u_long) buf_size, (long) n);
+ DBG(1, "%s: expected = %lu, got = %ld, canceling: %d\n", __func__,
+ (u_long) buf_size, (long) n, s->canceling);
+
*status = SANE_STATUS_IO_ERROR;
}
diff --git a/backend/epson2-ops.c b/backend/epson2-ops.c
index df6958c..eac01b0 100644
--- a/backend/epson2-ops.c
+++ b/backend/epson2-ops.c
@@ -177,7 +177,7 @@ e2_dev_init(Epson_Device *dev, const char *devname, int conntype)
SANE_Status
e2_dev_post_init(struct Epson_Device *dev)
{
- int i;
+ int i, last;
DBG(5, "%s\n", __func__);
@@ -231,7 +231,7 @@ e2_dev_post_init(struct Epson_Device *dev)
/* try to expand the resolution list where appropriate */
- int last = dev->res_list[dev->res_list_size - 1];
+ last = dev->res_list[dev->res_list_size - 1];
DBG(1, "highest available resolution: %d\n", last);
@@ -240,6 +240,21 @@ e2_dev_post_init(struct Epson_Device *dev)
e2_add_resolution(dev, dev->optical_res);
}
+ /* add missing resolutions for known scanners */
+
+ if (e2_dev_model(dev, "GT-X800") || e2_dev_model(dev, "GT-X700")) {
+
+ DBG(1, "known scanner, integrating resolution list\n");
+ e2_add_resolution(dev, 4800);
+ e2_add_resolution(dev, 6400);
+ e2_add_resolution(dev, 9600);
+ e2_add_resolution(dev, 12800);
+
+ last = dev->res_list[dev->res_list_size - 1];
+ }
+
+ /* guess for the others */
+
if (dev->dpi_range.max > last && dev->dpi_range.max != dev->optical_res) {
int val = last + last;
@@ -472,8 +487,10 @@ e2_set_tpu2_area(struct Epson_Scanner *s, int x, int y, int unit)
}
void
-e2_add_depth(Epson_Device * dev, SANE_Word depth)
+e2_add_depth(Epson_Device *dev, SANE_Int depth)
{
+ DBG(10, "%s: add (bpp): %d\n", __func__, depth);
+
if (depth > dev->maxDepth)
dev->maxDepth = depth;
@@ -579,7 +596,7 @@ e2_discover_capabilities(Epson_Scanner *s)
/*
* Extended status flag request (ESC f).
- * this also requests the scanner device name from the the scanner.
+ * this also requests the scanner device name from the scanner.
* It seems unsupported on the network transport (CX11NF/LP-A500).
*/
@@ -700,6 +717,11 @@ e2_discover_capabilities(Epson_Scanner *s)
*source_list_add++ = ADF_STR;
dev->ADF = SANE_TRUE;
}
+
+ if (buf[44] & EXT_IDTY_CAP1_ADFS) {
+ dev->duplex = SANE_TRUE;
+ }
+
}
/* TPU */
@@ -713,7 +735,7 @@ e2_discover_capabilities(Epson_Scanner *s)
}
/* TPU2 */
- if (e2_model(s, "GT-X800") || e2_model(s, "GT-X900")) {
+ if (e2_model(s, "GT-X800") || e2_model(s, "GT-X900") || e2_model(s, "GT-X980")) {
if (le32atoh(&buf[68]) > 0 ) {
e2_set_tpu2_area(s,
le32atoh(&buf[68]),
@@ -760,7 +782,7 @@ e2_discover_capabilities(Epson_Scanner *s)
* Check for the max. supported color depth and assign
* the values to the bitDepthList.
*/
- dev->depth_list = malloc(sizeof(SANE_Word) * 4);
+ dev->depth_list = malloc(sizeof(SANE_Int) * (4 + 1));
if (dev->depth_list == NULL) {
DBG(1, "out of memory (line %d)\n", __LINE__);
return SANE_STATUS_NO_MEM;
@@ -771,9 +793,12 @@ e2_discover_capabilities(Epson_Scanner *s)
/* maximum depth discovery */
DBG(3, "discovering max depth, NAKs are expected\n");
- if (dev->maxDepth >= 16 || dev->maxDepth == 0) {
- if (esci_set_data_format(s, 16) == SANE_STATUS_GOOD)
- e2_add_depth(dev, 16);
+ /* add default depth */
+ e2_add_depth(dev, 8);
+
+ if (dev->maxDepth >= 12 || dev->maxDepth == 0) {
+ if (esci_set_data_format(s, 12) == SANE_STATUS_GOOD)
+ e2_add_depth(dev, 12);
}
if (dev->maxDepth >= 14 || dev->maxDepth == 0) {
@@ -781,14 +806,11 @@ e2_discover_capabilities(Epson_Scanner *s)
e2_add_depth(dev, 14);
}
- if (dev->maxDepth >= 12 || dev->maxDepth == 0) {
- if (esci_set_data_format(s, 12) == SANE_STATUS_GOOD)
- e2_add_depth(dev, 12);
+ if (dev->maxDepth >= 16 || dev->maxDepth == 0) {
+ if (esci_set_data_format(s, 16) == SANE_STATUS_GOOD)
+ e2_add_depth(dev, 16);
}
- /* add default depth */
- e2_add_depth(dev, 8);
-
DBG(1, "maximum supported color depth: %d\n", dev->maxDepth);
/*
@@ -901,25 +923,28 @@ e2_set_extended_scanning_parameters(Epson_Scanner * s)
char extensionCtrl;
extensionCtrl = (s->hw->use_extension ? 1 : 0);
- if (s->hw->use_extension && (s->val[OPT_ADF_MODE].w == 1))
+ if (s->hw->use_extension && (s->val[OPT_ADF_MODE].w == 1)) {
extensionCtrl = 2;
+ }
/* Test for TPU2
* Epson Perfection 4990 Command Specifications
* JZIS-0075 Rev. A, page 31
*/
- if (s->hw->use_extension && s->hw->TPU2)
+ if (s->hw->use_extension && s->hw->TPU2) {
extensionCtrl = 5;
+ }
- if (s->val[OPT_MODE].w == MODE_INFRARED)
+ if (s->val[OPT_MODE].w == MODE_INFRARED) {
/* only infrared in TPU mode (NOT in TPU2 or flatbeth)
* XXX investigate this ... only tested on GT-X800
*/
if (extensionCtrl == 1) /* test for TPU */
- extensionCtrl = 3;
+ extensionCtrl = 3;
else
- return SANE_STATUS_UNSUPPORTED;
+ return SANE_STATUS_UNSUPPORTED;
+ }
/* ESC e */
buf[26] = extensionCtrl;
@@ -1262,7 +1287,7 @@ e2_setup_block_mode(Epson_Scanner * s)
DBG(1, "max req size: %d, line count: %d\n", maxreq, s->lcount);
/* XXX investigate this */
- if (s->lcount < 3 && (e2_model(s, "GT-X800") || e2_model(s, "GT-X900"))) {
+ if (s->lcount < 3 && (e2_model(s, "GT-X800") || e2_model(s, "GT-X900") || e2_model(s, "GT-X980"))) {
s->lcount = 21;
DBG(17,
"%s: set lcount = %i bigger than sanei_scsi_max_request_size\n",
@@ -1689,10 +1714,6 @@ e2_scan_finish(Epson_Scanner * s)
if (s->hw->ADF && s->hw->use_extension && s->val[OPT_AUTO_EJECT].w)
if (e2_check_adf(s) == SANE_STATUS_NO_DOCS)
esci_eject(s);
-
- /* XXX required? */
- if (s->hw->connection != SANE_EPSON_NET)
- esci_reset(s);
}
void
@@ -1738,6 +1759,8 @@ e2_ext_read(struct Epson_Scanner *s)
SANE_Status status = SANE_STATUS_GOOD;
ssize_t buf_len = 0, read;
+ DBG(18, "%s: begin\n", __func__);
+
/* did we passed everything we read to sane? */
if (s->ptr == s->end) {
@@ -1761,10 +1784,12 @@ e2_ext_read(struct Epson_Scanner *s)
/* receive image data + error code */
read = e2_recv(s, s->buf, buf_len + 1, &status);
- DBG(18, "%s: read %lu bytes\n", __func__, (unsigned long) read);
+ DBG(18, "%s: read %lu bytes, status: %d\n", __func__, (unsigned long) read, status);
- if (read != buf_len + 1)
- return SANE_STATUS_IO_ERROR;
+ if (status != SANE_STATUS_GOOD) {
+ e2_cancel(s);
+ return status;
+ }
if (e2_dev_model(dev, "GT-8200") || e2_dev_model(dev, "Perfection1650")) {
/* See http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=597922#127 */
@@ -2132,6 +2157,7 @@ e2_block_read(struct Epson_Scanner *s)
* RGB then swap the colors.
*/
+ /* never used, beta testers required */
needStrangeReorder =
(strstr(s->hw->model, "GT-2200") ||
((strstr(s->hw->model, "1640")
diff --git a/backend/epson2-ops.h b/backend/epson2-ops.h
index 9c36326..decbd4b 100644
--- a/backend/epson2-ops.h
+++ b/backend/epson2-ops.h
@@ -33,6 +33,7 @@ extern SANE_Status e2_add_resolution(Epson_Device *dev, int r);
extern void e2_set_fbf_area(Epson_Scanner *s, int x, int y, int unit);
extern void e2_set_adf_area(struct Epson_Scanner *s, int x, int y, int unit);
extern void e2_set_tpu_area(struct Epson_Scanner *s, int x, int y, int unit);
+extern void e2_set_tpu2_area(struct Epson_Scanner *s, int x, int y, int unit);
extern void e2_add_depth(Epson_Device *dev, SANE_Word depth);
extern SANE_Status e2_discover_capabilities(Epson_Scanner *s);
extern SANE_Status e2_set_extended_scanning_parameters(Epson_Scanner *s);
diff --git a/backend/epson2.c b/backend/epson2.c
index 9f39c68..df84b1d 100644
--- a/backend/epson2.c
+++ b/backend/epson2.c
@@ -29,6 +29,7 @@
* 20 usb cmd counters
* 18 sane_read
* 17 setvalue, getvalue, control_option
+ * 16 gamma table
* 15 e2_send, e2_recv calls
* 13 e2_cmd_info_block
* 12 epson_cmd_simple
@@ -355,10 +356,12 @@ print_params(const SANE_Parameters params)
static void
close_scanner(Epson_Scanner *s)
{
+ int i;
+
DBG(7, "%s: fd = %d\n", __func__, s->fd);
if (s->fd == -1)
- return;
+ goto free;
/* send a request_status. This toggles w_cmd_count and r_cmd_count */
if (r_cmd_count % 2)
@@ -380,6 +383,14 @@ close_scanner(Epson_Scanner *s)
}
s->fd = -1;
+
+free:
+ for (i = 0; i < LINES_SHUFFLE_MAX; i++) {
+ if (s->line_buffer[i] != NULL)
+ free(s->line_buffer[i]);
+ }
+
+ free(s);
}
static void
@@ -409,8 +420,8 @@ e2_network_discovery(void)
FD_SET(fd, &rfds);
sanei_udp_set_nonblock(fd, SANE_TRUE);
- if (select(fd + 1, &rfds, NULL, NULL, &to) > 0) {
- while ((len = sanei_udp_recvfrom(fd, buf, 76, &ip)) == 76) {
+ while (select(fd + 1, &rfds, NULL, NULL, &to) > 0) {
+ if ((len = sanei_udp_recvfrom(fd, buf, 76, &ip)) == 76) {
DBG(5, " response from %s\n", ip);
/* minimal check, protocol unknown */
@@ -576,12 +587,12 @@ static SANE_Status detect_scsi(struct Epson_Scanner *s)
}
static SANE_Status
-detect_usb(struct Epson_Scanner *s)
+detect_usb(struct Epson_Scanner *s, SANE_Bool assume_valid)
{
SANE_Status status;
int vendor, product;
int i, numIds;
- SANE_Bool is_valid;
+ SANE_Bool is_valid = assume_valid;
/* if the sanei_usb_get_vendor_product call is not supported,
* then we just ignore this and rely on the user to config
@@ -603,19 +614,20 @@ detect_usb(struct Epson_Scanner *s)
}
numIds = sanei_epson_getNumberOfUSBProductIds();
- is_valid = SANE_FALSE;
i = 0;
/* check all known product IDs to verify that we know
about the device */
- while (i != numIds && !is_valid) {
- if (product == sanei_epson_usb_product_ids[i])
+ while (i != numIds) {
+ if (product == sanei_epson_usb_product_ids[i]) {
is_valid = SANE_TRUE;
+ break;
+ }
i++;
}
if (is_valid == SANE_FALSE) {
- DBG(1, "the device at %s is not a supported (product id=0x%x)\n",
+ DBG(1, "the device at %s is not supported (product id=0x%x)\n",
s->hw->sane.name, product);
return SANE_STATUS_INVAL;
}
@@ -649,7 +661,7 @@ scanner_create(struct Epson_Device *dev, SANE_Status *status)
}
static struct Epson_Scanner *
-device_detect(const char *name, int type, SANE_Status *status)
+device_detect(const char *name, int type, SANE_Bool assume_valid, SANE_Status *status)
{
struct Epson_Scanner *s;
struct Epson_Device *dev;
@@ -702,7 +714,7 @@ device_detect(const char *name, int type, SANE_Status *status)
} else if (dev->connection == SANE_EPSON_USB) {
- *status = detect_usb(s);
+ *status = detect_usb(s, assume_valid);
}
if (*status != SANE_STATUS_GOOD)
@@ -748,7 +760,6 @@ device_detect(const char *name, int type, SANE_Status *status)
close:
close_scanner(s);
- free(s);
return NULL;
}
@@ -761,12 +772,11 @@ attach(const char *name, int type)
DBG(7, "%s: devname = %s, type = %d\n", __func__, name, type);
- s = device_detect(name, type, &status);
+ s = device_detect(name, type, 0, &status);
if(s == NULL)
return status;
close_scanner(s);
- free(s);
return status;
}
@@ -813,6 +823,7 @@ attach_one_config(SANEI_Config __sane_unused__ *config, const char *line)
DBG(7, "%s: len = %d, line = %s\n", __func__, len, line);
if (sscanf(line, "usb %i %i", &vendor, &product) == 2) {
+
/* add the vendor and product IDs to the list of
known devices before we call the attach function */
@@ -976,10 +987,10 @@ init_options(Epson_Scanner *s)
s->opt[OPT_MODE].size = max_string_size(mode_list);
s->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
s->opt[OPT_MODE].constraint.string_list = mode_list;
- s->val[OPT_MODE].w = 0; /* Binary */
+ s->val[OPT_MODE].w = 0; /* Lineart */
/* disable infrared on unsupported scanners */
- if (!e2_model(s, "GT-X800") && !e2_model(s, "GT-X700") && !e2_model(s, "GT-X900"))
+ if (!e2_model(s, "GT-X800") && !e2_model(s, "GT-X700") && !e2_model(s, "GT-X900") && !e2_model(s, "GT-X980"))
mode_list[MODE_INFRARED] = NULL;
/* bit depth */
@@ -987,14 +998,13 @@ init_options(Epson_Scanner *s)
s->opt[OPT_BIT_DEPTH].title = SANE_TITLE_BIT_DEPTH;
s->opt[OPT_BIT_DEPTH].desc = SANE_DESC_BIT_DEPTH;
s->opt[OPT_BIT_DEPTH].type = SANE_TYPE_INT;
- s->opt[OPT_BIT_DEPTH].unit = SANE_UNIT_NONE;
+ s->opt[OPT_BIT_DEPTH].unit = SANE_UNIT_BIT;
s->opt[OPT_BIT_DEPTH].constraint_type = SANE_CONSTRAINT_WORD_LIST;
s->opt[OPT_BIT_DEPTH].constraint.word_list = s->hw->depth_list;
- s->opt[OPT_BIT_DEPTH].cap |= SANE_CAP_INACTIVE;
- s->val[OPT_BIT_DEPTH].w = s->hw->depth_list[1]; /* the first "real" element is the default */
+ s->val[OPT_BIT_DEPTH].w = 8; /* default to 8 bit */
- if (s->hw->depth_list[0] == 1) /* only one element in the list -> hide the option */
- s->opt[OPT_BIT_DEPTH].cap |= SANE_CAP_INACTIVE;
+ /* default is Lineart, disable depth selection */
+ s->opt[OPT_BIT_DEPTH].cap |= SANE_CAP_INACTIVE;
/* halftone */
s->opt[OPT_HALFTONE].name = SANE_NAME_HALFTONE;
@@ -1456,6 +1466,8 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
DBG(7, "%s: name = %s\n", __func__, name);
+ *handle = NULL;
+
/* probe if empty device name provided */
if (l == 0) {
@@ -1467,7 +1479,7 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
}
s = device_detect(first_dev->sane.name, first_dev->connection,
- &status);
+ 0, &status);
if (s == NULL) {
DBG(1, "cannot open a perfectly valid device (%s),"
" please report to the authors\n", name);
@@ -1477,15 +1489,15 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
} else {
if (strncmp(name, "net:", 4) == 0) {
- s = device_detect(name, SANE_EPSON_NET, &status);
+ s = device_detect(name, SANE_EPSON_NET, 0, &status);
if (s == NULL)
return status;
} else if (strncmp(name, "libusb:", 7) == 0) {
- s = device_detect(name, SANE_EPSON_USB, &status);
+ s = device_detect(name, SANE_EPSON_USB, 1, &status);
if (s == NULL)
return status;
} else if (strncmp(name, "pio:", 4) == 0) {
- s = device_detect(name, SANE_EPSON_PIO, &status);
+ s = device_detect(name, SANE_EPSON_PIO, 0, &status);
if (s == NULL)
return status;
} else {
@@ -1498,7 +1510,7 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
if (first_dev == NULL)
probe_devices();
- s = device_detect(name, SANE_EPSON_NODEV, &status);
+ s = device_detect(name, SANE_EPSON_NODEV, 0, &status);
if (s == NULL) {
DBG(1, "invalid device name: %s\n", name);
return SANE_STATUS_INVAL;
@@ -1513,8 +1525,6 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
init_options(s);
- *handle = (SANE_Handle) s;
-
status = open_scanner(s);
if (status != SANE_STATUS_GOOD) {
free(s);
@@ -1522,18 +1532,23 @@ sane_open(SANE_String_Const name, SANE_Handle *handle)
}
status = esci_reset(s);
- if (status != SANE_STATUS_GOOD)
+ if (status != SANE_STATUS_GOOD) {
close_scanner(s);
+ return status;
+ }
+
+ *handle = (SANE_Handle)s;
- return status;
+ return SANE_STATUS_GOOD;
}
void
sane_close(SANE_Handle handle)
{
- int i;
Epson_Scanner *s;
+ DBG(1, "* %s\n", __func__);
+
/*
* XXX Test if there is still data pending from
* the scanner. If so, then do a cancel
@@ -1541,15 +1556,7 @@ sane_close(SANE_Handle handle)
s = (Epson_Scanner *) handle;
- if (s->fd != -1)
- close_scanner(s);
-
- for (i = 0; i < LINES_SHUFFLE_MAX; i++) {
- if (s->line_buffer[i] != NULL)
- free(s->line_buffer[i]);
- }
-
- free(s);
+ close_scanner(s);
}
const SANE_Option_Descriptor *
@@ -1752,8 +1759,9 @@ change_source(Epson_Scanner *s, SANE_Int optindex, char *value)
s->val[OPT_ADF_MODE].w = 0;
}
- DBG(1, "adf activated (%d %d)\n", s->hw->use_extension,
- s->hw->duplex);
+ DBG(1, "adf activated (ext: %d, duplex: %d)\n",
+ s->hw->use_extension,
+ s->hw->duplex);
} else if (strcmp(TPU_STR, value) == 0 || strcmp(TPU_STR2, value) == 0) {
if (strcmp(TPU_STR, value) == 0) {
@@ -1907,6 +1915,8 @@ setvalue(SANE_Handle handle, SANE_Int option, void *value, SANE_Int *info)
sval->w = optindex;
+ DBG(17, "%s: setting mode to %d\n", __func__, optindex);
+
/* halftoning available only on bw scans */
if (s->hw->cmd->set_halftoning != 0)
setOptionState(s, mode_params[optindex].depth == 1,
@@ -1921,16 +1931,18 @@ setvalue(SANE_Handle handle, SANE_Int option, void *value, SANE_Int *info)
/* if binary, then disable the bit depth selection */
if (optindex == 0) {
+ DBG(17, "%s: disabling bit depth selection\n", __func__);
s->opt[OPT_BIT_DEPTH].cap |= SANE_CAP_INACTIVE;
} else {
- if (s->hw->depth_list[0] == 1)
- s->opt[OPT_BIT_DEPTH].cap |=
- SANE_CAP_INACTIVE;
- else {
- s->opt[OPT_BIT_DEPTH].cap &=
- ~SANE_CAP_INACTIVE;
- s->val[OPT_BIT_DEPTH].w =
- mode_params[optindex].depth;
+ if (s->hw->depth_list[0] == 1) {
+ DBG(17, "%s: only one depth is available\n", __func__);
+ s->opt[OPT_BIT_DEPTH].cap |= SANE_CAP_INACTIVE;
+ } else {
+
+ DBG(17, "%s: enabling bit depth selection\n", __func__);
+
+ s->opt[OPT_BIT_DEPTH].cap &= ~SANE_CAP_INACTIVE;
+ s->val[OPT_BIT_DEPTH].w = mode_params[optindex].depth;
}
}
@@ -2075,7 +2087,10 @@ sane_start(SANE_Handle handle)
Epson_Device *dev = s->hw;
SANE_Status status;
- DBG(5, "%s\n", __func__);
+ DBG(5, "* %s\n", __func__);
+
+ s->eof = SANE_FALSE;
+ s->canceling = SANE_FALSE;
/* check if we just have finished working with the ADF */
status = e2_check_adf(s);
@@ -2200,9 +2215,7 @@ sane_start(SANE_Handle handle)
if (s->buf == NULL)
return SANE_STATUS_NO_MEM;
- s->eof = SANE_FALSE;
s->ptr = s->end = s->buf;
- s->canceling = SANE_FALSE;
/* feed the first sheet in the ADF */
if (dev->ADF && dev->use_extension && dev->cmd->feed) {
@@ -2273,8 +2286,14 @@ sane_read(SANE_Handle handle, SANE_Byte *data, SANE_Int max_length,
SANE_Status status;
Epson_Scanner *s = (Epson_Scanner *) handle;
- if (s->buf == NULL || s->canceling)
- return SANE_STATUS_CANCELLED;
+ DBG(18, "* %s: eof: %d, canceling: %d\n",
+ __func__, s->eof, s->canceling);
+
+ /* sane_read called before sane_start? */
+ if (s->buf == NULL) {
+ DBG(1, "%s: buffer is NULL", __func__);
+ return SANE_STATUS_INVAL;
+ }
*length = 0;
@@ -2283,9 +2302,12 @@ sane_read(SANE_Handle handle, SANE_Byte *data, SANE_Int max_length,
else
status = e2_block_read(s);
- if (status == SANE_STATUS_CANCELLED) {
+ /* The scanning operation might be canceled by the scanner itself
+ * or the fronted program
+ */
+ if (status == SANE_STATUS_CANCELLED || s->canceling) {
e2_scan_finish(s);
- return status;
+ return SANE_STATUS_CANCELLED;
}
/* XXX if FS G and STATUS_IOERR, use e2_check_extended_status */
@@ -2296,9 +2318,9 @@ sane_read(SANE_Handle handle, SANE_Byte *data, SANE_Int max_length,
e2_copy_image_data(s, data, max_length, length);
- DBG(18, "%d lines read, eof: %d, status: %d\n",
+ DBG(18, "%d lines read, eof: %d, canceling: %d, status: %d\n",
*length / s->params.bytes_per_line,
- s->eof, status);
+ s->canceling, s->eof, status);
/* continue reading if appropriate */
if (status == SANE_STATUS_GOOD)
@@ -2321,6 +2343,8 @@ sane_cancel(SANE_Handle handle)
{
Epson_Scanner *s = (Epson_Scanner *) handle;
+ DBG(1, "* %s\n", __func__);
+
s->canceling = SANE_TRUE;
}
diff --git a/backend/epson2.conf.in b/backend/epson2.conf.in
index a996487..797df2d 100644
--- a/backend/epson2.conf.in
+++ b/backend/epson2.conf.in
@@ -16,7 +16,7 @@ scsi EPSON
usb
# For libusb support for unknown scanners use the following command
-# usb <product ID> <device ID>
+# usb <vendor ID> <product ID>
# e.g.:
# usb 0x4b8 0x110
diff --git a/backend/epson2.h b/backend/epson2.h
index bb6c9e0..8650f01 100644
--- a/backend/epson2.h
+++ b/backend/epson2.h
@@ -346,7 +346,7 @@ struct Epson_Device
SANE_Bool color_shuffle; /* does this scanner need color shuffling */
SANE_Int maxDepth; /* max. color depth */
- SANE_Word *depth_list;
+ SANE_Int *depth_list;
SANE_Int optical_res; /* optical resolution */
SANE_Int max_line_distance;
diff --git a/backend/epson2_net.c b/backend/epson2_net.c
index c7b4873..911ce62 100644
--- a/backend/epson2_net.c
+++ b/backend/epson2_net.c
@@ -15,6 +15,10 @@
#include "sane/config.h"
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
#include "sane/sane.h"
#include "sane/saneopts.h"
#include "sane/sanei_tcp.h"
@@ -28,25 +32,32 @@
#include "sane/sanei_debug.h"
-int
-sanei_epson_net_read_raw(Epson_Scanner *s, unsigned char *buf, size_t wanted,
- SANE_Status * status)
+static int
+sanei_epson_net_read_raw(Epson_Scanner *s, unsigned char *buf, ssize_t wanted,
+ SANE_Status *status)
{
- size_t size, read = 0;
+ int ready, read = -1;
+ fd_set readable;
+ struct timeval tv;
- *status = SANE_STATUS_GOOD;
-
- while (read < wanted) {
- size = sanei_tcp_read(s->fd, buf + read, wanted - read);
+ tv.tv_sec = 10;
+ tv.tv_usec = 0;
- if (size == 0)
- break;
+ FD_ZERO(&readable);
+ FD_SET(s->fd, &readable);
- read += size;
+ ready = select(s->fd + 1, &readable, NULL, NULL, &tv);
+ if (ready > 0) {
+ read = sanei_tcp_read(s->fd, buf, wanted);
+ } else {
+ DBG(15, "%s: select failed: %d\n", __func__, ready);
}
- if (read < wanted)
+ *status = SANE_STATUS_GOOD;
+
+ if (read < wanted) {
*status = SANE_STATUS_IO_ERROR;
+ }
return read;
}
@@ -80,9 +91,8 @@ sanei_epson_net_read(Epson_Scanner *s, unsigned char *buf, ssize_t wanted,
}
/* receive net header */
- size = sanei_tcp_read(s->fd, header, 12);
+ size = sanei_epson_net_read_raw(s, header, 12, status);
if (size != 12) {
- *status = SANE_STATUS_IO_ERROR;
return 0;
}
@@ -102,7 +112,8 @@ sanei_epson_net_read(Epson_Scanner *s, unsigned char *buf, ssize_t wanted,
if (size == wanted) {
DBG(15, "%s: full read\n", __func__);
- read = sanei_tcp_read(s->fd, buf, size);
+
+ read = sanei_epson_net_read_raw(s, buf, size, status);
if (s->netbuf) {
free(s->netbuf);
@@ -111,7 +122,6 @@ sanei_epson_net_read(Epson_Scanner *s, unsigned char *buf, ssize_t wanted,
}
if (read < 0) {
- *status = SANE_STATUS_IO_ERROR;
return 0;
}
@@ -119,9 +129,8 @@ sanei_epson_net_read(Epson_Scanner *s, unsigned char *buf, ssize_t wanted,
} else {
DBG(23, "%s: partial read\n", __func__);
- read = sanei_tcp_read(s->fd, s->netbuf, size);
+ read = sanei_epson_net_read_raw(s, s->netbuf, size, status);
if (read != size) {
- *status = SANE_STATUS_IO_ERROR;
return 0;
}
diff --git a/backend/epson2_net.h b/backend/epson2_net.h
index 6a6e8d8..6aef2b7 100644
--- a/backend/epson2_net.h
+++ b/backend/epson2_net.h
@@ -9,9 +9,6 @@ extern int sanei_epson_net_read(struct Epson_Scanner *s, unsigned char *buf, ssi
extern int sanei_epson_net_write(struct Epson_Scanner *s, unsigned int cmd, const unsigned char *buf,
size_t buf_size, size_t reply_len,
SANE_Status *status);
-extern int
-sanei_epson_net_read_raw(Epson_Scanner *s, unsigned char *buf, size_t wanted,
- SANE_Status * status);
extern SANE_Status sanei_epson_net_lock(struct Epson_Scanner *s);
extern SANE_Status sanei_epson_net_unlock(struct Epson_Scanner *s);
diff --git a/backend/epson2_usb.c b/backend/epson2_usb.c
new file mode 100644
index 0000000..8e29943
--- /dev/null
+++ b/backend/epson2_usb.c
@@ -0,0 +1,182 @@
+#include <sys/types.h>
+#include "../include/sane/sanei_usb.h"
+#include "epson_usb.h"
+
+/* generated with epson2usb.pl doc/descriptions/epson2.desc */
+
+SANE_Word sanei_epson_usb_product_ids[] = {
+ 0x101, /* GT-7000U, Perfection 636U */
+ 0x103, /* GT-6600U, Perfection 610 */
+ 0x104, /* GT-7600U, GT-7600UF, Perfection 1200U, Perfection 1200U PHOTO */
+ 0x105, /* Stylus Scan 2000 */
+ 0x106, /* Stylus Scan 2500 */
+ 0x107, /* ES-2000, Expression 1600 */
+ 0x109, /* ES-8500, Expression 1640XL */
+ 0x10a, /* GT-8700, GT-8700F, Perfection 1640SU, Perfection 1640SU PHOTO */
+ 0x10b, /* GT-7700U, Perfection 1240U */
+ 0x10c, /* GT-6700U, Perfection 640U */
+ 0x10e, /* ES-2200, Expression 1680 */
+ 0x110, /* GT-8200U, GT-8200UF, Perfection 1650, Perfection 1650 PHOTO */
+ 0x112, /* GT-9700F, Perfection 2450 PHOTO */
+ 0x11b, /* GT-9300UF, Perfection 2400 PHOTO */
+ 0x11c, /* GT-9800F, Perfection 3200 PHOTO */
+ 0x11e, /* GT-8300UF, Perfection 1660 PHOTO */
+ 0x126, /* ES-7000H, GT-15000 */
+ 0x128, /* GT-X700, Perfection 4870 PHOTO */
+ 0x129, /* ES-10000G, Expression 10000XL */
+ 0x12a, /* GT-X800, Perfection 4990 PHOTO */
+ 0x12b, /* ES-H300, GT-2500 */
+ 0x12c, /* GT-X900, Perfection V700 Photo, Perfection V750 Photo */
+ 0x135, /* GT-X970 */
+ 0x138, /* ES-H7200, GT-20000 */
+ 0x14b, /* ES-G11000, Expression 11000XL */
+ 0x151, /* GT-X980, Perfection V800 Photo, Perfection V850 Pro */
+ 0x801, /* CC-600PX, Stylus CX5100, Stylus CX5200 */
+ 0x802, /* CC-570L, Stylus CX3100, Stylus CX3200 */
+ 0x805, /* Stylus CX6300, Stylus CX6400 */
+ 0x806, /* PM-A850, Stylus Photo RX600 */
+ 0x807, /* Stylus Photo RX500, Stylus Photo RX510 */
+ 0x808, /* Stylus CX5300, Stylus CX5400 */
+ 0x80d, /* Stylus CX4500, Stylus CX4600 */
+ 0x80e, /* PX-A550, Stylus CX3500, Stylus CX3600, Stylus CX3650 */
+ 0x80f, /* Stylus Photo RX420, Stylus Photo RX425, Stylus Photo RX430 */
+ 0x810, /* PM-A900, Stylus Photo RX700 */
+ 0x811, /* PM-A870, Stylus Photo RX620, Stylus Photo RX630 */
+ 0x813, /* Stylus CX6500, Stylus CX6600 */
+ 0x814, /* PM-A700 */
+ 0x815, /* AcuLaser CX11, AcuLaser CX11NF, LP-A500 */
+ 0x817, /* LP-M5500, LP-M5500F */
+ 0x818, /* Stylus CX3700, Stylus CX3800, Stylus CX3810, Stylus DX3800 */
+ 0x819, /* PX-A650, Stylus CX4700, Stylus CX4800, Stylus DX4800, Stylus DX4850 */
+ 0x81a, /* PM-A750, Stylus Photo RX520, Stylus Photo RX530 */
+ 0x81c, /* PM-A890, Stylus Photo RX640, Stylus Photo RX650 */
+ 0x81d, /* PM-A950 */
+ 0x81f, /* Stylus CX7700, Stylus CX7800 */
+ 0x820, /* Stylus CX4100, Stylus CX4200, Stylus DX4200 */
+ 0x827, /* PM-A820, Stylus Photo RX560, Stylus Photo RX580, Stylus Photo RX590 */
+ 0x828, /* PM-A970 */
+ 0x829, /* PM-T990 */
+ 0x82a, /* PM-A920 */
+ 0x82b, /* Stylus CX4900, Stylus CX5000, Stylus DX5000 */
+ 0x82e, /* PX-A720, Stylus CX5900, Stylus CX6000, Stylus DX6000 */
+ 0x82f, /* PX-A620, Stylus CX3900, Stylus DX4000 */
+ 0x830, /* ME 200, Stylus CX2800, Stylus CX2900 */
+ 0x833, /* LP-M5600 */
+ 0x834, /* LP-M6000 */
+ 0x835, /* AcuLaser CX21 */
+ 0x836, /* PM-T960 */
+ 0x837, /* PM-A940, Stylus Photo RX680, Stylus Photo RX685, Stylus Photo RX690 */
+ 0x838, /* PX-A640, Stylus CX7300, Stylus CX7400, Stylus DX7400 */
+ 0x839, /* PX-A740, Stylus CX8300, Stylus CX8400, Stylus DX8400 */
+ 0x83a, /* PX-FA700, Stylus CX9300F, Stylus CX9400Fax, Stylus DX9400F */
+ 0x83c, /* PM-A840, PM-A840S, Stylus Photo RX585, Stylus Photo RX595, Stylus Photo RX610 */
+ 0x841, /* ME 300, PX-401A, Stylus NX100, Stylus SX100, Stylus TX100 */
+ 0x843, /* LP-M5000 */
+ 0x844, /* Artisan 800, EP-901A, EP-901F, Stylus Photo PX800FW, Stylus Photo TX800FW */
+ 0x846, /* Artisan 700, EP-801A, Stylus Photo PX700W, Stylus Photo TX700W */
+ 0x847, /* ME Office 700FW, PX-601F, Stylus Office BX600FW, Stylus Office TX600FW, Stylus SX600FW, WorkForce 600 */
+ 0x848, /* ME Office 600F, Stylus Office BX300F, Stylus Office TX300F, Stylus NX300 Series */
+ 0x849, /* Stylus NX200, Stylus SX200, Stylus SX205, Stylus TX200, Stylus TX203, Stylus TX209 */
+ 0x84a, /* PX-501A, Stylus NX400, Stylus SX400, Stylus SX405, Stylus TX400 */
+ 0x84c, /* WorkForce 500 */
+ 0x84d, /* PX-402A, Stylus NX110 Series, Stylus SX110 Series, Stylus TX110 Series */
+ 0x84f, /* ME OFFICE 510, Stylus NX210 Series, Stylus SX210 Series, Stylus TX210 Series */
+ 0x850, /* EP-702A, Stylus Photo PX650 Series, Stylus Photo TX650 Series */
+ 0x851, /* Stylus NX410 Series, Stylus SX410 Series, Stylus TX410 Series */
+ 0x852, /* Artisan 710 Series, EP-802A, Stylus Photo PX710W Series, Stylus Photo TX710W Series */
+ 0x853, /* Artisan 810 Series, EP-902A, Stylus Photo PX810FW Series */
+ 0x854, /* ME OFFICE 650FN Series, Stylus Office BX310FN Series, Stylus Office TX510FN Series, WorkForce 310 Series */
+ 0x855, /* PX-602F, Stylus Office BX610FW Series, Stylus Office TX610FW Series, Stylus SX610FW Series, WorkForce 610 Series */
+ 0x856, /* PX-502A, Stylus NX510 Series, Stylus SX510W Series, Stylus TX550W Series */
+ 0x85c, /* ME 320 Series, ME 330 Series, Stylus NX125, Stylus NX127, Stylus SX125, Stylus TX120 Series */
+ 0x85d, /* ME OFFICE 960FWD Series, PX-603F, Stylus Office BX625FWD, Stylus Office TX620FWD Series, Stylus SX620FW Series, WorkForce 630 Series */
+ 0x85e, /* ME OFFICE 900WD Series, PX-503A, Stylus Office BX525WD, Stylus NX625, Stylus SX525WD, Stylus TX560WD Series, WorkForce 625 */
+ 0x85f, /* Stylus Office BX320FW Series, Stylus Office TX525FW, WorkForce 520 Series */
+ 0x860, /* Artisan 835, EP-903A, EP-903F, Stylus Photo PX820FWD Series, Stylus Photo TX820FWD Series */
+ 0x861, /* Artisan 725, EP-803A, EP-803AW, Stylus Photo PX720WD Series, Stylus Photo TX720WD Series */
+ 0x862, /* EP-703A, Stylus Photo PX660 Series */
+ 0x863, /* ME OFFICE 620F Series, Stylus Office BX305F, Stylus Office BX305FW, Stylus Office TX320F Series, WorkForce 320 Series */
+ 0x864, /* ME OFFICE 560W Series, Stylus NX420 Series, Stylus SX420W Series, Stylus TX420W Series */
+ 0x865, /* ME OFFICE 520 Series, Stylus NX220 Series, Stylus SX218, Stylus TX220 Series */
+ 0x866, /* AcuLaser MX20DN, AcuLaser MX20DNF, AcuLaser MX21DNF */
+ 0x869, /* PX-1600F, WF-7510 Series */
+ 0x86a, /* PX-673F, Stylus Office BX925FWD, WorkForce 840 Series */
+ 0x870, /* Stylus Office BX305FW Plus, WorkForce 435 */
+ 0x871, /* K200 Series */
+ 0x872, /* K300 Series, WorkForce K301 */
+ 0x873, /* L200 Series */
+ 0x878, /* Artisan 635, EP-704A */
+ 0x879, /* Artisan 837, EP-904A, EP-904F, Stylus Photo PX830FWD Series */
+ 0x87b, /* Artisan 730 Series, EP-804A, EP-804AR, EP-804AW, Stylus Photo PX730WD Series, Stylus Photo TX730WD Series */
+ 0x87c, /* PX-1700F, WF-7520 Series */
+ 0x87d, /* PX-B750F, WP-4511, WP-4515, WP-4521, WP-4525, WP-4530 Series, WP-4540 Series */
+ 0x87e, /* WP-4590 Series */
+ 0x87f, /* PX-403A */
+ 0x880, /* ME OFFICE 570W Series, PX-434A, Stylus NX330 Series, Stylus SX430W Series, Stylus TX430W Series */
+ 0x881, /* ME OFFICE 535, PX-404A, Stylus SX230 Series, Stylus TX235 */
+ 0x883, /* ME 340 Series, Stylus NX130 Series, Stylus SX130 Series, Stylus TX130 Series */
+ 0x884, /* Stylus NX430W Series, Stylus SX440W Series, Stylus TX435W */
+ 0x885, /* Stylus NX230 Series, Stylus SX235W, Stylus TX230W Series */
+ 0x88d, /* Epson ME 350 */
+ 0x88f, /* Stylus Office BX635FWD, WorkForce 645 */
+ 0x890, /* ME OFFICE 940FW Series, Stylus Office BX630FW Series, WorkForce 545 */
+ 0x891, /* PX-504A, Stylus Office BX535WD, Stylus NX530 Series, Stylus NX635, Stylus SX535WD */
+ 0x892, /* Stylus Office BX935FWD, WorkForce 845 */
+ 0x893, /* EP-774A */
+ 0x894, /* LP-M5300 Series */
+ 0x895, /* PX-045A, XP-100 Series */
+ 0x896, /* ME-301, XP-200 Series */
+ 0x897, /* ME-303, PX-405A */
+ 0x898, /* ME-401, PX-435A, XP-300 Series, XP-400 Series */
+ 0x899, /* PX-605F, PX-675F, WF-3520 Series, WF-3530 Series, WF-3540 Series */
+ 0x89a, /* EP-905F, XP-850 Series */
+ 0x89b, /* EP-905A, XP-800 Series */
+ 0x89c, /* EP-805A, EP-805AR, EP-805AW, XP-750 Series */
+ 0x89d, /* XP-700 Series */
+ 0x89e, /* EP-775A, EP-775AW, XP-600 Series */
+ 0x89f, /* EP-705A */
+ 0x8a0, /* ME-101 */
+ 0x8a1, /* L210 Series, L350, L351 */
+ 0x8a5, /* PX-505F, WF-2510 Series */
+ 0x8a6, /* PX-535F, WF-2520 Series, WF-2530 Series, WF-2540 Series */
+ 0x8a7, /* WP-M4525, WP-M4521, PX-K751F, WP-M4595 */
+ 0x8a8, /* L355, L358 */
+ 0x8a9, /* L550 Series */
+ 0x8aa, /* M200 Series */
+ 0x8ab, /* WF-M1560 Series */
+ 0x8ac, /* AL-MX300DN Series, AL-MX300DNF Series */
+ 0x8ad, /* LP-M8040, LP-M8040A, LP-M8040F */
+ 0x8ae, /* PX-046A, XP-211, XP-212, XP-215 */
+ 0x8af, /* PX-436A, XP-310 Series */
+ 0x8b0, /* XP-410 Series */
+ 0x8b3, /* EP-976A3, XP-950 Series */
+ 0x8b4, /* EP-906F, XP-810 Series */
+ 0x8b5, /* EP-806AB, EP-806AR, EP-806AW, XP-710 Series */
+ 0x8b6, /* EP-776AB, EP-776AW, XP-610 Series */
+ 0x8b7, /* EP-706A, XP-510 Series */
+ 0x8b8, /* PX-M740F, PX-M741F, WF-3620 Series, WF-3640 Series */
+ 0x8b9, /* PX-M5040F, PX-M5041F, WF-7610 Series, WF-7620 Series */
+ 0x8bd, /* PX-M840F, WF-5620 Series, WF-5690 Series */
+ 0x8be, /* WF-4630 Series, WF-4640 Series */
+ 0x8bf, /* PX-437A, XP-320 Series */
+ 0x8c0, /* PX-047A, XP-225 */
+ 0x8c1, /* XP-420 Series */
+ 0x8c3, /* PX-M650A, PX-M650F, WF-2650 Series, WF-2660 Series */
+ 0x8c4, /* WF-2630 Series */
+ 0x8c5, /* EP-977A3 */
+ 0x8c6, /* EP-907F, XP-820 Series, XP-860 Series */
+ 0x8c7, /* EP-807AB, EP-807AR, EP-807AW, XP-720 Series, XP-760 Series */
+ 0x8c8, /* EP-777A, XP-520 Series, XP-620 Series */
+ 0x8c9, /* EP-707A */
+ 0x8ca, /* L850 Series */
+ 0x8cd, /* WF-R4640 Series, WF-R5690 Series */
+ 0x8d0, /* PX-M350F, WF-M5690 Series */
+ 0 /* last entry - this is used for devices that are specified
+ in the config file as "usb <vendor> <product>" */
+};
+
+int
+sanei_epson_getNumberOfUSBProductIds (void)
+{
+ return sizeof (sanei_epson_usb_product_ids) / sizeof (SANE_Word);
+}
diff --git a/backend/epson_usb.c b/backend/epson_usb.c
index 848ef63..520b49f 100644
--- a/backend/epson_usb.c
+++ b/backend/epson_usb.c
@@ -2,86 +2,45 @@
#include "../include/sane/sanei_usb.h"
#include "epson_usb.h"
-/* generated with epson2usb.pl doc/descriptions/epson2.desc */
+/* generated with epson2usb.pl doc/descriptions/epson.desc */
SANE_Word sanei_epson_usb_product_ids[] = {
- 0x101, /* GT-7000U, Perfection 636U */
- 0x103, /* GT-6600U, Perfection 610 */
- 0x104, /* GT-7600U, GT-7600UF, Perfection 1200U, Perfection 1200U PHOTO */
- 0x105, /* Stylus Scan 2000 */
- 0x106, /* Stylus Scan 2500 */
- 0x107, /* ES-2000, Expression 1600 */
- 0x109, /* ES-8500, Expression 1640XL */
- 0x10a, /* GT-8700, GT-8700F, Perfection 1640SU, Perfection 1640SU PHOTO */
- 0x10b, /* GT-7700U, Perfection 1240U */
- 0x10c, /* GT-6700U, Perfection 640U */
- 0x10e, /* ES-2200, Expression 1680 */
- 0x110, /* GT-8200U, GT-8200UF, Perfection 1650, Perfection 1650 PHOTO */
- 0x112, /* GT-9700F, Perfection 2450 PHOTO */
- 0x11b, /* GT-9300UF, Perfection 2400 PHOTO */
- 0x11c, /* GT-9800F, Perfection 3200 PHOTO */
- 0x11e, /* GT-8300UF, Perfection 1660 PHOTO */
- 0x126, /* ES-7000H, GT-15000 */
- 0x128, /* GT-X700, Perfection 4870 PHOTO */
- 0x129, /* ES-10000G, Expression 10000XL */
- 0x12a, /* GT-X800, Perfection 4990 PHOTO */
- 0x12b, /* ES-H300, GT-2500 */
- 0x12c, /* GT-X900, Perfection V700 Photo, Perfection V750 Photo */
- 0x135, /* GT-X970 */
- 0x801, /* CC-600PX, Stylus CX5100, Stylus CX5200 */
- 0x802, /* CC-570L, Stylus CX3100, Stylus CX3200 */
- 0x805, /* Stylus CX6300, Stylus CX6400 */
- 0x806, /* PM-A850, Stylus Photo RX600 */
- 0x807, /* Stylus Photo RX500, Stylus Photo RX510 */
- 0x808, /* Stylus CX5300, Stylus CX5400 */
- 0x80d, /* Stylus CX4500, Stylus CX4600 */
- 0x80e, /* PX-A550, Stylus CX3500, Stylus CX3600, Stylus CX3650 */
- 0x80f, /* Stylus Photo RX420, Stylus Photo RX425, Stylus Photo RX430 */
- 0x810, /* PM-A900, Stylus Photo RX700 */
- 0x811, /* PM-A870, Stylus Photo RX620, Stylus Photo RX630 */
- 0x813, /* Stylus CX6500, Stylus CX6600 */
- 0x814, /* PM-A700 */
- 0x815, /* AcuLaser CX11, AcuLaser CX11NF, LP-A500 */
- 0x817, /* LP-M5500, LP-M5500F */
- 0x818, /* Stylus CX3700, Stylus CX3800, Stylus DX3800 */
- 0x819, /* PX-A650, Stylus CX4700, Stylus CX4800, Stylus DX4800, Stylus DX4850 */
- 0x81a, /* PM-A750, Stylus Photo RX520, Stylus Photo RX530 */
- 0x81c, /* PM-A890, Stylus Photo RX640, Stylus Photo RX650 */
- 0x81d, /* PM-A950 */
- 0x81f, /* Stylus CX7700, Stylus CX7800 */
- 0x820, /* Stylus CX4100, Stylus CX4200, Stylus DX4200 */
- 0x827, /* PM-A820, Stylus Photo RX560, Stylus Photo RX580, Stylus Photo RX590 */
- 0x828, /* PM-A970 */
- 0x829, /* PM-T990 */
- 0x82a, /* PM-A920 */
- 0x82b, /* Stylus CX4900, Stylus CX5000, Stylus DX5000 */
- 0x82e, /* PX-A720, Stylus CX5900, Stylus CX6000, Stylus DX6000 */
- 0x82f, /* PX-A620, Stylus CX3900, Stylus DX4000 */
- 0x830, /* ME 200, Stylus CX2800, Stylus CX2900 */
- 0x833, /* LP-M5600 */
- 0x834, /* LP-M6000 */
- 0x835, /* AcuLaser CX21 */
- 0x836, /* PM-T960 */
- 0x837, /* PM-A940, Stylus Photo RX680, Stylus Photo RX685, Stylus Photo RX690 */
- 0x838, /* PX-A640, Stylus CX7300, Stylus CX7400, Stylus DX7400 */
- 0x839, /* PX-A740, Stylus CX8300, Stylus CX8400, Stylus DX8400 */
- 0x83a, /* PX-FA700, Stylus CX9300F, Stylus CX9400Fax, Stylus DX9400F */
- 0x83c, /* PM-A840, PM-A840S, Stylus Photo RX585, Stylus Photo RX595, Stylus Photo RX610 */
- 0x841, /* ME 300, PX-401A, Stylus NX100, Stylus SX100, Stylus TX100 */
- 0x843, /* LP-M5000 */
- 0x844, /* Artisan 800, EP-901A, EP-901F, Stylus Photo PX800FW, Stylus Photo TX800FW */
- 0x846, /* Artisan 700, EP-801A, Stylus Photo PX700W, Stylus Photo TX700W */
- 0x847, /* ME Office 700FW, PX-601F, Stylus Office BX600FW, Stylus Office TX600FW, Stylus SX600FW, WorkForce 600 */
- 0x848, /* ME Office 600F, Stylus Office BX300F, Stylus Office TX300F, Stylus NX300 */
- 0x849, /* Stylus NX200, Stylus SX200, Stylus SX205, Stylus TX200, Stylus TX203, Stylus TX209 */
- 0x84a, /* PX-501A, Stylus NX400, Stylus SX400, Stylus SX405, Stylus TX400 */
- 0x84c, /* WorkForce 500 */
- 0x84d, /* PX-402A, Stylus NX110 Series, Stylus SX110 Series, Stylus TX110 Series */
- 0x84f, /* ME OFFICE 510, Stylus NX210 Series, Stylus SX210 Series, Stylus TX210 Series */
- 0x851, /* Stylus NX410 Series, Stylus SX410 Series, Stylus TX410 Series */
- 0x854, /* ME OFFICE 650FN Series, Stylus Office BX310FN Series, Stylus Office TX510FN Series, WorkForce 310 Series */
- 0x856, /* PX-502A, Stylus NX510 Series, Stylus SX510W Series, Stylus TX550W Series */
- 0x85c, /* Stylus SX125 */
+ 0x101, /* Perfection 636U */
+ 0x103, /* Perfection 610 */
+ 0x104, /* Perfection 1200U, Perfection 1200Photo */
+ 0x107, /* Expression 1600 */
+ 0x10a, /* Perfection 1640 */
+ 0x10b, /* Perfection 1240 */
+ 0x10c, /* Perfection 640 */
+ 0x10e, /* Expression 1680 */
+ 0x110, /* Perfection 1650 */
+ 0x112, /* Perfection 2450 */
+ 0x11b, /* Perfection 2400 */
+ 0x11c, /* Perfection 3200 */
+ 0x11e, /* Perfection 1660 */
+ 0x128, /* Perfection 4870 */
+ 0x12a, /* Perfection 4990 */
+ 0x12c, /* V700, V750 */
+ 0x801, /* CX-5200, CX-5400 */
+ 0x802, /* CX-3200 */
+ 0x805, /* CX-6300, CX-6400 */
+ 0x806, /* RX-600 */
+ 0x807, /* RX-500 */
+ 0x808, /* CX-5400 */
+ 0x80d, /* CX-4600 */
+ 0x80e, /* CX-3600, CX-3650 */
+ 0x80f, /* RX-425 */
+ 0x810, /* RX-700 */
+ 0x811, /* RX-620 */
+ 0x813, /* CX-6500, CX-6600 */
+ 0x815, /* AcuLaser CX11, AcuLaser CX11NF */
+ 0x818, /* DX-3850, CX-3700, CX-3800, DX-3800 */
+ 0x819, /* CX-4800 */
+ 0x820, /* CX-4200 */
+ 0x82b, /* CX-5000, DX-5000, DX-5050 */
+ 0x82e, /* DX-6000 */
+ 0x82f, /* DX-4050 */
+ 0x838, /* DX-7400 */
0 /* last entry - this is used for devices that are specified
in the config file as "usb <vendor> <product>" */
};
diff --git a/backend/epsonds-cmd.c b/backend/epsonds-cmd.c
new file mode 100644
index 0000000..b91f3f1
--- /dev/null
+++ b/backend/epsonds-cmd.c
@@ -0,0 +1,908 @@
+/*
+ * epsonds-cmd.c - Epson ESC/I-2 routines.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#define DEBUG_DECLARE_ONLY
+
+#include "sane/config.h"
+#include <ctype.h>
+#include <unistd.h> /* sleep */
+
+#include "epsonds.h"
+#include "epsonds-io.h"
+#include "epsonds-cmd.h"
+#include "epsonds-ops.h"
+
+static SANE_Status
+esci2_parse_block(char *buf, int len, void *userdata, SANE_Status (*cb)(void *userdata, char *token, int len))
+{
+ SANE_Status status = SANE_STATUS_GOOD;
+ SANE_Status delayed_status = SANE_STATUS_GOOD;
+
+
+ char *start = buf;
+ char *end = (buf + len) - 1;
+
+ /* 0 : #
+ * 1-3: param
+ * 4- : data
+ */
+
+ while (1) {
+
+ char param[4];
+
+ while (*start != '#' && start < end)
+ start++;
+
+ if (*start != '#')
+ break;
+
+ param[0] = *++start;
+ param[1] = *++start;
+ param[2] = *++start;
+ param[3] = '\0';
+
+ if (strncmp("---", param, 3) == 0)
+ break;
+
+ /* ugly hack to skip over GMT in RESA */
+ if (strncmp("GMT", param, 3) == 0 && *(start + 5) == 'h') {
+ start = start + 4 + 0x100;
+ continue;
+ }
+
+ /* find the end of the token */
+ {
+ int tlen;
+ char *next = start;
+
+ while (*next != '#' && *next != 0x00 && next < end)
+ next++;
+
+ tlen = next - start - 1;
+
+ if (cb) {
+ status = cb(userdata, start - 2, tlen);
+ if (status != SANE_STATUS_GOOD) {
+ delayed_status = status;
+ }
+ }
+
+ start = next;
+ }
+ }
+
+ if (delayed_status != SANE_STATUS_GOOD)
+ return delayed_status;
+
+ return status;
+}
+
+static SANE_Bool
+esci2_check_header(const char *cmd, const char *buf, unsigned int *more)
+{
+ int err;
+
+ *more = 0;
+
+ if (strncmp(cmd, buf, 4) != 0) {
+
+ if (strncmp("UNKN", buf, 4) == 0) {
+ DBG(1, "UNKN reply code received\n");
+ } else if (strncmp("INVD", buf, 4) == 0) {
+ DBG(1, "INVD reply code received\n");
+ } else {
+ DBG(1, "%c%c%c%c, unexpected reply code\n", buf[0], buf[1], buf[2], buf[3]);
+ }
+
+ return 0;
+ }
+
+ /* INFOx0000100#.... */
+
+ /* read the answer len */
+ if (buf[4] != 'x') {
+ DBG(1, "unknown type in header: %c\n", buf[4]);
+ return 0;
+ }
+
+ err = sscanf(&buf[5], "%x#", more);
+ if (err != 1) {
+ DBG(1, "cannot decode length from header\n");
+ return 0;
+ }
+
+ return 1;
+}
+
+static SANE_Status esci2_cmd(epsonds_scanner* s,
+ char *cmd, size_t len,
+ char *payload, size_t plen,
+ void *userdata, SANE_Status (*cb)(void *userdata, char *token, int len))
+{
+ SANE_Status status;
+ unsigned int more;
+ char rbuf[64];
+
+ DBG(8, "%s: %4s len %lu, payload len: %lu\n", __func__, cmd, len, plen);
+
+ if (len < 12) {
+ DBG(1, "%s: command is too short (%lu)\n", __func__, len);
+ return SANE_STATUS_INVAL;
+ }
+
+ /* merge the payload size and send the RequestBlock */
+ if (payload && plen) {
+
+ sprintf(rbuf, "%4.4sx%07x", cmd, (unsigned int)plen);
+
+ DBG(8, " %s (%lu)\n", rbuf, plen);
+
+ eds_send(s, rbuf, 12, &status);
+
+ } else {
+ eds_send(s, cmd, len, &status);
+ }
+
+ if (status != SANE_STATUS_GOOD) {
+ return status;
+ }
+
+ /* send ParameterBlock */
+ if (payload && plen) {
+
+ eds_send(s, payload, plen, &status);
+ if (status != SANE_STATUS_GOOD) {
+ return status;
+ }
+ }
+
+ /* receive DataHeaderBlock */
+ memset(rbuf, 0x00, sizeof(rbuf));
+
+ eds_recv(s, rbuf, 64, &status);
+ if (status != SANE_STATUS_GOOD) {
+ return status;
+ }
+
+ /* rxbuf holds the DataHeaderBlock, which should be
+ * parsed to know if we need to read more data
+ */
+ if (!esci2_check_header(cmd, rbuf, &more)) {
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* parse the received header block */
+ if (cb) {
+ status = esci2_parse_block(rbuf + 12, 64 - 12, userdata, cb);
+ if (status != SANE_STATUS_GOOD && status != SANE_STATUS_DEVICE_BUSY) {
+ DBG(1, "%s: %4s error while parsing received header\n", __func__, cmd);
+ }
+ }
+
+ /* header valid, get the data block if present */
+ if (more) {
+
+ char *pbuf = malloc(more);
+ if (pbuf) {
+
+ ssize_t read = eds_recv(s, pbuf, more, &status);
+ if (read != more) {
+ }
+
+ /* parse the received data block */
+ if (cb) {
+ status = esci2_parse_block(pbuf, more, userdata, cb);
+ if (status != SANE_STATUS_GOOD) {
+ DBG(1, "%s: %4s error while parsing received data block\n", __func__, cmd);
+ }
+ }
+
+ free(pbuf);
+
+ } else {
+ return SANE_STATUS_NO_MEM;
+ }
+ }
+
+ return status;
+}
+
+static SANE_Status esci2_cmd_simple(epsonds_scanner* s, char *cmd, SANE_Status (*cb)(void *userdata, char *token, int len))
+{
+ return esci2_cmd(s, cmd, 12, NULL, 0, s, cb);
+}
+
+SANE_Status esci2_fin(epsonds_scanner *s)
+{
+ SANE_Status status;
+
+ DBG(5, "%s\n", __func__);
+
+ status = esci2_cmd_simple(s, "FIN x0000000", NULL);
+ s->locked = 0;
+ return status;
+}
+
+SANE_Status esci2_can(epsonds_scanner *s)
+{
+ return esci2_cmd_simple(s, "CAN x0000000", NULL);
+}
+
+static int decode_value(char *buf, int len)
+{
+ char tmp[10];
+
+ memcpy(tmp, buf, len);
+ tmp[len] = '\0';
+
+ if (buf[0] == 'd' && len == 4) {
+ return strtol(buf + 1, NULL, 10);
+ } else if (buf[0] == 'i' && len == 8) {
+ return strtol(buf + 1, NULL, 10);
+ } else if (buf[0] == 'x' && len == 8) {
+ return strtol(buf + 1, NULL, 16);
+ } else if (buf[0] == 'h' && len == 4) {
+ return strtol(buf + 1, NULL, 16);
+ }
+
+ return -1;
+}
+
+/* h000 */
+static char *decode_binary(char *buf)
+{
+ char tmp[6];
+ int hl;
+
+ memcpy(tmp, buf, 4);
+ tmp[4] = '\0';
+
+ if (buf[0] != 'h')
+ return NULL;
+
+ hl = strtol(tmp + 1, NULL, 16);
+ if (hl) {
+
+ char *v = malloc(hl + 1);
+ memcpy(v, buf + 4, hl);
+ v[hl] = '\0';
+
+ return v;
+ }
+
+ return NULL;
+}
+
+static char *decode_string(char *buf)
+{
+ char *p, *s = decode_binary(buf);
+ if (s == NULL)
+ return NULL;
+
+ /* trim white space at the end */
+ p = s + strlen(s);
+ while (*--p == ' ')
+ *p = '\0';
+
+ return s;
+}
+
+static void debug_token(int level, const char *func, char *token, int len)
+{
+ char *tdata = malloc(len + 1);
+ memcpy(tdata, token + 3, len);
+ tdata[len] = '\0';
+
+ DBG(level, "%s: %3.3s / %s / %d\n", func, token, tdata, len);
+
+ free(tdata);
+}
+
+static SANE_Status info_cb(void *userdata, char *token, int len)
+{
+ epsonds_scanner *s = (epsonds_scanner *)userdata;
+ char *value;
+
+ if (DBG_LEVEL >= 11) {
+ debug_token(DBG_LEVEL, __func__, token, len);
+ }
+
+ /* pointer to the token's value */
+ value = token + 3;
+
+ /* nrd / nrdBUSY */
+
+ if (strncmp("nrd", token, 3) == 0) {
+ if (strncmp("BUSY", value, 4) == 0) {
+ return SANE_STATUS_DEVICE_BUSY;
+ }
+ }
+
+ if (strncmp("PRD", token, 3) == 0) {
+ free(s->hw->model);
+ s->hw->model = decode_string(value);
+ s->hw->sane.model = s->hw->model;
+ DBG(1, " product: %s\n", s->hw->model);
+ /* we will free the string later */
+ }
+
+ if (strncmp("VER", token, 3) == 0) {
+ char *v = decode_string(value);
+ DBG(1, " version: %s\n", v);
+ free(v);
+ }
+
+ if (strncmp("S/N", token, 3) == 0) {
+ char *v = decode_string(value);
+ DBG(1, " serial: %s\n", v);
+ free(v);
+ }
+
+ if (strncmp("ADF", token, 3) == 0) {
+
+ s->hw->has_adf = 1;
+
+ if (len == 8) {
+
+ if (strncmp("TYPEPAGE", value, len) == 0) {
+ DBG(1, " ADF: page type\n");
+ }
+
+ if (strncmp("TYPEFEED", value, len) == 0) {
+ DBG(1, " ADF: sheet feed type\n");
+ }
+
+ if (strncmp("DPLX1SCN", value, len) == 0) {
+ DBG(1, " ADF: duplex single pass\n");
+ s->hw->adf_singlepass = 1;
+ }
+
+ if (strncmp("DPLX2SCN", value, len) == 0) {
+ DBG(1, " ADF: duplex double pass\n");
+ s->hw->adf_singlepass = 0;
+ }
+
+ if (strncmp("FORDPF1N", value, len) == 0) {
+ DBG(1, " ADF: order is 1 to N\n");
+ }
+
+ if (strncmp("FORDPFN1", value, len) == 0) {
+ DBG(1, " ADF: order is N to 1\n");
+ }
+
+ if (strncmp("ALGNLEFT", value, len) == 0) {
+ DBG(1, " ADF: left aligned\n");
+ s->hw->adf_alignment = 0;
+ }
+
+ if (strncmp("ALGNCNTR", value, len) == 0) {
+ DBG(1, " ADF: center aligned\n");
+ s->hw->adf_alignment = 1;
+ }
+
+ if (strncmp("ALGNRIGT", value, len) == 0) {
+ DBG(1, " ADF: right aligned (not supported!)\n");
+ s->hw->adf_alignment = 2;
+ }
+ }
+
+ if (len == 4) {
+
+ if (strncmp("PREF", value, len) == 0) {
+ DBG(1, " ADF: auto pre-feed\n");
+ }
+
+ if (strncmp("ASCN", value, len) == 0) {
+ DBG(1, " ADF: auto scan\n");
+ }
+
+ if (strncmp("RCVR", value, len) == 0) {
+ DBG(1, " ADF: auto recovery\n");
+ }
+ }
+
+ if (len == 20) {
+
+ /* ADFAREAi0000850i0001400 */
+
+ if (strncmp("AREA", value, 4) == 0) {
+
+ int min = decode_value(value + 4, 8);
+ int max = decode_value(value + 4 + 8, 8);
+
+ DBG(1, " ADF: area %dx%d @ 100dpi\n", min, max);
+ }
+
+ if (strncmp("AMIN", value, 4) == 0) {
+
+ int min = decode_value(value + 4, 8);
+ int max = decode_value(value + 4 + 8, 8);
+
+ DBG(1, " ADF: min %dx%d @ 100dpi\n", min, max);
+ }
+
+ if (strncmp("AMAX", value, 4) == 0) {
+
+ int min = decode_value(value + 4, 8);
+ int max = decode_value(value + 4 + 8, 8);
+
+ DBG(1, " ADF: max %dx%d @ 100dpi\n", min, max);
+
+ eds_set_adf_area(s->hw, min, max, 100);
+ }
+ }
+
+ if (len == 12) {
+
+ /* RESOi0000600 */
+
+ if (strncmp("RESO", value, 4) == 0) {
+
+ int res = decode_value(value + 4, 8);
+
+ DBG(1, " ADF: basic resolution is %d dpi\n", res);
+ }
+
+ /* OVSNd025d035 */
+
+ if (strncmp("OVSN", value, 4) == 0) {
+
+ int x = decode_value(value + 4, 4);
+ int y = decode_value(value + 4 + 4, 4);
+
+ DBG(1, " ADF: overscan %dx%d @ 100dpi\n", x, y);
+ }
+ }
+ }
+
+ if (strncmp("FB ", token, 3) == 0) {
+
+ s->hw->has_fb = 1;
+
+ if (len == 20) {
+
+ /* AREAi0000850i0001400 */
+ if (strncmp("AREA", value, 4) == 0) {
+
+ int min = decode_value(value + 4, 8);
+ int max = decode_value(value + 4 + 8, 8);
+
+ DBG(1, " FB: area %dx%d @ 100dpi\n", min, max);
+
+ eds_set_fbf_area(s->hw, min, max, 100);
+ }
+ }
+
+ if (len == 8) {
+
+ if (strncmp("ALGNLEFT", value, len) == 0) {
+ DBG(1, " FB: left aligned\n");
+ s->hw->fbf_alignment = 0;
+ }
+
+ if (strncmp("ALGNCNTR", value, len) == 0) {
+ DBG(1, " FB: center aligned\n");
+ s->hw->fbf_alignment = 1;
+ }
+
+ if (strncmp("ALGNRIGT", value, len) == 0) {
+ DBG(1, " FB: right aligned (not supported!)\n");
+ s->hw->fbf_alignment = 2;
+ }
+ }
+
+ if (len == 12) {
+
+ /* RESOi0000600 */
+
+ if (strncmp("RESO", value, 4) == 0) {
+
+ int res = decode_value(value + 4, 8);
+
+ DBG(1, " FB: basic resolution is %d dpi\n", res);
+ }
+
+ /* OVSNd025d035 */
+
+ if (strncmp("OVSN", value, 4) == 0) {
+
+ int x = decode_value(value + 4, 4);
+ int y = decode_value(value + 4 + 4, 4);
+
+ DBG(1, " FB: overscan %dx%d @ 100dpi\n", x, y);
+ }
+ }
+
+ if (len == 4) {
+
+ if (strncmp("DETX", value, len) == 0) {
+ DBG(1, " FB: paper width detection\n");
+ }
+
+ if (strncmp("DETY", value, len) == 0) {
+ DBG(1, " FB: paper height detection\n");
+ }
+ }
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status esci2_info(epsonds_scanner *s)
+{
+ SANE_Status status;
+ int i = 4;
+
+ DBG(1, "= gathering device information\n");
+
+ do {
+ status = esci2_cmd_simple(s, "INFOx0000000", &info_cb);
+ if (status == SANE_STATUS_DEVICE_BUSY) {
+ sleep(2);
+ }
+
+ i--;
+
+ } while (status == SANE_STATUS_DEVICE_BUSY && i);
+
+ return status;
+}
+
+/* CAPA */
+
+static SANE_Status capa_cb(void *userdata, char *token, int len)
+{
+ epsonds_scanner *s = (epsonds_scanner *)userdata;
+
+ char *value = token + 3;
+
+ if (DBG_LEVEL >= 11) {
+ debug_token(DBG_LEVEL, __func__, token, len);
+ }
+
+ if (len == 4) {
+
+ if (strncmp("ADFDPLX", token, 3 + 4) == 0) {
+ DBG(1, " ADF: duplex\n");
+ s->hw->adf_is_duplex = 1;
+ }
+
+ if (strncmp("ADFSKEW", token, 3 + 4) == 0) {
+ DBG(1, " ADF: skew correction\n");
+ s->hw->adf_has_skew = 1;
+ }
+
+ if (strncmp("ADFOVSN", token, 3 + 4) == 0) {
+ DBG(1, " ADF: overscan\n");
+ }
+
+ if (strncmp("ADFPEDT", token, 3 + 4) == 0) {
+ DBG(1, " ADF: paper end detection\n");
+ }
+
+ if (strncmp("ADFLOAD", token, 3 + 4) == 0) {
+ DBG(1, " ADF: paper load\n");
+ s->hw->adf_has_load = 1;
+ }
+
+ if (strncmp("ADFEJCT", token, 3 + 4) == 0) {
+ DBG(1, " ADF: paper eject\n");
+ s->hw->adf_has_eject = 1;
+ }
+
+ if (strncmp("ADFCRP ", token, 3 + 4) == 0) {
+ DBG(1, " ADF: image cropping\n");
+ }
+
+ if (strncmp("ADFFAST", token, 3 + 4) == 0) {
+ DBG(1, " ADF: fast mode available\n");
+ }
+
+ if (strncmp("ADFDFL1", token, 3 + 4) == 0) {
+ DBG(1, " ADF: double feed detection\n");
+ s->hw->adf_has_dfd = 1;
+ }
+ }
+
+ if (len == 8 && strncmp("ADFDFL1DFL2", token, 3 + 4) == 0) {
+ DBG(1, " ADF: double feed detection (high sensitivity)\n");
+ s->hw->adf_has_dfd = 2;
+ }
+
+ if (strncmp("FMT", token, 3) == 0) {
+
+ /* a bit ugly... */
+
+ if (len >= 8) {
+ if (strncmp("RAW ", value + 4, 4) == 0) {
+ s->hw->has_raw = 1;
+ }
+ }
+
+ if (len >= 12) {
+ if (strncmp("RAW ", value + 8, 4) == 0) {
+ s->hw->has_raw = 1;
+ }
+ }
+ }
+
+ /* RSMRANGi0000050i0000600 */
+
+ if (strncmp("RSMRANG", token, 3 + 4) == 0) {
+
+ char *p = token + 3 + 4;
+
+ if (p[0] == 'i') {
+
+ int min = decode_value(p, 8);
+ int max = decode_value(p + 8, 8);
+
+ eds_set_resolution_range(s->hw, min, max);
+
+ DBG(1, "resolution min/max %d/%d\n", min, max);
+ }
+ }
+
+ /* RSMLISTi0000300i0000600 */
+
+ if (strncmp("RSMLIST", token, 3 + 4) == 0) {
+
+ char *p = token + 3 + 4;
+
+ if (p[0] == 'i') {
+
+ int i;
+ int count = (len - 4) / 8;
+
+ for (i = 0; i < count; i++) {
+
+ eds_add_resolution(s->hw, decode_value(p, 8));
+ p += 8;
+ }
+ }
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status esci2_capa(epsonds_scanner *s)
+{
+ return esci2_cmd_simple(s, "CAPAx0000000", &capa_cb);
+}
+
+/* STAT */
+
+static SANE_Status stat_cb(void *userdata, char *token, int len)
+{
+/*
+ epsonds_scanner *s = (epsonds_scanner *)userdata;
+ char *value = token + 3;
+*/
+ userdata = userdata;
+
+ if (DBG_LEVEL >= 11) {
+ debug_token(DBG_LEVEL, __func__, token, len);
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status esci2_stat(epsonds_scanner *s)
+{
+ return esci2_cmd_simple(s, "STATx0000000", &stat_cb);
+}
+
+/* RESA */
+
+static SANE_Status resa_cb(void *userdata, char *token, int len)
+{
+ /* epsonds_scanner *s = (epsonds_scanner *)userdata; */
+
+ userdata = userdata;
+
+ if (DBG_LEVEL >= 11) {
+ debug_token(DBG_LEVEL, __func__, token, len);
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status esci2_resa(epsonds_scanner *s)
+{
+ return esci2_cmd_simple(s, "RESAx0000000", &resa_cb);
+}
+
+/* PARA */
+
+static SANE_Status para_cb(void *userdata, char *token, int len)
+{
+ if (DBG_LEVEL >= 11) {
+ debug_token(DBG_LEVEL, __func__, token, len);
+ }
+
+ userdata = userdata;
+
+ if (strncmp("par", token, 3) == 0) {
+ if (strncmp("FAIL", token + 3, 4) == 0) {
+ DBG(1, "%s: parameter setting failed\n", __func__);
+ return SANE_STATUS_INVAL;
+ }
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status esci2_para(epsonds_scanner *s, char *parameters)
+{
+ DBG(8, "%s: %s\n", __func__, parameters);
+ return esci2_cmd(s, "PARAx0000000", 12, parameters, strlen(parameters), NULL, &para_cb);
+}
+
+SANE_Status esci2_mech(epsonds_scanner *s, char *parameters)
+{
+ DBG(8, "%s: %s\n", __func__, parameters);
+ return esci2_cmd(s, "MECHx0000000", 12, parameters, strlen(parameters), NULL, &para_cb);
+}
+
+SANE_Status esci2_trdt(epsonds_scanner *s)
+{
+ return esci2_cmd_simple(s, "TRDTx0000000", NULL);
+}
+
+
+static SANE_Status img_cb(void *userdata, char *token, int len)
+{
+ struct epsonds_scanner *s = userdata;
+
+ if (DBG_LEVEL >= 11) {
+ debug_token(DBG_LEVEL, __func__, token, len);
+ }
+
+ /* psti0000256i0000000i0000945 / 24 */
+
+ /* integer comparison first so it's faster */
+ if (len == 24 && strncmp("pst", token, 3) == 0) {
+
+ s->dummy = decode_value(token + 3 + 8, 8);
+
+ DBG(10, "%s: pst width: %d, height: %d, dummy: %d\n",
+ __func__,
+ decode_value(token + 3, 8),
+ decode_value(token + 3 + 8 + 8, 8),
+ s->dummy);
+
+ return SANE_STATUS_GOOD;
+ }
+
+ if (len == 16 && strncmp("pen", token, 3) == 0) {
+ DBG(10, "%s: page end\n", __func__);
+ s->eof = 1;
+ return SANE_STATUS_EOF;
+ }
+
+ /* typIMGA or typIMGB */
+ if (len == 4 && strncmp("typ", token, 3) == 0) {
+
+ if (token[6] == 'B')
+ s->backside = 1;
+ else
+ s->backside = 0;
+
+ return SANE_STATUS_GOOD;
+ }
+
+ if (strncmp("err", token, 3) == 0) {
+
+ char *option = token + 3; /* ADF, TPU, FB */
+ char *cause = token + 3 + 4; /* OPN, PJ, PE, ERR, LTF, LOCK, DFED, DTCL, AUT, PERM */
+
+ s->scanning = 0;
+
+ DBG(1, "%s: error on option %3.3s, cause %4.4s\n",
+ __func__, option, cause);
+
+ if (cause[0] == 'P' && cause[1] == 'J')
+ return SANE_STATUS_JAMMED;
+
+ if (cause[0] == 'P' && cause[1] == 'E')
+ return SANE_STATUS_NO_DOCS;
+
+ if (cause[0] == 'O' && cause[1] == 'P' && cause[2] == 'N')
+ return SANE_STATUS_COVER_OPEN;
+
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ if (len == 4 && strncmp("atnCAN ", token, 3 + 4) == 0) {
+ DBG(1, "%s: cancel request\n", __func__);
+ s->canceling = 1;
+ s->scanning = 0;
+ return SANE_STATUS_CANCELLED;
+ }
+
+ if (len == 4 && strncmp("lftd000", token, 3 + 4) == 0) {
+ s->scanning = 0;
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+
+SANE_Status
+esci2_img(struct epsonds_scanner *s, SANE_Int *length)
+{
+ SANE_Status status = SANE_STATUS_GOOD;
+ SANE_Status parse_status;
+ unsigned int more;
+ ssize_t read;
+
+ *length = 0;
+
+ if (s->canceling)
+ return SANE_STATUS_CANCELLED;
+
+ /* request image data */
+ eds_send(s, "IMG x0000000", 12, &status);
+ if (status != SANE_STATUS_GOOD) {
+ return status;
+ }
+
+ /* receive DataHeaderBlock */
+ memset(s->buf, 0x00, 64);
+ eds_recv(s, s->buf, 64, &status);
+ if (status != SANE_STATUS_GOOD) {
+ return status;
+ }
+
+ /* check if we need to read any image data */
+ more = 0;
+ if (!esci2_check_header("IMG ", (char *)s->buf, &more)) {
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* this handles eof and errors */
+ parse_status = esci2_parse_block((char *)s->buf + 12, 64 - 12, s, &img_cb);
+
+ /* no more data? return using the status of the esci2_parse_block
+ * call, which might hold other error conditions.
+ */
+ if (!more) {
+ return parse_status;
+ }
+
+ /* ALWAYS read image data */
+ read = eds_recv(s, s->buf, more, &status);
+ if (status != SANE_STATUS_GOOD) {
+ return status;
+ }
+
+ if (read != more) {
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* handle esci2_parse_block errors */
+ if (parse_status != SANE_STATUS_GOOD) {
+ return parse_status;
+ }
+
+ DBG(15, "%s: read %lu bytes, status: %d\n", __func__, (unsigned long) read, status);
+
+ *length = read;
+
+ if (s->canceling) {
+ return SANE_STATUS_CANCELLED;
+ }
+
+ return SANE_STATUS_GOOD;
+}
diff --git a/backend/epsonds-cmd.h b/backend/epsonds-cmd.h
new file mode 100644
index 0000000..923e811
--- /dev/null
+++ b/backend/epsonds-cmd.h
@@ -0,0 +1,29 @@
+/*
+ * epsonds-cmd.h - Epson ESC/I-2 routines.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#ifndef epsonds_cmd_h
+#define epsonds_cmd_h
+
+SANE_Status esci2_info(epsonds_scanner *s);
+SANE_Status esci2_fin(epsonds_scanner *s);
+SANE_Status esci2_can(epsonds_scanner *s);
+SANE_Status esci2_capa(epsonds_scanner *s);
+SANE_Status esci2_resa(epsonds_scanner *s);
+SANE_Status esci2_stat(epsonds_scanner *s);
+SANE_Status esci2_para(epsonds_scanner *s, char *parameters);
+SANE_Status esci2_mech(epsonds_scanner *s, char *parameters);
+SANE_Status esci2_trdt(epsonds_scanner *s);
+SANE_Status esci2_img(struct epsonds_scanner *s, SANE_Int *length) ;
+
+#endif
+
diff --git a/backend/epsonds-io.c b/backend/epsonds-io.c
new file mode 100644
index 0000000..28bacfc
--- /dev/null
+++ b/backend/epsonds-io.c
@@ -0,0 +1,177 @@
+/*
+ * epsonds-io.c - Epson ESC/I-2 driver, low level I/O.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#define DEBUG_DECLARE_ONLY
+
+#include "sane/config.h"
+#include <ctype.h>
+#include <unistd.h> /* sleep */
+
+#include "epsonds.h"
+#include "epsonds-io.h"
+
+size_t eds_send(epsonds_scanner *s, void *buf, size_t length, SANE_Status *status)
+{
+ DBG(32, "%s: size = %lu\n", __func__, (u_long) length);
+
+ if (length == 2) {
+
+ char *cmd = buf;
+
+ switch (cmd[0]) {
+ case FS:
+ DBG(9, "%s: FS %c\n", __func__, cmd[1]);
+ break;
+ }
+ }
+
+ if (s->hw->connection == SANE_EPSONDS_NET) {
+ /* XXX */
+ } else if (s->hw->connection == SANE_EPSONDS_USB) {
+
+ size_t n = length;
+
+ *status = sanei_usb_write_bulk(s->fd, buf, &n);
+
+ return n;
+ }
+
+ /* never reached */
+
+ *status = SANE_STATUS_INVAL;
+
+ return 0;
+}
+
+size_t eds_recv(epsonds_scanner *s, void *buf, size_t length, SANE_Status *status)
+{
+ size_t n = 0;
+
+ DBG(30, "%s: size = %ld, buf = %p\n", __func__, (long) length, buf);
+
+ if (s->hw->connection == SANE_EPSONDS_NET) {
+ /* XXX */
+ } else if (s->hw->connection == SANE_EPSONDS_USB) {
+
+ /* !!! only report an error if we don't read anything */
+
+ n = length;
+ *status = sanei_usb_read_bulk(s->fd, (SANE_Byte *)buf,
+ (size_t *) &n);
+ if (n > 0)
+ *status = SANE_STATUS_GOOD;
+ }
+
+ if (n < length) {
+ DBG(1, "%s: expected = %lu, got = %ld, canceling: %d\n", __func__,
+ (u_long)length, (long)n, s->canceling);
+
+ *status = SANE_STATUS_IO_ERROR;
+ }
+
+ return n;
+}
+
+/* Simple function to exchange a fixed amount of data with the scanner */
+
+SANE_Status eds_txrx(epsonds_scanner* s, char *txbuf, size_t txlen,
+ char *rxbuf, size_t rxlen)
+{
+ SANE_Status status;
+ size_t done;
+
+ done = eds_send(s, txbuf, txlen, &status);
+ if (status != SANE_STATUS_GOOD) {
+ DBG(1, "%s: tx err, %s\n", __func__, sane_strstatus(status));
+ return status;
+ }
+
+ if (done != txlen) {
+ DBG(1, "%s: tx err, short write\n", __func__);
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ done = eds_recv(s, rxbuf, rxlen, &status);
+ if (status != SANE_STATUS_GOOD) {
+ DBG(1, "%s: rx err, %s\n", __func__, sane_strstatus(status));
+ }
+
+ return status;
+}
+
+/* This function should be used to send codes that only requires the scanner
+ * to give back an ACK or a NAK, namely FS X or FS Y
+ */
+
+SANE_Status eds_control(epsonds_scanner *s, void *buf, size_t buf_size)
+{
+ char result;
+ SANE_Status status;
+
+ DBG(12, "%s: size = %lu\n", __func__, (u_long) buf_size);
+
+ status = eds_txrx(s, buf, buf_size, &result, 1);
+ if (status != SANE_STATUS_GOOD) {
+ DBG(1, "%s: failed, %s\n", __func__, sane_strstatus(status));
+ return status;
+ }
+
+ if (result == ACK)
+ return SANE_STATUS_GOOD;
+
+ if (result == NAK) {
+ DBG(3, "%s: NAK\n", __func__);
+ return SANE_STATUS_INVAL;
+ }
+
+ DBG(1, "%s: result is neither ACK nor NAK but 0x%02x\n",
+ __func__, result);
+
+ return SANE_STATUS_INVAL;
+}
+
+SANE_Status eds_fsy(epsonds_scanner *s)
+{
+ return eds_control(s, "\x1CY", 2);
+}
+
+SANE_Status eds_fsx(epsonds_scanner *s)
+{
+ SANE_Status status = eds_control(s, "\x1CX", 2);
+ if (status == SANE_STATUS_GOOD) {
+ s->locked = 1;
+ }
+
+ return status;
+}
+
+SANE_Status eds_lock(epsonds_scanner *s)
+{
+ SANE_Status status;
+
+ DBG(5, "%s\n", __func__);
+
+ if (s->hw->connection == SANE_EPSONDS_USB) {
+ sanei_usb_set_timeout(USB_SHORT_TIMEOUT);
+ }
+
+ status = eds_fsx(s);
+
+ if (s->hw->connection == SANE_EPSONDS_USB) {
+ sanei_usb_set_timeout(USB_TIMEOUT);
+ }
+
+ return status;
+}
+
+
diff --git a/backend/epsonds-io.h b/backend/epsonds-io.h
new file mode 100644
index 0000000..1a1b2b7
--- /dev/null
+++ b/backend/epsonds-io.h
@@ -0,0 +1,33 @@
+/*
+ * epsonds-io.h - Epson ESC/I-2 driver, low level I/O.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#ifndef epsonds_io_h
+#define epsonds_io_h
+
+#define USB_TIMEOUT (6 * 1000)
+#define USB_SHORT_TIMEOUT (1 * 800)
+
+size_t eds_send(epsonds_scanner *s, void *buf, size_t length, SANE_Status *status);
+size_t eds_recv(epsonds_scanner *s, void *buf, size_t length, SANE_Status *status);
+
+SANE_Status eds_txrx(epsonds_scanner *s, char *txbuf, size_t txlen,
+ char *rxbuf, size_t rxlen);
+
+SANE_Status eds_control(epsonds_scanner *s, void *buf, size_t buf_size);
+
+SANE_Status eds_fsy(epsonds_scanner *s);
+SANE_Status eds_fsx(epsonds_scanner *s);
+SANE_Status eds_lock(epsonds_scanner *s);
+
+#endif
+
diff --git a/backend/epsonds-jpeg.c b/backend/epsonds-jpeg.c
new file mode 100644
index 0000000..76a52cb
--- /dev/null
+++ b/backend/epsonds-jpeg.c
@@ -0,0 +1,226 @@
+/*
+ * epsonds-jpeg.c - Epson ESC/I-2 driver, JPEG support.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#define DEBUG_DECLARE_ONLY
+
+#include <math.h>
+
+#include "epsonds.h"
+#include "epsonds-jpeg.h"
+#include "epsonds-ops.h"
+
+#define min(A,B) (((A)<(B)) ? (A) : (B))
+
+typedef struct
+{
+ struct jpeg_source_mgr pub;
+
+ epsonds_scanner *s;
+ JOCTET *buffer;
+
+ SANE_Byte *linebuffer;
+ SANE_Int linebuffer_size;
+ SANE_Int linebuffer_index;
+}
+epsonds_src_mgr;
+
+METHODDEF(void)
+jpeg_init_source(j_decompress_ptr UNUSEDARG cinfo)
+{
+}
+
+METHODDEF(void)
+jpeg_term_source(j_decompress_ptr UNUSEDARG cinfo)
+{
+}
+
+METHODDEF(boolean)
+jpeg_fill_input_buffer(j_decompress_ptr cinfo)
+{
+ epsonds_src_mgr *src = (epsonds_src_mgr *)cinfo->src;
+ int avail, size;
+
+ /* read from the scanner or the ring buffer */
+
+ avail = eds_ring_avail(src->s->current);
+ if (avail == 0) {
+ return FALSE;
+ }
+
+ /* read from scanner if no data? */
+ size = min(1024, avail);
+
+ eds_ring_read(src->s->current, src->buffer, size);
+
+ src->pub.next_input_byte = src->buffer;
+ src->pub.bytes_in_buffer = size;
+
+ return TRUE;
+}
+
+METHODDEF (void)
+jpeg_skip_input_data(j_decompress_ptr cinfo, long num_bytes)
+{
+ epsonds_src_mgr *src = (epsonds_src_mgr *)cinfo->src;
+
+ if (num_bytes > 0) {
+
+ while (num_bytes > (long)src->pub.bytes_in_buffer) {
+ num_bytes -= (long)src->pub.bytes_in_buffer;
+ jpeg_fill_input_buffer(cinfo);
+ }
+
+ src->pub.next_input_byte += (size_t) num_bytes;
+ src->pub.bytes_in_buffer -= (size_t) num_bytes;
+ }
+}
+
+SANE_Status
+eds_jpeg_start(epsonds_scanner *s)
+{
+ epsonds_src_mgr *src;
+
+ s->jpeg_cinfo.err = jpeg_std_error(&s->jpeg_err);
+
+ jpeg_create_decompress(&s->jpeg_cinfo);
+
+ s->jpeg_cinfo.src = (struct jpeg_source_mgr *)(*s->jpeg_cinfo.mem->alloc_small)((j_common_ptr)&s->jpeg_cinfo,
+ JPOOL_PERMANENT, sizeof(epsonds_src_mgr));
+
+ memset(s->jpeg_cinfo.src, 0x00, sizeof(epsonds_src_mgr));
+
+ src = (epsonds_src_mgr *)s->jpeg_cinfo.src;
+ src->s = s;
+
+ src->buffer = (JOCTET *)(*s->jpeg_cinfo.mem->alloc_small)((j_common_ptr)&s->jpeg_cinfo,
+ JPOOL_PERMANENT,
+ 1024 * sizeof(JOCTET));
+
+ src->pub.init_source = jpeg_init_source;
+ src->pub.fill_input_buffer = jpeg_fill_input_buffer;
+ src->pub.skip_input_data = jpeg_skip_input_data;
+ src->pub.resync_to_restart = jpeg_resync_to_restart;
+ src->pub.term_source = jpeg_term_source;
+ src->pub.bytes_in_buffer = 0;
+ src->pub.next_input_byte = NULL;
+
+ s->jpeg_header_seen = 0;
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status
+eds_jpeg_read_header(epsonds_scanner *s)
+{
+ epsonds_src_mgr *src = (epsonds_src_mgr *)s->jpeg_cinfo.src;
+
+ if (jpeg_read_header(&s->jpeg_cinfo, TRUE)) {
+
+ s->jdst = sanei_jpeg_jinit_write_ppm(&s->jpeg_cinfo);
+
+ if (jpeg_start_decompress(&s->jpeg_cinfo)) {
+
+ int size;
+
+ DBG(3, "%s: w: %d, h: %d, components: %d\n",
+ __func__,
+ s->jpeg_cinfo.output_width, s->jpeg_cinfo.output_height,
+ s->jpeg_cinfo.output_components);
+
+ size = s->jpeg_cinfo.output_width * s->jpeg_cinfo.output_components * 1;
+
+ src->linebuffer = (*s->jpeg_cinfo.mem->alloc_large)((j_common_ptr)&s->jpeg_cinfo,
+ JPOOL_PERMANENT, size);
+
+ src->linebuffer_size = 0;
+ src->linebuffer_index = 0;
+
+ s->jpeg_header_seen = 1;
+
+ return SANE_STATUS_GOOD;
+
+ } else {
+ DBG(0, "%s: decompression failed\n", __func__);
+ return SANE_STATUS_IO_ERROR;
+ }
+ } else {
+ DBG(0, "%s: cannot read JPEG header\n", __func__);
+ return SANE_STATUS_IO_ERROR;
+ }
+}
+
+void
+eds_jpeg_finish(epsonds_scanner *s)
+{
+ jpeg_destroy_decompress(&s->jpeg_cinfo);
+}
+
+void
+eds_jpeg_read(SANE_Handle handle, SANE_Byte *data,
+ SANE_Int max_length, SANE_Int *length)
+{
+ epsonds_scanner *s = handle;
+
+ struct jpeg_decompress_struct cinfo = s->jpeg_cinfo;
+ epsonds_src_mgr *src = (epsonds_src_mgr *)s->jpeg_cinfo.src;
+
+ int l;
+
+ *length = 0;
+
+ /* copy from line buffer if available */
+ if (src->linebuffer_size && src->linebuffer_index < src->linebuffer_size) {
+
+ *length = src->linebuffer_size - src->linebuffer_index;
+
+ if (*length > max_length)
+ *length = max_length;
+
+ memcpy(data, src->linebuffer + src->linebuffer_index, *length);
+ src->linebuffer_index += *length;
+
+ return;
+ }
+
+ if (cinfo.output_scanline >= cinfo.output_height) {
+ *length = 0;
+ return;
+ }
+
+ /* scanlines of decompressed data will be in s->jdst->buffer
+ * only one line at time is supported
+ */
+
+ l = jpeg_read_scanlines(&cinfo, s->jdst->buffer, 1);
+ if (l == 0) {
+ return;
+ }
+
+ /* from s->jdst->buffer to linebuffer
+ * linebuffer holds width * bytesperpixel
+ */
+
+ (*s->jdst->put_pixel_rows)(&cinfo, s->jdst, 1, (char *)src->linebuffer);
+
+ *length = cinfo.output_width * cinfo.output_components * 1;
+ src->linebuffer_size = *length;
+ src->linebuffer_index = 0;
+
+ if (*length > max_length)
+ *length = max_length;
+
+ memcpy(data, src->linebuffer + src->linebuffer_index, *length);
+ src->linebuffer_index += *length;
+}
+
+
diff --git a/backend/epsonds-jpeg.h b/backend/epsonds-jpeg.h
new file mode 100644
index 0000000..c54208e
--- /dev/null
+++ b/backend/epsonds-jpeg.h
@@ -0,0 +1,19 @@
+/*
+ * epsonds.c - Epson ESC/I-2 driver, JPEG support.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#define UNUSEDARG __attribute__ ((unused))
+
+SANE_Status eds_jpeg_start(epsonds_scanner *s);
+void eds_jpeg_finish(epsonds_scanner *s);
+SANE_Status eds_jpeg_read_header(epsonds_scanner *s);
+void eds_jpeg_read(SANE_Handle handle, SANE_Byte *data, SANE_Int max_length, SANE_Int *length);
diff --git a/backend/epsonds-ops.c b/backend/epsonds-ops.c
new file mode 100644
index 0000000..403cd58
--- /dev/null
+++ b/backend/epsonds-ops.c
@@ -0,0 +1,481 @@
+/*
+ * epsonds-ops.c - Epson ESC/I-2 driver, support routines.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#define DEBUG_DECLARE_ONLY
+
+#include "sane/config.h"
+
+#include <unistd.h> /* sleep */
+#ifdef HAVE_SYS_SELECT_H
+#include <sys/select.h>
+#endif
+
+#include "epsonds.h"
+#include "epsonds-io.h"
+#include "epsonds-ops.h"
+#include "epsonds-cmd.h"
+
+extern struct mode_param mode_params[];
+
+/* Define the different scan sources */
+
+#define FBF_STR SANE_I18N("Flatbed")
+#define TPU_STR SANE_I18N("Transparency Unit")
+#define ADF_STR SANE_I18N("Automatic Document Feeder")
+
+extern SANE_String_Const source_list[];
+
+void
+eds_dev_init(epsonds_device *dev)
+{
+ dev->res_list = malloc(sizeof(SANE_Word));
+ dev->res_list[0] = 0;
+
+ dev->depth_list = malloc(sizeof(SANE_Word));
+ dev->depth_list[0] = 0;
+}
+
+SANE_Status
+eds_dev_post_init(struct epsonds_device *dev)
+{
+ SANE_String_Const *source_list_add = source_list;
+
+ DBG(10, "%s\n", __func__);
+
+ if (dev->has_fb)
+ *source_list_add++ = FBF_STR;
+
+ if (dev->has_adf)
+ *source_list_add++ = ADF_STR;
+
+ if (source_list[0] == 0
+ || (dev->res_list[0] == 0 && dev->dpi_range.min == 0)
+ || dev->depth_list[0] == 0) {
+
+ DBG(1, "something is wrong in the discovery process, aborting.\n");
+ DBG(1, "sources: %ld, res: %d, depths: %d.\n",
+ source_list_add - source_list, dev->res_list[0], dev->depth_list[0]);
+
+ return SANE_STATUS_INVAL;
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status
+eds_add_resolution(epsonds_device *dev, int r)
+{
+ DBG(10, "%s: add (dpi): %d\n", __func__, r);
+
+ /* first element is the list size */
+ dev->res_list[0]++;
+ dev->res_list = realloc(dev->res_list,
+ (dev->res_list[0] + 1) *
+ sizeof(SANE_Word));
+ if (dev->res_list == NULL)
+ return SANE_STATUS_NO_MEM;
+
+ dev->res_list[dev->res_list[0]] = r;
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status
+eds_set_resolution_range(epsonds_device *dev, int min, int max)
+{
+ DBG(10, "%s: set min/max (dpi): %d/%d\n", __func__, min, max);
+
+ dev->dpi_range.min = min;
+ dev->dpi_range.max = max;
+ dev->dpi_range.quant = 1;
+
+ return SANE_STATUS_GOOD;
+}
+
+void
+eds_set_fbf_area(epsonds_device *dev, int x, int y, int unit)
+{
+ if (x == 0 || y == 0)
+ return;
+
+ dev->fbf_x_range.min = 0;
+ dev->fbf_x_range.max = SANE_FIX(x * MM_PER_INCH / unit);
+ dev->fbf_x_range.quant = 0;
+
+ dev->fbf_y_range.min = 0;
+ dev->fbf_y_range.max = SANE_FIX(y * MM_PER_INCH / unit);
+ dev->fbf_y_range.quant = 0;
+
+ DBG(5, "%s: %f,%f %f,%f %d [mm]\n",
+ __func__,
+ SANE_UNFIX(dev->fbf_x_range.min),
+ SANE_UNFIX(dev->fbf_y_range.min),
+ SANE_UNFIX(dev->fbf_x_range.max),
+ SANE_UNFIX(dev->fbf_y_range.max), unit);
+}
+
+void
+eds_set_adf_area(struct epsonds_device *dev, int x, int y, int unit)
+{
+ dev->adf_x_range.min = 0;
+ dev->adf_x_range.max = SANE_FIX(x * MM_PER_INCH / unit);
+ dev->adf_x_range.quant = 0;
+
+ dev->adf_y_range.min = 0;
+ dev->adf_y_range.max = SANE_FIX(y * MM_PER_INCH / unit);
+ dev->adf_y_range.quant = 0;
+
+ DBG(5, "%s: %f,%f %f,%f %d [mm]\n",
+ __func__,
+ SANE_UNFIX(dev->adf_x_range.min),
+ SANE_UNFIX(dev->adf_y_range.min),
+ SANE_UNFIX(dev->adf_x_range.max),
+ SANE_UNFIX(dev->adf_y_range.max), unit);
+}
+
+void
+eds_set_tpu_area(struct epsonds_device *dev, int x, int y, int unit)
+{
+ dev->tpu_x_range.min = 0;
+ dev->tpu_x_range.max = SANE_FIX(x * MM_PER_INCH / unit);
+ dev->tpu_x_range.quant = 0;
+
+ dev->tpu_y_range.min = 0;
+ dev->tpu_y_range.max = SANE_FIX(y * MM_PER_INCH / unit);
+ dev->tpu_y_range.quant = 0;
+
+ DBG(5, "%s: %f,%f %f,%f %d [mm]\n",
+ __func__,
+ SANE_UNFIX(dev->tpu_x_range.min),
+ SANE_UNFIX(dev->tpu_y_range.min),
+ SANE_UNFIX(dev->tpu_x_range.max),
+ SANE_UNFIX(dev->tpu_y_range.max), unit);
+}
+
+SANE_Status
+eds_add_depth(epsonds_device *dev, SANE_Word depth)
+{
+ DBG(5, "%s: add (bpp): %d\n", __func__, depth);
+
+ /* > 8bpp not implemented yet */
+ if (depth > 8) {
+ DBG(1, " not supported");
+ return SANE_STATUS_GOOD;
+ }
+
+ if (depth > dev->max_depth)
+ dev->max_depth = depth;
+
+ /* first element is the list size */
+ dev->depth_list[0]++;
+ dev->depth_list = realloc(dev->depth_list,
+ (dev->depth_list[0] + 1) *
+ sizeof(SANE_Word));
+
+ if (dev->depth_list == NULL)
+ return SANE_STATUS_NO_MEM;
+
+ dev->depth_list[dev->depth_list[0]] = depth;
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status
+eds_init_parameters(epsonds_scanner *s)
+{
+ int dpi, bytes_per_pixel;
+
+ memset(&s->params, 0, sizeof(SANE_Parameters));
+
+ s->dummy = 0;
+
+ dpi = s->val[OPT_RESOLUTION].w;
+
+ if (SANE_UNFIX(s->val[OPT_BR_Y].w) == 0 ||
+ SANE_UNFIX(s->val[OPT_BR_X].w) == 0)
+ return SANE_STATUS_INVAL;
+
+ s->left = ((SANE_UNFIX(s->val[OPT_TL_X].w) / MM_PER_INCH) *
+ s->val[OPT_RESOLUTION].w) + 0.5;
+
+ s->top = ((SANE_UNFIX(s->val[OPT_TL_Y].w) / MM_PER_INCH) *
+ s->val[OPT_RESOLUTION].w) + 0.5;
+
+ s->params.pixels_per_line =
+ ((SANE_UNFIX(s->val[OPT_BR_X].w -
+ s->val[OPT_TL_X].w) / MM_PER_INCH) * dpi) + 0.5;
+ s->params.lines =
+ ((SANE_UNFIX(s->val[OPT_BR_Y].w -
+ s->val[OPT_TL_Y].w) / MM_PER_INCH) * dpi) + 0.5;
+
+ DBG(5, "%s: tlx %f tly %f brx %f bry %f [mm]\n",
+ __func__,
+ SANE_UNFIX(s->val[OPT_TL_X].w), SANE_UNFIX(s->val[OPT_TL_Y].w),
+ SANE_UNFIX(s->val[OPT_BR_X].w), SANE_UNFIX(s->val[OPT_BR_Y].w));
+
+ DBG(5, "%s: tlx %d tly %d brx %d bry %d [dots @ %d dpi]\n",
+ __func__, s->left, s->top,
+ s->params.pixels_per_line, s->params.lines, dpi);
+
+ /* center aligned? */
+ if (s->hw->alignment == 1) {
+
+ SANE_Int offset = ((SANE_UNFIX(s->hw->x_range->max) / MM_PER_INCH) * dpi) + 0.5;
+
+ s->left += ((offset - s->params.pixels_per_line) / 2);
+
+ DBG(5, "%s: centered to tlx %d tly %d brx %d bry %d [dots @ %d dpi]\n",
+ __func__, s->left, s->top,
+ s->params.pixels_per_line, s->params.lines, dpi);
+ }
+
+ /*
+ * Calculate bytes_per_pixel and bytes_per_line for
+ * any color depths.
+ *
+ * The default color depth is stored in mode_params.depth:
+ */
+
+ if (mode_params[s->val[OPT_MODE].w].depth == 1)
+ s->params.depth = 1;
+ else
+ s->params.depth = s->val[OPT_DEPTH].w;
+
+ /* this works because it can only be set to 1, 8 or 16 */
+ bytes_per_pixel = s->params.depth / 8;
+ if (s->params.depth % 8) { /* just in case ... */
+ bytes_per_pixel++;
+ }
+
+ /* pixels_per_line is rounded to the next 8bit boundary */
+ s->params.pixels_per_line = s->params.pixels_per_line & ~7;
+
+ s->params.last_frame = SANE_TRUE;
+
+ switch (s->val[OPT_MODE].w) {
+ case MODE_BINARY:
+ case MODE_GRAY:
+ s->params.format = SANE_FRAME_GRAY;
+ s->params.bytes_per_line =
+ s->params.pixels_per_line * s->params.depth / 8;
+ break;
+ case MODE_COLOR:
+ s->params.format = SANE_FRAME_RGB;
+ s->params.bytes_per_line =
+ 3 * s->params.pixels_per_line * bytes_per_pixel;
+ break;
+ }
+
+ if (s->params.bytes_per_line == 0) {
+ DBG(1, "bytes_per_line is ZERO\n");
+ return SANE_STATUS_INVAL;
+ }
+
+ /*
+ * If (s->top + s->params.lines) is larger than the max scan area, reset
+ * the number of scan lines:
+ * XXX: precalculate the maximum scanning area elsewhere (use dev max_y)
+ */
+
+ if (SANE_UNFIX(s->val[OPT_BR_Y].w) / MM_PER_INCH * dpi <
+ (s->params.lines + s->top)) {
+ s->params.lines =
+ ((int) SANE_UNFIX(s->val[OPT_BR_Y].w) / MM_PER_INCH *
+ dpi + 0.5) - s->top;
+ }
+
+ if (s->params.lines <= 0) {
+ DBG(1, "wrong number of lines: %d\n", s->params.lines);
+ return SANE_STATUS_INVAL;
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+void
+eds_copy_image_from_ring(epsonds_scanner *s, SANE_Byte *data, SANE_Int max_length,
+ SANE_Int *length)
+{
+ int lines, available;
+ int hw_line_size = (s->params.bytes_per_line + s->dummy);
+
+ /* trim max_length to a multiple of hw_line_size */
+ max_length -= (max_length % hw_line_size);
+
+ /* check available data */
+ available = eds_ring_avail(s->current);
+ if (max_length > available)
+ max_length = available;
+
+ lines = max_length / hw_line_size;
+
+ DBG(18, "copying %d lines (%d, %d)\n", lines, s->params.bytes_per_line, s->dummy);
+
+ /* need more data? */
+ if (lines == 0) {
+ *length = 0;
+ return;
+ }
+
+ *length = (lines * s->params.bytes_per_line);
+
+ /* we need to copy one line at time, skipping
+ * dummy bytes at the end of each line
+ */
+
+ /* lineart */
+ if (s->params.depth == 1) {
+
+ while (lines--) {
+
+ int i;
+ SANE_Byte *p;
+
+ eds_ring_read(s->current, s->line_buffer, s->params.bytes_per_line);
+ eds_ring_skip(s->current, s->dummy);
+
+ p = s->line_buffer;
+
+ for (i = 0; i < s->params.bytes_per_line; i++) {
+ *data++ = ~*p++;
+ }
+ }
+
+ } else { /* gray and color */
+
+ while (lines--) {
+
+ eds_ring_read(s->current, data, s->params.bytes_per_line);
+ eds_ring_skip(s->current, s->dummy);
+
+ data += s->params.bytes_per_line;
+
+ }
+ }
+}
+
+SANE_Status eds_ring_init(ring_buffer *ring, SANE_Int size)
+{
+ ring->ring = realloc(ring->ring, size);
+ if (!ring->ring) {
+ return SANE_STATUS_NO_MEM;
+ }
+
+ ring->size = size;
+ ring->fill = 0;
+ ring->end = ring->ring + size;
+ ring->wp = ring->rp = ring->ring;
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status eds_ring_write(ring_buffer *ring, SANE_Byte *buf, SANE_Int size)
+{
+ SANE_Int tail;
+
+ if (size > (ring->size - ring->fill)) {
+ DBG(1, "ring buffer full, requested: %d, available: %d\n", size, ring->size - ring->fill);
+ return SANE_STATUS_NO_MEM;
+ }
+
+ tail = ring->end - ring->wp;
+ if (size < tail) {
+
+ memcpy(ring->wp, buf, size);
+
+ ring->wp += size;
+ ring->fill += size;
+
+ } else {
+
+ memcpy(ring->wp, buf, tail);
+ size -= tail;
+
+ ring->wp = ring->ring;
+ memcpy(ring->wp, buf + tail, size);
+
+ ring->wp += size;
+ ring->fill += (tail + size);
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Int eds_ring_read(ring_buffer *ring, SANE_Byte *buf, SANE_Int size)
+{
+ SANE_Int tail;
+
+ DBG(18, "reading from ring, %d bytes available\n", (int)ring->fill);
+
+ /* limit read to available */
+ if (size > ring->fill) {
+ DBG(1, "not enough data in the ring, shouldn't happen\n");
+ size = ring->fill;
+ }
+
+ tail = ring->end - ring->rp;
+ if (size < tail) {
+
+ memcpy(buf, ring->rp, size);
+
+ ring->rp += size;
+ ring->fill -= size;
+
+ return size;
+
+ } else {
+
+ memcpy(buf, ring->rp, tail);
+ size -= tail;
+
+ ring->rp = ring->ring;
+ memcpy(buf + tail, ring->rp, size);
+
+ ring->rp += size;
+ ring->fill -= (size + tail);
+
+ return size + tail;
+ }
+}
+
+SANE_Int eds_ring_skip(ring_buffer *ring, SANE_Int size)
+{
+ SANE_Int tail;
+ /* limit skip to available */
+ if (size > ring->fill)
+ size = ring->fill;
+
+ tail = ring->end - ring->rp;
+ if (size < tail) {
+ ring->rp += size;
+ } else {
+
+ ring->rp = ring->ring + (size - tail);
+ }
+
+ ring->fill -= size;
+
+ return size;
+}
+
+SANE_Int eds_ring_avail(ring_buffer *ring)
+{
+ return ring->fill;
+}
+
+void eds_ring_flush(ring_buffer *ring)
+{
+ eds_ring_skip(ring, ring->fill);
+}
+
+
diff --git a/backend/epsonds-ops.h b/backend/epsonds-ops.h
new file mode 100644
index 0000000..3f45393
--- /dev/null
+++ b/backend/epsonds-ops.h
@@ -0,0 +1,41 @@
+/*
+ * epsonds-ops.h - Epson ESC/I-2 driver.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#define e2_model(s,m) e2_dev_model((s)->hw,(m))
+
+extern void eds_dev_init(epsonds_device *dev);
+extern SANE_Status eds_dev_post_init(struct epsonds_device *dev);
+
+extern SANE_Status eds_add_resolution(epsonds_device *dev, int r);
+extern SANE_Status eds_set_resolution_range(epsonds_device *dev, int min, int max);
+extern void eds_set_fbf_area(epsonds_device *dev, int x, int y, int unit);
+extern void eds_set_adf_area(epsonds_device *dev, int x, int y, int unit);
+extern void eds_set_tpu_area(epsonds_device *dev, int x, int y, int unit);
+
+extern SANE_Status eds_add_depth(epsonds_device *dev, SANE_Word depth);
+extern SANE_Status eds_discover_capabilities(epsonds_scanner *s);
+extern SANE_Status eds_set_extended_scanning_parameters(epsonds_scanner *s);
+extern SANE_Status eds_set_scanning_parameters(epsonds_scanner *s);
+extern void eds_setup_block_mode(epsonds_scanner *s);
+extern SANE_Status eds_init_parameters(epsonds_scanner *s);
+
+extern void eds_copy_image_from_ring(epsonds_scanner *s, SANE_Byte *data, SANE_Int max_length,
+ SANE_Int *length);
+
+extern SANE_Status eds_ring_init(ring_buffer *ring, SANE_Int size);
+extern SANE_Status eds_ring_write(ring_buffer *ring, SANE_Byte *buf, SANE_Int size);
+extern SANE_Int eds_ring_read(ring_buffer *ring, SANE_Byte *buf, SANE_Int size);
+extern SANE_Int eds_ring_skip(ring_buffer *ring, SANE_Int size);
+extern SANE_Int eds_ring_avail(ring_buffer *ring);
+extern void eds_ring_flush(ring_buffer *ring) ;
+
diff --git a/backend/epsonds-usb.c b/backend/epsonds-usb.c
new file mode 100644
index 0000000..c7e514c
--- /dev/null
+++ b/backend/epsonds-usb.c
@@ -0,0 +1,33 @@
+/*
+ * epsonds-usb.c - Epson ESC/I-2 driver, USB device list.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#include "epsonds-usb.h"
+
+SANE_Word epsonds_usb_product_ids[] = {
+ 0x0145, /* DS-5500, DS-6500, DS-7500 */
+ 0x0146, /* DS-50000, DS-60000, DS-70000 */
+ 0x014c, /* DS-510 */
+ 0x014d, /* DS-560 */
+ 0x0150, /* DS-40 */
+ 0x0152, /* DS-760, DS-860 */
+ 0x0154, /* DS-520 */
+ 0x08bc, /* PX-M7050 Series, WF-8510/8590 Series */
+ 0x08cc, /* PX-M7050FX Series, WF-R8590 Series */
+ 0 /* last entry - this is used for devices that are specified
+ in the config file as "usb <vendor> <product>" */
+};
+
+int epsonds_get_number_of_ids(void)
+{
+ return sizeof (epsonds_usb_product_ids) / sizeof (SANE_Word);
+}
diff --git a/backend/epsonds-usb.h b/backend/epsonds-usb.h
new file mode 100644
index 0000000..96c77b5
--- /dev/null
+++ b/backend/epsonds-usb.h
@@ -0,0 +1,24 @@
+/*
+ * epsonds-usb.h - Epson ESC/I-2 driver, USB device list.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#include "sane/sane.h"
+
+#ifndef _EPSONDS_USB_H_
+#define _EPSONDS_USB_H_
+
+#define SANE_EPSONDS_VENDOR_ID (0x4b8)
+
+extern SANE_Word epsonds_usb_product_ids[];
+extern int epsonds_get_number_of_ids(void);
+
+#endif
diff --git a/backend/epsonds.c b/backend/epsonds.c
new file mode 100644
index 0000000..2f85312
--- /dev/null
+++ b/backend/epsonds.c
@@ -0,0 +1,1364 @@
+/*
+ * epsonds.c - Epson ESC/I-2 driver.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#define EPSONDS_VERSION 1
+#define EPSONDS_REVISION 0
+#define EPSONDS_BUILD 35
+
+/* debugging levels:
+ *
+ * 32 eds_send
+ * 30 eds_recv
+ * 20 sane_read and related
+ * 18 sane_read and related
+ * 17 setvalue, getvalue, control_option
+ * 16
+ * 15 esci2_img
+ * 13 image_cb
+ * 12 eds_control
+ * 11 all received params
+ * 10 some received params
+ * 9
+ * 8 esci2_xxx
+ * 7 open/close/attach
+ * 6 print_params
+ * 5 basic functions
+ * 3 JPEG decompressor
+ * 1 scanner info and capabilities
+ * 0 errors
+ */
+
+#include "sane/config.h"
+
+#include <ctype.h>
+
+#include "sane/saneopts.h"
+#include "sane/sanei_config.h"
+
+#include "epsonds.h"
+#include "epsonds-usb.h"
+#include "epsonds-io.h"
+#include "epsonds-cmd.h"
+#include "epsonds-ops.h"
+#include "epsonds-jpeg.h"
+
+/*
+ * Definition of the mode_param struct, that is used to
+ * specify the valid parameters for the different scan modes.
+ *
+ * The depth variable gets updated when the bit depth is modified.
+ */
+
+struct mode_param mode_params[] = {
+ {0, 0x00, 0x30, 1},
+ {0, 0x00, 0x30, 8},
+ {1, 0x02, 0x00, 8},
+ {0, 0x00, 0x30, 1}
+};
+
+static SANE_String_Const mode_list[] = {
+ SANE_VALUE_SCAN_MODE_LINEART,
+ SANE_VALUE_SCAN_MODE_GRAY,
+ SANE_VALUE_SCAN_MODE_COLOR,
+ NULL
+};
+
+static const SANE_String_Const adf_mode_list[] = {
+ SANE_I18N("Simplex"),
+ SANE_I18N("Duplex"),
+ NULL
+};
+
+/* Define the different scan sources */
+
+#define FBF_STR SANE_I18N("Flatbed")
+#define ADF_STR SANE_I18N("Automatic Document Feeder")
+
+/* order will be fixed: fb, adf, tpu */
+SANE_String_Const source_list[] = {
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+/*
+ * List of pointers to devices - will be dynamically allocated depending
+ * on the number of devices found.
+ */
+static const SANE_Device **devlist;
+
+/* Some utility functions */
+
+static size_t
+max_string_size(const SANE_String_Const strings[])
+{
+ size_t size, max_size = 0;
+ int i;
+
+ for (i = 0; strings[i]; i++) {
+ size = strlen(strings[i]) + 1;
+ if (size > max_size)
+ max_size = size;
+ }
+ return max_size;
+}
+
+static SANE_Status attach_one_usb(SANE_String_Const devname);
+
+static void
+print_params(const SANE_Parameters params)
+{
+ DBG(6, "params.format = %d\n", params.format);
+ DBG(6, "params.last_frame = %d\n", params.last_frame);
+ DBG(6, "params.bytes_per_line = %d\n", params.bytes_per_line);
+ DBG(6, "params.pixels_per_line = %d\n", params.pixels_per_line);
+ DBG(6, "params.lines = %d\n", params.lines);
+ DBG(6, "params.depth = %d\n", params.depth);
+}
+
+static void
+close_scanner(epsonds_scanner *s)
+{
+ DBG(7, "%s: fd = %d\n", __func__, s->fd);
+
+ if (s->fd == -1)
+ goto free;
+
+ if (s->locked) {
+ DBG(7, " unlocking scanner\n");
+ esci2_fin(s);
+ }
+
+ if (s->hw->connection == SANE_EPSONDS_USB) {
+ sanei_usb_close(s->fd);
+ }
+
+free:
+
+ free(s->front.ring);
+ free(s->back.ring);
+ free(s->line_buffer);
+ free(s);
+
+ DBG(7, "%s: ZZZ\n", __func__);
+}
+
+static SANE_Status
+open_scanner(epsonds_scanner *s)
+{
+ SANE_Status status = SANE_STATUS_INVAL;
+
+ DBG(7, "%s: %s\n", __func__, s->hw->sane.name);
+
+ if (s->fd != -1) {
+ DBG(5, "scanner is already open: fd = %d\n", s->fd);
+ return SANE_STATUS_GOOD; /* no need to open the scanner */
+ }
+
+ if (s->hw->connection == SANE_EPSONDS_USB) {
+
+ status = sanei_usb_open(s->hw->sane.name, &s->fd);
+ sanei_usb_set_timeout(USB_TIMEOUT);
+
+ } else {
+ DBG(1, "unknown connection type: %d\n", s->hw->connection);
+ }
+
+ if (status == SANE_STATUS_ACCESS_DENIED) {
+ DBG(1, "please check that you have permissions on the device.\n");
+ DBG(1, "if this is a multi-function device with a printer,\n");
+ DBG(1, "disable any conflicting driver (like usblp).\n");
+ }
+
+ if (status != SANE_STATUS_GOOD)
+ DBG(1, "%s open failed: %s\n",
+ s->hw->sane.name,
+ sane_strstatus(status));
+ else
+ DBG(5, " opened correctly\n");
+
+ return status;
+}
+
+static int num_devices; /* number of scanners attached to backend */
+static epsonds_device *first_dev; /* first EPSON scanner in list */
+
+static struct epsonds_scanner *
+scanner_create(struct epsonds_device *dev, SANE_Status *status)
+{
+ struct epsonds_scanner *s;
+
+ s = malloc(sizeof(struct epsonds_scanner));
+ if (s == NULL) {
+ *status = SANE_STATUS_NO_MEM;
+ return NULL;
+ }
+
+ /* clear verything */
+ memset(s, 0x00, sizeof(struct epsonds_scanner));
+
+ s->fd = -1;
+ s->hw = dev;
+
+ return s;
+}
+
+static struct epsonds_scanner *
+device_detect(const char *name, int type, SANE_Status *status)
+{
+ struct epsonds_scanner *s;
+ struct epsonds_device *dev;
+
+ DBG(1, "%s\n", __func__);
+
+ /* try to find the device in our list */
+ for (dev = first_dev; dev; dev = dev->next) {
+ if (strcmp(dev->sane.name, name) == 0) {
+ DBG(1, " found cached device\n");
+ return scanner_create(dev, status);
+ }
+ }
+
+ /* not found, create new if valid */
+ if (type == SANE_EPSONDS_NODEV) {
+ *status = SANE_STATUS_INVAL;
+ return NULL;
+ }
+
+ /* alloc and clear our device structure */
+ dev = malloc(sizeof(*dev));
+ if (!dev) {
+ *status = SANE_STATUS_NO_MEM;
+ return NULL;
+ }
+ memset(dev, 0x00, sizeof(struct epsonds_device));
+
+ s = scanner_create(dev, status);
+ if (s == NULL)
+ return NULL;
+
+ dev->connection = type;
+ dev->model = strdup("(undetermined)");
+
+ dev->sane.name = name;
+ dev->sane.vendor = "Epson";
+ dev->sane.model = dev->model;
+ dev->sane.type = "ESC/I-2";
+
+ *status = open_scanner(s);
+ if (*status != SANE_STATUS_GOOD) {
+ free(s);
+ return NULL;
+ }
+
+ eds_dev_init(dev);
+
+ /* lock scanner */
+ *status = eds_lock(s);
+ if (*status != SANE_STATUS_GOOD) {
+ goto close;
+ }
+
+ /* discover capabilities */
+ *status = esci2_info(s);
+ if (*status != SANE_STATUS_GOOD)
+ goto close;
+
+ *status = esci2_capa(s);
+ if (*status != SANE_STATUS_GOOD)
+ goto close;
+
+ *status = esci2_resa(s);
+ if (*status != SANE_STATUS_GOOD)
+ goto close;
+
+ /* assume 1 and 8 bit are always supported */
+ eds_add_depth(s->hw, 1);
+ eds_add_depth(s->hw, 8);
+
+ /* setup area according to available options */
+ if (s->hw->has_fb) {
+
+ dev->x_range = &dev->fbf_x_range;
+ dev->y_range = &dev->fbf_y_range;
+ dev->alignment = dev->fbf_alignment;
+
+ } else if (s->hw->has_adf) {
+
+ dev->x_range = &dev->adf_x_range;
+ dev->y_range = &dev->adf_y_range;
+ dev->alignment = dev->adf_alignment;
+
+ } else {
+ DBG(0, "unable to lay on the flatbed or feed the feeder. is that a scanner??\n");
+ }
+
+ *status = eds_dev_post_init(dev);
+ if (*status != SANE_STATUS_GOOD)
+ goto close;
+
+ DBG(1, "scanner model: %s\n", dev->model);
+
+ /* add this scanner to the device list */
+
+ num_devices++;
+ dev->next = first_dev;
+ first_dev = dev;
+
+ return s;
+
+close:
+ DBG(1, " failed\n");
+
+ close_scanner(s);
+ return NULL;
+}
+
+
+static SANE_Status
+attach(const char *name, int type)
+{
+ SANE_Status status;
+ epsonds_scanner * s;
+
+ DBG(7, "%s: devname = %s, type = %d\n", __func__, name, type);
+
+ s = device_detect(name, type, &status);
+ if (s == NULL)
+ return status;
+
+ close_scanner(s);
+ return status;
+}
+
+SANE_Status
+attach_one_usb(const char *dev)
+{
+ DBG(7, "%s: dev = %s\n", __func__, dev);
+ return attach(dev, SANE_EPSONDS_USB);
+}
+
+static SANE_Status
+attach_one_config(SANEI_Config __sane_unused__ *config, const char *line)
+{
+ int vendor, product;
+
+ int len = strlen(line);
+
+ DBG(7, "%s: len = %d, line = %s\n", __func__, len, line);
+
+ if (sscanf(line, "usb %i %i", &vendor, &product) == 2) {
+
+ DBG(7, " user configured device\n");
+
+ if (vendor != SANE_EPSONDS_VENDOR_ID)
+ return SANE_STATUS_INVAL; /* this is not an Epson device */
+
+ sanei_usb_attach_matching_devices(line, attach_one_usb);
+
+ } else if (strncmp(line, "usb", 3) == 0 && len == 3) {
+
+ int i, numIds;
+
+ DBG(7, " probing usb devices\n");
+
+ numIds = epsonds_get_number_of_ids();
+
+ for (i = 0; i < numIds; i++) {
+ sanei_usb_find_devices(SANE_EPSONDS_VENDOR_ID,
+ epsonds_usb_product_ids[i], attach_one_usb);
+ }
+
+ } else {
+ DBG(0, "unable to parse config line: %s\n", line);
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+static void
+free_devices(void)
+{
+ epsonds_device *dev, *next;
+
+ for (dev = first_dev; dev; dev = next) {
+ next = dev->next;
+ free(dev->name);
+ free(dev->model);
+ free(dev);
+ }
+
+ free(devlist);
+ first_dev = NULL;
+}
+
+static void
+probe_devices(void)
+{
+ DBG(5, "%s\n", __func__);
+
+ free_devices();
+ sanei_configure_attach(EPSONDS_CONFIG_FILE, NULL, attach_one_config);
+}
+
+/**** SANE API ****/
+
+SANE_Status
+sane_init(SANE_Int *version_code, SANE_Auth_Callback __sane_unused__ authorize)
+{
+ DBG_INIT();
+ DBG(2, "%s: " PACKAGE " " VERSION "\n", __func__);
+
+ DBG(1, "epsonds backend, version %i.%i.%i\n",
+ EPSONDS_VERSION, EPSONDS_REVISION, EPSONDS_BUILD);
+
+ if (version_code != NULL)
+ *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR,
+ EPSONDS_BUILD);
+
+ sanei_usb_init();
+
+ return SANE_STATUS_GOOD;
+}
+
+void
+sane_exit(void)
+{
+ DBG(5, "** %s\n", __func__);
+ free_devices();
+}
+
+SANE_Status
+sane_get_devices(const SANE_Device ***device_list, SANE_Bool __sane_unused__ local_only)
+{
+ int i;
+ epsonds_device *dev;
+
+ DBG(5, "** %s\n", __func__);
+
+ probe_devices();
+
+ devlist = malloc((num_devices + 1) * sizeof(devlist[0]));
+ if (!devlist) {
+ DBG(1, "out of memory (line %d)\n", __LINE__);
+ return SANE_STATUS_NO_MEM;
+ }
+
+ DBG(5, "%s - results:\n", __func__);
+
+ for (i = 0, dev = first_dev; i < num_devices && dev; dev = dev->next, i++) {
+ DBG(1, " %d (%d): %s\n", i, dev->connection, dev->model);
+ devlist[i] = &dev->sane;
+ }
+
+ devlist[i] = NULL;
+
+ *device_list = devlist;
+
+ return SANE_STATUS_GOOD;
+}
+
+static SANE_Status
+init_options(epsonds_scanner *s)
+{
+ int i;
+
+ for (i = 0; i < NUM_OPTIONS; i++) {
+ s->opt[i].size = sizeof(SANE_Word);
+ s->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ }
+
+ s->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;
+ s->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;
+ s->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;
+ s->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;
+ s->val[OPT_NUM_OPTS].w = NUM_OPTIONS;
+
+ /* "Scan Mode" group: */
+
+ s->opt[OPT_MODE_GROUP].title = SANE_I18N("Scan Mode");
+ s->opt[OPT_MODE_GROUP].desc = "";
+ s->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP;
+ s->opt[OPT_MODE_GROUP].cap = 0;
+
+ /* scan mode */
+ s->opt[OPT_MODE].name = SANE_NAME_SCAN_MODE;
+ s->opt[OPT_MODE].title = SANE_TITLE_SCAN_MODE;
+ s->opt[OPT_MODE].desc = SANE_DESC_SCAN_MODE;
+ s->opt[OPT_MODE].type = SANE_TYPE_STRING;
+ s->opt[OPT_MODE].size = max_string_size(mode_list);
+ s->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ s->opt[OPT_MODE].constraint.string_list = mode_list;
+ s->val[OPT_MODE].w = 0; /* Lineart */
+
+ /* bit depth */
+ s->opt[OPT_DEPTH].name = SANE_NAME_BIT_DEPTH;
+ s->opt[OPT_DEPTH].title = SANE_TITLE_BIT_DEPTH;
+ s->opt[OPT_DEPTH].desc = SANE_DESC_BIT_DEPTH;
+ s->opt[OPT_DEPTH].type = SANE_TYPE_INT;
+ s->opt[OPT_DEPTH].unit = SANE_UNIT_BIT;
+ s->opt[OPT_DEPTH].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+ s->opt[OPT_DEPTH].constraint.word_list = s->hw->depth_list;
+ s->val[OPT_DEPTH].w = s->hw->depth_list[1]; /* the first "real" element is the default */
+
+ /* default is Lineart, disable depth selection */
+ s->opt[OPT_DEPTH].cap |= SANE_CAP_INACTIVE;
+
+ /* resolution */
+ s->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
+ s->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
+ s->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
+
+ s->opt[OPT_RESOLUTION].type = SANE_TYPE_INT;
+ s->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI;
+
+ /* range */
+ if (s->hw->dpi_range.quant) {
+ s->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
+ s->opt[OPT_RESOLUTION].constraint.range = &s->hw->dpi_range;
+ s->val[OPT_RESOLUTION].w = s->hw->dpi_range.min;
+ } else { /* list */
+ s->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+ s->opt[OPT_RESOLUTION].constraint.word_list = s->hw->res_list;
+ s->val[OPT_RESOLUTION].w = s->hw->res_list[1];
+ }
+
+ /* "Geometry" group: */
+ s->opt[OPT_GEOMETRY_GROUP].title = SANE_I18N("Geometry");
+ s->opt[OPT_GEOMETRY_GROUP].desc = "";
+ s->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP;
+ s->opt[OPT_GEOMETRY_GROUP].cap = SANE_CAP_ADVANCED;
+
+ /* top-left x */
+ s->opt[OPT_TL_X].name = SANE_NAME_SCAN_TL_X;
+ s->opt[OPT_TL_X].title = SANE_TITLE_SCAN_TL_X;
+ s->opt[OPT_TL_X].desc = SANE_DESC_SCAN_TL_X;
+ s->opt[OPT_TL_X].type = SANE_TYPE_FIXED;
+ s->opt[OPT_TL_X].unit = SANE_UNIT_MM;
+ s->opt[OPT_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ s->opt[OPT_TL_X].constraint.range = s->hw->x_range;
+ s->val[OPT_TL_X].w = 0;
+
+ /* top-left y */
+ s->opt[OPT_TL_Y].name = SANE_NAME_SCAN_TL_Y;
+ s->opt[OPT_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
+ s->opt[OPT_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
+
+ s->opt[OPT_TL_Y].type = SANE_TYPE_FIXED;
+ s->opt[OPT_TL_Y].unit = SANE_UNIT_MM;
+ s->opt[OPT_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ s->opt[OPT_TL_Y].constraint.range = s->hw->y_range;
+ s->val[OPT_TL_Y].w = 0;
+
+ /* bottom-right x */
+ s->opt[OPT_BR_X].name = SANE_NAME_SCAN_BR_X;
+ s->opt[OPT_BR_X].title = SANE_TITLE_SCAN_BR_X;
+ s->opt[OPT_BR_X].desc = SANE_DESC_SCAN_BR_X;
+
+ s->opt[OPT_BR_X].type = SANE_TYPE_FIXED;
+ s->opt[OPT_BR_X].unit = SANE_UNIT_MM;
+ s->opt[OPT_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ s->opt[OPT_BR_X].constraint.range = s->hw->x_range;
+ s->val[OPT_BR_X].w = s->hw->x_range->max;
+
+ /* bottom-right y */
+ s->opt[OPT_BR_Y].name = SANE_NAME_SCAN_BR_Y;
+ s->opt[OPT_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
+ s->opt[OPT_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
+
+ s->opt[OPT_BR_Y].type = SANE_TYPE_FIXED;
+ s->opt[OPT_BR_Y].unit = SANE_UNIT_MM;
+ s->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ s->opt[OPT_BR_Y].constraint.range = s->hw->y_range;
+ s->val[OPT_BR_Y].w = s->hw->y_range->max;
+
+ /* "Optional equipment" group: */
+ s->opt[OPT_EQU_GROUP].title = SANE_I18N("Optional equipment");
+ s->opt[OPT_EQU_GROUP].desc = "";
+ s->opt[OPT_EQU_GROUP].type = SANE_TYPE_GROUP;
+ s->opt[OPT_EQU_GROUP].cap = SANE_CAP_ADVANCED;
+
+ /* source */
+ s->opt[OPT_SOURCE].name = SANE_NAME_SCAN_SOURCE;
+ s->opt[OPT_SOURCE].title = SANE_TITLE_SCAN_SOURCE;
+ s->opt[OPT_SOURCE].desc = SANE_DESC_SCAN_SOURCE;
+ s->opt[OPT_SOURCE].type = SANE_TYPE_STRING;
+ s->opt[OPT_SOURCE].size = max_string_size(source_list);
+ s->opt[OPT_SOURCE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ s->opt[OPT_SOURCE].constraint.string_list = source_list;
+ s->val[OPT_SOURCE].w = 0;
+
+ s->opt[OPT_EJECT].name = "eject";
+ s->opt[OPT_EJECT].title = SANE_I18N("Eject");
+ s->opt[OPT_EJECT].desc = SANE_I18N("Eject the sheet in the ADF");
+ s->opt[OPT_EJECT].type = SANE_TYPE_BUTTON;
+
+ if (!s->hw->adf_has_eject)
+ s->opt[OPT_EJECT].cap |= SANE_CAP_INACTIVE;
+
+ s->opt[OPT_LOAD].name = "load";
+ s->opt[OPT_LOAD].title = SANE_I18N("Load");
+ s->opt[OPT_LOAD].desc = SANE_I18N("Load a sheet in the ADF");
+ s->opt[OPT_LOAD].type = SANE_TYPE_BUTTON;
+
+ if (!s->hw->adf_has_load)
+ s->opt[OPT_LOAD].cap |= SANE_CAP_INACTIVE;
+
+ s->opt[OPT_ADF_MODE].name = "adf-mode";
+ s->opt[OPT_ADF_MODE].title = SANE_I18N("ADF Mode");
+ s->opt[OPT_ADF_MODE].desc =
+ SANE_I18N("Selects the ADF mode (simplex/duplex)");
+ s->opt[OPT_ADF_MODE].type = SANE_TYPE_STRING;
+ s->opt[OPT_ADF_MODE].size = max_string_size(adf_mode_list);
+ s->opt[OPT_ADF_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ s->opt[OPT_ADF_MODE].constraint.string_list = adf_mode_list;
+ s->val[OPT_ADF_MODE].w = 0; /* simplex */
+
+ if (!s->hw->adf_is_duplex)
+ s->opt[OPT_ADF_MODE].cap |= SANE_CAP_INACTIVE;
+
+ s->opt[OPT_ADF_SKEW].name = "adf-skew";
+ s->opt[OPT_ADF_SKEW].title = SANE_I18N("ADF Skew Correction");
+ s->opt[OPT_ADF_SKEW].desc =
+ SANE_I18N("Enables ADF skew correction");
+ s->opt[OPT_ADF_SKEW].type = SANE_TYPE_BOOL;
+ s->val[OPT_ADF_SKEW].w = 0;
+
+ if (!s->hw->adf_has_skew)
+ s->opt[OPT_ADF_SKEW].cap |= SANE_CAP_INACTIVE;
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status
+sane_open(SANE_String_Const name, SANE_Handle *handle)
+{
+ SANE_Status status;
+ epsonds_scanner *s = NULL;
+
+ DBG(7, "** %s: name = '%s'\n", __func__, name);
+
+ /* probe if empty device name provided */
+ if (name[0] == '\0') {
+
+ probe_devices();
+
+ if (first_dev == NULL) {
+ DBG(1, "no devices detected\n");
+ return SANE_STATUS_INVAL;
+ }
+
+ s = device_detect(first_dev->sane.name, first_dev->connection,
+ &status);
+ if (s == NULL) {
+ DBG(1, "cannot open a perfectly valid device (%s),"
+ " please report to the authors\n", name);
+ return SANE_STATUS_INVAL;
+ }
+
+ } else {
+
+ if (strncmp(name, "libusb:", 7) == 0) {
+ s = device_detect(name, SANE_EPSONDS_USB, &status);
+ if (s == NULL)
+ return status;
+ } else {
+ DBG(1, "invalid device name: %s\n", name);
+ return SANE_STATUS_INVAL;
+ }
+ }
+
+ /* s is always valid here */
+
+ DBG(5, "%s: handle obtained\n", __func__);
+
+ init_options(s);
+
+ *handle = (SANE_Handle)s;
+
+ status = open_scanner(s);
+ if (status != SANE_STATUS_GOOD) {
+ free(s);
+ return status;
+ }
+
+ /* lock scanner if required */
+ if (!s->locked) {
+ status = eds_lock(s);
+ }
+
+ return status;
+}
+
+void
+sane_close(SANE_Handle handle)
+{
+ epsonds_scanner *s = (epsonds_scanner *)handle;
+
+ DBG(1, "** %s\n", __func__);
+
+ close_scanner(s);
+}
+
+const SANE_Option_Descriptor *
+sane_get_option_descriptor(SANE_Handle handle, SANE_Int option)
+{
+ epsonds_scanner *s = (epsonds_scanner *) handle;
+
+ if (option < 0 || option >= NUM_OPTIONS)
+ return NULL;
+
+ return s->opt + option;
+}
+
+static const SANE_String_Const *
+search_string_list(const SANE_String_Const *list, SANE_String value)
+{
+ while (*list != NULL && strcmp(value, *list) != 0)
+ list++;
+
+ return ((*list == NULL) ? NULL : list);
+}
+
+static void
+activateOption(epsonds_scanner *s, SANE_Int option, SANE_Bool *change)
+{
+ if (!SANE_OPTION_IS_ACTIVE(s->opt[option].cap)) {
+ s->opt[option].cap &= ~SANE_CAP_INACTIVE;
+ *change = SANE_TRUE;
+ }
+}
+
+static void
+deactivateOption(epsonds_scanner *s, SANE_Int option, SANE_Bool *change)
+{
+ if (SANE_OPTION_IS_ACTIVE(s->opt[option].cap)) {
+ s->opt[option].cap |= SANE_CAP_INACTIVE;
+ *change = SANE_TRUE;
+ }
+}
+
+/*
+ * Handles setting the source (flatbed, transparency adapter (TPU),
+ * or auto document feeder (ADF)).
+ *
+ * For newer scanners it also sets the focus according to the
+ * glass / TPU settings.
+ */
+
+static void
+change_source(epsonds_scanner *s, SANE_Int optindex, char *value)
+{
+ int force_max = SANE_FALSE;
+ SANE_Bool dummy;
+
+ DBG(1, "%s: optindex = %d, source = '%s'\n", __func__, optindex,
+ value);
+
+ s->val[OPT_SOURCE].w = optindex;
+
+ /* if current selected area is the maximum available,
+ * keep this setting on the new source.
+ */
+ if (s->val[OPT_TL_X].w == s->hw->x_range->min
+ && s->val[OPT_TL_Y].w == s->hw->y_range->min
+ && s->val[OPT_BR_X].w == s->hw->x_range->max
+ && s->val[OPT_BR_Y].w == s->hw->y_range->max) {
+ force_max = SANE_TRUE;
+ }
+
+ if (strcmp(ADF_STR, value) == 0) {
+
+ s->hw->x_range = &s->hw->adf_x_range;
+ s->hw->y_range = &s->hw->adf_y_range;
+ s->hw->alignment = s->hw->adf_alignment;
+
+ if (s->hw->adf_is_duplex) {
+ activateOption(s, OPT_ADF_MODE, &dummy);
+ } else {
+ deactivateOption(s, OPT_ADF_MODE, &dummy);
+ s->val[OPT_ADF_MODE].w = 0;
+ }
+
+ } else if (strcmp(TPU_STR, value) == 0) {
+
+ s->hw->x_range = &s->hw->tpu_x_range;
+ s->hw->y_range = &s->hw->tpu_y_range;
+
+ deactivateOption(s, OPT_ADF_MODE, &dummy);
+
+ } else {
+
+ /* neither ADF nor TPU active, assume FB */
+ s->hw->x_range = &s->hw->fbf_x_range;
+ s->hw->y_range = &s->hw->fbf_y_range;
+ s->hw->alignment = s->hw->fbf_alignment;
+ }
+
+ s->opt[OPT_BR_X].constraint.range = s->hw->x_range;
+ s->opt[OPT_BR_Y].constraint.range = s->hw->y_range;
+
+ if (s->val[OPT_TL_X].w < s->hw->x_range->min || force_max)
+ s->val[OPT_TL_X].w = s->hw->x_range->min;
+
+ if (s->val[OPT_TL_Y].w < s->hw->y_range->min || force_max)
+ s->val[OPT_TL_Y].w = s->hw->y_range->min;
+
+ if (s->val[OPT_BR_X].w > s->hw->x_range->max || force_max)
+ s->val[OPT_BR_X].w = s->hw->x_range->max;
+
+ if (s->val[OPT_BR_Y].w > s->hw->y_range->max || force_max)
+ s->val[OPT_BR_Y].w = s->hw->y_range->max;
+}
+
+static SANE_Status
+getvalue(SANE_Handle handle, SANE_Int option, void *value)
+{
+ epsonds_scanner *s = (epsonds_scanner *)handle;
+ SANE_Option_Descriptor *sopt = &(s->opt[option]);
+ Option_Value *sval = &(s->val[option]);
+
+ DBG(17, "%s: option = %d\n", __func__, option);
+
+ switch (option) {
+
+ case OPT_NUM_OPTS:
+ case OPT_RESOLUTION:
+ case OPT_TL_X:
+ case OPT_TL_Y:
+ case OPT_BR_X:
+ case OPT_BR_Y:
+ case OPT_DEPTH:
+ case OPT_ADF_SKEW:
+ *((SANE_Word *) value) = sval->w;
+ break;
+
+ case OPT_MODE:
+ case OPT_ADF_MODE:
+ case OPT_SOURCE:
+ strcpy((char *) value, sopt->constraint.string_list[sval->w]);
+ break;
+
+ default:
+ return SANE_STATUS_INVAL;
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+static SANE_Status
+setvalue(SANE_Handle handle, SANE_Int option, void *value, SANE_Int *info)
+{
+ epsonds_scanner *s = (epsonds_scanner *) handle;
+ SANE_Option_Descriptor *sopt = &(s->opt[option]);
+ Option_Value *sval = &(s->val[option]);
+
+ SANE_Status status;
+ const SANE_String_Const *optval = NULL;
+ int optindex = 0;
+ SANE_Bool reload = SANE_FALSE;
+
+ DBG(17, "** %s: option = %d, value = %p\n", __func__, option, value);
+
+ status = sanei_constrain_value(sopt, value, info);
+ if (status != SANE_STATUS_GOOD)
+ return status;
+
+ if (info && value && (*info & SANE_INFO_INEXACT)
+ && sopt->type == SANE_TYPE_INT)
+ DBG(17, " constrained val = %d\n", *(SANE_Word *) value);
+
+ if (sopt->constraint_type == SANE_CONSTRAINT_STRING_LIST) {
+ optval = search_string_list(sopt->constraint.string_list,
+ (char *) value);
+ if (optval == NULL)
+ return SANE_STATUS_INVAL;
+ optindex = optval - sopt->constraint.string_list;
+ }
+
+ /* block faulty frontends */
+ if (sopt->cap & SANE_CAP_INACTIVE) {
+ DBG(1, " tried to modify a disabled parameter");
+ return SANE_STATUS_INVAL;
+ }
+
+ switch (option) {
+
+ case OPT_ADF_MODE: /* simple lists */
+ sval->w = optindex;
+ break;
+
+ case OPT_ADF_SKEW:
+ case OPT_RESOLUTION:
+ sval->w = *((SANE_Word *) value);
+ reload = SANE_TRUE;
+ break;
+
+ case OPT_BR_X:
+ case OPT_BR_Y:
+ sval->w = *((SANE_Word *) value);
+ if (SANE_UNFIX(sval->w) == 0) {
+ DBG(17, " invalid br-x or br-y\n");
+ return SANE_STATUS_INVAL;
+ }
+ /* passthru */
+ case OPT_TL_X:
+ case OPT_TL_Y:
+ sval->w = *((SANE_Word *) value);
+ if (NULL != info)
+ *info |= SANE_INFO_RELOAD_PARAMS;
+ break;
+
+ case OPT_SOURCE:
+ change_source(s, optindex, (char *) value);
+ reload = SANE_TRUE;
+ break;
+
+ case OPT_MODE:
+ {
+ /* use JPEG mode if RAW is not available when bpp > 1 */
+ if (optindex > 0 && !s->hw->has_raw) {
+ s->mode_jpeg = 1;
+ } else {
+ s->mode_jpeg = 0;
+ }
+
+ sval->w = optindex;
+
+ /* if binary, then disable the bit depth selection */
+ if (optindex == 0) {
+ s->opt[OPT_DEPTH].cap |= SANE_CAP_INACTIVE;
+ } else {
+ if (s->hw->depth_list[0] == 1)
+ s->opt[OPT_DEPTH].cap |= SANE_CAP_INACTIVE;
+ else {
+ s->opt[OPT_DEPTH].cap &= ~SANE_CAP_INACTIVE;
+ s->val[OPT_DEPTH].w =
+ mode_params[optindex].depth;
+ }
+ }
+
+ reload = SANE_TRUE;
+ break;
+ }
+
+ case OPT_DEPTH:
+ sval->w = *((SANE_Word *) value);
+ mode_params[s->val[OPT_MODE].w].depth = sval->w;
+ reload = SANE_TRUE;
+ break;
+
+ case OPT_LOAD:
+ esci2_mech(s, "#ADFLOAD");
+ break;
+
+ case OPT_EJECT:
+ esci2_mech(s, "#ADFEJCT");
+ break;
+
+ default:
+ return SANE_STATUS_INVAL;
+ }
+
+ if (reload && info != NULL)
+ *info |= SANE_INFO_RELOAD_OPTIONS | SANE_INFO_RELOAD_PARAMS;
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status
+sane_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action,
+ void *value, SANE_Int *info)
+{
+ DBG(17, "** %s: action = %x, option = %d\n", __func__, action, option);
+
+ if (option < 0 || option >= NUM_OPTIONS)
+ return SANE_STATUS_INVAL;
+
+ if (info != NULL)
+ *info = 0;
+
+ switch (action) {
+ case SANE_ACTION_GET_VALUE:
+ return getvalue(handle, option, value);
+
+ case SANE_ACTION_SET_VALUE:
+ return setvalue(handle, option, value, info);
+
+ default:
+ return SANE_STATUS_INVAL;
+ }
+
+ return SANE_STATUS_INVAL;
+}
+
+SANE_Status
+sane_get_parameters(SANE_Handle handle, SANE_Parameters *params)
+{
+ epsonds_scanner *s = (epsonds_scanner *)handle;
+
+ DBG(5, "** %s\n", __func__);
+
+ if (params == NULL)
+ DBG(1, "%s: params is NULL\n", __func__);
+
+ /*
+ * If sane_start was already called, then just retrieve the parameters
+ * from the scanner data structure
+ */
+ if (s->scanning) {
+ DBG(5, "scan in progress, returning saved params structure\n");
+ } else {
+ /* otherwise initialize the params structure */
+ eds_init_parameters(s);
+ }
+
+ if (params != NULL)
+ *params = s->params;
+
+ print_params(s->params);
+
+ return SANE_STATUS_GOOD;
+}
+
+/*
+ * This function is part of the SANE API and gets called from the front end to
+ * start the scan process.
+ */
+
+SANE_Status
+sane_start(SANE_Handle handle)
+{
+ epsonds_scanner *s = (epsonds_scanner *)handle;
+ char buf[64];
+ char cmd[100]; /* take care not to overflow */
+ SANE_Status status = 0;
+
+ s->pages++;
+
+ DBG(5, "** %s, pages = %d, scanning = %d, backside = %d, front fill: %d, back fill: %d\n",
+ __func__, s->pages, s->scanning, s->backside,
+ eds_ring_avail(&s->front),
+ eds_ring_avail(&s->back));
+
+ s->eof = 0;
+ s->canceling = 0;
+
+ if ((s->pages % 2) == 1) {
+ s->current = &s->front;
+ eds_ring_flush(s->current);
+ } else if (eds_ring_avail(&s->back)) {
+ DBG(5, "back side\n");
+ s->current = &s->back;
+ }
+
+ /* prepare the JPEG decompressor */
+ if (s->mode_jpeg) {
+ status = eds_jpeg_start(s);
+ if (status != SANE_STATUS_GOOD) {
+ goto end;
+ } }
+
+ /* scan already in progress? (one pass adf) */
+ if (s->scanning) {
+ DBG(5, " scan in progress, returning early\n");
+ return SANE_STATUS_GOOD;
+ }
+
+ /* calc scanning parameters */
+ status = eds_init_parameters(s);
+ if (status != SANE_STATUS_GOOD) {
+ DBG(1, " parameters initialization failed\n");
+ return status;
+ }
+
+ /* allocate line buffer */
+ s->line_buffer = realloc(s->line_buffer, s->params.bytes_per_line);
+ if (s->line_buffer == NULL)
+ return SANE_STATUS_NO_MEM;
+
+ /* ring buffer for front page, twice bsz */
+ /* XXX read value from scanner */
+ status = eds_ring_init(&s->front, (65536 * 4) * 2);
+ if (status != SANE_STATUS_GOOD) {
+ return status;
+ }
+
+ /* transfer buffer, bsz */
+ /* XXX read value from scanner */
+ s->buf = realloc(s->buf, 65536 * 4);
+ if (s->buf == NULL)
+ return SANE_STATUS_NO_MEM;
+
+ print_params(s->params);
+
+ /* set scanning parameters */
+
+ /* document source */
+ if (strcmp(source_list[s->val[OPT_SOURCE].w], ADF_STR) == 0) {
+
+ sprintf(buf, "#ADF%s%s",
+ s->val[OPT_ADF_MODE].w ? "DPLX" : "",
+ s->val[OPT_ADF_SKEW].w ? "SKEW" : "");
+
+ if (s->hw->adf_has_dfd == 2) {
+ strcat(buf, "DFL2");
+ } else if (s->hw->adf_has_dfd == 1) {
+ strcat(buf, "DFL1");
+ }
+
+ } else if (strcmp(source_list[s->val[OPT_SOURCE].w], FBF_STR) == 0) {
+
+ strcpy(buf, "#FB ");
+
+ } else {
+ /* XXX */
+ }
+
+ strcpy(cmd, buf);
+
+ if (s->params.format == SANE_FRAME_GRAY) {
+ sprintf(buf, "#COLM%03d", s->params.depth);
+ } else if (s->params.format == SANE_FRAME_RGB) {
+ sprintf(buf, "#COLC%03d", s->params.depth * 3);
+ }
+
+ strcat(cmd, buf);
+
+ /* image transfer format */
+ if (!s->mode_jpeg) {
+ if (s->params.depth > 1 || s->hw->has_raw) {
+ strcat(cmd, "#FMTRAW ");
+ }
+ } else {
+ strcat(cmd, "#FMTJPG #JPGd090");
+ }
+
+ /* resolution (RSMi not always supported) */
+
+ if (s->val[OPT_RESOLUTION].w > 999) {
+ sprintf(buf, "#RSMi%07d", s->val[OPT_RESOLUTION].w);
+ } else {
+ sprintf(buf, "#RSMd%03d", s->val[OPT_RESOLUTION].w);
+ }
+
+ strcat(cmd, buf);
+
+ /* scanning area */
+ sprintf(buf, "#ACQi%07di%07di%07di%07d",
+ s->left, s->top, s->params.pixels_per_line, s->params.lines);
+
+ strcat(cmd, buf);
+
+ status = esci2_para(s, cmd);
+ if (status != SANE_STATUS_GOOD) {
+ goto end;
+ }
+
+ /* start scanning */
+ DBG(1, "%s: scanning...\n", __func__);
+
+ /* switch to data state */
+ status = esci2_trdt(s);
+ if (status != SANE_STATUS_GOOD) {
+ goto end;
+ }
+
+ /* first page is page 1 */
+ s->pages = 1;
+ s->scanning = 1;
+
+end:
+ if (status != SANE_STATUS_GOOD) {
+ DBG(1, "%s: start failed: %s\n", __func__, sane_strstatus(status));
+ }
+
+ return status;
+}
+
+/* this moves data from our buffers to SANE */
+
+SANE_Status
+sane_read(SANE_Handle handle, SANE_Byte *data, SANE_Int max_length,
+ SANE_Int *length)
+{
+ SANE_Int read = 0, tries = 3;
+ SANE_Int available;
+ SANE_Status status = 0;
+ epsonds_scanner *s = (epsonds_scanner *)handle;
+
+ *length = read = 0;
+
+ DBG(20, "** %s: backside = %d\n", __func__, s->backside);
+
+ /* sane_read called before sane_start? */
+ if (s->current == NULL) {
+ DBG(0, "%s: buffer is NULL", __func__);
+ return SANE_STATUS_INVAL;
+ }
+
+ /* anything in the buffer? pass it to the frontend */
+ available = eds_ring_avail(s->current);
+ if (available) {
+
+ DBG(18, "reading from ring buffer, %d left\n", available);
+
+ if (s->mode_jpeg && !s->jpeg_header_seen) {
+
+ status = eds_jpeg_read_header(s);
+ if (status != SANE_STATUS_GOOD && --tries) {
+ goto read_again;
+ }
+ }
+
+ if (s->mode_jpeg) {
+ eds_jpeg_read(handle, data, max_length, &read);
+ } else {
+ eds_copy_image_from_ring(s, data, max_length, &read);
+ }
+
+ if (read == 0) {
+ goto read_again;
+ }
+
+ *length = read;
+
+ return SANE_STATUS_GOOD;
+
+
+ } else if (s->current == &s->back) {
+
+ /* finished reading the back page, next
+ * command should give us the EOF
+ */
+ DBG(18, "back side ring buffer empty\n");
+ }
+
+ /* read until data or error */
+
+read_again:
+
+ status = esci2_img(s, &read);
+ if (status != SANE_STATUS_GOOD) {
+ DBG(20, "read: %d, eof: %d, backside: %d, status: %d\n", read, s->eof, s->backside, status);
+ }
+
+ /* just got a back side page, alloc ring buffer if necessary
+ * we didn't before because dummy was not known
+ */
+ if (s->backside) {
+
+ int required = s->params.lines * (s->params.bytes_per_line + s->dummy);
+
+ if (s->back.size < required) {
+
+ DBG(20, "allocating buffer for the back side\n");
+
+ status = eds_ring_init(&s->back, required);
+ if (status != SANE_STATUS_GOOD) {
+ return status;
+ }
+ }
+ }
+
+ /* abort scanning when appropriate */
+ if (status == SANE_STATUS_CANCELLED) {
+ esci2_can(s);
+ return status;
+ }
+
+ if (s->eof && s->backside) {
+ DBG(18, "back side scan finished\n");
+ }
+
+ /* read again if no error and no data */
+ if (read == 0 && status == SANE_STATUS_GOOD) {
+ goto read_again;
+ }
+
+ /* got something, write to ring */
+ if (read) {
+
+ DBG(20, " %d bytes read, %d lines, eof: %d, canceling: %d, status: %d, backside: %d\n",
+ read, read / (s->params.bytes_per_line + s->dummy),
+ s->canceling, s->eof, status, s->backside);
+
+ /* move data to the appropriate ring */
+ status = eds_ring_write(s->backside ? &s->back : &s->front, s->buf, read);
+
+ if (0 && s->mode_jpeg && !s->jpeg_header_seen
+ && status == SANE_STATUS_GOOD) {
+
+ status = eds_jpeg_read_header(s);
+ if (status != SANE_STATUS_GOOD && --tries) {
+ goto read_again;
+ }
+ }
+ }
+
+ /* continue reading if appropriate */
+ if (status == SANE_STATUS_GOOD)
+ return status;
+
+ /* cleanup */
+ DBG(5, "** %s: cleaning up\n", __func__);
+
+ if (s->mode_jpeg) {
+ eds_jpeg_finish(s);
+ }
+
+ eds_ring_flush(s->current);
+
+ return status;
+}
+
+/*
+ * void sane_cancel(SANE_Handle handle)
+ *
+ * Set the cancel flag to true. The next time the backend requests data
+ * from the scanner the CAN message will be sent.
+ */
+
+void
+sane_cancel(SANE_Handle handle)
+{
+ DBG(1, "** %s\n", __func__);
+ ((epsonds_scanner *)handle)->canceling = SANE_TRUE;
+}
+
+/*
+ * SANE_Status sane_set_io_mode()
+ *
+ * not supported - for asynchronous I/O
+ */
+
+SANE_Status
+sane_set_io_mode(SANE_Handle __sane_unused__ handle,
+ SANE_Bool __sane_unused__ non_blocking)
+{
+ return SANE_STATUS_UNSUPPORTED;
+}
+
+/*
+ * SANE_Status sane_get_select_fd()
+ *
+ * not supported - for asynchronous I/O
+ */
+
+SANE_Status
+sane_get_select_fd(SANE_Handle __sane_unused__ handle,
+ SANE_Int __sane_unused__ *fd)
+{
+ return SANE_STATUS_UNSUPPORTED;
+}
diff --git a/backend/epsonds.conf.in b/backend/epsonds.conf.in
new file mode 100644
index 0000000..23dc461
--- /dev/null
+++ b/backend/epsonds.conf.in
@@ -0,0 +1,12 @@
+# epsonds.conf
+#
+# here are some examples for how to configure the epsonds backend
+
+# USB
+usb
+
+# For libusb support for unknown scanners use the following command
+# usb <vendor ID> <product ID>
+# e.g.:
+# usb 0x4b8 0x14c
+
diff --git a/backend/epsonds.h b/backend/epsonds.h
new file mode 100644
index 0000000..024773b
--- /dev/null
+++ b/backend/epsonds.h
@@ -0,0 +1,199 @@
+/*
+ * epsonds.c - Epson ESC/I-2 driver.
+ *
+ * Copyright (C) 2015 Tower Technologies
+ * Author: Alessandro Zummo <a.zummo@towertech.it>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation, version 2.
+ */
+
+#ifndef epsonds_h
+#define epsonds_h
+
+#undef BACKEND_NAME
+#define BACKEND_NAME epsonds
+#define DEBUG_NOT_STATIC
+
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+
+#ifdef HAVE_STDDEF_H
+#include <stddef.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#ifdef NEED_SYS_TYPES_H
+#include <sys/types.h>
+#endif
+
+#include <string.h> /* for memset and memcpy */
+#include <stdio.h>
+
+#include "sane/sane.h"
+#include "sane/sanei_backend.h"
+#include "sane/sanei_debug.h"
+#include "sane/sanei_usb.h"
+#include "sane/sanei_jpeg.h"
+
+#ifdef __GNUC__
+#define __func__ __FUNCTION__
+#else
+#define __func__ "(undef)"
+/* I cast my vote for C99... :) */
+#endif
+
+#define EPSONDS_CONFIG_FILE "epsonds.conf"
+
+#ifndef PATH_MAX
+#define PATH_MAX (1024)
+#endif
+
+#ifndef XtNumber
+#define XtNumber(x) (sizeof(x) / sizeof(x[0]))
+#define XtOffset(p_type, field) ((size_t)&(((p_type)NULL)->field))
+#define XtOffsetOf(s_type, field) XtOffset(s_type*, field)
+#endif
+
+#define ACK 0x06
+#define NAK 0x15
+#define FS 0x1C
+
+#define FBF_STR SANE_I18N("Flatbed")
+#define TPU_STR SANE_I18N("Transparency Unit")
+#define ADF_STR SANE_I18N("Automatic Document Feeder")
+
+enum {
+ OPT_NUM_OPTS = 0,
+ OPT_MODE_GROUP,
+ OPT_MODE,
+ OPT_DEPTH,
+ OPT_RESOLUTION,
+ OPT_GEOMETRY_GROUP,
+ OPT_TL_X,
+ OPT_TL_Y,
+ OPT_BR_X,
+ OPT_BR_Y,
+ OPT_EQU_GROUP,
+ OPT_SOURCE,
+ OPT_EJECT,
+ OPT_LOAD,
+ OPT_ADF_MODE,
+ OPT_ADF_SKEW,
+ NUM_OPTIONS
+};
+
+typedef enum
+{ /* hardware connection to the scanner */
+ SANE_EPSONDS_NODEV, /* default, no HW specified yet */
+ SANE_EPSONDS_USB, /* USB interface */
+ SANE_EPSONDS_NET /* network interface (unsupported)*/
+} epsonds_conn_type;
+
+/* hardware description */
+
+struct epsonds_device
+{
+ struct epsonds_device *next;
+
+ epsonds_conn_type connection;
+
+ char *name;
+ char *model;
+
+ unsigned int model_id;
+
+ SANE_Device sane;
+ SANE_Range *x_range;
+ SANE_Range *y_range;
+ SANE_Range dpi_range;
+ SANE_Byte alignment;
+
+
+ SANE_Int *res_list; /* list of resolutions */
+ SANE_Int *depth_list;
+ SANE_Int max_depth; /* max. color depth */
+
+ SANE_Bool has_raw; /* supports RAW format */
+
+ SANE_Bool has_fb; /* flatbed */
+ SANE_Range fbf_x_range; /* x range */
+ SANE_Range fbf_y_range; /* y range */
+ SANE_Byte fbf_alignment; /* left, center, right */
+ SANE_Bool fbf_has_skew; /* supports skew correction */
+
+ SANE_Bool has_adf; /* adf */
+ SANE_Range adf_x_range; /* x range */
+ SANE_Range adf_y_range; /* y range */
+ SANE_Bool adf_is_duplex; /* supports duplex mode */
+ SANE_Bool adf_singlepass; /* supports single pass duplex */
+ SANE_Bool adf_has_skew; /* supports skew correction */
+ SANE_Bool adf_has_load; /* supports load command */
+ SANE_Bool adf_has_eject; /* supports eject command */
+ SANE_Byte adf_alignment; /* left, center, right */
+ SANE_Byte adf_has_dfd; /* supports double feed detection */
+
+ SANE_Bool has_tpu; /* tpu */
+ SANE_Range tpu_x_range; /* transparency unit x range */
+ SANE_Range tpu_y_range; /* transparency unit y range */
+};
+
+typedef struct epsonds_device epsonds_device;
+
+typedef struct ring_buffer
+{
+ SANE_Byte *ring, *wp, *rp, *end;
+ SANE_Int fill, size;
+
+} ring_buffer;
+
+/* an instance of a scanner */
+
+struct epsonds_scanner
+{
+ struct epsonds_scanner *next;
+ struct epsonds_device *hw;
+
+ int fd;
+
+ SANE_Option_Descriptor opt[NUM_OPTIONS];
+ Option_Value val[NUM_OPTIONS];
+ SANE_Parameters params;
+
+ SANE_Byte *buf, *line_buffer;
+ ring_buffer *current, front, back;
+
+ SANE_Bool eof, scanning, canceling, locked, backside, mode_jpeg;
+
+ SANE_Int left, top, pages, dummy;
+
+ /* jpeg stuff */
+
+ djpeg_dest_ptr jdst;
+ struct jpeg_decompress_struct jpeg_cinfo;
+ struct jpeg_error_mgr jpeg_err;
+ SANE_Bool jpeg_header_seen;
+};
+
+typedef struct epsonds_scanner epsonds_scanner;
+
+struct mode_param
+{
+ int color;
+ int flags;
+ int dropout_mask;
+ int depth;
+};
+
+enum {
+ MODE_BINARY, MODE_GRAY, MODE_COLOR
+};
+
+#endif
diff --git a/backend/fujitsu-scsi.h b/backend/fujitsu-scsi.h
index 52ac7c6..de6652c 100644
--- a/backend/fujitsu-scsi.h
+++ b/backend/fujitsu-scsi.h
@@ -330,6 +330,7 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
#define get_IN_skew_check(in) getbitfield(in+0x6d, 1, 7)
#define get_IN_new_fd_roll(in) getbitfield(in+0x6d, 1, 6)
+#define get_IN_paper_prot_2(in) getbitfield(in+0x6d, 1, 1)
#define get_IN_evpd_len(in) getnbyte(in + 0x6f, 1)
@@ -364,8 +365,20 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
/*byte 75 is poorly documented*/
+#define get_IN_erp_lot6_supp(in) getbitfield(in+0x76, 1, 7)
+#define get_IN_mode_change_jpeg(in) getbitfield(in+0x76, 1, 5)
+#define get_IN_mode_change_irdc(in) getbitfield(in+0x76, 1, 4)
+#define get_IN_mode_change_iomf(in) getbitfield(in+0x76, 1, 3)
#define get_IN_sync_next_feed(in) getbitfield(in+0x76, 0x07, 0)
+#define get_IN_imp_func3(in) getbitfield(in+0x77, 1, 7)
+
+#define get_IN_reset_ms(in) getbitfield(in+0x78, 1, 7)
+#define get_IN_read_size(in) getbitfield(in+0x78, 1, 6)
+#define get_IN_start_end_ms(in) getbitfield(in+0x78, 1, 5)
+
+#define get_IN_op_halt(in) getbitfield(in+0x7a, 1, 7)
+
/* some scanners need evpd inquiry data manipulated */
#define set_IN_page_length(in,val) in[0x04]=val
@@ -429,6 +442,7 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
#define set_MSEL_df_paperprot(sb, val) setbitfield(sb + 3, 3, 6, val)
#define set_MSEL_df_stapledet(sb, val) setbitfield(sb + 3, 3, 4, val)
#define set_MSEL_df_recovery(sb, val) setbitfield(sb + 3, 3, 2, val)
+#define set_MSEL_df_paperprot2(sb, val) setbitfield(sb + 5, 3, 6, val)
#define set_MSEL_dropout_front(sb, val) setbitfield(sb + 0x02, 0x0f, 0, val)
#define set_MSEL_dropout_back(sb, val) setbitfield(sb + 0x02, 0x0f, 4, val)
@@ -548,6 +562,13 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
#define set_SD_preread_composition(sb, val) putnbyte(sb + 0x1c, val, 1)
#define set_SD_preread_escan(sb, val) putnbyte(sb + 0x1d, val, 1)
+#define SD_powoff_string "SET POWOFF TIME "
+#define SD_powoff_stringlen 16
+#define SD_powoff_len 18
+#define set_SD_powoff_disable(in, val) setbitfield(in + 16, 1, 7, val)
+#define set_SD_powoff_interval(in, val) setbitfield(in + 16, 0x7f, 0, val)
+#define set_SD_powoff_notify(sb, val) putnbyte(sb + 0x17, val, 1)
+
/* ==================================================================== */
/* SET_WINDOW */
#define SET_WINDOW_code 0x24
@@ -675,9 +696,10 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
#define OBJECT_POSITION_code 0x31
#define OBJECT_POSITION_len 10
-#define set_OP_autofeed(b,val) setbitfield(b+0x01, 0x07, 0, val)
+#define set_OP_action(b,val) setbitfield(b+0x01, 0x07, 0, val)
#define OP_Discharge 0x00
#define OP_Feed 0x01
+#define OP_Halt 0x04
/* ==================================================================== */
/* SET_SUBWINDOW */
diff --git a/backend/fujitsu.c b/backend/fujitsu.c
index 48d55dc..9fddb1c 100644
--- a/backend/fujitsu.c
+++ b/backend/fujitsu.c
@@ -6,7 +6,7 @@
Copyright (C) 2000 Randolph Bentson
Copyright (C) 2001 Frederik Ramm
Copyright (C) 2001-2004 Oliver Schirrmeister
- Copyright (C) 2003-2011 m. allan noah
+ Copyright (C) 2003-2014 m. allan noah
JPEG output and low memory usage support funded by:
Archivista GmbH, www.archivista.ch
@@ -14,7 +14,7 @@
O A S Oilfield Accounting Service Ltd, www.oas.ca
Automatic length detection support funded by:
Martin G. Miller, mgmiller at optonline.net
- Software image enhancement routines funded by:
+ Software image enhancement routines and recent scanner support funded by:
Fujitsu Computer Products of America, Inc. www.fcpa.com
--------------------------------------------------------------------------
@@ -533,11 +533,50 @@
v116 2013-03-23, MAN
- call set_mode() in init_interlace
- add swskip option
- v117 2013-06-11, MAN
+ v117 2013-06-11, MAN (SANE 1.0.24)
- default buffer-mode to off
- improved error handling in sane_start
- image width must be multiple of 8 when swcrop is used before binarization (iX500)
- check hopper sensor before calling object_position(load) on iX500
+ v118 2013-12-09, MAN
+ - support fi-7160, fi-7260, fi-7180 and fi-7280
+ - remove unused var from do_scsi_cmd()
+ - added more request_sense options
+ - add adv_paper_protect option
+ - enable paper protection by default
+ - increase max_x_fb for fi-6240 and fi-6230
+ v119 2013-12-18, MAN
+ - call get_pixelsize after start_scan, not before
+ - extend get_pixelsize to request backside data
+ - stop using backup/restore_params
+ - don't use extended get_pixelsize on M3091 or M3092
+ - call software crop code on backside images too
+ v120 2014-01-29, MAN
+ - only call hopper_before_op code at batch start
+ - remove unused backup/restore_params
+ v121 2014-04-07, MAN
+ - add JFIF APP0 marker with resolution to jpeg images
+ - improve jpeg duplex parsing code
+ - simplify jpeg ifdefs
+ - add offtimer option for more recent scanners
+ - don't print 0 length line in hexdump
+ v122 2014-10-28, MAN
+ - add support for object_position halt
+ - call object_position halt in check_for_cancel when requested
+ v123 2014-11-06, MAN
+ - workaround Linux USB3 bugs by adding command counting code and
+ sending an even number of reads and writes during disconnect_fd
+ v124 2014-12-09, MAN
+ - support resolution controlled max page-height (fi-6/7xxx scanners)
+ - reorder scanner sections in init_model chronologically
+ v125 2014-12-16, MAN
+ - remove USB packet counting code from v123, fix sanei_usb instead
+ v126 2015-08-23, MAN
+ - initial support for iX100
+ - add late_lut support for iX500/iX100
+ v127 2015-08-25, MAN
+ - separate iX100 from iX500 settings
+ - iX100 has gray and lineart
SANE FLOW DIAGRAM
@@ -587,7 +626,7 @@
#include "fujitsu.h"
#define DEBUG 1
-#define BUILD 117
+#define BUILD 127
/* values for SANE_DEBUG_FUJITSU env var:
- errors 5
@@ -601,6 +640,12 @@
*/
/* ------------------------------------------------------------------------- */
+/* if JPEG support is not enabled in sane.h, we setup our own defines */
+#ifndef SANE_FRAME_JPEG
+#define SANE_FRAME_JPEG 0x0B
+#define SANE_JPEG_DISABLED 1
+#endif
+/* ------------------------------------------------------------------------- */
#define STRING_FLATBED SANE_I18N("Flatbed")
#define STRING_ADFFRONT SANE_I18N("ADF Front")
#define STRING_ADFBACK SANE_I18N("ADF Back")
@@ -1577,9 +1622,8 @@ init_vpd (struct fujitsu *s)
s->has_comp_JPG1 = get_IN_compression_JPG_BASE (in);
DBG (15, " compression JPG1: %d\n", s->has_comp_JPG1);
-#ifndef SANE_FRAME_JPEG
+#ifdef SANE_JPEG_DISABLED
DBG (15, " (Disabled)\n");
- s->has_comp_JPG1 = 0;
#endif
s->has_comp_JPG2 = get_IN_compression_JPG_EXT (in);
@@ -1671,7 +1715,12 @@ init_vpd (struct fujitsu *s)
DBG (15, " rgb lut: %d\n", get_IN_rgb_lut(in));
DBG (15, " num lut dl: %d\n", get_IN_num_lut_dl(in));
+ s->has_off_mode = get_IN_erp_lot6_supp(in);
+ DBG (15, " ErP Lot6 (power off timer): %d\n", s->has_off_mode);
DBG (15, " sync next feed: %d\n", get_IN_sync_next_feed(in));
+
+ s->has_op_halt = get_IN_op_halt(in);
+ DBG (15, " object postion halt: %d\n", s->has_op_halt);
}
ret = SANE_STATUS_GOOD;
@@ -2012,6 +2061,10 @@ init_model (struct fujitsu *s)
s->max_x = s->max_x_basic * 1200 / s->basic_x_res;
s->max_y = s->max_y_basic * 1200 / s->basic_y_res;
+ /* setup the list with a single choice, in 1200dpi units, at max res */
+ s->max_y_by_res[0].res = s->max_y_res;
+ s->max_y_by_res[0].len = s->max_y;
+
/* assume these are same as adf, override below */
s->max_x_fb = s->max_x;
s->max_y_fb = s->max_y;
@@ -2062,6 +2115,7 @@ init_model (struct fujitsu *s)
s->has_vuid_3091 = 1;
s->has_vuid_color = 0;
s->has_vuid_mono = 0;
+ s->has_short_pixelsize = 1;
s->color_interlace = COLOR_INTERLACE_3091;
s->duplex_interlace = DUPLEX_INTERLACE_3091;
@@ -2106,6 +2160,38 @@ init_model (struct fujitsu *s)
s->max_y_fb = 14032;
}
+ else if (strstr (s->model_name, "fi-4750") ) {
+ /* weirdness */
+ s->broken_diag_serial = 1;
+ }
+
+ /* some firmware versions use capital f? */
+ else if (strstr (s->model_name, "Fi-4860")
+ || strstr (s->model_name, "fi-4860") ) {
+
+ /* weirdness */
+ s->broken_diag_serial = 1;
+
+ s->ppl_mod_by_mode[MODE_LINEART] = 32;
+ s->ppl_mod_by_mode[MODE_HALFTONE] = 32;
+ s->ppl_mod_by_mode[MODE_GRAYSCALE] = 4;
+ s->ppl_mod_by_mode[MODE_COLOR] = 4;
+ }
+
+ /* some firmware versions use capital f? */
+ else if (strstr (s->model_name, "Fi-4990")
+ || strstr (s->model_name, "fi-4990") ) {
+
+ /* weirdness */
+ s->duplex_interlace = DUPLEX_INTERLACE_NONE;
+ s->color_interlace = COLOR_INTERLACE_RRGGBB;
+
+ s->ppl_mod_by_mode[MODE_LINEART] = 32;
+ s->ppl_mod_by_mode[MODE_HALFTONE] = 32;
+ s->ppl_mod_by_mode[MODE_GRAYSCALE] = 4;
+ s->ppl_mod_by_mode[MODE_COLOR] = 4;
+ }
+
else if (strstr (s->model_name,"fi-5110C")){
/* missing from vpd */
@@ -2135,49 +2221,44 @@ init_model (struct fujitsu *s)
s->adbits = 8;
}
- /* some firmware versions use capital f? */
- else if (strstr (s->model_name, "Fi-4990")
- || strstr (s->model_name, "fi-4990") ) {
-
- /* weirdness */
- s->duplex_interlace = DUPLEX_INTERLACE_NONE;
- s->color_interlace = COLOR_INTERLACE_RRGGBB;
+ else if (strstr (s->model_name,"S1500")){
- s->ppl_mod_by_mode[MODE_LINEART] = 32;
- s->ppl_mod_by_mode[MODE_HALFTONE] = 32;
- s->ppl_mod_by_mode[MODE_GRAYSCALE] = 4;
- s->ppl_mod_by_mode[MODE_COLOR] = 4;
- }
-
- else if (strstr (s->model_name, "fi-4750") ) {
- /* weirdness */
- s->broken_diag_serial = 1;
+ /*lies*/
+ s->has_MS_bg=0;
+ s->has_MS_prepick=0;
}
- /* some firmware versions use capital f? */
- else if (strstr (s->model_name, "Fi-4860")
- || strstr (s->model_name, "fi-4860") ) {
+ /* also includes the 'Z' models */
+ else if (strstr (s->model_name,"fi-6130")
+ || strstr (s->model_name,"fi-6140")){
/* weirdness */
- s->broken_diag_serial = 1;
-
- s->ppl_mod_by_mode[MODE_LINEART] = 32;
- s->ppl_mod_by_mode[MODE_HALFTONE] = 32;
- s->ppl_mod_by_mode[MODE_GRAYSCALE] = 4;
- s->ppl_mod_by_mode[MODE_COLOR] = 4;
+ /* these machines have longer max paper at lower res */
+ s->max_y_by_res[1].res = 200;
+ s->max_y_by_res[1].len = 151512;
}
/* also includes the 'Z' models */
else if (strstr (s->model_name,"fi-6230")
|| strstr (s->model_name,"fi-6240")){
+ /* weirdness */
+ /* these machines have longer max paper at lower res */
+ s->max_y_by_res[1].res = 200;
+ s->max_y_by_res[1].len = 151512;
+
/* missing from vpd */
- s->max_x_fb = 10488;
+ s->max_x_fb = 10764; /* was previously 10488 */
s->max_y_fb = 14032; /* some scanners can be slightly more? */
}
- else if (strstr (s->model_name,"S1500")
- || strstr (s->model_name,"fi-6110")){
+ else if (strstr (s->model_name,"fi-6110")){
+
+ /* weirdness */
+ /* these machines have longer max paper at lower res */
+ s->max_y_by_res[1].res = 200;
+ s->max_y_by_res[1].len = 151512;
+
/*lies*/
s->has_MS_bg=0;
s->has_MS_prepick=0;
@@ -2196,6 +2277,7 @@ init_model (struct fujitsu *s)
/* weirdness */
s->need_q_table = 1;
+ s->late_lut = 1;
s->need_diag_preread = 1;
s->ppl_mod_by_mode[MODE_COLOR] = 2;
s->hopper_before_op = 1;
@@ -2212,6 +2294,62 @@ init_model (struct fujitsu *s)
s->can_mode[MODE_HALFTONE] = 0;
}
+ /*mostly copied from iX500*/
+ else if (strstr (s->model_name,"iX100")){
+ /* locks up scanner if we try to auto detect */
+ s->has_MS_lamp = 0;
+
+ /* weirdness */
+ s->need_q_table = 1;
+ s->late_lut = 1;
+ s->need_diag_preread = 1;
+ s->ppl_mod_by_mode[MODE_COLOR] = 2;
+ s->hopper_before_op = 1;
+ s->no_wait_after_op = 1;
+
+ /* lies */
+ s->adbits = 8;
+
+ /* dont bother with this one */
+ s->can_mode[MODE_HALFTONE] = 0;
+ }
+
+ else if (strstr (s->model_name,"fi-7180")
+ || strstr (s->model_name,"fi-7160")){
+
+ /* weirdness */
+ /* these machines have longer max paper at lower res */
+ s->max_y_by_res[1].res = 400;
+ s->max_y_by_res[1].len = 194268;
+ s->max_y_by_res[2].res = 300;
+ s->max_y_by_res[2].len = 260268;
+ s->max_y_by_res[3].res = 200;
+ s->max_y_by_res[3].len = 266268;
+
+ /* missing from vpd */
+ s->has_df_recovery=1;
+ s->has_adv_paper_prot=1;
+ }
+
+ else if (strstr (s->model_name,"fi-7280")
+ || strstr (s->model_name,"fi-7260")){
+
+ /* weirdness */
+ /* these machines have longer max paper at lower res */
+ s->max_y_by_res[1].res = 400;
+ s->max_y_by_res[1].len = 194268;
+ s->max_y_by_res[2].res = 300;
+ s->max_y_by_res[2].len = 260268;
+ s->max_y_by_res[3].res = 200;
+ s->max_y_by_res[3].len = 266268;
+
+ /* missing from vpd */
+ s->has_df_recovery=1;
+ s->has_adv_paper_prot=1;
+ s->max_x_fb = 10764;
+ s->max_y_fb = 14032; /* some scanners can be slightly more? */
+ }
+
DBG (10, "init_model: finish\n");
return SANE_STATUS_GOOD;
@@ -2277,6 +2415,7 @@ init_user (struct fujitsu *s)
/* page height US-Letter */
s->page_height = 11 * 1200;
+ set_max_y(s);
if(s->page_height > s->max_y){
s->page_height = s->max_y;
}
@@ -2310,6 +2449,23 @@ init_user (struct fujitsu *s)
* even when the user only wants one */
s->buff_mode = MSEL_OFF;
+ /* useful features of newer scanners which we turn on,
+ * even though the scanner defaults to off */
+ if(s->has_paper_protect){
+ s->paper_protect = MSEL_ON;
+ }
+ if(s->has_staple_detect){
+ s->staple_detect = MSEL_ON;
+ }
+ if(s->has_df_recovery){
+ s->df_recovery = MSEL_ON;
+ }
+ if(s->has_adv_paper_prot){
+ s->adv_paper_prot = MSEL_ON;
+ }
+
+ s->off_time = 240;
+
DBG (10, "init_user: finish\n");
return SANE_STATUS_GOOD;
@@ -3377,7 +3533,9 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
s->compress_list[i++]=STRING_NONE;
if(s->has_comp_JPG1){
+#ifndef SANE_JPEG_DISABLED
s->compress_list[i++]=STRING_JPEG;
+#endif
}
s->compress_list[i]=NULL;
@@ -3528,7 +3686,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->cap = SANE_CAP_INACTIVE;
}
- /*df recovery*/
+ /*df_recovery*/
if(option==OPT_DF_RECOVERY){
s->df_recovery_list[0] = STRING_DEFAULT;
s->df_recovery_list[1] = STRING_OFF;
@@ -3548,7 +3706,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->cap = SANE_CAP_INACTIVE;
}
- /*paper protection*/
+ /*paper_protect*/
if(option==OPT_PAPER_PROTECT){
s->paper_protect_list[0] = STRING_DEFAULT;
s->paper_protect_list[1] = STRING_OFF;
@@ -3568,6 +3726,26 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->cap = SANE_CAP_INACTIVE;
}
+ /*adv_paper_prot*/
+ if(option==OPT_ADV_PAPER_PROT){
+ s->adv_paper_prot_list[0] = STRING_DEFAULT;
+ s->adv_paper_prot_list[1] = STRING_OFF;
+ s->adv_paper_prot_list[2] = STRING_ON;
+ s->adv_paper_prot_list[3] = NULL;
+
+ opt->name = "adv-paper-protect";
+ opt->title = "Advanced paper protection";
+ opt->desc = "Request scanner to predict jams in the ADF using improved sensors";
+ opt->type = SANE_TYPE_STRING;
+ opt->constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ opt->constraint.string_list = s->adv_paper_prot_list;
+ opt->size = maxStringSize (opt->constraint.string_list);
+ if (s->has_MS_df && s->has_adv_paper_prot)
+ opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ else
+ opt->cap = SANE_CAP_INACTIVE;
+ }
+
/*staple detection*/
if(option==OPT_STAPLE_DETECT){
s->staple_detect_list[0] = STRING_DEFAULT;
@@ -3693,7 +3871,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->cap = SANE_CAP_INACTIVE;
}
- /*sleep time*/
+ /*sleep_time*/
if(option==OPT_SLEEP_TIME){
s->sleep_time_range.min = 0;
s->sleep_time_range.max = 60;
@@ -3712,6 +3890,25 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->cap = SANE_CAP_INACTIVE;
}
+ /*off_time*/
+ if(option==OPT_OFF_TIME){
+ s->off_time_range.min = 0;
+ s->off_time_range.max = 960;
+ s->off_time_range.quant = 1;
+
+ opt->name = "offtimer";
+ opt->title = "Off timer";
+ opt->desc = "Time in minutes until the internal power supply switches the scanner off. Will be rounded to nearest 15 minutes. Zero means never power off.";
+ opt->type = SANE_TYPE_INT;
+ opt->unit = SANE_UNIT_NONE;
+ opt->constraint_type = SANE_CONSTRAINT_RANGE;
+ opt->constraint.range=&s->off_time_range;
+ if(s->has_off_mode)
+ opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ else
+ opt->cap = SANE_CAP_INACTIVE;
+ }
+
/*duplex offset*/
if(option==OPT_DUPLEX_OFFSET){
s->duplex_offset_range.min = -16;
@@ -3862,13 +4059,25 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
opt->constraint_type = SANE_CONSTRAINT_RANGE;
opt->constraint.range = &s->swskip_range;
- s->swskip_range.quant=1;
+ s->swskip_range.quant=SANE_FIX(0.10001);
s->swskip_range.min=SANE_FIX(0);
s->swskip_range.max=SANE_FIX(100);
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
}
+ /*halt scanner feeder when cancelling*/
+ if(option==OPT_HALT_ON_CANCEL){
+ opt->name = "halt-on-cancel";
+ opt->title = "Halt on Cancel";
+ opt->desc = "Request driver to halt the paper feed instead of eject during a cancel.";
+ opt->type = SANE_TYPE_BOOL;
+ if (s->has_op_halt)
+ opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ else
+ opt->cap = SANE_CAP_INACTIVE;
+ }
+
/* "Endorser" group ------------------------------------------------------ */
if(option==OPT_ENDORSER_GROUP){
opt->name = "endorser-options";
@@ -4689,6 +4898,20 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
}
return SANE_STATUS_GOOD;
+ case OPT_ADV_PAPER_PROT:
+ switch (s->adv_paper_prot) {
+ case MSEL_DEFAULT:
+ strcpy (val, STRING_DEFAULT);
+ break;
+ case MSEL_ON:
+ strcpy (val, STRING_ON);
+ break;
+ case MSEL_OFF:
+ strcpy (val, STRING_OFF);
+ break;
+ }
+ return SANE_STATUS_GOOD;
+
case OPT_STAPLE_DETECT:
switch (s->staple_detect) {
case MSEL_DEFAULT:
@@ -4780,6 +5003,10 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
*val_p = s->sleep_time;
return SANE_STATUS_GOOD;
+ case OPT_OFF_TIME:
+ *val_p = s->off_time;
+ return SANE_STATUS_GOOD;
+
case OPT_DUPLEX_OFFSET:
*val_p = s->duplex_offset;
return SANE_STATUS_GOOD;
@@ -4820,6 +5047,10 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
*val_p = SANE_FIX(s->swskip);
return SANE_STATUS_GOOD;
+ case OPT_HALT_ON_CANCEL:
+ *val_p = s->halt_on_cancel;
+ return SANE_STATUS_GOOD;
+
/* Endorser Group */
case OPT_ENDORSER:
*val_p = s->u_endorser;
@@ -5080,6 +5311,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
s->resolution_x = val_c;
s->resolution_y = val_c;
+ set_max_y(s);
*info |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS;
return SANE_STATUS_GOOD;
@@ -5341,6 +5573,15 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
s->paper_protect = MSEL_OFF;
return SANE_STATUS_GOOD;
+ case OPT_ADV_PAPER_PROT:
+ if (!strcmp(val, STRING_DEFAULT))
+ s->adv_paper_prot = MSEL_DEFAULT;
+ else if (!strcmp(val, STRING_ON))
+ s->adv_paper_prot = MSEL_ON;
+ else if (!strcmp(val, STRING_OFF))
+ s->adv_paper_prot = MSEL_OFF;
+ return SANE_STATUS_GOOD;
+
case OPT_STAPLE_DETECT:
if (!strcmp(val, STRING_DEFAULT))
s->staple_detect = MSEL_DEFAULT;
@@ -5403,6 +5644,14 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
s->sleep_time = val_c;
return set_sleep_mode(s);
+ case OPT_OFF_TIME:
+ /* do our own constrain, because we want to round up */
+ s->off_time = (val_c + 14)/15*15;
+ if(s->off_time != val_c){
+ *info |= SANE_INFO_INEXACT;
+ }
+ return set_off_mode(s);
+
case OPT_DUPLEX_OFFSET:
s->duplex_offset = val_c;
return SANE_STATUS_GOOD;
@@ -5439,6 +5688,10 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
s->swskip = SANE_UNFIX(val_c);
return SANE_STATUS_GOOD;
+ case OPT_HALT_ON_CANCEL:
+ s->halt_on_cancel = val_c;
+ return SANE_STATUS_GOOD;
+
/* Endorser Group */
case OPT_ENDORSER:
s->u_endorser = val_c;
@@ -5550,6 +5803,50 @@ set_sleep_mode(struct fujitsu *s)
}
static SANE_Status
+set_off_mode(struct fujitsu *s)
+{
+ SANE_Status ret = SANE_STATUS_GOOD;
+
+ unsigned char cmd[SEND_DIAGNOSTIC_len]; /*also big enough for READ_DIAG*/
+ size_t cmdLen = SEND_DIAGNOSTIC_len;
+
+ unsigned char out[SD_powoff_len];
+ size_t outLen = SD_powoff_len;
+
+ DBG (10, "set_off_mode: start\n");
+
+ if (!s->has_cmd_sdiag || !s->has_cmd_rdiag || !s->has_off_mode){
+ DBG (5, "set_off_mode: not supported, returning\n");
+ return ret;
+ }
+
+ memset(cmd,0,cmdLen);
+ set_SCSI_opcode(cmd, SEND_DIAGNOSTIC_code);
+ set_SD_slftst(cmd, 0);
+ set_SD_xferlen(cmd, outLen);
+
+ memcpy(out,SD_powoff_string,SD_powoff_stringlen);
+ set_SD_powoff_disable(out,!s->off_time);
+ set_SD_powoff_interval(out,s->off_time/15);
+
+ ret = do_cmd (
+ s, 1, 0,
+ cmd, cmdLen,
+ out, outLen,
+ NULL, NULL
+ );
+
+ if (ret != SANE_STATUS_GOOD){
+ DBG (5, "set_off_mode: send diag error: %d\n", ret);
+ return ret;
+ }
+
+ DBG (10, "set_off_mode: finish\n");
+
+ return SANE_STATUS_GOOD;
+}
+
+static SANE_Status
get_hardware_status (struct fujitsu *s, SANE_Int option)
{
SANE_Status ret = SANE_STATUS_GOOD;
@@ -6092,6 +6389,7 @@ mode_select_df (struct fujitsu *s)
set_MSEL_df_paperprot(page,s->paper_protect);
set_MSEL_df_stapledet(page,s->staple_detect);
set_MSEL_df_recovery(page,s->df_recovery);
+ set_MSEL_df_paperprot2(page,s->adv_paper_prot);
ret = do_cmd (
s, 1, 0,
@@ -6408,7 +6706,6 @@ update_params (struct fujitsu * s)
if (s->s_mode == MODE_COLOR) {
params->depth = 8;
-#ifdef SANE_FRAME_JPEG
/* jpeg requires 8x8 squares */
if(s->compress == COMP_JPEG){
params->format = SANE_FRAME_JPEG;
@@ -6416,20 +6713,16 @@ update_params (struct fujitsu * s)
params->lines -= params->lines % 8;
}
else{
-#endif
params->format = SANE_FRAME_RGB;
params->pixels_per_line -= params->pixels_per_line
% max(s->ppl_mod_by_mode[s->s_mode], s->ppl_mod_by_mode[s->u_mode]);
-#ifdef SANE_FRAME_JPEG
}
-#endif
params->bytes_per_line = params->pixels_per_line * 3;
}
else if (s->s_mode == MODE_GRAYSCALE) {
params->depth = 8;
-#ifdef SANE_FRAME_JPEG
/* jpeg requires 8x8 squares */
if(s->compress == COMP_JPEG){
params->format = SANE_FRAME_JPEG;
@@ -6437,13 +6730,10 @@ update_params (struct fujitsu * s)
params->lines -= params->lines % 8;
}
else{
-#endif
params->format = SANE_FRAME_GRAY;
params->pixels_per_line -= params->pixels_per_line
% max(s->ppl_mod_by_mode[s->s_mode], s->ppl_mod_by_mode[s->u_mode]);
-#ifdef SANE_FRAME_JPEG
}
-#endif
params->bytes_per_line = params->pixels_per_line;
}
@@ -6526,70 +6816,6 @@ update_u_params (struct fujitsu * s)
return ret;
}
-/* make backup of param data, in case original is overwritten */
-SANE_Status
-backup_params (struct fujitsu * s)
-{
- SANE_Status ret = SANE_STATUS_GOOD;
- SANE_Parameters * params = &(s->s_params);
- SANE_Parameters * params_bk = &(s->s_params_bk);
-
- DBG (10, "backup_params: start\n");
-
- params_bk->format = params->format;
- params_bk->last_frame = params->last_frame;
- params_bk->bytes_per_line = params->bytes_per_line;
- params_bk->pixels_per_line = params->pixels_per_line;
- params_bk->lines = params->lines;
- params_bk->depth = params->depth;
-
- /* also have to save the user params */
- params = &(s->u_params);
- params_bk = &(s->u_params_bk);
-
- params_bk->format = params->format;
- params_bk->last_frame = params->last_frame;
- params_bk->bytes_per_line = params->bytes_per_line;
- params_bk->pixels_per_line = params->pixels_per_line;
- params_bk->lines = params->lines;
- params_bk->depth = params->depth;
-
- DBG (10, "backup_params: finish\n");
- return ret;
-}
-
-/* restore backup of param data, in case original was overwritten */
-SANE_Status
-restore_params (struct fujitsu * s)
-{
- SANE_Status ret = SANE_STATUS_GOOD;
- SANE_Parameters * params = &(s->s_params);
- SANE_Parameters * params_bk = &(s->s_params_bk);
-
- DBG (10, "restore_params: start\n");
-
- params->format = params_bk->format;
- params->last_frame = params_bk->last_frame;
- params->bytes_per_line = params_bk->bytes_per_line;
- params->pixels_per_line = params_bk->pixels_per_line;
- params->lines = params_bk->lines;
- params->depth = params_bk->depth;
-
- /* also have to restore the user params */
- params = &(s->u_params);
- params_bk = &(s->u_params_bk);
-
- params->format = params_bk->format;
- params->last_frame = params_bk->last_frame;
- params->bytes_per_line = params_bk->bytes_per_line;
- params->pixels_per_line = params_bk->pixels_per_line;
- params->lines = params_bk->lines;
- params->depth = params_bk->depth;
-
- DBG (10, "restore_params: finish\n");
- return ret;
-}
-
/*
* Called by SANE when a page acquisition operation is to be started.
* commands: scanner control (lampon), send (lut), send (dither),
@@ -6700,6 +6926,13 @@ sane_start (SANE_Handle handle)
if (ret != SANE_STATUS_GOOD)
DBG (5, "sane_start: WARNING: cannot send_endorser %d\n", ret);
+ /* send lut if scanner has no hardware brightness/contrast */
+ if (!s->late_lut && (!s->brightness_steps || !s->contrast_steps)){
+ ret = send_lut(s);
+ if (ret != SANE_STATUS_GOOD)
+ DBG (5, "sane_start: WARNING: cannot early send_lut %d\n", ret);
+ }
+
/* set window command */
ret = set_window(s);
if (ret != SANE_STATUS_GOOD) {
@@ -6708,10 +6941,10 @@ sane_start (SANE_Handle handle)
}
/* send lut if scanner has no hardware brightness/contrast */
- if (!s->brightness_steps || !s->contrast_steps){
+ if (s->late_lut && (!s->brightness_steps || !s->contrast_steps)){
ret = send_lut(s);
if (ret != SANE_STATUS_GOOD)
- DBG (5, "sane_start: WARNING: cannot send_lut %d\n", ret);
+ DBG (5, "sane_start: WARNING: cannot late send_lut %d\n", ret);
}
/* some scanners need the q table sent, even when not scanning jpeg */
@@ -6721,20 +6954,6 @@ sane_start (SANE_Handle handle)
DBG (5, "sane_start: WARNING: cannot send_q_table %d\n", ret);
}
- /* try to read scan size from scanner */
- ret = get_pixelsize(s,0);
- if (ret != SANE_STATUS_GOOD) {
- DBG (5, "sane_start: ERROR: cannot get pixelsize\n");
- goto errors;
- }
-
- /* make backup copy of params because later functions overwrite */
- ret = backup_params(s);
- if (ret != SANE_STATUS_GOOD) {
- DBG (5, "sane_start: ERROR: cannot backup params\n");
- goto errors;
- }
-
/* start/stop endorser */
ret = endorser(s);
if (ret != SANE_STATUS_GOOD) {
@@ -6747,19 +6966,23 @@ sane_start (SANE_Handle handle)
if (ret != SANE_STATUS_GOOD) {
DBG (5, "sane_start: WARNING: cannot start lamp, ignoring\n");
}
+
+ /* iX500 errors if op is called with no paper
+ * at the beginning of a batch, so we check */
+ if(s->hopper_before_op && s->source != SOURCE_FLATBED){
+ ret = get_hardware_status(s,0);
+ if(!s->hw_hopper){
+ ret = SANE_STATUS_NO_DOCS;
+ DBG (5, "sane_start: ERROR: hopper empty\n");
+ goto errors;
+ }
+ }
}
/* if already running, duplex needs to switch sides */
else if(s->source == SOURCE_ADF_DUPLEX){
s->side = !s->side;
}
- /* restore backup copy of params at the start of each image */
- ret = restore_params(s);
- if (ret != SANE_STATUS_GOOD) {
- DBG (5, "sane_start: ERROR: cannot restore params\n");
- goto errors;
- }
-
/* set clean defaults with new sheet of paper */
/* dont reset the transfer vars on backside of duplex page */
/* otherwise buffered back page will be lost */
@@ -6788,11 +7011,30 @@ sane_start (SANE_Handle handle)
s->buff_tx[1]=0;
/* reset jpeg just in case... */
- s->jpeg_stage = JPEG_STAGE_HEAD;
- s->jpeg_ff_offset = 0;
+ s->jpeg_stage = JPEG_STAGE_NONE;
+ s->jpeg_ff_offset = -1;
s->jpeg_front_rst = 0;
s->jpeg_back_rst = 0;
+ ret = object_position (s, OP_Feed);
+ if (ret != SANE_STATUS_GOOD) {
+ DBG (5, "sane_start: ERROR: cannot load page\n");
+ goto errors;
+ }
+
+ ret = start_scan (s);
+ if (ret != SANE_STATUS_GOOD) {
+ DBG (5, "sane_start: ERROR: cannot start_scan\n");
+ goto errors;
+ }
+
+ /* try to read scan size from scanner */
+ ret = get_pixelsize(s,0);
+ if (ret != SANE_STATUS_GOOD) {
+ DBG (5, "sane_start: ERROR: cannot get pixelsize\n");
+ goto errors;
+ }
+
/* store the number of front bytes */
if ( s->source != SOURCE_ADF_BACK ){
s->bytes_tot[SIDE_FRONT] = s->s_params.bytes_per_line * s->s_params.lines;
@@ -6840,16 +7082,12 @@ sane_start (SANE_Handle handle)
s->started=1;
}
-
- ret = object_position (s, SANE_TRUE);
- if (ret != SANE_STATUS_GOOD) {
- DBG (5, "sane_start: ERROR: cannot load page\n");
- goto errors;
- }
-
- ret = start_scan (s);
+ }
+ else{
+ /* try to read scan size from scanner */
+ ret = get_pixelsize(s,0);
if (ret != SANE_STATUS_GOOD) {
- DBG (5, "sane_start: ERROR: cannot start_scan\n");
+ DBG (5, "sane_start: ERROR: cannot get pixelsize\n");
goto errors;
}
}
@@ -7249,13 +7487,11 @@ set_window (struct fujitsu *s)
set_WD_compress_type(desc1, COMP_NONE);
set_WD_compress_arg(desc1, 0);
-#ifdef SANE_FRAME_JPEG
/* some scanners support jpeg image compression, for color/gs only */
if(s->s_params.format == SANE_FRAME_JPEG){
set_WD_compress_type(desc1, COMP_JPEG);
set_WD_compress_arg(desc1, s->compress_arg);
}
-#endif
/* the remainder of the block varies based on model and mode,
* except for gamma and paper size, those are in the same place */
@@ -7435,7 +7671,8 @@ get_pixelsize(struct fujitsu *s, int actual)
memset(cmd,0,cmdLen);
set_SCSI_opcode(cmd, READ_code);
set_R_datatype_code (cmd, R_datatype_pixelsize);
- if(s->source == SOURCE_ADF_BACK){
+
+ if(s->side == SIDE_BACK){
set_R_window_id (cmd, WD_wid_back);
}
else{
@@ -7453,7 +7690,7 @@ get_pixelsize(struct fujitsu *s, int actual)
/* when we are called post-scan, the scanner may give
* more accurate data in other fields */
- if(actual && get_PSIZE_paper_w(in)){
+ if(actual && !s->has_short_pixelsize && get_PSIZE_paper_w(in)){
s->s_params.pixels_per_line = get_PSIZE_paper_w(in);
DBG(5,"get_pixelsize: Actual width\n");
}
@@ -7469,7 +7706,7 @@ get_pixelsize(struct fujitsu *s, int actual)
}
/* when we are called post-scan, the scanner may give
* more accurate data in other fields */
- else if(actual && get_PSIZE_paper_l(in)){
+ else if(actual && !s->has_short_pixelsize && get_PSIZE_paper_l(in)){
s->s_params.lines = get_PSIZE_paper_l(in);
DBG(5,"get_pixelsize: Actual length\n");
}
@@ -7489,7 +7726,7 @@ get_pixelsize(struct fujitsu *s, int actual)
}
/* some scanners can request that the driver clean img */
- if(get_PSIZE_req_driv_valid(in)){
+ if(!s->has_short_pixelsize && get_PSIZE_req_driv_valid(in)){
s->req_driv_crop = get_PSIZE_req_driv_crop(in);
s->req_driv_lut = get_PSIZE_req_driv_lut(in);
DBG(5,"get_pixelsize: scanner requests: crop=%d, lut=%d\n",
@@ -7530,38 +7767,23 @@ get_pixelsize(struct fujitsu *s, int actual)
* Issues the SCSI OBJECT POSITION command if an ADF is in use.
*/
static SANE_Status
-object_position (struct fujitsu *s, int i_load)
+object_position (struct fujitsu *s, int action)
{
SANE_Status ret = SANE_STATUS_GOOD;
unsigned char cmd[OBJECT_POSITION_len];
size_t cmdLen = OBJECT_POSITION_len;
- DBG (10, "object_position: start\n");
+ DBG (10, "object_position: start %d\n", action);
- if (s->source == SOURCE_FLATBED) {
+ if (s->source == SOURCE_FLATBED && action < OP_Halt) {
DBG (10, "object_position: flatbed no-op\n");
return SANE_STATUS_GOOD;
}
- if(s->hopper_before_op && i_load){
- ret = get_hardware_status(s,0);
- if(!s->hw_hopper){
- return SANE_STATUS_NO_DOCS;
- }
- }
-
memset(cmd,0,cmdLen);
set_SCSI_opcode(cmd, OBJECT_POSITION_code);
-
- if (i_load) {
- DBG (15, "object_position: load\n");
- set_OP_autofeed (cmd, OP_Feed);
- }
- else {
- DBG (15, "object_position: eject\n");
- set_OP_autofeed (cmd, OP_Discharge);
- }
+ set_OP_action (cmd, action);
ret = do_cmd (
s, 1, 0,
@@ -7630,22 +7852,30 @@ check_for_cancel(struct fujitsu *s)
{
SANE_Status ret=SANE_STATUS_GOOD;
- DBG (10, "check_for_cancel: start\n");
+ DBG (10, "check_for_cancel: start %d %d\n",s->started,s->cancelled);
if(s->started && s->cancelled){
- DBG (15, "check_for_cancel: cancelling\n");
- /* cancel scan */
+ /* halt scan */
+ if(s->halt_on_cancel){
+ DBG (15, "check_for_cancel: halting\n");
+ ret = object_position (s, OP_Halt);
+ }
+ /* cancel scan */
+ else{
+ DBG (15, "check_for_cancel: cancelling\n");
ret = scanner_control(s, SC_function_cancel);
- if (ret == SANE_STATUS_GOOD) {
- ret = SANE_STATUS_CANCELLED;
- }
- else{
- DBG (5, "check_for_cancel: ERROR: cannot cancel\n");
- }
+ }
+
+ if (ret == SANE_STATUS_GOOD || ret == SANE_STATUS_CANCELLED) {
+ ret = SANE_STATUS_CANCELLED;
+ }
+ else{
+ DBG (5, "check_for_cancel: ERROR: cannot cancel\n");
+ }
- s->started = 0;
- s->cancelled = 0;
+ s->started = 0;
+ s->cancelled = 0;
}
else if(s->cancelled){
DBG (15, "check_for_cancel: already cancelled\n");
@@ -7723,7 +7953,6 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
}
} /* end 3091 */
-#ifdef SANE_FRAME_JPEG
/* alternating jpeg duplex interlacing */
else if(s->source == SOURCE_ADF_DUPLEX
&& s->s_params.format == SANE_FRAME_JPEG
@@ -7735,11 +7964,10 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
return ret;
}
} /* end alt jpeg */
-#endif
/* alternating pnm duplex interlacing */
else if(s->source == SOURCE_ADF_DUPLEX
- && s->s_params.format <= SANE_FRAME_RGB
+ && s->s_params.format != SANE_FRAME_JPEG
&& s->duplex_interlace == DUPLEX_INTERLACE_ALT
){
@@ -7808,7 +8036,33 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len
return ret;
}
-#ifdef SANE_FRAME_JPEG
+/* bare jpeg images dont contain resolution, but JFIF APP0 does, so we add */
+static SANE_Status
+inject_jfif_header(struct fujitsu *s, int side)
+{
+ SANE_Status ret=SANE_STATUS_GOOD;
+
+ unsigned char out[] = {
+ 0xFF, 0xE0, 0x00, 0x10, 0x4A, 0x46, 0x49, 0x46,
+ 0x00, 0x01, 0x02, 0x01, 0x00, 0x48, 0x00, 0x48,
+ 0x00, 0x00
+ };
+ size_t outLen=JFIF_APP0_LENGTH;
+
+ DBG (10, "inject_jfif_header: start %d\n", side);
+
+ putnbyte(out + 12, s->resolution_x, 2);
+ putnbyte(out + 14, s->resolution_y, 2);
+
+ memcpy(s->buffers[side]+s->buff_rx[side], out, outLen);
+ s->buff_rx[side] += outLen;
+ s->bytes_rx[side] += outLen;
+
+ DBG (10, "inject_jfif_header: finish %d\n", ret);
+
+ return ret;
+}
+
static SANE_Status
read_from_JPEGduplex(struct fujitsu *s)
{
@@ -7834,13 +8088,21 @@ read_from_JPEGduplex(struct fujitsu *s)
* so we only get enough to fill whichever is smaller (and not yet done) */
if(!s->eof_rx[SIDE_FRONT]){
int avail = s->buff_tot[SIDE_FRONT] - s->buff_rx[SIDE_FRONT];
- if(bytes > avail)
+ if(bytes > avail){
bytes = avail;
+ /* leave space for JFIF header at start of image */
+ if(s->bytes_rx[SIDE_FRONT] < 2)
+ bytes -= JFIF_APP0_LENGTH;
+ }
}
if(!s->eof_rx[SIDE_BACK]){
int avail = s->buff_tot[SIDE_BACK] - s->buff_rx[SIDE_BACK];
- if(bytes > avail)
+ if(bytes > avail){
bytes = avail;
+ /* leave space for JFIF header at start of image */
+ if(s->bytes_rx[SIDE_BACK] < 2)
+ bytes -= JFIF_APP0_LENGTH;
+ }
}
DBG(15, "read_from_JPEGduplex: fto:%d frx:%d bto:%d brx:%d pa:%d\n",
@@ -7901,7 +8163,7 @@ read_from_JPEGduplex(struct fujitsu *s)
for(i=0;i<(int)inLen;i++){
/* about to change stage */
- if(in[i] == 0xff){
+ if(in[i] == 0xff && s->jpeg_ff_offset != 0){
s->jpeg_ff_offset=0;
continue;
}
@@ -7909,9 +8171,21 @@ read_from_JPEGduplex(struct fujitsu *s)
/* last byte was an ff, this byte will change stage */
if(s->jpeg_ff_offset == 0){
- /* headers (SOI/HuffTab/QTab/DRI), in both sides */
- if(in[i] == 0xd8 || in[i] == 0xc4
- || in[i] == 0xdb || in[i] == 0xdd){
+ /* first marker after SOI is not APP0, add one */
+ if(s->jpeg_stage == JPEG_STAGE_SOI && in[i] != 0xe0){
+ inject_jfif_header(s,SIDE_FRONT);
+ inject_jfif_header(s,SIDE_BACK);
+ s->jpeg_stage = JPEG_STAGE_HEAD;
+ }
+
+ /* SOI header, in both sides */
+ if(in[i] == 0xd8){
+ s->jpeg_stage = JPEG_STAGE_SOI;
+ DBG(15, "read_from_JPEGduplex: stage SOI\n");
+ }
+
+ /* headers (HuffTab/QTab/DRI), in both sides */
+ else if(in[i] == 0xc4 || in[i] == 0xdb || in[i] == 0xdd){
s->jpeg_stage = JPEG_STAGE_HEAD;
DBG(15, "read_from_JPEGduplex: stage head\n");
}
@@ -7972,6 +8246,11 @@ read_from_JPEGduplex(struct fujitsu *s)
s->jpeg_stage = JPEG_STAGE_EOI;
DBG(15, "read_from_JPEGduplex: stage eoi %d %d\n",(int)inLen,i);
}
+
+ /* unknown, warn */
+ else if(in[i] != 0xff){
+ DBG(15, "read_from_JPEGduplex: unknown %02x\n", in[i]);
+ }
}
s->jpeg_ff_offset++;
@@ -8025,7 +8304,8 @@ read_from_JPEGduplex(struct fujitsu *s)
}
/* copy these stages to front */
- if(s->jpeg_stage == JPEG_STAGE_HEAD
+ if(s->jpeg_stage == JPEG_STAGE_SOI
+ || s->jpeg_stage == JPEG_STAGE_HEAD
|| s->jpeg_stage == JPEG_STAGE_SOF
|| s->jpeg_stage == JPEG_STAGE_SOS
|| s->jpeg_stage == JPEG_STAGE_EOI
@@ -8043,7 +8323,8 @@ read_from_JPEGduplex(struct fujitsu *s)
/* copy these stages to back */
if( s->jpeg_interlace == JPEG_INTERLACE_ALT
&&
- ( s->jpeg_stage == JPEG_STAGE_HEAD
+ ( s->jpeg_stage == JPEG_STAGE_SOI
+ || s->jpeg_stage == JPEG_STAGE_HEAD
|| s->jpeg_stage == JPEG_STAGE_SOF
|| s->jpeg_stage == JPEG_STAGE_SOS
|| s->jpeg_stage == JPEG_STAGE_EOI
@@ -8086,7 +8367,6 @@ read_from_JPEGduplex(struct fujitsu *s)
return ret;
}
-#endif
static SANE_Status
read_from_3091duplex(struct fujitsu *s)
@@ -8267,6 +8547,10 @@ read_from_scanner(struct fujitsu *s, int side)
if(bytes % 2 && bytes < remain){
bytes -= s->s_params.bytes_per_line;
}
+
+ /* jpeg scans leave space for JFIF header at start of image */
+ if(s->s_params.format == SANE_FRAME_JPEG && s->bytes_rx[side] < 2)
+ bytes -= JFIF_APP0_LENGTH;
DBG(15, "read_from_scanner: si:%d re:%d bs:%d by:%d av:%d\n",
side, remain, s->buffer_size, bytes, avail);
@@ -8341,6 +8625,9 @@ read_from_scanner(struct fujitsu *s, int side)
if(s->s_mode==MODE_COLOR && s->color_interlace == COLOR_INTERLACE_3091){
copy_3091 (s, in, inLen, side);
}
+ else if(s->s_params.format == SANE_FRAME_JPEG){
+ copy_JPEG (s, in, inLen, side);
+ }
else{
copy_buffer (s, in, inLen, side);
}
@@ -8454,6 +8741,48 @@ copy_3091(struct fujitsu *s, unsigned char * buf, int len, int side)
}
static SANE_Status
+copy_JPEG(struct fujitsu *s, unsigned char * buf, int len, int side)
+{
+ SANE_Status ret=SANE_STATUS_GOOD;
+ int i, seen = 0;
+
+ DBG (10, "copy_JPEG: start\n");
+
+ /* A jpeg image starts with the SOI marker, FF D8.
+ * This is optionally followed by the JFIF APP0
+ * marker, FF E0. If that marker is not present,
+ * we add it, so we can insert the resolution */
+
+ if(!s->bytes_rx[side] && len >= 4
+ && buf[0] == 0xFF && buf[1] == 0xD8
+ && buf[2] == 0xFF && buf[3] != 0xE0
+ ){
+ /* SOI marker */
+ for (i=0; i<2; i++){
+ s->buffers[side][s->buff_rx[side]++] = buf[i];
+ s->bytes_rx[side]++;
+ seen++;
+ }
+
+ /* JFIF header after SOI */
+ inject_jfif_header(s,side);
+ }
+
+ memcpy(s->buffers[side]+s->buff_rx[side],buf+seen,len-seen);
+ s->buff_rx[side] += len-seen;
+ s->bytes_rx[side] += len-seen;
+
+ /* should never happen with jpeg */
+ if(s->bytes_rx[side] == s->bytes_tot[side]){
+ s->eof_rx[side] = 1;
+ }
+
+ DBG (10, "copy_JPEG: finish\n");
+
+ return ret;
+}
+
+static SANE_Status
copy_buffer(struct fujitsu *s, unsigned char * buf, int len, int side)
{
SANE_Status ret=SANE_STATUS_GOOD;
@@ -8465,7 +8794,7 @@ copy_buffer(struct fujitsu *s, unsigned char * buf, int len, int side)
/* invert image if scanner needs it for this mode */
/* jpeg data does not use inverting */
- if(s->s_params.format <= SANE_FRAME_RGB && s->reverse_by_mode[s->s_mode]){
+ if(s->s_params.format != SANE_FRAME_JPEG && s->reverse_by_mode[s->s_mode]){
for(i=0; i<len; i++){
buf[i] ^= 0xff;
}
@@ -8895,6 +9224,14 @@ sense_handler (int fd, unsigned char * sensed_data, void *arg)
DBG (5, "Medium error: double feed\n");
return SANE_STATUS_JAMMED;
}
+ if (0x08 == ascq) {
+ DBG (5, "Medium error: ADF setup error\n");
+ return SANE_STATUS_JAMMED;
+ }
+ if (0x09 == ascq) {
+ DBG (5, "Medium error: Carrier sheet\n");
+ return SANE_STATUS_JAMMED;
+ }
if (0x10 == ascq) {
DBG (5, "Medium error: no ink cartridge\n");
return SANE_STATUS_IO_ERROR;
@@ -8907,12 +9244,36 @@ sense_handler (int fd, unsigned char * sensed_data, void *arg)
DBG (5, "Medium error: endorser error\n");
return SANE_STATUS_IO_ERROR;
}
+ if (0x20 == ascq) {
+ DBG (5, "Medium error: Stop button\n");
+ return SANE_STATUS_NO_DOCS;
+ }
+ if (0x22 == ascq) {
+ DBG (5, "Medium error: scanning halted\n");
+ return SANE_STATUS_CANCELLED;
+ }
+ if (0x30 == ascq) {
+ DBG (5, "Medium error: Not enough paper\n");
+ return SANE_STATUS_NO_DOCS;
+ }
+ if (0x31 == ascq) {
+ DBG (5, "Medium error: scanning disabled\n");
+ return SANE_STATUS_IO_ERROR;
+ }
+ if (0x32 == ascq) {
+ DBG (5, "Medium error: scanning paused\n");
+ return SANE_STATUS_DEVICE_BUSY;
+ }
+ if (0x33 == ascq) {
+ DBG (5, "Medium error: WiFi control error\n");
+ return SANE_STATUS_IO_ERROR;
+ }
DBG (5, "Medium error: unknown ascq\n");
return SANE_STATUS_IO_ERROR;
break;
case 0x4:
- if (0x80 != asc && 0x44 != asc && 0x47 != asc) {
+ if (0x80 != asc && 0x44 != asc) {
DBG (5, "Hardware error: unknown asc\n");
return SANE_STATUS_IO_ERROR;
}
@@ -8928,6 +9289,10 @@ sense_handler (int fd, unsigned char * sensed_data, void *arg)
DBG (5, "Hardware error: heater fuse\n");
return SANE_STATUS_IO_ERROR;
}
+ if ((0x80 == asc) && (0x03 == ascq)) {
+ DBG (5, "Hardware error: lamp fuse\n");
+ return SANE_STATUS_IO_ERROR;
+ }
if ((0x80 == asc) && (0x04 == ascq)) {
DBG (5, "Hardware error: ADF motor fuse\n");
return SANE_STATUS_IO_ERROR;
@@ -8952,6 +9317,22 @@ sense_handler (int fd, unsigned char * sensed_data, void *arg)
DBG (5, "Hardware error: endorser error\n");
return SANE_STATUS_IO_ERROR;
}
+ if ((0x80 == asc) && (0x11 == ascq)) {
+ DBG (5, "Hardware error: endorser fuse\n");
+ return SANE_STATUS_IO_ERROR;
+ }
+ if ((0x80 == asc) && (0x80 == ascq)) {
+ DBG (5, "Hardware error: interface board timeout\n");
+ return SANE_STATUS_IO_ERROR;
+ }
+ if ((0x80 == asc) && (0x81 == ascq)) {
+ DBG (5, "Hardware error: interface board error 1\n");
+ return SANE_STATUS_IO_ERROR;
+ }
+ if ((0x80 == asc) && (0x82 == ascq)) {
+ DBG (5, "Hardware error: interface board error 2\n");
+ return SANE_STATUS_IO_ERROR;
+ }
DBG (5, "Hardware error: unknown asc/ascq\n");
return SANE_STATUS_IO_ERROR;
break;
@@ -9098,7 +9479,6 @@ do_scsi_cmd(struct fujitsu *s, int runRS, int shortTime,
)
{
int ret;
- size_t actLen = 0;
/*shut up compiler*/
runRS=runRS;
@@ -9116,7 +9496,6 @@ do_scsi_cmd(struct fujitsu *s, int runRS, int shortTime,
if (inBuff && inLen){
DBG(25, "in: reading %d bytes\n", (int)*inLen);
memset(inBuff,0,*inLen);
- actLen = *inLen;
}
ret = sanei_scsi_cmd2(s->fd, cmdBuff, cmdLen, outBuff, outLen, inBuff, inLen);
@@ -9408,9 +9787,7 @@ must_fully_buffer(struct fujitsu *s)
if(
(s->swdeskew || s->swdespeck || s->swcrop || s->swskip)
-#ifdef SANE_FRAME_JPEG
&& s->s_params.format != SANE_FRAME_JPEG
-#endif
){
return 1;
}
@@ -9424,9 +9801,7 @@ static int
must_downsample(struct fujitsu *s)
{
if(s->s_mode != s->u_mode
-#ifdef SANE_FRAME_JPEG
&& s->compress != COMP_JPEG
-#endif
){
return 1;
}
@@ -9492,6 +9867,23 @@ get_page_height(struct fujitsu *s)
return height;
}
+/* s->max_y gives the maximum height of paper which can be scanned
+ * this actually varies by resolution, so a helper to change it */
+static int
+set_max_y(struct fujitsu *s)
+{
+ int i;
+
+ for(i=0;i<4;i++){
+ if(!s->max_y_by_res[i].res)
+ break;
+ if(s->resolution_x <= s->max_y_by_res[i].res){
+ s->max_y = s->max_y_by_res[i].len;
+ }
+ }
+
+ return s->max_y;
+}
/**
* Convenience method to determine longest string size in a list.
@@ -9561,7 +9953,8 @@ hexdump (int level, char *comment, unsigned char *p, int l)
}
/* print last (partial) line */
- DBG (level, "%s\n", line);
+ if (i)
+ DBG (level, "%s\n", line);
}
/**
@@ -9654,37 +10047,23 @@ buffer_crop(struct fujitsu *s, int side)
DBG (10, "buffer_crop: start\n");
- /*only find edges on first image from a page, or if first image had error */
- if(s->side == SIDE_FRONT || s->source == SOURCE_ADF_BACK || s->crop_stat){
-
- s->crop_stat = sanei_magic_findEdges(
- &s->s_params,s->buffers[side],s->resolution_x,s->resolution_y,
- &s->crop_vals[0],&s->crop_vals[1],&s->crop_vals[2],&s->crop_vals[3]);
-
- if(s->crop_stat){
- DBG (5, "buffer_crop: bad edges, bailing\n");
- goto cleanup;
- }
-
- DBG (15, "buffer_crop: t:%d b:%d l:%d r:%d\n",
- s->crop_vals[0],s->crop_vals[1],s->crop_vals[2],s->crop_vals[3]);
-
- /* we dont listen to the 'top' value, since fujitsu does not pad the top */
- s->crop_vals[0] = 0;
+ ret = sanei_magic_findEdges(
+ &s->s_params,s->buffers[side],s->resolution_x,s->resolution_y,
+ &s->crop_vals[0],&s->crop_vals[1],&s->crop_vals[2],&s->crop_vals[3]);
- /* if we will later binarize this image, make sure the width
- * is a multiple of 8 pixels, by adjusting the right side */
- if ( must_downsample(s) && s->u_mode < MODE_GRAYSCALE ){
- s->crop_vals[3] -= (s->crop_vals[3]-s->crop_vals[2]) % 8;
- }
+ if(ret){
+ DBG (5, "buffer_crop: bad edges, bailing\n");
+ ret = SANE_STATUS_GOOD;
+ goto cleanup;
}
- /* backside images can use a 'flipped' version of frontside data */
- else{
- int left = s->crop_vals[2];
- int right = s->crop_vals[3];
+
+ DBG (15, "buffer_crop: t:%d b:%d l:%d r:%d\n",
+ s->crop_vals[0],s->crop_vals[1],s->crop_vals[2],s->crop_vals[3]);
- s->crop_vals[2] = s->s_params.pixels_per_line - right;
- s->crop_vals[3] = s->s_params.pixels_per_line - left;
+ /* if we will later binarize this image, make sure the width
+ * is a multiple of 8 pixels, by adjusting the right side */
+ if ( must_downsample(s) && s->u_mode < MODE_GRAYSCALE ){
+ s->crop_vals[3] -= (s->crop_vals[3]-s->crop_vals[2]) % 8;
}
/* now crop the image */
diff --git a/backend/fujitsu.conf.in b/backend/fujitsu.conf.in
index 8034f25..b3895ea 100644
--- a/backend/fujitsu.conf.in
+++ b/backend/fujitsu.conf.in
@@ -118,12 +118,6 @@ usb 0x04c5 0x119d
#fi-6800-CGA
usb 0x04c5 0x119e
-#fi-6900
-usb 0x04c5 0x119f
-
-#fi-6900-CGA
-usb 0x04c5 0x11a0
-
#S1500 & S1500M
usb 0x04c5 0x11a2
@@ -145,5 +139,24 @@ usb 0x04c5 0x11fc
#fi-5950
usb 0x04c5 0x1213
+#ScanSnap SV600
+usb 0x04c5 0x128e
+
#ScanSnap iX500
usb 0x04c5 0x132b
+
+#fi-7180
+usb 0x04c5 0x132c
+
+#fi-7280
+usb 0x04c5 0x132d
+
+#fi-7160
+usb 0x04c5 0x132e
+
+#fi-7260
+usb 0x04c5 0x132f
+
+#ScanSnap iX100
+usb 0x04c5 0x13f4
+
diff --git a/backend/fujitsu.h b/backend/fujitsu.h
index 4c6804b..6ce1a56 100644
--- a/backend/fujitsu.h
+++ b/backend/fujitsu.h
@@ -72,6 +72,7 @@ enum fujitsu_Option
OPT_DF_DIFF,
OPT_DF_RECOVERY,
OPT_PAPER_PROTECT,
+ OPT_ADV_PAPER_PROT,
OPT_STAPLE_DETECT,
OPT_BG_COLOR,
OPT_DROPOUT_COLOR,
@@ -79,6 +80,7 @@ enum fujitsu_Option
OPT_PREPICK,
OPT_OVERSCAN,
OPT_SLEEP_TIME,
+ OPT_OFF_TIME,
OPT_DUPLEX_OFFSET,
OPT_GREEN_OFFSET,
OPT_BLUE_OFFSET,
@@ -89,6 +91,7 @@ enum fujitsu_Option
OPT_SWDESPECK,
OPT_SWCROP,
OPT_SWSKIP,
+ OPT_HALT_ON_CANCEL,
OPT_ENDORSER_GROUP,
OPT_ENDORSER,
@@ -127,6 +130,13 @@ enum fujitsu_Option
NUM_OPTIONS
};
+/* used to control the max page-height, which varies by resolution */
+struct y_size
+{
+ int res;
+ int len;
+};
+
struct fujitsu
{
/* --------------------------------------------------------------------- */
@@ -242,6 +252,7 @@ struct fujitsu
int has_df_recovery;
int has_paper_protect;
+ int has_adv_paper_prot;
int has_staple_detect;
int has_rif;
@@ -257,6 +268,7 @@ struct fujitsu
int has_ipc3;
int has_rotation;
int has_hybrid_crop_deskew;
+ int has_off_mode;
int has_comp_MH;
int has_comp_MR;
@@ -265,6 +277,7 @@ struct fujitsu
int has_comp_JPG1;
int has_comp_JPG2;
int has_comp_JPG3;
+ int has_op_halt;
/*FIXME: more endorser data? */
int endorser_type_f;
@@ -299,6 +312,7 @@ struct fujitsu
/* the scan size in 1/1200th inches, NOT basic_units or sane units */
int max_x;
int max_y;
+ struct y_size max_y_by_res[4];
int min_x;
int min_y;
int max_x_fb;
@@ -313,10 +327,12 @@ struct fujitsu
int window_gamma;
int endorser_string_len;
int has_pixelsize;
+ int has_short_pixelsize; /* m3091/2 put weird stuff at end, ignore it */
int broken_diag_serial; /* some scanners are just plain borked */
int need_q_table; /* some scanners wont work without these */
int need_diag_preread;
+ int late_lut;
int hopper_before_op; /* some scanners dont like OP when hopper empty */
int no_wait_after_op; /* some scanners dont like TUR after OP */
@@ -382,6 +398,7 @@ struct fujitsu
SANE_String_Const df_diff_list[5];
SANE_String_Const df_recovery_list[4];
SANE_String_Const paper_protect_list[4];
+ SANE_String_Const adv_paper_prot_list[4];
SANE_String_Const staple_detect_list[4];
SANE_String_Const bg_color_list[4];
SANE_String_Const do_color_list[5];
@@ -390,6 +407,7 @@ struct fujitsu
SANE_String_Const prepick_list[4];
SANE_String_Const overscan_list[4];
SANE_Range sleep_time_range;
+ SANE_Range off_time_range;
SANE_Range duplex_offset_range;
SANE_Range green_offset_range;
SANE_Range blue_offset_range;
@@ -467,6 +485,7 @@ struct fujitsu
int df_diff;
int df_recovery;
int paper_protect;
+ int adv_paper_prot;
int staple_detect;
int bg_color;
int dropout_color;
@@ -475,6 +494,7 @@ struct fujitsu
int overscan;
int lamp_color;
int sleep_time;
+ int off_time;
int duplex_offset;
int green_offset;
int blue_offset;
@@ -484,6 +504,7 @@ struct fujitsu
int swdespeck;
int swcrop;
double swskip;
+ int halt_on_cancel;
/*endorser group*/
int u_endorser;
@@ -514,8 +535,10 @@ struct fujitsu
SANE_Parameters s_params;
/* also keep a backup copy, in case the software enhancement code overwrites*/
+ /*
SANE_Parameters u_params_bk;
SANE_Parameters s_params_bk;
+ */
/* --------------------------------------------------------------------- */
/* values which are set by scanning functions to keep track of pages, etc */
@@ -556,7 +579,6 @@ struct fujitsu
int deskew_vals[2];
double deskew_slope;
- SANE_Status crop_stat;
int crop_vals[4];
/* --------------------------------------------------------------------- */
@@ -622,12 +644,16 @@ struct fujitsu
#define COMP_NONE WD_cmp_NONE
#define COMP_JPEG WD_cmp_JPG1
-#define JPEG_STAGE_HEAD 0
-#define JPEG_STAGE_SOF 1
-#define JPEG_STAGE_SOS 2
-#define JPEG_STAGE_FRONT 3
-#define JPEG_STAGE_BACK 4
-#define JPEG_STAGE_EOI 5
+#define JPEG_STAGE_NONE 0
+#define JPEG_STAGE_SOI 1
+#define JPEG_STAGE_HEAD 2
+#define JPEG_STAGE_SOF 3
+#define JPEG_STAGE_SOS 4
+#define JPEG_STAGE_FRONT 5
+#define JPEG_STAGE_BACK 6
+#define JPEG_STAGE_EOI 7
+
+#define JFIF_APP0_LENGTH 18
/* these are same as scsi data to make code easier */
#define MODE_LINEART WD_comp_LA
@@ -771,7 +797,7 @@ do_usb_cmd(struct fujitsu *s, int runRS, int shortTime,
static SANE_Status wait_scanner (struct fujitsu *s);
-static SANE_Status object_position (struct fujitsu *s, int i_load);
+static SANE_Status object_position (struct fujitsu *s, int action);
static SANE_Status scanner_control (struct fujitsu *s, int function);
static SANE_Status scanner_control_ric (struct fujitsu *s, int bytes, int side);
@@ -789,11 +815,13 @@ static SANE_Status mode_select_prepick (struct fujitsu *s);
static SANE_Status mode_select_auto (struct fujitsu *s);
static SANE_Status set_sleep_mode(struct fujitsu *s);
+static SANE_Status set_off_mode(struct fujitsu *s);
static int must_downsample (struct fujitsu *s);
static int must_fully_buffer (struct fujitsu *s);
static int get_page_width (struct fujitsu *s);
static int get_page_height (struct fujitsu *s);
+static int set_max_y (struct fujitsu *s);
static SANE_Status send_lut (struct fujitsu *s);
static SANE_Status send_endorser (struct fujitsu *s);
@@ -803,19 +831,17 @@ static SANE_Status get_pixelsize(struct fujitsu *s, int actual);
static SANE_Status update_params (struct fujitsu *s);
static SANE_Status update_u_params (struct fujitsu *s);
-static SANE_Status backup_params (struct fujitsu *s);
-static SANE_Status restore_params (struct fujitsu *s);
+
static SANE_Status start_scan (struct fujitsu *s);
static SANE_Status check_for_cancel(struct fujitsu *s);
-#ifdef SANE_FRAME_JPEG
static SANE_Status read_from_JPEGduplex(struct fujitsu *s);
-#endif
static SANE_Status read_from_3091duplex(struct fujitsu *s);
static SANE_Status read_from_scanner(struct fujitsu *s, int side);
static SANE_Status copy_3091(struct fujitsu *s, unsigned char * buf, int len, int side);
+static SANE_Status copy_JPEG(struct fujitsu *s, unsigned char * buf, int len, int side);
static SANE_Status copy_buffer(struct fujitsu *s, unsigned char * buf, int len, int side);
static SANE_Status read_from_buffer(struct fujitsu *s, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len, int side);
diff --git a/backend/genesys.c b/backend/genesys.c
index 6e7caad..984cead 100644
--- a/backend/genesys.c
+++ b/backend/genesys.c
@@ -2,7 +2,7 @@
Copyright (C) 2003, 2004 Henning Meier-Geinitz <henning@meier-geinitz.de>
Copyright (C) 2004, 2005 Gerhard Jaeger <gerhard@gjaeger.de>
- Copyright (C) 2004-2013 Stphane Voltz <stef.dev@free.fr>
+ Copyright (C) 2004-2015 Stphane Voltz <stef.dev@free.fr>
Copyright (C) 2005-2009 Pierre Willenbrock <pierre@pirsoft.dnsalias.org>
Copyright (C) 2006 Laurent Charpentier <laurent_pubs@yahoo.com>
Copyright (C) 2007 Luke <iceyfor@gmail.com>
@@ -16,49 +16,49 @@
noah work in the fujitsu backend
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
/*
* SANE backend for Genesys Logic GL646/GL841/GL842/GL843/GL846/GL847/GL124 based scanners
*/
-#define BUILD 2411
+#define BUILD 2508
#define BACKEND_NAME genesys
#include "genesys.h"
@@ -157,6 +157,15 @@ static const SANE_Range enhance_range = {
1 /* quantization */
};
+/**
+ * range for expiration time
+ */
+static const SANE_Range expiration_range = {
+ -1, /* minimum */
+ 30000, /* maximum */
+ 1 /* quantization */
+};
+
void
sanei_genesys_init_structs (Genesys_Device * dev)
{
@@ -231,11 +240,11 @@ sanei_genesys_init_fe (Genesys_Device * dev)
/* main function for slope creation */
/**
- * This function generates a slope table using the given slope
- * truncated at the given exposure time or step count, whichever comes first.
+ * This function generates a slope table using the given slope
+ * truncated at the given exposure time or step count, whichever comes first.
* The reached step time is then stored in final_exposure and used for the rest
* of the table. The summed time of the acceleration steps is returned, and the
- * number of accerelation steps is put into used_steps.
+ * number of accerelation steps is put into used_steps.
*
* @param slope_table Table to write to
* @param max_steps Size of slope_table in steps
@@ -248,7 +257,7 @@ sanei_genesys_init_fe (Genesys_Device * dev)
* @param used_steps Final number of steps is stored here
* @param vfinal Final step time is stored here
* @return Time for acceleration
- * @note All times in pixel time. Correction for other motor timings is not
+ * @note All times in pixel time. Correction for other motor timings is not
* done.
*/
SANE_Int
@@ -339,10 +348,10 @@ sanei_genesys_generate_slope_table (uint16_t * slope_table,
/* Generate slope table for motor movement */
/**
* This function generates a slope table using the slope from the motor struct
- * truncated at the given exposure time or step count, whichever comes first.
+ * truncated at the given exposure time or step count, whichever comes first.
* The reached step time is then stored in final_exposure and used for the rest
* of the table. The summed time of the acceleration steps is returned, and the
- * number of accerelation steps is put into used_steps.
+ * number of accerelation steps is put into used_steps.
*
* @param dev Device struct
* @param slope_table Table to write to
@@ -412,7 +421,7 @@ sanei_genesys_create_slope_table3 (Genesys_Device * dev,
if (final_exposure)
*final_exposure = (vfinal * dev->motor.base_ydpi) / yres;
-
+
DBG (DBG_proc,
"sanei_genesys_create_slope_table: returns sum_time=%d, completed\n",
sum_time);
@@ -735,7 +744,7 @@ sanei_genesys_create_gamma_table (uint16_t * gamma_table, int size,
if(gamma_table==NULL)
{
- DBG (DBG_proc, "sanei_genesys_create_gamma_table: gamma tbale is NULL\n");
+ DBG (DBG_proc, "sanei_genesys_create_gamma_table: gamma table is NULL\n");
return;
}
DBG (DBG_proc,
@@ -753,27 +762,26 @@ sanei_genesys_create_gamma_table (uint16_t * gamma_table, int size,
}
-/* computes the exposure_time on the basis of the given vertical dpi,
+/* computes the exposure_time on the basis of the given vertical dpi,
the number of pixels the ccd needs to send,
the step_type and the corresponding maximum speed from the motor struct */
/*
- Currently considers maximum motor speed at given step_type, minimum
+ Currently considers maximum motor speed at given step_type, minimum
line exposure needed for conversion and led exposure time.
TODO: Should also consider maximum transfer rate: ~6.5MB/s.
- Note: The enhance option of the scanners does _not_ help. It only halves
+ Note: The enhance option of the scanners does _not_ help. It only halves
the amount of pixels transfered.
*/
SANE_Int
sanei_genesys_exposure_time2 (Genesys_Device * dev, float ydpi,
int step_type, int endpixel,
- int led_exposure, int power_mode)
+ int exposure_by_led, int power_mode)
{
int exposure_by_ccd = endpixel + 32;
int exposure_by_motor =
(dev->motor.slopes[power_mode][step_type].maximum_speed
* dev->motor.base_ydpi) / ydpi;
- int exposure_by_led = led_exposure;
int exposure = exposure_by_ccd;
@@ -783,6 +791,8 @@ sanei_genesys_exposure_time2 (Genesys_Device * dev, float ydpi,
if (exposure < exposure_by_led && dev->model->is_cis)
exposure = exposure_by_led;
+ DBG (DBG_info, "%s: ydpi=%d, step=%d, endpixel=%d led=%d, power=%d => exposure=%d\n",
+ __FUNCTION__, (int)ydpi, step_type, endpixel, exposure_by_led, power_mode, exposure);
return exposure;
}
@@ -898,11 +908,11 @@ sanei_genesys_exposure_time (Genesys_Device * dev, Genesys_Register_Set * reg,
-/* Sends a block of shading information to the scanner.
- The data is placed at address 0x0000 for color mode, gray mode and
+/* Sends a block of shading information to the scanner.
+ The data is placed at address 0x0000 for color mode, gray mode and
unconditionally for the following CCD chips: HP2300, HP2400 and HP5345
- In the other cases (lineart, halftone on ccd chips not mentioned) the
- addresses are 0x2a00 for dpihw==0, 0x5500 for dpihw==1 and 0xa800 for
+ In the other cases (lineart, halftone on ccd chips not mentioned) the
+ addresses are 0x2a00 for dpihw==0, 0x5500 for dpihw==1 and 0xa800 for
dpihw==2. //Note: why this?
The data needs to be of size "size", and in little endian byte order.
@@ -918,10 +928,11 @@ genesys_send_offset_and_shading (Genesys_Device * dev, uint8_t * data,
int start_address;
SANE_Status status;
- DBG (DBG_proc, "genesys_send_offset_and_shading (size = %d)\n", size);
+ DBG (DBG_proc, "%s: (size = %d)\n", __FUNCTION__, size);
/* ASIC higher than gl843 doesn't have register 2A/2B, so we route to
- * a per ASIC shading data loading function if available */
+ * a per ASIC shading data loading function if available.
+ * It is also used for scanners using SHDAREA */
if(dev->model->cmd_set->send_shading_data!=NULL)
{
status=dev->model->cmd_set->send_shading_data(dev, data, size);
@@ -932,7 +943,7 @@ genesys_send_offset_and_shading (Genesys_Device * dev, uint8_t * data,
/* gl646, gl84[123] case */
dpihw = sanei_genesys_read_reg_from_set (dev->reg, 0x05) >> 6;
- /* TODO invert the test so only the 2 models behaving like that are
+ /* TODO invert the test so only the 2 models behaving like that are
* tested instead of adding all the others */
/* many scanners send coefficient for lineart/gray like in color mode */
if (dev->settings.scan_mode < 2
@@ -945,6 +956,7 @@ genesys_send_offset_and_shading (Genesys_Device * dev, uint8_t * data,
&& dev->model->ccd_type != CCD_XP300
&& dev->model->ccd_type != CCD_DP665
&& dev->model->ccd_type != CCD_DP685
+ && dev->model->ccd_type != CIS_CANONLIDE80
&& dev->model->ccd_type != CCD_ROADWARRIOR
&& dev->model->ccd_type != CCD_HP2300
&& dev->model->ccd_type != CCD_HP2400
@@ -966,17 +978,15 @@ genesys_send_offset_and_shading (Genesys_Device * dev, uint8_t * data,
status = sanei_genesys_set_buffer_address (dev, start_address);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "genesys_send_offset_and_shading: failed to set buffer address: %s\n",
- sane_strstatus (status));
+ DBG (DBG_error, "%s: failed to set buffer address: %s\n", __FUNCTION__,
+ sane_strstatus (status));
return status;
}
-
+
status = dev->model->cmd_set->bulk_write_data (dev, 0x3c, data, size);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "genesys_send_offset_and_shading: failed to send shading table: %s\n",
+ DBG (DBG_error, "%s: failed to send shading table: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
@@ -1030,22 +1040,22 @@ sanei_genesys_init_shading_data (Genesys_Device * dev, int pixels_per_line)
*shading_data_ptr++ = 0x40; /* white hi -> 0x4000 */
}
- status =
- genesys_send_offset_and_shading (dev, shading_data,
- pixels_per_line * 4 * channels);
- if (status != SANE_STATUS_GOOD)
- DBG (DBG_error,
- "sanei_genesys_init_shading_data: failed to send shading data: %s\n",
- sane_strstatus (status));
-
+ status = genesys_send_offset_and_shading (dev,
+ shading_data,
+ pixels_per_line * 4 * channels);
free (shading_data);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: failed to send shading data: %s\n", __FUNCTION__,
+ sane_strstatus (status));
+ }
DBGCOMPLETED;
return status;
}
-/* Find the position of the reference point:
+/* Find the position of the reference point:
takes gray level 8 bits data and find
first CCD usable pixel and top of scanning area */
SANE_Status
@@ -1090,7 +1100,7 @@ sanei_genesys_search_reference_point (Genesys_Device * dev, uint8_t * data,
if (DBG_LEVEL >= DBG_data)
sanei_genesys_write_pnm_file ("laplace.pnm", image, 8, 1, width, height);
- /* apply X direction sobel filter
+ /* apply X direction sobel filter
-1 0 1
-2 0 2
-1 0 1
@@ -1144,7 +1154,7 @@ sanei_genesys_search_reference_point (Genesys_Device * dev, uint8_t * data,
start_pixel + (left * dev->sensor.optical_res) / dpi;
/* find top edge by detecting black strip */
- /* apply Y direction sobel filter
+ /* apply Y direction sobel filter
-1 -2 -1
0 0 0
1 2 1
@@ -1913,7 +1923,7 @@ genesys_dark_shading_calibration (Genesys_Device * dev)
/*
* this function builds dummy dark calibration data so that we can
* compute shading coefficient in a clean way
- * todo: current values are hardcoded, we have to find if they
+ * todo: current values are hardcoded, we have to find if they
* can be computed from previous calibration data (when doing offset
* calibration ?)
*/
@@ -2114,7 +2124,7 @@ genesys_white_shading_calibration (Genesys_Device * dev)
sanei_genesys_write_pnm_file ("white_shading.pnm", calibration_data, 16,
channels, pixels_per_line,
dev->calib_lines);
-
+
genesys_average_data (dev->white_average_data, calibration_data,
dev->calib_lines,
pixels_per_line * channels);
@@ -2138,7 +2148,7 @@ genesys_white_shading_calibration (Genesys_Device * dev)
return status;
}
}
-
+
if (dev->model->flags & GENESYS_FLAG_SHADING_REPARK)
{
status = dev->model->cmd_set->slow_back_home (dev, SANE_TRUE);
@@ -2149,10 +2159,13 @@ genesys_white_shading_calibration (Genesys_Device * dev)
return status;
}
-/* This calibration uses a scan over the calibration target, comprising a
+/* This calibration uses a scan over the calibration target, comprising a
* black and a white strip. (So the motor must be on.)
*/
-static SANE_Status
+#ifndef UNIT_TESTING
+static
+#endif
+SANE_Status
genesys_dark_white_shading_calibration (Genesys_Device * dev)
{
SANE_Status status;
@@ -2167,8 +2180,7 @@ genesys_dark_white_shading_calibration (Genesys_Device * dev)
SANE_Bool motor;
- DBG (DBG_proc, "genesys_black_white_shading_calibration (lines = %d)\n",
- (unsigned int)dev->calib_lines);
+ DBG (DBG_proc, "%s: (lines = %d)\n", __FUNCTION__, (unsigned int)dev->calib_lines);
pixels_per_line = dev->calib_pixels;
channels = dev->calib_channels;
@@ -2181,8 +2193,7 @@ genesys_dark_white_shading_calibration (Genesys_Device * dev)
dev->white_average_data = malloc (dev->average_size);
if (!dev->white_average_data)
{
- DBG (DBG_error,
- "genesys_dark_white_shading_calibration: failed to allocate average memory\n");
+ DBG (DBG_error, "%s: failed to allocate white average memory\n", __FUNCTION__);
return SANE_STATUS_NO_MEM;
}
@@ -2192,8 +2203,7 @@ genesys_dark_white_shading_calibration (Genesys_Device * dev)
dev->dark_average_data = malloc (channels * 2 * pixels_per_line);
if (!dev->dark_average_data)
{
- DBG (DBG_error,
- "genesys_dark_white_shading_shading_calibration: failed to allocate average memory\n");
+ DBG (DBG_error, "%s: failed to allocate dark average memory\n", __FUNCTION__);
return SANE_STATUS_NO_MEM;
}
@@ -2202,8 +2212,7 @@ genesys_dark_white_shading_calibration (Genesys_Device * dev)
calibration_data = malloc (size);
if (!calibration_data)
{
- DBG (DBG_error,
- "genesys_dark_white_shading_calibration: failed to allocate calibration memory\n");
+ DBG (DBG_error, "%s: failed to allocate calibration memory\n", __FUNCTION__);
return SANE_STATUS_NO_MEM;
}
@@ -2224,9 +2233,8 @@ genesys_dark_white_shading_calibration (Genesys_Device * dev)
if (status != SANE_STATUS_GOOD)
{
free (calibration_data);
- DBG (DBG_error,
- "genesys_dark_white_shading_calibration: failed to bulk write registers: %s\n",
- sane_strstatus (status));
+ DBG (DBG_error, "%s: failed to bulk write registers: %s\n", __FUNCTION__,
+ sane_strstatus (status));
return status;
}
@@ -2235,8 +2243,7 @@ genesys_dark_white_shading_calibration (Genesys_Device * dev)
if (status != SANE_STATUS_GOOD)
{
free (calibration_data);
- DBG (DBG_error,
- "genesys_dark_white_shading_calibration: Failed to begin scan: %s\n",
+ DBG (DBG_error, "%s: failed to begin scan: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
@@ -2245,8 +2252,7 @@ genesys_dark_white_shading_calibration (Genesys_Device * dev)
if (status != SANE_STATUS_GOOD)
{
free (calibration_data);
- DBG (DBG_error,
- "genesys_dark_white_shading_calibration: Failed to read data: %s\n",
+ DBG (DBG_error, "%s: failed to read data: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
@@ -2255,16 +2261,26 @@ genesys_dark_white_shading_calibration (Genesys_Device * dev)
if (status != SANE_STATUS_GOOD)
{
free (calibration_data);
- DBG (DBG_error,
- "genesys_dark_white_shading_calibration: Failed to end scan: %s\n",
+ DBG (DBG_error, "%s: Failed to end scan: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
if (DBG_LEVEL >= DBG_data)
- sanei_genesys_write_pnm_file ("black_white_shading.pnm", calibration_data,
- 16, channels, pixels_per_line,
- dev->calib_lines);
+ {
+ if (dev->model->is_cis)
+ {
+ sanei_genesys_write_pnm_file ("black_white_shading.pnm", calibration_data,
+ 16, 1, pixels_per_line*channels,
+ dev->calib_lines);
+ }
+ else
+ {
+ sanei_genesys_write_pnm_file ("black_white_shading.pnm", calibration_data,
+ 16, channels, pixels_per_line,
+ dev->calib_lines);
+ }
+ }
average_white = dev->white_average_data;
@@ -2375,15 +2391,15 @@ compute_coefficient (unsigned int coeff, unsigned int target, unsigned int value
* The dark/white shading is actually performed _after_ reducing
* resolution via averaging. only dark/white shading data for what would be
* first pixel at full resolution is used.
- *
+ *
* scanner raw input to output value calculation:
* o=(i-off)*(gain/coeff)
- *
+ *
* from datasheet:
* off=dark_average
* gain=coeff*bright_target/(bright_average-dark_average)
* works for dark_target==0
- *
+ *
* what we want is these:
* bright_target=(bright_average-off)*(gain/coeff)
* dark_target=(dark_average-off)*(gain/coeff)
@@ -2406,30 +2422,31 @@ static
#endif
void
compute_averaged_planar (Genesys_Device * dev,
- uint8_t * shading_data,
- unsigned int pixels_per_line,
- unsigned int words_per_color,
- unsigned int channels,
- unsigned int o,
- unsigned int coeff,
- unsigned int target_bright,
- unsigned int target_dark)
+ uint8_t * shading_data,
+ unsigned int pixels_per_line,
+ unsigned int words_per_color,
+ unsigned int channels,
+ unsigned int o,
+ unsigned int coeff,
+ unsigned int target_bright,
+ unsigned int target_dark)
{
unsigned int x, i, j, br, dk, res, avgpixels, basepixels, val;
+ unsigned int fill,factor;
+
+ DBG (DBG_info, "%s: pixels=%d, offset=%d\n", __FUNCTION__, pixels_per_line, o);
- DBG (DBG_info, "%s: pixels=%d, offset=%d\n", __FUNCTION__, pixels_per_line,
- o);
/* initialize result */
memset (shading_data, 0xff, words_per_color * 3 * 2);
- /*
+ /*
strangely i can write 0x20000 bytes beginning at 0x00000 without overwriting
slope tables - which begin at address 0x10000(for 1200dpi hw mode):
memory is organized in words(2 bytes) instead of single bytes. explains
quite some things
*/
/*
- another one: the dark/white shading is actually performed _after_ reducing
+ another one: the dark/white shading is actually performed _after_ reducing
resolution via averaging. only dark/white shading data for what would be
first pixel at full resolution is used.
*/
@@ -2449,15 +2466,17 @@ compute_averaged_planar (Genesys_Device * dev,
off = (dark_average*bright_target - bright_average*dark_target)/(bright_target - dark_target)
gain = (bright_target - dark_target)/(bright_average - dark_average)*coeff
*/
- /* duplicate half-ccd logic */
res = dev->settings.xres;
+
+ /* duplicate half-ccd logic */
if ((dev->model->flags & GENESYS_FLAG_HALF_CCD_MODE) &&
dev->settings.xres <= dev->sensor.optical_res / 2)
- res *= 2; /* scanner is using half-ccd mode */
- /*this should be evenly dividable */
+ res *= 2;
+
+ /* this should be evenly dividable */
basepixels = dev->sensor.optical_res / res;
-/* gl841 supports 1/1 1/2 1/3 1/4 1/5 1/6 1/8 1/10 1/12 1/15 averaging */
+ /* gl841 supports 1/1 1/2 1/3 1/4 1/5 1/6 1/8 1/10 1/12 1/15 averaging */
if (basepixels < 1)
avgpixels = 1;
else if (basepixels < 6)
@@ -2473,11 +2492,24 @@ compute_averaged_planar (Genesys_Device * dev,
else
avgpixels = 15;
+ /* LiDE80 packs shading data */
+ if(dev->model->ccd_type != CIS_CANONLIDE80)
+ {
+ factor=1;
+ fill=avgpixels;
+ }
+ else
+ {
+ factor=avgpixels;
+ fill=1;
+ }
+
DBG (DBG_info, "%s: averaging over %d pixels\n", __FUNCTION__, avgpixels);
+ DBG (DBG_info, "%s: packing factor is %d\n", __FUNCTION__, factor);
+ DBG (DBG_info, "%s: fill length is %d\n", __FUNCTION__, fill);
for (x = 0; x <= pixels_per_line - avgpixels; x += avgpixels)
{
-
if ((x + o) * 2 * 2 + 3 > words_per_color * 2)
break;
@@ -2514,59 +2546,47 @@ compute_averaged_planar (Genesys_Device * dev,
65535 * (target_bright - target_dark))
val = 65535;
else
- val =
- (dk * target_bright - br * target_dark) / (target_bright -
- target_dark);
+ {
+ val = (dk * target_bright - br * target_dark) / (target_bright - target_dark);
+ }
-/*fill all pixels, even if only the last one is relevant*/
- for (i = 0; i < avgpixels; i++)
+ /*fill all pixels, even if only the last one is relevant*/
+ for (i = 0; i < fill; i++)
{
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * j] = val & 0xff;
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * j + 1] = val >> 8;
+ shading_data[(x/factor + o + i) * 2 * 2 + words_per_color * 2 * j] = val & 0xff;
+ shading_data[(x/factor + o + i) * 2 * 2 + words_per_color * 2 * j + 1] = val >> 8;
}
val = br - dk;
if (65535 * val > (target_bright - target_dark) * coeff)
- val = (coeff * (target_bright - target_dark)) / val;
+ {
+ val = (coeff * (target_bright - target_dark)) / val;
+ }
else
- val = 65535;
+ {
+ val = 65535;
+ }
-/*fill all pixels, even if only the last one is relevant*/
- for (i = 0; i < avgpixels; i++)
+ /*fill all pixels, even if only the last one is relevant*/
+ for (i = 0; i < fill; i++)
{
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * j + 2] = val & 0xff;
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * j + 3] = val >> 8;
+ shading_data[(x/factor + o + i) * 2 * 2 + words_per_color * 2 * j + 2] = val & 0xff;
+ shading_data[(x/factor + o + i) * 2 * 2 + words_per_color * 2 * j + 3] = val >> 8;
}
}
-/*fill remaining channels*/
+ /* fill remaining channels */
for (j = channels; j < 3; j++)
{
- for (i = 0; i < avgpixels; i++)
+ for (i = 0; i < fill; i++)
{
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * j] =
- shading_data[(x + o + i) * 2 * 2 + words_per_color * 0];
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * j + 1] =
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * 0 + 1];
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * j + 2] =
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * 0 + 2];
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * j + 3] =
- shading_data[(x + o + i) * 2 * 2 +
- words_per_color * 2 * 0 + 3];
+ shading_data[(x/factor + o + i) * 2 * 2 + words_per_color * 2 * j ] = shading_data[(x/factor + o + i) * 2 * 2 ];
+ shading_data[(x/factor + o + i) * 2 * 2 + words_per_color * 2 * j + 1] = shading_data[(x/factor + o + i) * 2 * 2 + 1];
+ shading_data[(x/factor + o + i) * 2 * 2 + words_per_color * 2 * j + 2] = shading_data[(x/factor + o + i) * 2 * 2 + 2];
+ shading_data[(x/factor + o + i) * 2 * 2 + words_per_color * 2 * j + 3] = shading_data[(x/factor + o + i) * 2 * 2 + 3];
}
}
-
}
}
@@ -2603,7 +2623,7 @@ compute_coefficients (Genesys_Device * dev,
DBG (DBG_io,
"compute_coefficients: pixels_per_line=%d, coeff=0x%04x\n", pixels_per_line, coeff);
-
+
/* compute start & end values depending of the offset */
if (offset < 0)
{
@@ -2672,7 +2692,7 @@ compute_planar_coefficients (Genesys_Device * dev,
unsigned int channels,
unsigned int cmat[3],
unsigned int offset,
- unsigned int coeff,
+ unsigned int coeff,
unsigned int target)
{
uint8_t *ptr; /* contains 16bit words in little endian */
@@ -2781,9 +2801,9 @@ compute_shifted_coefficients (Genesys_Device * dev,
for (i = 0; i < avgpixels; i++) {
for (j = 0; j < channels; j++) {
- br_tmp[j] += (dev->white_average_data[((x + i) * channels + j) * 2] |
+ br_tmp[j] += (dev->white_average_data[((x + i) * channels + j) * 2] |
(dev->white_average_data[((x + i) * channels + j) * 2 + 1] << 8));
- dk_tmp[i] += (dev->dark_average_data[((x + i) * channels + j) * 2] |
+ dk_tmp[i] += (dev->dark_average_data[((x + i) * channels + j) * 2] |
(dev->dark_average_data[((x + i) * channels + j) * 2 + 1] << 8));
}
}
@@ -2826,7 +2846,7 @@ compute_shifted_coefficients (Genesys_Device * dev,
}
}
-static SANE_Status
+GENESYS_STATIC SANE_Status
genesys_send_shading_coefficient (Genesys_Device * dev)
{
SANE_Status status;
@@ -2869,19 +2889,27 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
break;
}
+ /* special case, memory is aligned on 0x5400, this has yet to be explained */
+ /* could be 0xa800 because sensor is truly 2400 dpi, then halved because
+ * we only set 1200 dpi */
+ if(dev->model->ccd_type==CIS_CANONLIDE80)
+ {
+ words_per_color = 0x5400;
+ }
+
length = words_per_color * 3 * 2;
+
/* allocate computed size */
shading_data = malloc (length);
if (!shading_data)
{
- DBG (DBG_error,
- "genesys_send_shading_coefficient: failed to allocate memory\n");
+ DBG (DBG_error, "%s: failed to allocate memory\n", __FUNCTION__);
return SANE_STATUS_NO_MEM;
}
memset (shading_data, 0, length);
/* TARGET/(Wn-Dn) = white gain -> ~1.xxx then it is multiplied by 0x2000
- or 0x4000 to give an integer
+ or 0x4000 to give an integer
Wn = white average for column n
Dn = dark average for column n
*/
@@ -2974,10 +3002,10 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
compute_coefficients (dev,
shading_data,
pixels_per_line,
- 3,
- cmat,
- o,
- coeff,
+ 3,
+ cmat,
+ o,
+ coeff,
target_code);
break;
case CCD_HP3670:
@@ -2999,10 +3027,10 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
compute_coefficients (dev,
shading_data,
pixels_per_line,
- 3,
- cmat,
- o,
- coeff,
+ 3,
+ cmat,
+ o,
+ coeff,
target_code);
break;
case CCD_KVSS080:
@@ -3015,21 +3043,25 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
compute_coefficients (dev,
shading_data,
pixels_per_line,
- 3,
- cmat,
- o,
- coeff,
+ 3,
+ cmat,
+ o,
+ coeff,
target_code);
break;
case CIS_CANONLIDE700:
case CIS_CANONLIDE100:
case CIS_CANONLIDE200:
case CIS_CANONLIDE110:
+ case CIS_CANONLIDE120:
case CIS_CANONLIDE210:
+ case CIS_CANONLIDE220:
/* TODO store this in a data struct so we avoid
* growing this switch */
if(dev->model->ccd_type!=CIS_CANONLIDE110
- && dev->model->ccd_type!=CIS_CANONLIDE210)
+ && dev->model->ccd_type!=CIS_CANONLIDE210
+ && dev->model->ccd_type!=CIS_CANONLIDE120
+ && dev->model->ccd_type!=CIS_CANONLIDE220)
target_code=0xdc00;
else
target_code=0xf000;
@@ -3039,8 +3071,7 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
shading_data = malloc (length);
if (!shading_data)
{
- DBG (DBG_error,
- "genesys_send_shading_coefficient: failed to allocate memory\n");
+ DBG (DBG_error, "%s: failed to allocate memory\n", __FUNCTION__);
return SANE_STATUS_NO_MEM;
}
memset (shading_data, 0, length);
@@ -3063,9 +3094,20 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
channels,
4,
coeff,
- 0xfa00,
+ 0xe000,
0x0a00);
break;
+ case CIS_CANONLIDE80:
+ compute_averaged_planar (dev,
+ shading_data,
+ pixels_per_line,
+ words_per_color,
+ channels,
+ 0,
+ coeff,
+ 0xd000,
+ 0x0800);
+ break;
case CCD_PLUSTEK_3600:
compute_shifted_coefficients (dev,
shading_data,
@@ -3079,23 +3121,21 @@ genesys_send_shading_coefficient (Genesys_Device * dev)
256); /* patch_size: contigous extent */
break;
default:
- DBG (DBG_error,
- "genesys_send_shading_coefficient: sensor %d not supported\n",
- dev->model->ccd_type);
+ DBG (DBG_error, "%s: sensor %d not supported\n", __FUNCTION__, dev->model->ccd_type);
return SANE_STATUS_UNSUPPORTED;
break;
}
/* do the actual write of shading calibration data to the scanner */
status = genesys_send_offset_and_shading (dev, shading_data, length);
+ free (shading_data);
if (status != SANE_STATUS_GOOD)
- DBG (DBG_error,
- "genesys_send_shading_coefficient: failed to send shading data: %s\n",
- sane_strstatus (status));
+ {
+ DBG (DBG_error, "%s: failed to send shading data: %s\n", __FUNCTION__,
+ sane_strstatus (status));
+ }
- free (shading_data);
DBGCOMPLETED;
-
return SANE_STATUS_GOOD;
}
@@ -3125,7 +3165,7 @@ genesys_restore_calibration (Genesys_Device * dev)
for (cache = dev->calibration_cache; cache; cache = cache->next)
{
status = dev->model->cmd_set->is_compatible_calibration (dev, cache, SANE_FALSE);
- /* SANE_STATUS_GOOD, a matching cache has been found
+ /* SANE_STATUS_GOOD, a matching cache has been found
* so we use it to populate calibration data
*/
if (status == SANE_STATUS_GOOD)
@@ -3270,7 +3310,7 @@ genesys_save_calibration (Genesys_Device * dev)
* @param dev device to calibrate
* @return SANE_STATUS_GOOD if everything when all right, else the error code.
*/
-static SANE_Status
+GENESYS_STATIC SANE_Status
genesys_flatbed_calibration (Genesys_Device * dev)
{
SANE_Status status;
@@ -3514,7 +3554,7 @@ genesys_sheetfed_calibration (Genesys_Device * dev)
xres = dev->sensor.optical_res;
dev->settings.xres = dev->sensor.optical_res;
/* XP200 needs to calibrate a full and half sensor's resolution */
- if (dev->model->ccd_type == CIS_XP200
+ if (dev->model->ccd_type == CIS_XP200
&& dev->settings.xres <= dev->sensor.optical_res / 2)
dev->settings.xres /= 2;
@@ -3590,7 +3630,7 @@ genesys_sheetfed_calibration (Genesys_Device * dev)
}
}
- /* search for a full width black strip and then do a 16 bit scan to
+ /* search for a full width black strip and then do a 16 bit scan to
* gather black shading data */
if (dev->model->flags & GENESYS_FLAG_DARK_CALIBRATION)
{
@@ -3649,8 +3689,7 @@ genesys_sheetfed_calibration (Genesys_Device * dev)
if (status != SANE_STATUS_GOOD)
{
dev->model->cmd_set->eject_document (dev);
- DBG (DBG_error,
- "genesys_sheetfed_calibration: failed eject target: %s\n",
+ DBG (DBG_error, "%s: failed eject target: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
@@ -3851,7 +3890,7 @@ genesys_warmup_lamp (Genesys_Device * dev)
{
first_average /= pixel;
second_average /= pixel;
- difference = abs (first_average - second_average);
+ difference = fabs (first_average - second_average);
DBG (DBG_info,
"genesys_warmup_lamp: average = %.2f, diff = %.3f\n",
100 * ((second_average) / (256 * 256)),
@@ -3878,7 +3917,7 @@ genesys_warmup_lamp (Genesys_Device * dev)
}
DBG (DBG_info, "genesys_warmup_lamp: average 1 = %.2f, average 2 = %.2f\n", first_average, second_average);
/* if delta below 15/255 ~= 5.8%, lamp is considred warm enough */
- if (abs (first_average - second_average) < 15
+ if (fabs (first_average - second_average) < 15
&& second_average > 55)
break;
}
@@ -3935,7 +3974,7 @@ genesys_start_scan (Genesys_Device * dev, SANE_Bool lamp_off)
return status;
}
}
-
+
/* disable power saving*/
status = dev->model->cmd_set->save_power (dev, SANE_FALSE);
if (status != SANE_STATUS_GOOD)
@@ -4077,7 +4116,7 @@ genesys_start_scan (Genesys_Device * dev, SANE_Bool lamp_off)
status = sanei_genesys_load_lut(dev->lineart_lut, 8, 8, 50, 205,
dev->settings.threshold_curve,
dev->settings.threshold-127);
- if (status != SANE_STATUS_GOOD)
+ if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "genesys_start_scan: failed to build lut\n");
return status;
@@ -4094,11 +4133,11 @@ genesys_start_scan (Genesys_Device * dev, SANE_Bool lamp_off)
}
/* no lamp during scan */
- if(lamp_off == SANE_TRUE)
+ if(lamp_off == SANE_TRUE)
{
dev->model->cmd_set->set_lamp_power (dev, dev->reg, SANE_FALSE);
}
-
+
/* GL124 is using SHDAREA, so we have to wait for scan to be set up before
* sending shading data */
if( (dev->model->cmd_set->send_shading_data!=NULL)
@@ -4140,7 +4179,7 @@ genesys_start_scan (Genesys_Device * dev, SANE_Bool lamp_off)
/*do we really need this? the valid data check should be sufficent -- pierre*/
/* waits for head to reach scanning position */
expected = sanei_genesys_read_reg_from_set (dev->reg, 0x3d) * 65536
- + sanei_genesys_read_reg_from_set (dev->reg, 0x3e) * 256
+ + sanei_genesys_read_reg_from_set (dev->reg, 0x3e) * 256
+ sanei_genesys_read_reg_from_set (dev->reg, 0x3f);
do
{
@@ -4157,7 +4196,7 @@ genesys_start_scan (Genesys_Device * dev, SANE_Bool lamp_off)
}
}
while (steps < expected);
-
+
/* wait for buffers to be filled */
do
{
@@ -4173,7 +4212,7 @@ genesys_start_scan (Genesys_Device * dev, SANE_Bool lamp_off)
else
usleep (500 * 1000);
*/
- /* then we wait for at least one word of valid scan data
+ /* then we wait for at least one word of valid scan data
this is also done in sanei_genesys_read_data_from_scanner -- pierre */
if (dev->model->is_sheetfed == SANE_FALSE)
@@ -4192,12 +4231,12 @@ genesys_start_scan (Genesys_Device * dev, SANE_Bool lamp_off)
}
while (steps < 1);
}
-
+
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
-/* this is _not_ a ringbuffer.
+/* this is _not_ a ringbuffer.
if we need a block which does not fit at the end of our available data,
we move the available data to the beginning.
*/
@@ -4294,7 +4333,7 @@ static SANE_Status accurate_line_read(Genesys_Device * dev,
* must be read and bytes interleaved to get usable by the other stages
* of the backend
*/
-static SANE_Status
+static SANE_Status
genesys_fill_line_interp_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, size_t size)
{
size_t count;
@@ -4313,7 +4352,7 @@ genesys_fill_line_interp_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst,
}
}
- /* copy size bytes of data, copying from a line when line count matches */
+ /* copy size bytes of data, copying from a line when line count matches */
count = 0;
while (count < size)
{
@@ -4344,7 +4383,7 @@ genesys_fill_line_interp_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst,
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
- "%s: failed to read %lu bytes (%s)\n", __FUNCTION__,
+ "%s: failed to read %lu bytes (%s)\n", __FUNCTION__,
(u_long) dev->oe_buffer.size, sane_strstatus (status));
return SANE_STATUS_IO_ERROR;
}
@@ -4356,17 +4395,17 @@ genesys_fill_line_interp_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst,
/** @brief fill buffer for segmented sensors
* This function fills a read buffer with scanned data from a sensor segmented
- * in several parts (multi-lines sensors). Data of the same valid area is read
+ * in several parts (multi-lines sensors). Data of the same valid area is read
* back to back and must be interleaved to get usable by the other stages
* of the backend
*/
-static SANE_Status
+static SANE_Status
genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, size_t size)
{
size_t count;
SANE_Status status;
int depth,i,n,k;
-
+
depth = dev->settings.depth;
if (dev->settings.scan_mode == SCAN_MODE_LINEART && dev->settings.dynamic_lineart==SANE_FALSE)
depth = 1;
@@ -4397,12 +4436,12 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s
count++;
dev->cur++;
}
- else
+ else
{
if(depth==1)
{
while (dev->cur < dev->len && count < size)
- {
+ {
for(n=0;n<dev->segnb;n++)
{
work_buffer_dst[count+n] = 0;
@@ -4429,7 +4468,7 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s
if(depth==8)
{
while (dev->cur < dev->len && count < size)
- {
+ {
for(n=0;n<dev->segnb;n++)
{
work_buffer_dst[count+n] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist*dev->order[n] + dev->oe_buffer.pos];
@@ -4442,7 +4481,7 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s
if(depth==16)
{
while (dev->cur < dev->len && count < size)
- {
+ {
for(n=0;n<dev->segnb;n++)
{
work_buffer_dst[count+n*2] = dev->oe_buffer.buffer[dev->cur + dev->skip + dev->dist*dev->order[n] + dev->oe_buffer.pos];
@@ -4469,7 +4508,7 @@ genesys_fill_segmented_buffer (Genesys_Device * dev, uint8_t *work_buffer_dst, s
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
- "%s: failed to read %lu bytes (%s)\n", __FUNCTION__,
+ "%s: failed to read %lu bytes (%s)\n", __FUNCTION__,
(u_long) dev->oe_buffer.size, sane_strstatus (status));
return SANE_STATUS_IO_ERROR;
}
@@ -4508,7 +4547,7 @@ genesys_fill_read_buffer (Genesys_Device * dev)
size = space;
- /* never read an odd number. exception: last read
+ /* never read an odd number. exception: last read
the chip internal counter does not count half words. */
size &= ~1;
/* Some setups need the reads to be multiples of 256 bytes */
@@ -4536,10 +4575,10 @@ genesys_fill_read_buffer (Genesys_Device * dev)
* may have to be read from another intermediate buffer and then processed.
* There are currently 3 intermediate stages:
* - handling of odd/even sensors
- * - handling of line interpolation for motors that can't have low
+ * - handling of line interpolation for motors that can't have low
* enough dpi
* - handling of multi-segments sensors
- *
+ *
* This is also the place where full duplex data will be handled.
*/
if (dev->line_interp>0)
@@ -4576,8 +4615,8 @@ genesys_fill_read_buffer (Genesys_Device * dev)
return SANE_STATUS_GOOD;
}
-/* this function does the effective data read in a manner that suits
- the scanner. It does data reordering and resizing if need.
+/* this function does the effective data read in a manner that suits
+ the scanner. It does data reordering and resizing if need.
It also manages EOF and I/O errors, and line distance correction.
*/
static SANE_Status
@@ -4736,14 +4775,14 @@ genesys_read_ordered_data (Genesys_Device * dev, SANE_Byte * destination,
-------------- out_buffer -----------------------
4. memcpy to destination (for lineart with bit reversal)
*/
-/*FIXME: for lineart we need sub byte addressing in buffers, or conversion to
+/*FIXME: for lineart we need sub byte addressing in buffers, or conversion to
bytes at 0. and back to bits at 4.
Problems with the first approach:
- its not clear how to check if we need to output an incomplete byte
because it is the last one.
*/
-/*FIXME: add lineart support for gl646. in the meantime add logic to convert
- from gray to lineart at the end? would suffer the above problem,
+/*FIXME: add lineart support for gl646. in the meantime add logic to convert
+ from gray to lineart at the end? would suffer the above problem,
total_bytes_to_read and total_bytes_read help in that case.
*/
@@ -5061,7 +5100,7 @@ Problems with the first approach:
dev->total_bytes_read += *len;
RIE (sanei_genesys_buffer_consume (src_buffer, bytes));
-
+
/* end scan if all needed data have been read */
if(dev->total_bytes_read >= dev->total_bytes_to_read)
{
@@ -5149,11 +5188,11 @@ calc_parameters (Genesys_Scanner * s)
/* we need an even pixels number
* TODO invert test logic or generalize behaviour across all ASICs */
if ((s->dev->model->flags & GENESYS_FLAG_SIS_SENSOR)
- || s->dev->model->asic_type == GENESYS_GL847
- || s->dev->model->asic_type == GENESYS_GL124
- || s->dev->model->asic_type == GENESYS_GL845
- || s->dev->model->asic_type == GENESYS_GL846
- || s->dev->model->asic_type == GENESYS_GL843)
+ || s->dev->model->asic_type == GENESYS_GL847
+ || s->dev->model->asic_type == GENESYS_GL124
+ || s->dev->model->asic_type == GENESYS_GL845
+ || s->dev->model->asic_type == GENESYS_GL846
+ || s->dev->model->asic_type == GENESYS_GL843)
{
if (s->dev->settings.xres <= 1200)
s->params.pixels_per_line = (s->params.pixels_per_line/4)*4;
@@ -5164,7 +5203,7 @@ calc_parameters (Genesys_Scanner * s)
/* corner case for true lineart for sensor with several segments
* or when xres is doubled to match yres */
if (s->dev->settings.xres >= 1200
- && ( s->dev->model->asic_type == GENESYS_GL124
+ && ( s->dev->model->asic_type == GENESYS_GL124
|| s->dev->model->asic_type == GENESYS_GL847
|| s->dev->current_setup.xres < s->dev->current_setup.yres
)
@@ -5182,7 +5221,7 @@ calc_parameters (Genesys_Scanner * s)
else if (s->params.depth == 1)
{
s->params.bytes_per_line /= 8;
- /* round down pixel number
+ /* round down pixel number
really? rounding down means loss of at most 7 pixels! -- pierre */
s->params.pixels_per_line = 8 * s->params.bytes_per_line;
}
@@ -5241,21 +5280,21 @@ calc_parameters (Genesys_Scanner * s)
/* hardware lineart works only when we don't have interleave data
* for GL847 scanners, ie up to 600 DPI, then we have to rely on
* dynamic_lineart */
- if(s->dev->settings.xres > 600
+ if(s->dev->settings.xres > 600
&& s->dev->model->asic_type==GENESYS_GL847
&& s->dev->settings.scan_mode == SCAN_MODE_LINEART)
{
s->dev->settings.dynamic_lineart = SANE_TRUE;
}
-
+
/* threshold curve for dynamic rasterization */
s->dev->settings.threshold_curve=s->val[OPT_THRESHOLD_CURVE].w;
/* some digital processing requires the whole picture to be buffered */
/* no digital processing takes place when doing preview, or when bit depth is
* higher than 8 bits */
- if ((s->val[OPT_SWDESPECK].b
- || s->val[OPT_SWCROP].b
+ if ((s->val[OPT_SWDESPECK].b
+ || s->val[OPT_SWCROP].b
|| s->val[OPT_SWDESKEW].b
|| s->val[OPT_SWDEROTATE].b
||(SANE_UNFIX(s->val[OPT_SWSKIP].w)>0))
@@ -5281,6 +5320,9 @@ calc_parameters (Genesys_Scanner * s)
s->dev->settings.brightness=0;
}
+ /* cache expiration time */
+ s->dev->settings.expiration_time=s->val[OPT_EXPIRATION_TIME].w;
+
return status;
}
@@ -5339,7 +5381,7 @@ init_gamma_vector_option (Genesys_Scanner * scanner, int option)
scanner->val[option].wa = NULL;
}
-/**
+/**
* allocate a geometry range
* @param size maximum size of the range
* @return a pointer to a valid range or NULL
@@ -5358,6 +5400,107 @@ SANE_Range *range=NULL;
return range;
}
+/** @brief generate calibration cache file nam
+ * Generates the calibration cache file name to use.
+ * Tries to store the chache in $HOME/.sane or
+ * then fallbacks to $TMPDIR or TMP. The filename
+ * uses the model name if only one scanner is plugged
+ * else is uses the device name when several identical
+ * scanners are in use.
+ * @param currdev current scanner device
+ * @return an allocated string containing a file name
+ */
+GENESYS_STATIC char *calibration_filename(Genesys_Device *currdev)
+{
+ char *tmpstr;
+ char *ptr;
+ char filename[80];
+ Genesys_Device *dev;
+ unsigned int count;
+ unsigned int i;
+
+ /* allocate space for result */
+ tmpstr=malloc(PATH_MAX);
+ if(tmpstr==NULL)
+ {
+ return NULL;
+ }
+
+ /* first compute the DIR where we can store cache:
+ * 1 - home dir
+ * 2 - $TMPDIR
+ * 3 - $TMP
+ * 4 - tmp dir
+ * 5 - temp dir
+ * 6 - then resort to current dir
+ */
+ ptr = getenv ("HOME");
+ if(ptr==NULL)
+ {
+ ptr = getenv ("USERPROFILE");
+ }
+ if(ptr==NULL)
+ {
+ ptr = getenv ("TMPDIR");
+ }
+ if(ptr==NULL)
+ {
+ ptr = getenv ("TMP");
+ }
+
+ /* now choose filename:
+ * 1 - if only one scanner, name of the model
+ * 2 - if several scanners of the same model, use device name,
+ * replacing special chars
+ */
+ count=0;
+ /* count models of the same names if several scanners attached */
+ if(num_devices>1)
+ {
+ for (dev = first_dev; dev; dev = dev->next)
+ {
+ if(strcmp(dev->model->name,currdev->model->name)==0)
+ {
+ count++;
+ }
+ }
+ }
+ if(count>1)
+ {
+ snprintf(filename,sizeof(filename),"%s.cal",currdev->file_name);
+ for(i=0;i<strlen(filename);i++)
+ {
+ if(filename[i]==':'||filename[i]==PATH_SEP)
+ {
+ filename[i]='_';
+ }
+ }
+ }
+ else
+ {
+ snprintf(filename,sizeof(filename),"%s.cal",currdev->model->name);
+ }
+
+ /* build final final name : store dir + filename */
+ if (NULL == ptr)
+ {
+ snprintf (tmpstr, PATH_MAX, "%s", filename);
+ }
+ else
+ {
+#ifdef HAVE_MKDIR
+ /* make sure .sane directory exists in existing store dir */
+ snprintf (tmpstr, PATH_MAX, "%s%c.sane", ptr, PATH_SEP);
+ mkdir(tmpstr,0700);
+#endif
+ snprintf (tmpstr, PATH_MAX, "%s%c.sane%c%s", ptr, PATH_SEP, PATH_SEP, filename);
+ }
+
+ DBG (DBG_info, "%s: calibration filename >%s<\n", __FUNCTION__, tmpstr);
+
+ return tmpstr;
+}
+
static SANE_Status
init_options (Genesys_Scanner * s)
@@ -5412,13 +5555,13 @@ init_options (Genesys_Scanner * s)
s->opt[OPT_SOURCE].size = max_string_size (source_list);
s->opt[OPT_SOURCE].constraint.string_list = source_list;
s->val[OPT_SOURCE].s = strdup (FLATBED);
- if (!(model->flags & GENESYS_FLAG_HAS_UTA))
+ if (model->flags & GENESYS_FLAG_HAS_UTA)
{
- DISABLE (OPT_SOURCE);
+ ENABLE (OPT_SOURCE);
}
else
{
- ENABLE (OPT_SOURCE);
+ DISABLE (OPT_SOURCE);
}
/* preview */
@@ -5578,7 +5721,7 @@ init_options (Genesys_Scanner * s)
DBG (DBG_info, "init_options: custom gamma disabled\n");
}
- /* software base image enhancements, these are consuming as many
+ /* software base image enhancements, these are consuming as many
* memory than used by the full scanned image and may fail at high
* resolution
*/
@@ -5589,7 +5732,7 @@ init_options (Genesys_Scanner * s)
s->opt[OPT_SWDESKEW].type = SANE_TYPE_BOOL;
s->opt[OPT_SWDESKEW].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
s->val[OPT_SWDESKEW].b = SANE_FALSE;
-
+
/* software deskew */
s->opt[OPT_SWDESPECK].name = "swdespeck";
s->opt[OPT_SWDESPECK].title = "Software despeck";
@@ -5606,7 +5749,7 @@ init_options (Genesys_Scanner * s)
s->opt[OPT_DESPECK].unit = SANE_UNIT_NONE;
s->opt[OPT_DESPECK].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_DESPECK].constraint.range = &swdespeck_range;
- s->opt[OPT_DESPECK].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED;
+ s->opt[OPT_DESPECK].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT | SANE_CAP_ADVANCED | SANE_CAP_INACTIVE;
s->val[OPT_DESPECK].w = 1;
/* crop by software */
@@ -5680,7 +5823,7 @@ init_options (Genesys_Scanner * s)
s->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_THRESHOLD].constraint.range = &percentage_range;
s->val[OPT_THRESHOLD].w = SANE_FIX (50);
-
+
/* BW threshold curve */
s->opt[OPT_THRESHOLD_CURVE].name = "threshold-curve";
s->opt[OPT_THRESHOLD_CURVE].title = SANE_I18N ("Threshold curve");
@@ -5690,7 +5833,7 @@ init_options (Genesys_Scanner * s)
s->opt[OPT_THRESHOLD_CURVE].constraint_type = SANE_CONSTRAINT_RANGE;
s->opt[OPT_THRESHOLD_CURVE].constraint.range = &threshold_curve_range;
s->val[OPT_THRESHOLD_CURVE].w = 50;
-
+
/* dynamic linart */
s->opt[OPT_DISABLE_DYNAMIC_LINEART].name = "disable-dynamic-lineart";
s->opt[OPT_DISABLE_DYNAMIC_LINEART].title = SANE_I18N ("Disable dynamic lineart");
@@ -5768,6 +5911,17 @@ init_options (Genesys_Scanner * s)
}
#endif
+ /* expiration time for calibration cache entries */
+ s->opt[OPT_EXPIRATION_TIME].name = "expiration-time";
+ s->opt[OPT_EXPIRATION_TIME].title = SANE_I18N ("Calibration cache expiration time");
+ s->opt[OPT_EXPIRATION_TIME].desc = SANE_I18N ("Time (in minutes) before a cached calibration expires. "
+ "A value of 0 means cache is not used. A negative value means cache never expires.");
+ s->opt[OPT_EXPIRATION_TIME].type = SANE_TYPE_INT;
+ s->opt[OPT_EXPIRATION_TIME].unit = SANE_UNIT_NONE;
+ s->opt[OPT_EXPIRATION_TIME].constraint_type = SANE_CONSTRAINT_RANGE;
+ s->opt[OPT_EXPIRATION_TIME].constraint.range = &expiration_range;
+ s->val[OPT_EXPIRATION_TIME].w = 60; /* 60 minutes by default */
+
/* Powersave time (turn lamp off) */
s->opt[OPT_LAMP_OFF_TIME].name = "lamp-off-time";
s->opt[OPT_LAMP_OFF_TIME].title = SANE_I18N ("Lamp off time");
@@ -5890,7 +6044,7 @@ init_options (Genesys_Scanner * s)
s->opt[OPT_POWER_SW].cap = SANE_CAP_INACTIVE;
s->val[OPT_POWER_SW].b = 0;
s->last_val[OPT_POWER_SW].b = 0;
-
+
/* extra button */
s->opt[OPT_EXTRA_SW].name = "extra";
s->opt[OPT_EXTRA_SW].title = SANE_I18N ("Extra button");
@@ -5971,13 +6125,24 @@ check_present (SANE_String_Const devname)
return SANE_STATUS_GOOD;
}
+/** @brief add a scanner device
+ * Insert the given device into the backend list of devices.
+ * @param dev device to add
+ */
+GENESYS_STATIC void add_device(Genesys_Device *dev)
+{
+ ++num_devices;
+ dev->next = first_dev;
+ first_dev = dev;
+}
+
static SANE_Status
attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
{
Genesys_Device *dev = 0;
SANE_Int dn, vendor, product;
SANE_Status status;
- int i;
+ unsigned int i;
DBG (DBG_proc, "attach: start: devp %s NULL, may_wait = %d\n",
@@ -6061,7 +6226,10 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
dev->file_name = strdup (devname);
if (!dev->file_name)
- return SANE_STATUS_NO_MEM;
+ {
+ free(dev);
+ return SANE_STATUS_NO_MEM;
+ }
dev->model = genesys_usb_device_list[i].model;
dev->vendorId = genesys_usb_device_list[i].vendor;
@@ -6070,9 +6238,7 @@ attach (SANE_String_Const devname, Genesys_Device ** devp, SANE_Bool may_wait)
DBG (DBG_info, "attach: found %s flatbed scanner %s at %s\n",
dev->model->vendor, dev->model->model, dev->file_name);
- ++num_devices;
- dev->next = first_dev;
- first_dev = dev;
+ add_device(dev);
if (devp)
*devp = dev;
@@ -6125,8 +6291,8 @@ attach_one_device (SANE_String_Const devname)
static SANE_Status
config_attach_genesys (SANEI_Config __sane_unused__ *config, const char *devname)
{
- /* the devname has been processed and is ready to be used
- * directly. Since the backend is an USB only one, we can
+ /* the devname has been processed and is ready to be used
+ * directly. Since the backend is an USB only one, we can
* call sanei_usb_attach_matching_devices straight */
sanei_usb_attach_matching_devices (devname, attach_one_device);
@@ -6164,15 +6330,17 @@ probe_genesys_devices (void)
free (new_dev);
}
+ DBG(DBG_info, "%s: %d devices currently attached\n", __FUNCTION__, num_devices);
+
DBGCOMPLETED;
return status;
}
/**
- * This should be changed if one of the substructures of
+ * This should be changed if one of the substructures of
Genesys_Calibration_Cache change, but it must be changed if there are
- changes that don't change size -- at least for now, as we store most
+ changes that don't change size -- at least for now, as we store most
of Genesys_Calibration_Cache as is.
*/
#define CALIBRATION_VERSION 1
@@ -6630,7 +6798,7 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
first_dev = dev->next;
num_devices--;
free (dev);
- dev = prev->next;
+ dev = first_dev;
}
}
/* case 2 : removed device is not first_dev */
@@ -6661,8 +6829,7 @@ sane_open (SANE_String_Const devicename, SANE_Handle * handle)
Genesys_Device *dev;
SANE_Status status;
Genesys_Scanner *s;
- char tmp_str[PATH_MAX];
- char *ptr;
+ char *tmpstr;
DBG (DBG_proc, "sane_open: start (devicename = `%s')\n", devicename);
@@ -6768,37 +6935,16 @@ sane_open (SANE_String_Const devicename, SANE_Handle * handle)
RIE (dev->model->cmd_set->init (dev));
- /* here is the place to fetch a stored calibration cache */
+ /* some hardware capabilities are detected through sensors */
+ RIE (s->dev->model->cmd_set->update_hardware_sensors (s));
- /* create calibration-filename
- lifted from plustek-usb.c
- */
- /* we should add a unique identifying feature to the file name
- to support multiple scanners of the same model, but to my
- knowledge, there is no such thing in these scanners.
- (At least the usb serial is always "0".)
- TODO add an storedir option to genesys.conf
- */
-
- ptr = getenv ("HOME");
- if (NULL == ptr)
- {
- sprintf (tmp_str, "/tmp/%s.cal", s->dev->model->name);
- }
- else
- {
-#ifdef HAVE_MKDIR
- /* make sure .sane directory exists */
- sprintf (tmp_str, "%s/.sane", ptr);
- mkdir(tmp_str,0700);
-#endif
- sprintf (tmp_str, "%s/.sane/%s.cal", ptr, s->dev->model->name);
- }
-
- s->val[OPT_CALIBRATION_FILE].s = strdup (tmp_str);
- s->dev->calib_file = strdup (tmp_str);
- DBG (DBG_info, "Calibration filename set to:\n");
- DBG (DBG_info, ">%s<\n", s->dev->calib_file);
+ /* here is the place to fetch a stored calibration cache */
+ tmpstr=calibration_filename(s->dev);
+ s->val[OPT_CALIBRATION_FILE].s = strdup (tmpstr);
+ s->dev->calib_file = strdup (tmpstr);
+ DBG (DBG_info, "%s: Calibration filename set to:\n", __FUNCTION__);
+ DBG (DBG_info, "%s: >%s<\n", __FUNCTION__, s->dev->calib_file);
+ free(tmpstr);
/* now open file, fetch calibration records */
@@ -6860,7 +7006,7 @@ sane_close (SANE_Handle handle)
"sane_close: failed to enable power saving mode: %s\n",
sane_strstatus (status));
}
-
+
/* here is the place to store calibration cache */
write_calibration (s->dev);
@@ -6903,13 +7049,12 @@ sane_close (SANE_Handle handle)
/* LAMP OFF : same register across all the ASICs */
sanei_genesys_write_register (s->dev, 0x03, 0x00);
- /* we need this to avoid ASIC getting stuck
+ /* clear before closing */
+ sanei_usb_clear_halt (s->dev->dn);
+
+ /* we need this to avoid these ASIC getting stuck
* in bulk writes */
- if(s->dev->model->asic_type==GENESYS_GL847
- ||s->dev->model->asic_type==GENESYS_GL845
- ||s->dev->model->asic_type==GENESYS_GL845
- ||s->dev->model->asic_type==GENESYS_GL843)
- sanei_usb_reset (s->dev->dn);
+ sanei_usb_reset (s->dev->dn);
sanei_usb_close (s->dev->dn);
free (s);
@@ -7075,37 +7220,35 @@ static SANE_Status set_calibration_value (Genesys_Scanner * s, int option, void
{
SANE_Status status=SANE_STATUS_GOOD;
char *tmp;
- Genesys_Calibration_Cache *cache;
Genesys_Device *dev=s->dev;
+ DBGSTART;
+
/* try to load file */
tmp=dev->calib_file;
dev->calib_file=val;
status=sanei_genesys_read_calibration (dev);
-
- /* file exists but is invalid */
+
+ /* file exists but is invalid, so fall back to previous cache file
+ * an re-read it */
if (status!=SANE_STATUS_IO_ERROR && status!=SANE_STATUS_GOOD)
{
dev->calib_file=tmp;
+ status=sanei_genesys_read_calibration (dev);
return status;
}
- /* we can set no file name value */
+ /* now we can set file name value */
if (s->val[option].s)
free (s->val[option].s);
s->val[option].s = strdup (val);
if (tmp)
free (tmp);
dev->calib_file = strdup (val);
+ DBG (DBG_info, "%s: Calibration filename set to:\n", __FUNCTION__);
+ DBG (DBG_info, "%s: >%s<\n", __FUNCTION__, s->dev->calib_file);
- /* clear device calibration cache */
- while(dev->calibration_cache!=NULL)
- {
- cache=dev->calibration_cache;
- dev->calibration_cache=dev->calibration_cache->next;
- free(cache);
- }
-
+ DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -7300,6 +7443,7 @@ set_option_value (Genesys_Scanner * s, int option, void *val,
RIE(set_calibration_value (s, option, val));
break;
case OPT_LAMP_OFF_TIME:
+ case OPT_EXPIRATION_TIME:
if (*(SANE_Word *) val != s->val[option].w)
{
s->val[option].w = *(SANE_Word *) val;
@@ -7617,27 +7761,27 @@ sane_start (SANE_Handle handle)
return status;
}
}
-
+
/* deskew image if required */
if(s->val[OPT_SWDESKEW].b == SANE_TRUE)
{
RIE(genesys_deskew(s));
}
-
+
/* despeck image if required */
if(s->val[OPT_SWDESPECK].b == SANE_TRUE)
{
RIE(genesys_despeck(s));
}
-
+
/* crop image if required */
- if(s->val[OPT_SWCROP].b == SANE_TRUE)
+ if(s->val[OPT_SWCROP].b == SANE_TRUE)
{
RIE(genesys_crop(s));
}
-
+
/* de-rotate image if required */
- if(s->val[OPT_SWDEROTATE].b == SANE_TRUE)
+ if(s->val[OPT_SWDEROTATE].b == SANE_TRUE)
{
RIE(genesys_derotate(s));
}
@@ -7661,7 +7805,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
DBG (DBG_error, "sane_read: handle is null!\n");
return SANE_STATUS_INVAL;
}
-
+
dev=s->dev;
if (!dev)
{
@@ -7694,7 +7838,7 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
DBG (DBG_io2, "sane_read: bytes_to_read=%lu, total_bytes_read=%lu\n",
(u_long) dev->total_bytes_to_read, (u_long) dev->total_bytes_read);
DBG (DBG_io2, "sane_read: physical bytes to read = %lu\n", (u_long) dev->read_bytes_left);
-
+
if(dev->total_bytes_read>=dev->total_bytes_to_read)
{
DBG (DBG_proc, "sane_read: nothing more to scan: EOF\n");
@@ -7776,11 +7920,11 @@ sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len,
*len = local_len;
if(local_len>(size_t)max_len)
{
- fprintf (stderr, "[genesys] sane_read: returning incorrect length!!\n");
+ fprintf (stderr, "[genesys] sane_read: returning incorrect length!!\n");
}
DBG (DBG_proc, "sane_read: %d bytes returned\n", *len);
return status;
-}
+}
void
sane_cancel (SANE_Handle handle)
diff --git a/backend/genesys.conf.in b/backend/genesys.conf.in
index 58cb351..7899455 100644
--- a/backend/genesys.conf.in
+++ b/backend/genesys.conf.in
@@ -36,6 +36,9 @@ usb 0x04a9 0x2213
# Canon LiDE 60
usb 0x04a9 0x221c
+# Canon LiDE 80
+usb 0x04a9 0x2214
+
# Canon 4400F
usb 0x04a9 0x2228
@@ -57,6 +60,12 @@ usb 0x04a9 0x1907
# Canon LiDE 210
usb 0x04a9 0x190a
+# Canon LiDE 120
+usb 0x04a9 0x190e
+
+# Canon LiDE 220
+usb 0x04a9 0x190f
+
# Canon 5600f
usb 0x04a9 0x1906
diff --git a/backend/genesys.h b/backend/genesys.h
index 4d5fd94..eab92bb 100644
--- a/backend/genesys.h
+++ b/backend/genesys.h
@@ -4,44 +4,44 @@
Copyright (C) 2005-2013 Stephane Voltz <stef.dev@free.fr>
Copyright (C) 2006 Laurent Charpentier <laurent_pubs@yahoo.com>
Copyright (C) 2009 Pierre Willenbrock <pierre@pirsoft.dnsalias.org>
-
+
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
-
+
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#ifndef GENESYS_H
@@ -49,6 +49,16 @@
#include "genesys_low.h"
+#ifndef PATH_MAX
+# define PATH_MAX 1024
+#endif
+
+#if defined(_WIN32) || defined(HAVE_OS2_H)
+# define PATH_SEP '\\'
+#else
+# define PATH_SEP '/'
+#endif
+
#define ENABLE(OPTION) s->opt[OPTION].cap &= ~SANE_CAP_INACTIVE
#define DISABLE(OPTION) s->opt[OPTION].cap |= SANE_CAP_INACTIVE
@@ -110,6 +120,7 @@ enum Genesys_Option
OPT_DISABLE_INTERPOLATION,
OPT_COLOR_FILTER,
OPT_CALIBRATION_FILE,
+ OPT_EXPIRATION_TIME,
OPT_SENSOR_GROUP,
OPT_SCAN_SW,
@@ -146,4 +157,9 @@ typedef struct Genesys_Scanner
SANE_Int bpp_list[5]; /**< */
} Genesys_Scanner;
+#ifdef UNIT_TESTING
+SANE_Status genesys_dark_white_shading_calibration (Genesys_Device * dev);
+char *calibration_filename(Genesys_Device *currdev);
+void add_device(Genesys_Device *dev);
+#endif
#endif /* not GENESYS_H */
diff --git a/backend/genesys_conv.c b/backend/genesys_conv.c
index 61ac782..0346ad6 100644
--- a/backend/genesys_conv.c
+++ b/backend/genesys_conv.c
@@ -4,42 +4,42 @@
Copyright (C) 2010-2013 Stphane Voltz <stef.dev@free.fr>
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
/*
@@ -79,9 +79,9 @@
static SANE_Status
genesys_reverse_bits(
- uint8_t *src_data,
- uint8_t *dst_data,
- size_t bytes)
+ uint8_t *src_data,
+ uint8_t *dst_data,
+ size_t bytes)
{
size_t i;
for(i = 0; i < bytes; i++) {
@@ -105,7 +105,7 @@ binarize_line(Genesys_Device * dev, uint8_t *src, uint8_t *dst, int width)
int thresh;
int offset, addCol, dropCol;
unsigned char mask;
-
+
int x;
uint8_t min, max;
@@ -186,8 +186,8 @@ binarize_line(Genesys_Device * dev, uint8_t *src, uint8_t *dst, int width)
static SANE_Status
genesys_gray_lineart(
Genesys_Device *dev,
- uint8_t *src_data,
- uint8_t *dst_data,
+ uint8_t *src_data,
+ uint8_t *dst_data,
size_t pixels,
size_t lines,
uint8_t threshold)
@@ -211,14 +211,14 @@ genesys_gray_lineart(
* or grows it in case it is the opposite like when motor resolution is higher than
* sensor's one.
*/
-static SANE_Status
+static SANE_Status
genesys_shrink_lines_1 (
- uint8_t *src_data,
- uint8_t *dst_data,
- unsigned int lines,
+ uint8_t *src_data,
+ uint8_t *dst_data,
+ unsigned int lines,
unsigned int src_pixels,
- unsigned int dst_pixels,
- unsigned int channels)
+ unsigned int dst_pixels,
+ unsigned int channels)
{
unsigned int dst_x, src_x, y, c, cnt;
unsigned int avg[3], val;
@@ -383,7 +383,7 @@ genesys_deskew(Genesys_Scanner *s)
double slope = 0;
DBG (DBG_proc, "%s: start\n", __FUNCTION__);
-
+
bg=0;
if(s->params.format==SANE_FRAME_GRAY && s->params.depth == 1)
{
@@ -402,7 +402,7 @@ genesys_deskew(Genesys_Scanner *s)
return SANE_STATUS_GOOD;
}
DBG(DBG_info, "%s: slope=%f => %f\n",__FUNCTION__,slope, (slope/M_PI_2)*90);
- /* rotate image slope is in [-PI/2,PI/2]
+ /* rotate image slope is in [-PI/2,PI/2]
* positive values rotate trigonometric direction wise */
status = sanei_magic_rotate (&s->params,
dev->img_buffer,
diff --git a/backend/genesys_conv_hlp.c b/backend/genesys_conv_hlp.c
index cae4116..7663a87 100644
--- a/backend/genesys_conv_hlp.c
+++ b/backend/genesys_conv_hlp.c
@@ -3,54 +3,54 @@
Copyright (C) 2005 Pierre Willenbrock <pierre@pirsoft.dnsalias.org>
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
/*
* Conversion filters for genesys backend
*/
-static SANE_Status
+static SANE_Status
FUNC_NAME(genesys_reorder_components_cis) (
- uint8_t *src_data,
- uint8_t *dst_data,
- unsigned int lines,
- unsigned int pixels)
+ uint8_t *src_data,
+ uint8_t *dst_data,
+ unsigned int lines,
+ unsigned int pixels)
{
unsigned int x, y;
uint8_t *src[3];
@@ -97,12 +97,12 @@ FUNC_NAME(genesys_reorder_components_cis) (
return SANE_STATUS_GOOD;
}
-static SANE_Status
+static SANE_Status
FUNC_NAME(genesys_reorder_components_cis_bgr) (
- uint8_t *src_data,
- uint8_t *dst_data,
- unsigned int lines,
- unsigned int pixels)
+ uint8_t *src_data,
+ uint8_t *dst_data,
+ unsigned int lines,
+ unsigned int pixels)
{
unsigned int x, y;
uint8_t *src[3];
@@ -148,12 +148,12 @@ FUNC_NAME(genesys_reorder_components_cis_bgr) (
return SANE_STATUS_GOOD;
}
-static SANE_Status
+static SANE_Status
FUNC_NAME(genesys_reorder_components_bgr) (
- uint8_t *src_data,
- uint8_t *dst_data,
- unsigned int lines,
- unsigned int pixels)
+ uint8_t *src_data,
+ uint8_t *dst_data,
+ unsigned int lines,
+ unsigned int pixels)
{
unsigned int c;
uint8_t *src = src_data;
@@ -190,13 +190,13 @@ FUNC_NAME(genesys_reorder_components_bgr) (
}
#if defined(DOUBLE_BYTE) && defined(WORDS_BIGENDIAN)
-static SANE_Status
+static SANE_Status
FUNC_NAME(genesys_reorder_components_endian) (
- uint8_t *src_data,
- uint8_t *dst_data,
- unsigned int lines,
+ uint8_t *src_data,
+ uint8_t *dst_data,
+ unsigned int lines,
unsigned int pixels,
- unsigned int channels)
+ unsigned int channels)
{
unsigned int c;
uint8_t *src = src_data;
@@ -212,14 +212,14 @@ return SANE_STATUS_GOOD;
#endif /*defined(DOUBLE_BYTE) && defined(WORDS_BIGENDIAN)*/
-static SANE_Status
+static SANE_Status
FUNC_NAME(genesys_reverse_ccd) (
- uint8_t *src_data,
- uint8_t *dst_data,
- unsigned int lines,
+ uint8_t *src_data,
+ uint8_t *dst_data,
+ unsigned int lines,
unsigned int components_per_line,
unsigned int *ccd_shift,
- unsigned int component_count)
+ unsigned int component_count)
{
unsigned int x, y, c;
COMPONENT_TYPE *src = (COMPONENT_TYPE *)src_data;
@@ -229,8 +229,8 @@ FUNC_NAME(genesys_reverse_ccd) (
unsigned int pitch = components_per_line;
unsigned int ccd_shift_pitch[12];
unsigned int *csp;
-
- for (c = 0; c < component_count; c++)
+
+ for (c = 0; c < component_count; c++)
ccd_shift_pitch[c] = ccd_shift[c] * pitch;
/*
@@ -239,7 +239,7 @@ FUNC_NAME(genesys_reverse_ccd) (
into the cpu cache for maximum efficiency. our lines take
maximum 252kb(3 channels, 16bit, 2400dpi, full gl841 shading range)
* instruction efficiency:
- the innermost loop runs long and consists of 3 adds, one compare,
+ the innermost loop runs long and consists of 3 adds, one compare,
2 derefences.
*/
/*
@@ -258,7 +258,7 @@ FUNC_NAME(genesys_reverse_ccd) (
src += pitch;
}
*/
-/*
+/*
* cache efficency:
here only line_dist_pitch needs to stay in cache. 12*4 = 48 bytes
* instruction efficiency:
@@ -281,14 +281,14 @@ FUNC_NAME(genesys_reverse_ccd) (
return SANE_STATUS_GOOD;
}
-static SANE_Status
+static SANE_Status
FUNC_NAME(genesys_shrink_lines) (
- uint8_t *src_data,
- uint8_t *dst_data,
- unsigned int lines,
+ uint8_t *src_data,
+ uint8_t *dst_data,
+ unsigned int lines,
unsigned int src_pixels,
- unsigned int dst_pixels,
- unsigned int channels)
+ unsigned int dst_pixels,
+ unsigned int channels)
{
unsigned int dst_x, src_x, y, c, cnt;
unsigned int avg[3];
@@ -329,11 +329,11 @@ FUNC_NAME(genesys_shrink_lines) (
for (src_x = 0; src_x < src_pixels; src_x++) {
for (c = 0; c < channels; c++)
avg[c] = *src++;
- while ((cnt < dst_pixels || src_x + 1 == src_pixels) &&
+ while ((cnt < dst_pixels || src_x + 1 == src_pixels) &&
dst_x < dst_pixels) {
cnt += src_pixels;
- for (c = 0; c < channels; c++)
+ for (c = 0; c < channels; c++)
*dst++ = avg[c];
dst_x++;
}
diff --git a/backend/genesys_devices.c b/backend/genesys_devices.c
index fb3cd43..775ffb6 100644
--- a/backend/genesys_devices.c
+++ b/backend/genesys_devices.c
@@ -11,44 +11,44 @@
xerox travelscan device entry
Copyright (C) 2010 Chris Berry <s0457957@sms.ed.ac.uk> and Michael Rickmann <mrickma@gwdg.de>
for Plustek Opticbook 3600 support
-
+
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
-
+
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
/* ------------------------------------------------------------------------ */
@@ -81,7 +81,7 @@ static Genesys_Frontend Wolfson[] = {
, /* 2: ST24 */
{DAC_WOLFSON_5345,{0x00, 0x03, 0x05, 0x12}
, {0x00, 0x00, 0x00}
- , {0xb8, 0xb8, 0xb8}
+ , {0xb8, 0xb8, 0xb8}
, {0x04, 0x04, 0x04}
, {0x00, 0x00, 0x00}
}
@@ -114,10 +114,10 @@ static Genesys_Frontend Wolfson[] = {
{0x58, 0x80, 0x00, 0x00} /* reg1=0x80 ? */
, {0x00, 0x00, 0x00}
, {0x09, 0x09, 0x09}
- , {0x09, 0x09, 0x09}
+ , {0x09, 0x09, 0x09}
, {0x00, 0x00, 0x00}
}
- ,
+ ,
{DAC_WOLFSON_XP300,{0x00, 0x35, 0x20, 0x14} /* 7: XP300 */
, {0x00, 0x00, 0x00}
, {0xe1, 0xe1, 0xe1}
@@ -125,7 +125,7 @@ static Genesys_Frontend Wolfson[] = {
, {0x07, 0x00, 0x00}
}
, /* 8: HP3670 */
- {DAC_WOLFSON_HP3670,
+ {DAC_WOLFSON_HP3670,
/* reg0 reg1 reg2 reg3 */
{0x00, 0x03, 0x05, 0x32} /* reg3=0x32 for 100-300 dpi, 0x12 at 1200 */
, {0x00, 0x00, 0x00} /* sign */
@@ -160,7 +160,7 @@ static Genesys_Frontend Wolfson[] = {
{DAC_KVSS080,
{0x00, 0x23, 0x24, 0x0f}
, {0x00, 0x00, 0x00}
- , {0x80, 0x80, 0x80}
+ , {0x80, 0x80, 0x80}
, {0x4b, 0x4b, 0x4b}
, {0x00,0x00,0x00}
}
@@ -211,12 +211,23 @@ static Genesys_Frontend Wolfson[] = {
, {0x00, 0x00, 0x00} /* 0x20, 0x21, 0x22 */
, {0x00, 0x00, 0x00} /* 0x28, 0x29, 0x2a */
, {0x00, 0x00, 0x00}
- }
+ },
+ {DAC_CANONLIDE80,
+ /* reg0: control 74 data, 70 no data
+ * reg3: offset
+ * reg6: gain
+ * reg0 , reg3, reg6 */
+ {0x70, 0x16, 0x60, 0x00}
+ , {0x00, 0x00, 0x00}
+ , {0x00, 0x00, 0x00}
+ , {0x00, 0x00, 0x00}
+ , {0x00, 0x00, 0x00}
+ }
};
/** for setting up the sensor-specific settings:
- * Optical Resolution, number of black pixels, number of dummy pixels,
+ * Optical Resolution, number of black pixels, number of dummy pixels,
* CCD_start_xoffset, and overall number of sensor pixels
* registers 0x08-0x0b, 0x10-0x1d and 0x52-0x5e
*/
@@ -294,13 +305,14 @@ static Genesys_Sensor Sensor[] = {
}
,
/* CANOLIDE35 */
- {CCD_CANONLIDE35, 1200,
- 87, /*(black) */
+ {CCD_CANONLIDE35,
+ 1200,
+ 87, /* (black) */
87, /* (dummy) */
0, /* (startxoffset) */
- 10400, /*sensor_pixels */
- 210,
- 200,
+ 10400, /* sensor_pixels */
+ 0,
+ 0,
{0x00, 0x00, 0x00, 0x00},
{0x04, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x02, 0x00, 0x50,
0x00, 0x00, 0x00, 0x02 /* TODO(these do no harm, but may be neccessery for CCD) */
@@ -349,7 +361,7 @@ static Genesys_Sensor Sensor[] = {
200,
{0x00, 0x00, 0x00, 0x00},
{0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x02, 0x04, 0x50,
- 0x10, 0x00, 0x20, 0x02
+ 0x10, 0x00, 0x20, 0x02
},
{0x04, 0x05,
0x00, 0x00, 0x00, 0x00, /*[GB](HI|LOW) not needed for cis */
@@ -372,7 +384,7 @@ static Genesys_Sensor Sensor[] = {
200,
{0x00, 0x00, 0x00, 0x00},
{0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x02, 0x04, 0x50,
- 0x10, 0x00, 0x20, 0x02
+ 0x10, 0x00, 0x20, 0x02
},
{0x04, 0x05,
0x00, 0x00, 0x00, 0x00, /*[GB](HI|LOW) not needed for cis */
@@ -395,7 +407,7 @@ static Genesys_Sensor Sensor[] = {
200,
{0x00, 0x00, 0x00, 0x00},
{0x15, 0x44, 0x15, 0x44, 0x15, 0x44, 0x00, 0x02, 0x04, 0x50,
- 0x10, 0x00, 0x20, 0x02
+ 0x10, 0x00, 0x20, 0x02
},
{0x04, 0x05,
0x00, 0x00, 0x00, 0x00, /*[GB](HI|LOW) not needed for cis */
@@ -418,7 +430,7 @@ static Genesys_Sensor Sensor[] = {
200,
{0x00, 0x00, 0x00, 0x00},
{0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x02, 0x04, 0x50,
- 0x10, 0x00, 0x20, 0x02
+ 0x10, 0x00, 0x20, 0x02
},
{0x04, 0x05,
0x00, 0x00, 0x00, 0x00, /*[GB](HI|LOW) not needed for cis */
@@ -441,7 +453,7 @@ static Genesys_Sensor Sensor[] = {
200,
{0x00, 0x00, 0x00, 0x00},
{0x11, 0x00, 0x11, 0x00, 0x11, 0x00, 0x00, 0x02, 0x04, 0x50,
- 0x10, 0x00, 0x20, 0x02
+ 0x10, 0x00, 0x20, 0x02
},
{0x04, 0x05,
0x00, 0x00, 0x00, 0x00, /*[GB](HI|LOW) not needed for cis */
@@ -471,9 +483,9 @@ static Genesys_Sensor Sensor[] = {
{0x03, 0x07,
0x00, 0x00, 0x00, 0x00,
0x2a, 0xe1,
- 0x55,
- 0x00, 0x00, 0x00,
- 0x41
+ 0x55,
+ 0x00, 0x00, 0x00,
+ 0x41
}
,
{1.7, 1.7, 1.7},
@@ -497,9 +509,9 @@ static Genesys_Sensor Sensor[] = {
{0x07, 0x03,
0x00, 0x00, 0x00, 0x00,
0x2a, 0xe1,
- 0x55,
- 0x00, 0x00, 0x00,
- 0x41
+ 0x55,
+ 0x00, 0x00, 0x00,
+ 0x41
}
,
{1.0, 1.0, 1.0},
@@ -524,9 +536,9 @@ static Genesys_Sensor Sensor[] = {
{0x03, 0x07,
0x00, 0x00, 0x00, 0x00,
0x2a, 0xe1,
- 0x55,
- 0x00, 0x00, 0x00,
- 0x41
+ 0x55,
+ 0x00, 0x00, 0x00,
+ 0x41
}
,
{1.7, 1.7, 1.7},
@@ -648,6 +660,30 @@ static Genesys_Sensor Sensor[] = {
{2.1, 2.1, 2.1},
{NULL, NULL, NULL}}
,
+
+ /* CANONLIDE120 */
+ {CIS_CANONLIDE120,
+ 2400, /* optical resolution */
+ 87, /* black pixels */
+ 16, /* dummy pixels 16 */
+ 303, /* 303 */
+ 5168*4, /* total pixels */
+ 210,
+ 200,
+ {0x00, 0x00, 0x00, 0x00},
+ /* reg 0x10 - 0x15 : EXPR, EXPG and EXPB */
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* reg 0x16 - 0x1d */
+ 0x10, 0x04, 0x00, 0x01, 0x30, 0x00, 0x02, 0x01 },
+ /* reg 0x52 - 0x5e */
+ {
+ 0x00, 0x02, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04,
+ 0x1a, 0x00, 0xc0, 0x00, 0x00
+ }
+ ,
+ {2.1, 2.1, 2.1},
+ {NULL, NULL, NULL}}
+ ,
/* CANON LIDE 210 sensor */
{CIS_CANONLIDE210,
2400, /* optical resolution */
@@ -671,6 +707,29 @@ static Genesys_Sensor Sensor[] = {
{2.1, 2.1, 2.1},
{NULL, NULL, NULL}}
,
+ /* CANON LIDE 220 sensor */
+ {CIS_CANONLIDE220,
+ 2400, /* optical resolution */
+ 87, /* black pixels */
+ 16, /* dummy pixels 16 */
+ 303, /* 303 */
+ 5168*4, /* total pixels */
+ 210,
+ 200,
+ {0x00, 0x00, 0x00, 0x00},
+ /* reg 0x10 - 0x15 : EXPR, EXPG and EXPB */
+ {0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ /* reg 0x16 - 0x1d */
+ 0x10, 0x04, 0x00, 0x01, 0x30, 0x00, 0x02, 0x01 },
+ /* reg 0x52 - 0x5e */
+ {
+ 0x00, 0x02, 0x04, 0x06, 0x04, 0x04, 0x04, 0x04,
+ 0x1a, 0x00, 0xc0, 0x00, 0x00
+ }
+ ,
+ {2.1, 2.1, 2.1},
+ {NULL, NULL, NULL}}
+ ,
{CCD_PLUSTEK_3600,
1200,
87, /*(black) */
@@ -696,8 +755,8 @@ static Genesys_Sensor Sensor[] = {
/* Canon Image formula 101 */
{CCD_IMG101,
1200, /* optical resolution */
- 31,
- 31,
+ 31,
+ 31,
0,
10800,
210,
@@ -711,9 +770,9 @@ static Genesys_Sensor Sensor[] = {
{0x02, 0x04,
0x06, 0x08, 0x0a, 0x00,
0x59, 0x31,
- 0x40,
- 0x00, 0x00, 0x00,
- 0x1f
+ 0x40,
+ 0x00, 0x00, 0x00,
+ 0x1f
}
,
{1.7, 1.7, 1.7},
@@ -723,8 +782,8 @@ static Genesys_Sensor Sensor[] = {
/* Plustek OpticBook 3800 */
{CCD_PLUSTEK3800,
1200, /* optical resolution */
- 31,
- 31,
+ 31,
+ 31,
0,
10200,
210,
@@ -738,14 +797,31 @@ static Genesys_Sensor Sensor[] = {
{0x02, 0x04,
0x06, 0x08, 0x0a, 0x00,
0x59, 0x31,
- 0x40,
- 0x00, 0x00, 0x00,
- 0x1f
+ 0x40,
+ 0x00, 0x00, 0x00,
+ 0x1f
}
,
{1.7, 1.7, 1.7},
{NULL, NULL, NULL}
- }
+ },
+ /* CANOLIDE80 */
+ {CIS_CANONLIDE80,
+ 1200, /* real hardware limit is 2400 */
+ 20, /* black pixels */
+ 6, /* expdummy 6 */
+ /* tuned to give 3*8 multiple startx coordinate during shading calibration */
+ 34, /* CCD_start_xoffset 14=>3, 20=>2 */
+ 10240, /* 10400, too wide=>10288 in shading data 10240~, 10208 too short for shading, max shading data = 10240 pixels, endpix-startpix=10208 */
+ 150,
+ 150,
+ {0x00, 0x05, 0x07, 0x09}, /* in fact ,maps to 0x70-0x73 for GL841 */
+ /* [0x10-0x15] values are initial led exposure values */
+ /* 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d*/
+ {0x10, 0x00, 0x10, 0x00, 0x05, 0x00, 0x00, 0x01, 0x00, 0x06, 0x00, 0x00, 0x00, 0x04},
+ {0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x29, 0x69, 0x55, 0x00, 0x00, 0x20, 0x41} ,
+ {1.0, 1.0, 1.0},
+ {NULL, NULL, NULL}}
};
/** for General Purpose Output specific settings:
@@ -804,7 +880,7 @@ static Genesys_Gpo Gpo[] = {
,
/* CANONLIDE35 */
{GPO_CANONLIDE35,
- {0x12, 0x80}
+ {0x02, 0x80}
,
{0xef, 0x80}
,
@@ -909,6 +985,12 @@ static Genesys_Gpo Gpo[] = {
{GPO_PLUSTEK3800,
{0x41, 0xa4},
{0x13, 0xa7}
+ },
+ /* Canon LiDE 80 */
+ {
+ GPO_CANONLIDE80,
+ {0x28, 0x90}, /* 6c, 6d */
+ {0x75, 0x80}, /* 6e, 6f */
}
};
@@ -919,7 +1001,7 @@ static Genesys_Motor Motor[] = {
2400, /* maximum motor resolution */
1, /* maximum step mode */
1, /* number of power modes*/
- {{{
+ {{{
11000, /* maximum start speed */
3000, /* maximum end speed */
128, /* step count */
@@ -937,7 +1019,7 @@ static Genesys_Motor Motor[] = {
2400,
1,
1,
- {{{
+ {{{
2000,
1375,
128,
@@ -966,7 +1048,7 @@ static Genesys_Motor Motor[] = {
2100,
128,
0.3,
- },},},
+ },},},
},
{MOTOR_HP3670, /* HP 3670 */
1200,
@@ -1027,18 +1109,8 @@ static Genesys_Motor Motor[] = {
2400,
1,
1,
- {{{
- 3500,
- 1300,
- 60,
- 0.8,
- },
- {
- 3500,
- 1400,
- 60,
- 0.8,
- },},},
+ {{{ 3500, 1300, 60, 0.8, },
+ { 3500, 1400, 60, 0.8, },},},
},
{MOTOR_XP200, /* Strobe XP200 */
600,
@@ -1263,6 +1335,21 @@ static Genesys_Motor Motor[] = {
{ 3500, 3250, 60, 0.8 },
},
},},
+ {MOTOR_CANONLIDE80,
+ 2400, /* 2400 ???? */
+ 4800, /* 9600 ???? */
+ 1, /* max step type */
+ 1, /* power mode count */
+ {
+ { /* start speed, max end speed, step number */
+ /* maximum speed (second field) is used to compute exposure as seen by motor */
+ /* exposure=max speed/ slope dpi * base dpi */
+ /* 5144 = max pixels at 600 dpi */
+ /* 1288=(5144+8)*ydpi(=300)/base_dpi(=1200) , where 5152 is exposure */
+ /* 6440=9660/(1932/1288) */
+ { 9560, 1912, 31, 0.8 },
+ },
+ },},
};
/* here we have the various device settings...
@@ -1296,7 +1383,7 @@ static Genesys_Model umax_astra_4500_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 8, 16, /* RGB CCD Line-distance correction in pixel */
@@ -1323,8 +1410,8 @@ static Genesys_Model canon_lide_50_model = {
GENESYS_GL841,
NULL,
- {1200, 600, 300, 150, 75, 0}, /* possible x-resolutions */
- {2400, 1200, 600, 300, 150, 75, 0}, /* possible y-resolutions */
+ { 1200, 600, 400, 300, 240, 200, 150, 75, 0}, /* possible x-resolutions */
+ {2400, 1200, 600, 400, 300, 240, 200, 150, 75, 0}, /* possible y-resolutions */
{16, 8, 0}, /* possible depths in gray mode */
{16, 8, 0}, /* possible depths in color mode */
@@ -1333,7 +1420,7 @@ static Genesys_Model canon_lide_50_model = {
SANE_FIX (218.0), /* Size of scan area in mm (x) */
SANE_FIX (299.0), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (6.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -1345,7 +1432,7 @@ static Genesys_Model canon_lide_50_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -1359,8 +1446,8 @@ static Genesys_Model canon_lide_50_model = {
GPO_CANONLIDE35,
MOTOR_CANONLIDE35,
GENESYS_FLAG_LAZY_INIT | /* Which flags are needed for this scanner? */
- GENESYS_FLAG_SKIP_WARMUP |
- GENESYS_FLAG_OFFSET_CALIBRATION |
+ GENESYS_FLAG_SKIP_WARMUP |
+ GENESYS_FLAG_OFFSET_CALIBRATION |
GENESYS_FLAG_DARK_WHITE_CALIBRATION |
GENESYS_FLAG_CUSTOM_GAMMA |
GENESYS_FLAG_HALF_CCD_MODE,
@@ -1401,7 +1488,7 @@ static Genesys_Model panasonic_kvss080_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 8, 16, /* RGB CCD Line-distance correction in pixel */
@@ -1452,7 +1539,7 @@ static Genesys_Model hp4850c_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 24, 48, /* RGB CCD Line-distance correction in line number */
@@ -1467,7 +1554,7 @@ static Genesys_Model hp4850c_model = {
DAC_G4050,
GPO_G4050,
MOTOR_G4050,
- GENESYS_FLAG_LAZY_INIT |
+ GENESYS_FLAG_LAZY_INIT |
GENESYS_FLAG_OFFSET_CALIBRATION |
GENESYS_FLAG_STAGGERED_LINE |
GENESYS_FLAG_SKIP_WARMUP |
@@ -1507,7 +1594,7 @@ static Genesys_Model hpg4010_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 24, 48, /* RGB CCD Line-distance correction in line number */
@@ -1522,7 +1609,7 @@ static Genesys_Model hpg4010_model = {
DAC_G4050,
GPO_G4050,
MOTOR_G4050,
- GENESYS_FLAG_LAZY_INIT |
+ GENESYS_FLAG_LAZY_INIT |
GENESYS_FLAG_OFFSET_CALIBRATION |
GENESYS_FLAG_STAGGERED_LINE |
GENESYS_FLAG_SKIP_WARMUP |
@@ -1562,7 +1649,7 @@ static Genesys_Model hpg4050_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 24, 48, /* RGB CCD Line-distance correction in line number */
@@ -1577,7 +1664,7 @@ static Genesys_Model hpg4050_model = {
DAC_G4050,
GPO_G4050,
MOTOR_G4050,
- GENESYS_FLAG_LAZY_INIT |
+ GENESYS_FLAG_LAZY_INIT |
GENESYS_FLAG_OFFSET_CALIBRATION |
GENESYS_FLAG_STAGGERED_LINE |
GENESYS_FLAG_SKIP_WARMUP |
@@ -1618,7 +1705,7 @@ static Genesys_Model canon_4400f_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 24, 48, /* RGB CCD Line-distance correction in line number */
@@ -1634,7 +1721,7 @@ static Genesys_Model canon_4400f_model = {
GPO_CS4400F,
MOTOR_G4050,
GENESYS_FLAG_NO_CALIBRATION |
- GENESYS_FLAG_LAZY_INIT |
+ GENESYS_FLAG_LAZY_INIT |
GENESYS_FLAG_OFFSET_CALIBRATION |
GENESYS_FLAG_STAGGERED_LINE |
GENESYS_FLAG_SKIP_WARMUP |
@@ -1677,7 +1764,7 @@ static Genesys_Model canon_8400f_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 24, 48, /* RGB CCD Line-distance correction in line number */
@@ -1693,7 +1780,7 @@ static Genesys_Model canon_8400f_model = {
GPO_CS8400F,
MOTOR_CS8400F,
GENESYS_FLAG_NO_CALIBRATION |
- GENESYS_FLAG_LAZY_INIT |
+ GENESYS_FLAG_LAZY_INIT |
GENESYS_FLAG_OFFSET_CALIBRATION |
GENESYS_FLAG_STAGGERED_LINE |
GENESYS_FLAG_SKIP_WARMUP |
@@ -1736,7 +1823,7 @@ static Genesys_Model canon_lide_100_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -1748,7 +1835,7 @@ static Genesys_Model canon_lide_100_model = {
CIS_CANONLIDE100,
DAC_CANONLIDE200,
GPO_CANONLIDE200,
- MOTOR_CANONLIDE100,
+ MOTOR_CANONLIDE100,
/* Which flags are needed for this scanner? */
GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_SIS_SENSOR
@@ -1790,7 +1877,7 @@ static Genesys_Model canon_lide_110_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -1802,7 +1889,60 @@ static Genesys_Model canon_lide_110_model = {
CIS_CANONLIDE110,
DAC_CANONLIDE110,
GPO_CANONLIDE110,
- MOTOR_CANONLIDE110,
+ MOTOR_CANONLIDE110,
+ GENESYS_FLAG_SKIP_WARMUP
+ | GENESYS_FLAG_OFFSET_CALIBRATION
+ | GENESYS_FLAG_DARK_CALIBRATION
+ | GENESYS_FLAG_HALF_CCD_MODE
+ | GENESYS_FLAG_SHADING_REPARK
+ | GENESYS_FLAG_CUSTOM_GAMMA,
+ GENESYS_HAS_SCAN_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW | GENESYS_HAS_FILE_SW,
+ 50,
+ 400
+};
+
+static Genesys_Model canon_lide_120_model = {
+ "canon-lide-120", /* Name */
+ "Canon", /* Device vendor string */
+ "LiDE 120", /* Device model name */
+ GENESYS_GL124,
+ NULL,
+
+ {4800, 2400, 1200, 600, 300, 150, 100, 75, 0}, /* possible x-resolutions */
+ {4800, 2400, 1200, 600, 300, 150, 100, 75, 0}, /* possible y-resolutions */
+ {16, 8, 0}, /* possible depths in gray mode */
+ {16, 8, 0}, /* possible depths in color mode */
+
+ SANE_FIX (2.2), /* Start of scan area in mm (x) */
+ SANE_FIX (9.0), /* Start of scan area in mm (y) */
+ SANE_FIX (216.70), /* Size of scan area in mm (x) */
+ SANE_FIX (300.0), /* Size of scan area in mm (y) */
+
+ SANE_FIX (1.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of black mark in mm (x) */
+
+ SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
+ SANE_FIX (0.0), /* Start of scan area in TA mode in mm (y) */
+ SANE_FIX (100.0), /* Size of scan area in TA mode in mm (x) */
+ SANE_FIX (100.0), /* Size of scan area in TA mode in mm (y) */
+
+ SANE_FIX (0.0), /* Start of white strip in TA mode in mm (y) */
+
+ SANE_FIX (0.0), /* Size of scan area after paper sensor stops
+ sensing document in mm */
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ after finishing scanning in mm */
+
+ 0, 0, 0, /* RGB CCD Line-distance correction in pixel */
+
+ COLOR_ORDER_RGB, /* Order of the CCD/CIS colors */
+
+ SANE_TRUE, /* Is this a CIS scanner? */
+ SANE_FALSE, /* Is this a sheetfed scanner? */
+ CIS_CANONLIDE120,
+ DAC_CANONLIDE110,
+ GPO_CANONLIDE110,
+ MOTOR_CANONLIDE110,
GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
| GENESYS_FLAG_DARK_CALIBRATION
@@ -1844,7 +1984,7 @@ static Genesys_Model canon_lide_210_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -1856,7 +1996,60 @@ static Genesys_Model canon_lide_210_model = {
CIS_CANONLIDE210,
DAC_CANONLIDE110,
GPO_CANONLIDE210,
- MOTOR_CANONLIDE210,
+ MOTOR_CANONLIDE210,
+ GENESYS_FLAG_SKIP_WARMUP
+ | GENESYS_FLAG_OFFSET_CALIBRATION
+ | GENESYS_FLAG_DARK_CALIBRATION
+ | GENESYS_FLAG_HALF_CCD_MODE
+ | GENESYS_FLAG_SHADING_REPARK
+ | GENESYS_FLAG_CUSTOM_GAMMA,
+ GENESYS_HAS_SCAN_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_EMAIL_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_EXTRA_SW,
+ 60,
+ 400
+};
+
+static Genesys_Model canon_lide_220_model = {
+ "canon-lide-220", /* Name */
+ "Canon", /* Device vendor string */
+ "LiDE 220", /* Device model name */
+ GENESYS_GL124, /* or a compatible one */
+ NULL,
+
+ {4800, 2400, 1200, 600, 300, 150, 100, 75, 0}, /* possible x-resolutions */
+ {4800, 2400, 1200, 600, 300, 150, 100, 75, 0}, /* possible y-resolutions */
+ {16, 8, 0}, /* possible depths in gray mode */
+ {16, 8, 0}, /* possible depths in color mode */
+
+ SANE_FIX (2.2), /* Start of scan area in mm (x) */
+ SANE_FIX (8.7), /* Start of scan area in mm (y) */
+ SANE_FIX (216.70), /* Size of scan area in mm (x) */
+ SANE_FIX (297.5), /* Size of scan area in mm (y) */
+
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of black mark in mm (x) */
+
+ SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
+ SANE_FIX (0.0), /* Start of scan area in TA mode in mm (y) */
+ SANE_FIX (100.0), /* Size of scan area in TA mode in mm (x) */
+ SANE_FIX (100.0), /* Size of scan area in TA mode in mm (y) */
+
+ SANE_FIX (0.0), /* Start of white strip in TA mode in mm (y) */
+
+ SANE_FIX (0.0), /* Size of scan area after paper sensor stops
+ sensing document in mm */
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ after finishing scanning in mm */
+
+ 0, 0, 0, /* RGB CCD Line-distance correction in pixel */
+
+ COLOR_ORDER_RGB, /* Order of the CCD/CIS colors */
+
+ SANE_TRUE, /* Is this a CIS scanner? */
+ SANE_FALSE, /* Is this a sheetfed scanner? */
+ CIS_CANONLIDE220,
+ DAC_CANONLIDE110,
+ GPO_CANONLIDE210,
+ MOTOR_CANONLIDE210,
GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
| GENESYS_FLAG_DARK_CALIBRATION
@@ -1897,7 +2090,7 @@ static Genesys_Model canon_5600f_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -1950,7 +2143,7 @@ static Genesys_Model canon_lide_700f_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2005,7 +2198,7 @@ static Genesys_Model canon_lide_200_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2047,7 +2240,7 @@ static Genesys_Model canon_lide_60_model = {
SANE_FIX (218.0), /* Size of scan area in mm (x) */
SANE_FIX (299.0), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (6.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -2059,7 +2252,7 @@ static Genesys_Model canon_lide_60_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2076,7 +2269,7 @@ static Genesys_Model canon_lide_60_model = {
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
| GENESYS_FLAG_DARK_WHITE_CALIBRATION
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_HALF_CCD_MODE,
GENESYS_HAS_NO_BUTTONS, /* no buttons supported */
@@ -2084,6 +2277,62 @@ static Genesys_Model canon_lide_60_model = {
400
}; /* this is completely untested -- hmg */
+static Genesys_Model canon_lide_80_model = {
+ "canon-lide-80", /* Name */
+ "Canon", /* Device vendor string */
+ "LiDE 80", /* Device model name */
+ GENESYS_GL841,
+ NULL,
+
+ { 1200, 600, 400, 300, 240, 150, 100, 75, 0}, /* possible x-resolutions */
+ {2400, 1200, 600, 400, 300, 240, 150, 100, 75, 0}, /* possible y-resolutions */
+ {16, 8, 0}, /* possible depths in gray mode */
+ {16, 8, 0}, /* possible depths in color mode */
+ SANE_FIX (0.42), /* Start of scan area in mm (x) 0.42 */
+ SANE_FIX (7.90), /* Start of scan area in mm (y) 7.90 */
+ SANE_FIX (216.07), /* Size of scan area in mm (x) 218.00 */
+ SANE_FIX (299.0), /* Size of scan area in mm (y) */
+
+ SANE_FIX (4.5), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of black mark in mm (x) */
+
+ SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
+ SANE_FIX (0.0), /* Start of scan area in TA mode in mm (y) */
+ SANE_FIX (100.0), /* Size of scan area in TA mode in mm (x) */
+ SANE_FIX (100.0), /* Size of scan area in TA mode in mm (y) */
+
+ SANE_FIX (0.0), /* Start of white strip in TA mode in mm (y) */
+
+ SANE_FIX (0.0), /* Size of scan area after paper sensor stops
+ sensing document in mm */
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ after finishing scanning in mm */
+
+ 0, 0, 0, /* RGB CCD Line-distance correction in pixel */
+
+ COLOR_ORDER_RGB, /* Order of the CCD/CIS colors */
+
+ SANE_TRUE, /* Is this a CIS scanner? */
+ SANE_FALSE, /* Is this a sheetfed scanner? */
+ CIS_CANONLIDE80,
+ DAC_CANONLIDE80,
+ GPO_CANONLIDE80,
+ MOTOR_CANONLIDE80,
+ GENESYS_FLAG_LAZY_INIT | /* Which flags are needed for this scanner? */
+ GENESYS_FLAG_SKIP_WARMUP |
+ GENESYS_FLAG_OFFSET_CALIBRATION |
+ GENESYS_FLAG_DARK_WHITE_CALIBRATION |
+ GENESYS_FLAG_CUSTOM_GAMMA |
+ GENESYS_FLAG_HALF_CCD_MODE,
+ GENESYS_HAS_SCAN_SW |
+ GENESYS_HAS_FILE_SW |
+ GENESYS_HAS_EMAIL_SW |
+ GENESYS_HAS_COPY_SW,
+ 160, /* 280 @2400 */
+ 400
+};
+
+
static Genesys_Model hp2300c_model = {
"hewlett-packard-scanjet-2300c", /* Name */
"Hewlett Packard", /* Device vendor string */
@@ -2113,7 +2362,7 @@ static Genesys_Model hp2300c_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
16, 8, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2139,7 +2388,7 @@ static Genesys_Model hp2300c_model = {
132
};
-static
+static
Genesys_Model hp2400c_model = {
"hewlett-packard-scanjet-2400c", /* Name */
"Hewlett Packard", /* Device vendor string */
@@ -2169,7 +2418,7 @@ Genesys_Model hp2400c_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 24, 48, /* RGB CCD Line-distance correction in pixel */
@@ -2194,7 +2443,7 @@ Genesys_Model hp2400c_model = {
132
};
-static
+static
Genesys_Model visioneer_xp200_model = {
"visioneer-strobe-xp200", /* Name */
"Visioneer", /* Device vendor string */
@@ -2224,7 +2473,7 @@ Genesys_Model visioneer_xp200_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2277,7 +2526,7 @@ static Genesys_Model hp3670c_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 24, 48, /* RGB CCD Line-distance correction in pixel */
@@ -2331,7 +2580,7 @@ static Genesys_Model plustek_st12_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 8, 16, /* RGB CCD Line-distance correction in pixel */
@@ -2379,7 +2628,7 @@ static Genesys_Model plustek_st24_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 8, 16, /* RGB CCD Line-distance correction in pixel */
@@ -2395,7 +2644,7 @@ static Genesys_Model plustek_st24_model = {
GENESYS_FLAG_UNTESTED
| GENESYS_FLAG_14BIT_GAMMA
| GENESYS_FLAG_LAZY_INIT
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_SEARCH_START
| GENESYS_FLAG_OFFSET_CALIBRATION,
GENESYS_HAS_NO_BUTTONS, /* no buttons supported */
@@ -2432,7 +2681,7 @@ static Genesys_Model medion_md5345_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
48, 24, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2475,7 +2724,7 @@ static Genesys_Model visioneer_xp300_model = {
SANE_FIX (435.0), /* Size of scan area in mm (x) */
SANE_FIX (511), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -2487,9 +2736,9 @@ static Genesys_Model visioneer_xp300_model = {
SANE_FIX (26.5), /* Size of scan area after paper sensor stops
sensing document in mm */
- /* this is larger than needed -- accounts for second sensor head, which is a
+ /* this is larger than needed -- accounts for second sensor head, which is a
calibration item */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2540,7 +2789,7 @@ static Genesys_Model syscan_docketport_665_model = {
SANE_FIX (17.5), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2580,7 +2829,7 @@ static Genesys_Model visioneer_roadwarrior_model = {
SANE_FIX (220.0), /* Size of scan area in mm (x) */
SANE_FIX (511), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -2592,7 +2841,7 @@ static Genesys_Model visioneer_roadwarrior_model = {
SANE_FIX (16.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2608,7 +2857,7 @@ static Genesys_Model visioneer_roadwarrior_model = {
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_DARK_CALIBRATION,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE,
100,
@@ -2632,7 +2881,7 @@ static Genesys_Model syscan_docketport_465_model = {
SANE_FIX (220.0), /* Size of scan area in mm (x) */
SANE_FIX (511), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -2644,7 +2893,7 @@ static Genesys_Model syscan_docketport_465_model = {
SANE_FIX (16.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2660,7 +2909,7 @@ static Genesys_Model syscan_docketport_465_model = {
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_NO_CALIBRATION
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_UNTESTED,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW,
300,
@@ -2684,7 +2933,7 @@ static Genesys_Model visioneer_xp100_r3_model = {
SANE_FIX (220.0), /* Size of scan area in mm (x) */
SANE_FIX (511), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -2696,7 +2945,7 @@ static Genesys_Model visioneer_xp100_r3_model = {
SANE_FIX (16.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2712,7 +2961,7 @@ static Genesys_Model visioneer_xp100_r3_model = {
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_DARK_CALIBRATION,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE,
100,
@@ -2736,7 +2985,7 @@ static Genesys_Model pentax_dsmobile_600_model = {
SANE_FIX (220.0), /* Size of scan area in mm (x) */
SANE_FIX (511), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -2748,7 +2997,7 @@ static Genesys_Model pentax_dsmobile_600_model = {
SANE_FIX (16.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2764,7 +3013,7 @@ static Genesys_Model pentax_dsmobile_600_model = {
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_DARK_CALIBRATION,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE,
100,
@@ -2788,7 +3037,7 @@ static Genesys_Model syscan_docketport_467_model = {
SANE_FIX (220.0), /* Size of scan area in mm (x) */
SANE_FIX (511), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -2800,7 +3049,7 @@ static Genesys_Model syscan_docketport_467_model = {
SANE_FIX (16.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2816,7 +3065,7 @@ static Genesys_Model syscan_docketport_467_model = {
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_DARK_CALIBRATION,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE,
100,
@@ -2840,7 +3089,7 @@ static Genesys_Model syscan_docketport_685_model = {
SANE_FIX (212.0), /* Size of scan area in mm (x) */
SANE_FIX (500), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -2852,9 +3101,9 @@ static Genesys_Model syscan_docketport_685_model = {
SANE_FIX (26.5), /* Size of scan area after paper sensor stops
sensing document in mm */
- /* this is larger than needed -- accounts for second sensor head, which is a
+ /* this is larger than needed -- accounts for second sensor head, which is a
calibration item */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2869,7 +3118,7 @@ static Genesys_Model syscan_docketport_685_model = {
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_DARK_CALIBRATION,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE,
100,
@@ -2893,7 +3142,7 @@ static Genesys_Model syscan_docketport_485_model = {
SANE_FIX (435.0), /* Size of scan area in mm (x) */
SANE_FIX (511), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -2905,9 +3154,9 @@ static Genesys_Model syscan_docketport_485_model = {
SANE_FIX (26.5), /* Size of scan area after paper sensor stops
sensing document in mm */
- /* this is larger than needed -- accounts for second sensor head, which is a
+ /* this is larger than needed -- accounts for second sensor head, which is a
calibration item */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2922,7 +3171,7 @@ static Genesys_Model syscan_docketport_485_model = {
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_DARK_CALIBRATION,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE,
100,
@@ -2946,7 +3195,7 @@ static Genesys_Model dct_docketport_487_model = {
SANE_FIX (435.0), /* Size of scan area in mm (x) */
SANE_FIX (511), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -2958,9 +3207,9 @@ static Genesys_Model dct_docketport_487_model = {
SANE_FIX (26.5), /* Size of scan area after paper sensor stops
sensing document in mm */
- /* this is larger than needed -- accounts for second sensor head, which is a
+ /* this is larger than needed -- accounts for second sensor head, which is a
calibration item */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -2976,7 +3225,7 @@ static Genesys_Model dct_docketport_487_model = {
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
| GENESYS_FLAG_DARK_CALIBRATION
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_UNTESTED,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE,
100,
@@ -3012,7 +3261,7 @@ static Genesys_Model visioneer_7100_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
48, 24, 0, /* RGB CCD Line-distance correction in pixel */
@@ -3067,7 +3316,7 @@ static Genesys_Model xerox_2400_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
48, 24, 0, /* RGB CCD Line-distance correction in pixel */
@@ -3111,7 +3360,7 @@ static Genesys_Model xerox_travelscanner_model = {
SANE_FIX (220.0), /* Size of scan area in mm (x) */
SANE_FIX (511), /* Size of scan area in mm (y) */
- SANE_FIX (3.0), /* Start of white strip in mm (y) */
+ SANE_FIX (0.0), /* Start of white strip in mm (y) */
SANE_FIX (0.0), /* Start of black mark in mm (x) */
SANE_FIX (0.0), /* Start of scan area in TA mode in mm (x) */
@@ -3123,7 +3372,7 @@ static Genesys_Model xerox_travelscanner_model = {
SANE_FIX (16.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 0, 0, /* RGB CCD Line-distance correction in pixel */
@@ -3139,7 +3388,7 @@ static Genesys_Model xerox_travelscanner_model = {
GENESYS_FLAG_LAZY_INIT /* Which flags are needed for this scanner? */
| GENESYS_FLAG_SKIP_WARMUP
| GENESYS_FLAG_OFFSET_CALIBRATION
- | GENESYS_FLAG_CUSTOM_GAMMA
+ | GENESYS_FLAG_CUSTOM_GAMMA
| GENESYS_FLAG_DARK_CALIBRATION,
GENESYS_HAS_SCAN_SW | GENESYS_HAS_PAGE_LOADED_SW | GENESYS_HAS_CALIBRATE,
100,
@@ -3176,7 +3425,7 @@ static Genesys_Model plustek_3600_model = {
sensing document in mm */
SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
-
+
0, 24, 48, /* RGB CCD Line-distance correction in pixel */
COLOR_ORDER_RGB, /* Order of the CCD/CIS colors */
@@ -3199,7 +3448,7 @@ static Genesys_Model plustek_3600_model = {
7,
200
};
-
+
static Genesys_Model hpn6310_model = {
"hewlett-packard-scanjet-N6310", /* Name */
"Hewlett Packard", /* Device vendor string */
@@ -3288,7 +3537,7 @@ static Genesys_Model plustek_3800_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 24, 48, /* RGB CCD Line-distance correction in pixel */
@@ -3340,7 +3589,7 @@ static Genesys_Model canon_formula101_model = {
SANE_FIX (0.0), /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_FIX (0.0), /* Amount of feeding needed to eject document
+ SANE_FIX (0.0), /* Amount of feeding needed to eject document
after finishing scanning in mm */
0, 24, 48, /* RGB CCD Line-distance correction in pixel */
@@ -3382,6 +3631,7 @@ static Genesys_USB_Device_Entry genesys_usb_device_list[] = {
{0x04a7, 0x04ac, &xerox_travelscanner_model},
{0x04a9, 0x2213, &canon_lide_50_model},
{0x04a9, 0x221c, &canon_lide_60_model},
+ {0x04a9, 0x2214, &canon_lide_80_model},
{0x07b3, 0x0900, &plustek_3600_model},
{0x0a17, 0x3210, &pentax_dsmobile_600_model},
{0x04f9, 0x2038, &pentax_dsmobile_600_model}, /* clone, only usb id is different */
@@ -3410,6 +3660,11 @@ static Genesys_USB_Device_Entry genesys_usb_device_list[] = {
{0x03f0, 0x4705, &hpn6310_model},
/* GL124 devices */
{0x04a9, 0x1909, &canon_lide_110_model},
+ {0x04a9, 0x190e, &canon_lide_120_model},
{0x04a9, 0x190a, &canon_lide_210_model},
+ {0x04a9, 0x190f, &canon_lide_220_model},
{0, 0, NULL}
};
+
+#define MAX_SCANNERS (sizeof(genesys_usb_device_list) / \
+ sizeof(genesys_usb_device_list[0]))
diff --git a/backend/genesys_gl124.c b/backend/genesys_gl124.c
index 9e2fb8a..eaac873 100644
--- a/backend/genesys_gl124.c
+++ b/backend/genesys_gl124.c
@@ -301,123 +301,6 @@ static Sensor_Profile *get_sensor_profile(int sensor_type, int dpi, int half_ccd
return &(sensors[idx]);
}
-/** @brief motor profile
- * search for the database of motor profiles and get the best one. Each
- * profile is at full step and at a reference exposure. Use LiDE 110 table
- * by default.
- * @param motor_type motor id
- * @param exposure exposure time
- * @return a pointer to a Motor_Profile struct
- */
-static Motor_Profile *get_motor_profile(int motor_type, int exposure)
-{
- unsigned int i;
- int idx;
-
- i=0;
- idx=-1;
- while(i<sizeof(motors)/sizeof(Motor_Profile))
- {
- /* exact match */
- if(motors[i].motor_type==motor_type && motors[i].exposure==exposure)
- {
- return &(motors[i]);
- }
-
- /* closest match */
- if(motors[i].motor_type==motor_type)
- {
- if(idx<0)
- {
- idx=i;
- }
- else
- {
- if(motors[i].exposure>=exposure
- && motors[i].exposure<motors[idx].exposure)
- {
- idx=i;
- }
- }
- }
- i++;
- }
-
- /* default fallback */
- if(idx<0)
- {
- DBG (DBG_warn,"%s: using default motor profile\n",__FUNCTION__);
- idx=0;
- }
-
- return &(motors[idx]);
-}
-
-/** @brief generate slope table
- * Generate the slope table to use for the scan using a reference slope
- * table.
- * @param slope pointer to the slope table to fill
- * @param steps pointer to return used step number
- * @param dpi desired motor resolution
- * @param exposure exposure used
- * @param base_dpi base resolution of the motor
- * @param step_type step type used for scan
- * @param factor shrink factor for the slope
- * @param motor_type motor id
- */
-static int gl124_slope_table(uint16_t *slope,
- int *steps,
- int dpi,
- int exposure,
- int base_dpi,
- int step_type,
- int factor,
- int motor_type)
-{
-int sum, i;
-uint16_t target,current;
-Motor_Profile *profile;
-
- /* required speed */
- target=((exposure * dpi) / base_dpi)>>step_type;
-
- /* fill result with target speed */
- for(i=0;i<SLOPE_TABLE_SIZE;i++)
- slope[i]=target;
-
- profile=get_motor_profile(motor_type,exposure);
-
- /* use profile to build table */
- i=0;
- sum=0;
-
- /* first step is used unmodified */
- current=profile->table[0];
-
- /* loop on profile copying and apply step type */
- while(i<SLOPE_TABLE_SIZE && current>=target)
- {
- slope[i]=current;
- sum+=slope[i];
- i++;
- current=profile->table[i*factor]>>step_type;
- }
- if(i<3 && DBG_LEVEL >= DBG_warn)
- {
- DBG (DBG_warn,"%s: short slope table, failed to reach %d\n",__FUNCTION__,target);
- }
-
- /* ensure minimal slope size */
- while(i<8)
- {
- sum+=slope[i];
- i++;
- }
-
- /* return used steps and acceleration sum */
- *steps=i;
- return sum;
-}
/* returns the max register bulk size */
static int
@@ -732,7 +615,7 @@ gl124_init_registers (Genesys_Device * dev)
* @param slope_table pointer to 16 bit values array of the slope table
* @param steps number of elemnts in the slope table
*/
-static SANE_Status
+GENESYS_STATIC SANE_Status
gl124_send_slope_table (Genesys_Device * dev, int table_nr,
uint16_t * slope_table, int steps)
{
@@ -922,24 +805,6 @@ static int gl124_compute_exposure(Genesys_Device *dev, int xres, int half_ccd)
return sensor->exposure;
}
-/**@brief compute motor step type to use
- * compute the step type (full, half, quarter, ...) to use based
- * on target resolution
- * @param dev device description
- * @param exposure sensor exposure
- * @return 0 for full step
- * 1 for half step
- * 2 for quarter step
- * 3 for eighth step
- */
-static int gl124_compute_step_type(Genesys_Device *dev, int exposure)
-{
-Motor_Profile *profile;
-
- profile=get_motor_profile(dev->model->motor_type,exposure);
- return profile->step_type;
-}
-
static SANE_Status
gl124_init_motor_regs_scan (Genesys_Device * dev,
@@ -987,7 +852,7 @@ gl124_init_motor_regs_scan (Genesys_Device * dev,
}
else
{
- min_speed = 600;
+ min_speed = 900;
if(dev->model->ccd_type==MOTOR_CANONLIDE110)
{
min_speed = 300;
@@ -1033,14 +898,15 @@ gl124_init_motor_regs_scan (Genesys_Device * dev,
sanei_genesys_set_double(reg,REG_SCANFED,4);
/* scan and backtracking slope table */
- gl124_slope_table(scan_table,
- &scan_steps,
- yres,
- scan_exposure_time,
- dev->motor.base_ydpi,
- scan_step_type,
- factor,
- dev->model->motor_type);
+ sanei_genesys_slope_table(scan_table,
+ &scan_steps,
+ yres,
+ scan_exposure_time,
+ dev->motor.base_ydpi,
+ scan_step_type,
+ factor,
+ dev->model->motor_type,
+ motors);
RIE(gl124_send_slope_table (dev, SCAN_TABLE, scan_table, scan_steps));
RIE(gl124_send_slope_table (dev, BACKTRACK_TABLE, scan_table, scan_steps));
@@ -1049,18 +915,22 @@ gl124_init_motor_regs_scan (Genesys_Device * dev,
/* fast table */
fast_dpi=yres;
+
+ /*
if (scan_mode != SCAN_MODE_COLOR)
{
fast_dpi*=3;
}
- gl124_slope_table(fast_table,
- &fast_steps,
- fast_dpi,
- scan_exposure_time,
- dev->motor.base_ydpi,
- scan_step_type,
- factor,
- dev->model->motor_type);
+ */
+ sanei_genesys_slope_table(fast_table,
+ &fast_steps,
+ fast_dpi,
+ scan_exposure_time,
+ dev->motor.base_ydpi,
+ scan_step_type,
+ factor,
+ dev->model->motor_type,
+ motors);
RIE(gl124_send_slope_table (dev, STOP_TABLE, fast_table, fast_steps));
RIE(gl124_send_slope_table (dev, FAST_TABLE, fast_table, fast_steps));
@@ -1505,10 +1375,8 @@ gl124_init_optical_regs_scan (Genesys_Device * dev,
*
* this function sets up the scanner to scan in normal or single line mode
*/
-#ifndef UNIT_TESTING
-static
-#endif
- SANE_Status
+GENESYS_STATIC
+SANE_Status
gl124_init_scan_regs (Genesys_Device * dev,
Genesys_Register_Set * reg,
float xres, /*dpi */
@@ -1519,6 +1387,8 @@ gl124_init_scan_regs (Genesys_Device * dev,
float lines,
unsigned int depth,
unsigned int channels,
+ __sane_unused__ int scan_method,
+ int scan_mode,
int color_filter,
unsigned int flags)
{
@@ -1619,7 +1489,7 @@ gl124_init_scan_regs (Genesys_Device * dev,
else
{
exposure_time = gl124_compute_exposure (dev, used_res, half_ccd);
- scan_step_type = gl124_compute_step_type(dev, exposure_time);
+ scan_step_type = sanei_genesys_compute_step_type(motors, dev->model->motor_type, exposure_time);
}
DBG (DBG_info, "gl124_init_scan_regs : exposure_time=%d pixels\n", exposure_time);
@@ -1628,8 +1498,7 @@ gl124_init_scan_regs (Genesys_Device * dev,
/*** optical parameters ***/
/* in case of dynamic lineart, we use an internal 8 bit gray scan
* to generate 1 lineart data */
- if ((flags & SCAN_FLAG_DYNAMIC_LINEART)
- && (dev->settings.scan_mode == SCAN_MODE_LINEART))
+ if ((flags & SCAN_FLAG_DYNAMIC_LINEART) && (scan_mode == SCAN_MODE_LINEART))
{
depth = 8;
}
@@ -1693,7 +1562,7 @@ gl124_init_scan_regs (Genesys_Device * dev,
dev->model->is_cis ? lincnt * channels : lincnt,
dummy,
move,
- dev->settings.scan_mode,
+ scan_mode,
mflags);
if (status != SANE_STATUS_GOOD)
return status;
@@ -2188,7 +2057,6 @@ gl124_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
uint8_t val;
float resolution;
int loop = 0;
- int scan_mode;
DBG (DBG_proc, "gl124_slow_back_home (wait_until_home = %d)\n",
wait_until_home);
@@ -2240,27 +2108,44 @@ gl124_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
return SANE_STATUS_GOOD;
}
+ /* feed a little first */
+ if (strcmp (dev->model->name, "canon-lide-210") == 0)
+ {
+ status = gl124_feed (dev, 20, SANE_TRUE);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: failed to do initial feed: %s\n", __FUNCTION__, sane_strstatus (status));
+ return status;
+ }
+ }
+
memcpy (local_reg, dev->reg, GENESYS_GL124_MAX_REGS * sizeof (Genesys_Register_Set));
resolution=sanei_genesys_get_lowest_dpi(dev);
- /* TODO add scan_mode to the API */
- scan_mode= dev->settings.scan_mode;
- dev->settings.scan_mode=SCAN_MODE_GRAY;
- gl124_init_scan_regs (dev,
- local_reg,
- resolution,
- resolution,
- 100,
- 30000,
- 100,
- 100,
- 8,
- 1,
- 0,
- SCAN_FLAG_DISABLE_SHADING |
- SCAN_FLAG_DISABLE_GAMMA |
- SCAN_FLAG_IGNORE_LINE_DISTANCE);
- dev->settings.scan_mode=scan_mode;
+ status = gl124_init_scan_regs (dev,
+ local_reg,
+ resolution,
+ resolution,
+ 100,
+ 30000,
+ 100,
+ 100,
+ 8,
+ 1,
+ dev->settings.scan_method,
+ SCAN_MODE_GRAY,
+ 0,
+ SCAN_FLAG_DISABLE_SHADING |
+ SCAN_FLAG_DISABLE_GAMMA |
+ SCAN_FLAG_IGNORE_LINE_DISTANCE);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error,
+ "gl124_slow_back_home: failed to set up registers: %s\n",
+ sane_strstatus (status));
+ DBGCOMPLETED;
+ return status;
+ }
/* clear scan and feed count */
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT | REG0D_CLRMCNT));
@@ -2328,12 +2213,13 @@ gl124_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
/** @brief moves the slider to steps at motor base dpi
* @param dev device to work on
* @param steps number of steps to move
+ * @param reverse true is moving backward
* */
#ifndef UNIT_TESTING
static
#endif
SANE_Status
-gl124_feed (Genesys_Device * dev, unsigned int steps)
+gl124_feed (Genesys_Device * dev, unsigned int steps, int reverse)
{
Genesys_Register_Set local_reg[GENESYS_GL124_MAX_REGS];
SANE_Status status;
@@ -2348,22 +2234,30 @@ gl124_feed (Genesys_Device * dev, unsigned int steps)
memcpy (local_reg, dev->reg, GENESYS_GL124_MAX_REGS * sizeof (Genesys_Register_Set));
resolution=sanei_genesys_get_lowest_ydpi(dev);
- gl124_init_scan_regs (dev,
- local_reg,
- resolution,
- resolution,
- 0,
- steps,
- 100,
- 3,
- 8,
- 3,
- dev->settings.color_filter,
- SCAN_FLAG_DISABLE_SHADING |
- SCAN_FLAG_DISABLE_GAMMA |
- SCAN_FLAG_FEEDING |
- SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE |
- SCAN_FLAG_IGNORE_LINE_DISTANCE);
+ status = gl124_init_scan_regs (dev,
+ local_reg,
+ resolution,
+ resolution,
+ 0,
+ steps,
+ 100,
+ 3,
+ 8,
+ 3,
+ dev->settings.scan_method,
+ SCAN_MODE_COLOR,
+ dev->settings.color_filter,
+ SCAN_FLAG_DISABLE_SHADING |
+ SCAN_FLAG_DISABLE_GAMMA |
+ SCAN_FLAG_FEEDING |
+ SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE |
+ SCAN_FLAG_IGNORE_LINE_DISTANCE);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: failed to set up registers: %s\n", __FUNCTION__, sane_strstatus (status));
+ DBGCOMPLETED;
+ return status;
+ }
/* set exposure to zero */
sanei_genesys_set_triple(local_reg,REG_EXPR,0);
@@ -2378,6 +2272,13 @@ gl124_feed (Genesys_Device * dev, unsigned int steps)
r = sanei_genesys_get_address (local_reg, REG01);
r->value &= ~REG01_SCAN;
+ /* set up for reverse if needed */
+ if(reverse)
+ {
+ r = sanei_genesys_get_address (local_reg, REG02);
+ r->value |= REG02_MTRREV;
+ }
+
/* send registers */
RIE (dev->model->cmd_set->bulk_write_register (dev, local_reg, GENESYS_GL124_MAX_REGS));
@@ -2422,7 +2323,7 @@ gl124_search_start_position (Genesys_Device * dev)
int pixels = 600;
int dpi = 300;
- DBG (DBG_proc, "gl124_search_start_position\n");
+ DBGSTART;
memcpy (local_reg, dev->reg,
GENESYS_GL124_MAX_REGS * sizeof (Genesys_Register_Set));
@@ -2430,8 +2331,19 @@ gl124_search_start_position (Genesys_Device * dev)
/* sets for a 200 lines * 600 pixels */
/* normal scan with no shading */
- status = gl124_init_scan_regs (dev, local_reg, dpi, dpi, 0, 0, /*we should give a small offset here~60 steps */
- 600, dev->model->search_lines, 8, 1, 1, /*green */
+ status = gl124_init_scan_regs (dev,
+ local_reg,
+ dpi,
+ dpi,
+ 0,
+ 0, /*we should give a small offset here~60 steps */
+ 600,
+ dev->model->search_lines,
+ 8,
+ 1,
+ dev->settings.scan_method,
+ SCAN_MODE_GRAY,
+ 1, /*green */
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
SCAN_FLAG_IGNORE_LINE_DISTANCE |
@@ -2521,6 +2433,7 @@ gl124_search_start_position (Genesys_Device * dev)
}
free (data);
+ DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -2553,6 +2466,8 @@ gl124_init_regs_for_coarse_calibration (Genesys_Device * dev)
20,
16,
channels,
+ dev->settings.scan_method,
+ dev->settings.scan_mode,
dev->settings.color_filter,
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
@@ -2637,6 +2552,8 @@ gl124_init_regs_for_shading (Genesys_Device * dev)
dev->calib_lines,
16,
dev->calib_channels,
+ dev->settings.scan_method,
+ SCAN_MODE_COLOR,
0,
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
@@ -2753,7 +2670,7 @@ gl124_init_regs_for_scan (Genesys_Device * dev)
if(channels*dev->settings.yres>=600 && move>700)
{
- status = gl124_feed (dev, move-500);
+ status = gl124_feed (dev, move-500, SANE_FALSE);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "%s: failed to move to scan area\n",__FUNCTION__);
@@ -2791,6 +2708,8 @@ gl124_init_regs_for_scan (Genesys_Device * dev)
dev->settings.lines,
depth,
channels,
+ dev->settings.scan_method,
+ dev->settings.scan_mode,
dev->settings.color_filter,
flags);
@@ -2964,6 +2883,8 @@ move_to_calibration_area (Genesys_Device * dev)
1,
8,
3,
+ dev->settings.scan_method,
+ SCAN_MODE_COLOR,
dev->settings.color_filter,
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
@@ -3062,6 +2983,8 @@ gl124_led_calibration (Genesys_Device * dev)
1,
depth,
channels,
+ dev->settings.scan_method,
+ SCAN_MODE_COLOR,
dev->settings.color_filter,
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
@@ -3250,6 +3173,8 @@ gl124_offset_calibration (Genesys_Device * dev)
lines,
bpp,
channels,
+ dev->settings.scan_method,
+ SCAN_MODE_COLOR,
dev->settings.color_filter,
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
@@ -3429,6 +3354,8 @@ gl124_coarse_gain_calibration (Genesys_Device * dev, int dpi)
lines,
bpp,
channels,
+ dev->settings.scan_method,
+ SCAN_MODE_COLOR,
dev->settings.color_filter,
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
@@ -3558,6 +3485,8 @@ gl124_init_regs_for_warmup (Genesys_Device * dev,
1,
8,
*channels,
+ dev->settings.scan_method,
+ SCAN_MODE_COLOR,
dev->settings.color_filter,
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
@@ -3599,12 +3528,13 @@ gl124_init_gpio (Genesys_Device * dev)
DBGSTART;
/* per model GPIO layout */
- if (strcmp (dev->model->name, "canon-lide-110") == 0)
+ if ((strcmp (dev->model->name, "canon-lide-110") == 0)
+ ||(strcmp (dev->model->name, "canon-lide-120") == 0))
{
idx = 0;
}
else
- { /* canon LiDE 210 case */
+ { /* canon LiDE 210 and 220 case */
idx = 1;
}
@@ -3632,12 +3562,13 @@ gl124_init_memory_layout (Genesys_Device * dev)
DBGSTART;
/* point to per model memory layout */
- if (strcmp (dev->model->name, "canon-lide-110") == 0)
+ if ((strcmp (dev->model->name, "canon-lide-110") == 0)
+ ||(strcmp (dev->model->name, "canon-lide-120") == 0))
{
idx = 0;
}
else
- { /* canon LiDE 210 case */
+ { /* canon LiDE 210 and 220 case */
idx = 1;
}
@@ -3878,7 +3809,8 @@ static Genesys_Command_Set gl124_cmd_set = {
NULL,
gl124_send_shading_data,
gl124_calculate_current_setup,
- gl124_boot
+ gl124_boot,
+ gl124_init_scan_regs
};
SANE_Status
diff --git a/backend/genesys_gl124.h b/backend/genesys_gl124.h
index 1b78af3..25f99c3 100644
--- a/backend/genesys_gl124.h
+++ b/backend/genesys_gl124.h
@@ -614,24 +614,40 @@ static size_t order_0213[]={0,2,1,3};
* database of sensor profiles
*/
static Sensor_Profile sensors[]={
- {CIS_CANONLIDE210, 600, 1, 2768, 0x1e, 0x9f, 0x55, 2584, 154, 101, 388, 574, 393, NULL , 0x00, 0x0c, 0x20, 0x21},
+ /* LiDE 110 */
+ {CIS_CANONLIDE110, 600, 1, 2768, 0x1e, 0x9f, 0x55, 2584, 154, 101, 388, 574, 393, NULL , 0x00, 0x0c, 0x20, 0x21},
{CIS_CANONLIDE110, 600, 0, 5360, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21},
{CIS_CANONLIDE110, 1200, 0, 10528, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, order_01 , 0x00, 0x08, 0x20, 0x22},
{CIS_CANONLIDE110, 2400, 0, 20864, 0x1e, 0x9f, 0x55, 5168, 163, 4679, 6839, 8401, 6859, order_0213, 0x00, 0x06, 0x20, 0x24},
+
+ /* LiDE 120 */
+ {CIS_CANONLIDE120, 600, 1, 2768, 0x0f, 0x9f, 0x55, 2552, 112, 94, 388, 574, 393, NULL , 0x00, 0x02, 0x20, 0x21},
+ {CIS_CANONLIDE120, 600, 0, 5360, 0x0f, 0x9f, 0x55, 5168, 163, 94, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21},
+ {CIS_CANONLIDE120, 1200, 0, 10528, 0x0f, 0x9f, 0x55, 5168, 163, 94, 388, 574, 393, order_01 , 0x00, 0x08, 0x20, 0x22},
+ {CIS_CANONLIDE120, 2400, 0, 20864, 0x0f, 0x9f, 0x55, 5168, 163, 4679, 6839, 8401, 6859, order_0213, 0x00, 0x06, 0x20, 0x24},
+
+ /* LiDE 210 */
{CIS_CANONLIDE210, 600, 1, 2768, 0x1e, 0x9f, 0x55, 2584, 154, 101, 388, 574, 393, NULL , 0x00, 0x0c, 0x20, 0x21},
{CIS_CANONLIDE210, 600, 0, 5360, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21},
{CIS_CANONLIDE210, 1200, 0, 10528, 0x1e, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, order_01 , 0x00, 0x08, 0x20, 0x22},
{CIS_CANONLIDE210, 2400, 0, 20864, 0x1e, 0x9f, 0x55, 5168, 163, 4679, 6839, 8401, 6859, order_0213, 0x00, 0x06, 0x20, 0x24},
+
+ /* LiDE 220 */
+ {CIS_CANONLIDE220, 600, 1, 2768, 0x0f, 0x9f, 0x55, 2584, 154, 101, 388, 574, 393, NULL , 0x00, 0x0c, 0x20, 0x21},
+ {CIS_CANONLIDE220, 600, 0, 5360, 0x0f, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, NULL , 0x00, 0x0a, 0x20, 0x21},
+ {CIS_CANONLIDE220, 1200, 0, 10528, 0x0f, 0x9f, 0x55, 5168, 163, 101, 388, 574, 393, order_01 , 0x00, 0x08, 0x20, 0x22},
+ {CIS_CANONLIDE220, 2400, 0, 20864, 0x0f, 0x9f, 0x55, 5168, 163, 4679, 6839, 8401, 6859, order_0213, 0x00, 0x06, 0x20, 0x24},
};
#define MOVE_DPI 200
#define MOVE_EXPOSURE 2304
-static uint32_t lide210_max[] = { 62496, 31296, 0};
-static uint32_t lide210_slow[] = { 62496, 7896, 0};
static uint32_t lide210_fast[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1432, 1372, 1323, 1280, 1246, 1216, 1188, 1163, 1142, 1121, 1101, 1084, 1068, 1051, 1036, 1020, 1007, 995, 983, 971, 959, 949, 938, 929, 917, 908, 900, 891, 882, 874, 866, 857, 849, 843, 835, 829, 821, 816, 808, 802, 795, 789, 784, 778, 773, 765, 760, 755, 749, 744, 739, 734, 731, 726, 721, 716, 711, 707, 702, 698, 693, 690, 685, 682, 677, 672, 669, 665, 662, 657, 654, 650, 647, 644, 639, 637, 632, 629, 626, 622, 619, 617, 614, 610, 607, 604, 601, 599, 595, 592, 589, 587, 584, 581, 579, 576, 572, 570, 567, 564, 562, 559, 557, 554, 552, 549, 547, 544, 542, 539, 538, 536, 533, 531, 529, 526, 524, 522, 519, 518, 516, 513, 511, 509, 506, 505, 503, 501, 498, 497, 495, 493, 491, 490, 487, 485, 483, 482, 480, 477, 476, 474, 472, 470, 469, 467, 465, 464, 462, 460, 458, 456, 455, 453, 451, 450, 448, 447, 445, 444, 442, 440, 439, 437, 436, 434, 433, 431, 430, 428, 427, 425, 423, 422, 420, 419, 417, 417, 415, 414, 413, 411, 410, 408, 407, 405, 404, 402, 401, 400, 399, 398, 396, 395, 393, 392, 391, 390, 389, 387, 386, 385, 383, 382, 381, 380, 379, 377, 376, 375, 374, 373, 371, 370, 369, 368, 367, 366, 364, 363, 363, 361, 360, 359, 358, 357, 356, 355, 353, 352, 352, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 335, 335, 0};
-static uint32_t lide210_ok[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1961, 1901, 1852, 1809, 1775, 1745, 1717, 1692, 1671, 1650, 1630, 1613, 1597,1580,1565,1549,1536,1524,1512,1500,1488,1478,1467,1458,1446,1437,1429,1420,1411,1403,1395,1386,1378,1372,1364,1358,1350,1345,1337,1331,1324,1318,1313,1307,1302,1294,1289,1284,1278,1273,1268,1263,1260,1255,1250,1245,1240,1236,1231,1227,1222,1219,1214,1211,1206,1201,1198,1194,1191,1186,1183,1179,1176,1173,1168,1166,1161,1158,1155,1151,1148,1146,1143,1139,1136,1133,1130,1128,1124,1121,1118,1116,1113,1110,1108,1105,1101,1099,1096,1093,1091,1088,1086,1083,1081,1078,1076,1073,1071,1068,1067,1065,1062,1060,1058,1055,1053,1051,1048,1047,1045,1042,1040,1038,1035,1034,1032,1030,1027,1026,1024,1022,1020,1019,1016,1014,1012,1011,1009,1006,1005,1003,1001,999,998,996,994,993,991,989,987,985,984,982,980,979,977,976,974,973,971,969,968,966,965,963,962,960,959,957,956,954,952,951,949,948,946,946,944,943,942,940,939,937,936,934,933,931,930,929,928,927,925,924,922,921,920,919,918,916,915,914,912,911,910,909,908,906,905,904,903,902,900,899,898,897,896,895,893,892,892,890,889,888,887,886,885,884,882,881,881,879,878,877,876,875,874,873,872,871,870,869,868,867,864,864, 0};
+static uint32_t lide110_ok[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2343, 2051, 1961, 1901, 1852, 1809, 1775, 1745, 1717, 1692, 1671, 1650, 1630, 1613, 1597,1580,1565,1549,1536,1524,1512,1500,1488,1478,1467,1458,1446,1437,1429,1420,1411,1403,1395,1386,1378,1372,1364,1358,1350,1345,1337,1331,1324,1318,1313,1307,1302,1294,1289,1284,1278,1273,1268,1263,1260,1255,1250,1245,1240,1236,1231,1227,1222,1219,1214,1211,1206,1201,1198,1194,1191,1186,1183,1179,1176,1173,1168,1166,1161,1158,1155,1151,1148,1146,1143,1139,1136,1133,1130,1128,1124,1121,1118,1116,1113,1110,1108,1105,1101,1099,1096,1093,1091,1088,1086,1083,1081,1078,1076,1073,1071,1068,1067,1065,1062,1060,1058,1055,1053,1051,1048,1047,1045,1042,1040,1038,1035,1034,1032,1030,1027,1026,1024,1022,1020,1019,1016,1014,1012,1011,1009,1006,1005,1003,1001,999,998,996,994,993,991,989,987,985,984,982,980,979,977,976,974,973,971,969,968,966,965,963,962,960,959,957,956,954,952,951,949,948,946,946,944,943,942,940,939,937,936,934,933,931,930,929,928,927,925,924,922,921,920,919,918,916,915,914,912,911,910,909,908,906,905,904,903,902,900,899,898,897,896,895,893,892,892,890,889,888,887,886,885,884,882,881,881,879,878,877,876,875,874,873,872,871,870,869,868,867,864,857, 849, 843, 835, 829, 821, 816, 808, 802, 795, 789, 784, 778, 773, 765, 760, 755, 749, 744, 739, 734, 731, 726, 721, 716, 711, 707, 702, 698, 693, 690, 685, 682, 677, 672, 669, 665, 662, 657, 654, 650, 647, 644, 639, 637, 632, 629, 626, 622, 619, 617, 614, 610, 607, 604, 601, 599, 595, 592, 589, 587, 584, 581, 579, 576, 572, 570, 567, 564, 562, 559, 557, 554, 552, 549, 547, 544, 542, 539, 538, 536, 533, 531, 529, 526, 524, 522, 519, 518, 516, 513, 511, 509, 506, 505, 503, 501, 498, 497, 495, 493, 491, 490, 487, 485, 483, 482, 480, 477, 476, 474, 472, 470, 469, 467, 465, 464, 462, 460, 458, 456, 455, 453, 451, 450, 448, 447, 445, 444, 442, 440, 439, 437, 436, 434, 433, 431, 430, 428, 427, 425, 423, 422, 420, 419, 417, 417, 415, 414, 413, 411, 410, 408, 407, 405, 404, 402, 401, 400, 399, 398, 396, 395, 393, 392, 391, 390, 389, 387, 386, 385, 383, 382, 381, 380, 379, 377, 376, 375, 374, 373, 371, 370, 369, 368, 367, 366, 364, 363, 363, 361, 360, 359, 358, 357, 356, 355, 353, 352, 352, 350, 349, 348, 347, 346, 345, 344, 343, 342, 341, 340, 339, 338, 335, 335, 0};
+static uint32_t lide110_slow[] = { 62496, 7896, 2632, 0};
+static uint32_t lide110_max[] = { 62496, 31296, 10432, 0};
+static uint32_t lide210_max[] = { 62496, 31296, 20864, 10432, 0};
/**
* database of motor profiles
@@ -641,31 +657,31 @@ static uint32_t lide210_ok[] = { 62496, 2343, 2343, 2343, 2343, 2343, 2343, 23
/* NEXT LPERIOD=PREVIOUS*2-192 */
static Motor_Profile motors[]={
{MOTOR_CANONLIDE110, 2768, 0, lide210_fast},
- {MOTOR_CANONLIDE110, 5360, 0, lide210_ok},
- {MOTOR_CANONLIDE110, 10528, 1, lide210_slow},
- {MOTOR_CANONLIDE110, 20864, 2, lide210_max},
+ {MOTOR_CANONLIDE110, 5360, 0, lide110_ok},
+ {MOTOR_CANONLIDE110, 10528, 1, lide110_slow},
+ {MOTOR_CANONLIDE110, 20864, 2, lide110_max},
{MOTOR_CANONLIDE210, 2768, 0, lide210_fast},
- {MOTOR_CANONLIDE210, 5360, 0, lide210_ok},
- {MOTOR_CANONLIDE210, 10528, 1, lide210_slow},
+ {MOTOR_CANONLIDE210, 5360, 0, lide110_ok},
+ {MOTOR_CANONLIDE210, 10528, 1, lide110_slow},
{MOTOR_CANONLIDE210, 20864, 2, lide210_max},
{0, 0, 0, NULL},
};
/* *INDENT-ON* */
-
-#ifndef UNIT_TESTING
-static
-#endif
- SANE_Status gl124_init_scan_regs (Genesys_Device * dev,
- Genesys_Register_Set * reg,
- float xres, /*dpi */
- float yres, /*dpi */
- float startx, /*optical_res, from dummy_pixel+1 */
- float starty, /*base_ydpi, from home! */
- float pixels,
- float lines,
- unsigned int depth,
- unsigned int channels,
- int color_filter, unsigned int flags);
+GENESYS_STATIC
+SANE_Status gl124_init_scan_regs (Genesys_Device * dev,
+ Genesys_Register_Set * reg,
+ float xres, /*dpi */
+ float yres, /*dpi */
+ float startx, /*optical_res, from dummy_pixel+1 */
+ float starty, /*base_ydpi, from home! */
+ float pixels,
+ float lines,
+ unsigned int depth,
+ unsigned int channels,
+ int scan_method,
+ int scan_mode,
+ int color_filter,
+ unsigned int flags);
#ifndef UNIT_TESTING
static
@@ -700,12 +716,13 @@ SANE_Status gl124_send_shading_data (Genesys_Device * dev, uint8_t * data, int s
#ifndef UNIT_TESTING
static
#endif
-SANE_Status gl124_feed (Genesys_Device * dev, unsigned int steps);
+SANE_Status gl124_feed (Genesys_Device * dev, unsigned int steps, int reverse);
-#ifndef UNIT_TESTING
-static
-#endif
-SANE_Status
+GENESYS_STATIC SANE_Status
gl124_stop_action (Genesys_Device * dev);
+GENESYS_STATIC SANE_Status
+gl124_send_slope_table (Genesys_Device * dev, int table_nr,
+ uint16_t * slope_table, int steps);
+
/* vim: set sw=2 cino=>2se-1sn-1s{s^-1st0(0u0 smarttab expandtab: */
diff --git a/backend/genesys_gl646.c b/backend/genesys_gl646.c
index c7fa175..19b4585 100644
--- a/backend/genesys_gl646.c
+++ b/backend/genesys_gl646.c
@@ -8,44 +8,44 @@
Copyright (C) 2007 Luke <iceyfor@gmail.com>
Copyright (C) 2011 Alexey Osipov <simba@lerlan.ru> for HP2400 description
and tuning
-
+
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
-
+
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#undef BACKEND_NAME
@@ -682,7 +682,7 @@ get_cksel (int sensor, int required, SANE_Bool color)
* the device.
* @param dev pointer to a struct describing the device
* @param regs register set to fill
- * @param scan_settings scan's settings
+ * @param scan_settings scan's settings
* @param slope_table1 first motor table to fill
* @param slope_table2 second motor table to fill
* @param resolution dpi of the scan
@@ -985,10 +985,8 @@ gl646_setup_registers (Genesys_Device * dev,
/* gamma enable for scans */
if (dev->model->flags & GENESYS_FLAG_14BIT_GAMMA)
regs[reg_0x05].value |= REG05_GMM14BIT;
- if (depth < 16)
- regs[reg_0x05].value |= REG05_GMMENB;
- else
- regs[reg_0x05].value &= ~REG05_GMMENB;
+
+ regs[reg_0x05].value &= ~REG05_GMMENB;
/* true CIS gray if needed */
if (dev->model->is_cis == SANE_TRUE && color == SANE_FALSE
@@ -1120,7 +1118,7 @@ gl646_setup_registers (Genesys_Device * dev,
/* we assume all scans are done with 2 tables */
/*
- feedl = feed_steps - fast_slope_steps*2 -
+ feedl = feed_steps - fast_slope_steps*2 -
(slow_slope_steps >> scan_step_type); */
/* but head has moved due to shading calibration => dev->scanhead_position_in_steps */
if (feedl > 0)
@@ -1299,7 +1297,7 @@ gl646_setup_registers (Genesys_Device * dev,
dev->current_setup.stagger = stagger;
dev->current_setup.max_shift = max_shift + stagger;
- /* total_bytes_to_read is the number of byte to send to frontend
+ /* total_bytes_to_read is the number of byte to send to frontend
* total_bytes_read is the number of bytes sent to frontend
* read_bytes_left is the number of bytes to read from the scanner
*/
@@ -1354,7 +1352,7 @@ gl646_setup_sensor (Genesys_Device * dev, Genesys_Register_Set * regs)
}
-/** Test if the ASIC works
+/** Test if the ASIC works
*/
static SANE_Status
gl646_asic_test (Genesys_Device * dev)
@@ -1415,7 +1413,7 @@ gl646_asic_test (Genesys_Device * dev)
size = 0x40000;
verify_size = size + 0x80;
/* todo: looks like the read size must be a multiple of 128?
- otherwise the read doesn't succeed the second time after the scanner has
+ otherwise the read doesn't succeed the second time after the scanner has
been plugged in. Very strange. */
data = (uint8_t *) malloc (size);
@@ -1699,7 +1697,7 @@ gl646_init_regs (Genesys_Device * dev)
}
-/* Send slope table for motor movement
+/* Send slope table for motor movement
slope_table in machine byte order
*/
static SANE_Status
@@ -1834,7 +1832,7 @@ gl646_set_ad_fe (Genesys_Device * dev, uint8_t set)
}
}
}
- /*
+ /*
if (set == AFE_POWER_SAVE)
{
status =
@@ -1864,7 +1862,7 @@ gl646_wm_hp3670 (Genesys_Device * dev, uint8_t set, int dpi)
SANE_Status status = SANE_STATUS_GOOD;
int i;
- DBG (DBG_proc, "gl646_wm_hp3670: start \n");
+ DBGSTART;
switch (set)
{
case AFE_INIT:
@@ -1971,7 +1969,7 @@ gl646_wm_hp3670 (Genesys_Device * dev, uint8_t set, int dpi)
}
}
- DBG (DBG_proc, "gl646_wm_hp3670: success \n");
+ DBGCOMPLETED;
return status;
}
@@ -2169,8 +2167,8 @@ gl646_set_fe (Genesys_Device * dev, uint8_t set, int dpi)
return SANE_STATUS_GOOD;
}
-/** Set values of analog frontend
- * this this the public interface, the gl646 as to use one more
+/** Set values of analog frontend
+ * this this the public interface, the gl646 as to use one more
* parameter to work effectively, hence the redirection
* @param dev device to set
* @param set action to execute
@@ -2229,16 +2227,14 @@ gl646_set_lamp_power (Genesys_Device * dev,
* limited to AFE for now.
* @param dev scanner's device
* @param enable SANE_TRUE to enable power saving, SANE_FALSE to leave it
- * @return allways SANE_STATUS_GOOD
+ * @return allways SANE_STATUS_GOOD
*/
-#ifndef UNIT_TESTING
-static
-#endif
- SANE_Status
+GENESYS_STATIC
+SANE_Status
gl646_save_power (Genesys_Device * dev, SANE_Bool enable)
{
- DBG (DBG_proc, "gl646_save_power: start\n");
+ DBGSTART;
DBG (DBG_info, "gl646_save_power: enable = %d\n", enable);
if (enable)
@@ -2250,7 +2246,7 @@ gl646_save_power (Genesys_Device * dev, SANE_Bool enable)
gl646_set_fe (dev, AFE_INIT, 0);
}
- DBG (DBG_proc, "gl646_save_power: end\n");
+ DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -2558,8 +2554,8 @@ gl646_detect_document_end (Genesys_Device * dev)
DBG (DBG_info, "gl646_detect_document_end: no more document\n");
dev->document = SANE_FALSE;
- /* adjust number of bytes to read:
- * total_bytes_to_read is the number of byte to send to frontend
+ /* adjust number of bytes to read:
+ * total_bytes_to_read is the number of byte to send to frontend
* total_bytes_read is the number of bytes sent to frontend
* read_bytes_left is the number of bytes to read from the scanner
*/
@@ -2972,10 +2968,8 @@ gl646_end_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
* @param dev scanner's device
* @param wait_until_home true if the function waits until head parked
*/
-#ifndef UNIT_TESTING
-static
-#endif
- SANE_Status
+GENESYS_STATIC
+SANE_Status
gl646_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
{
SANE_Status status;
@@ -3068,11 +3062,11 @@ gl646_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
settings.exposure_time = 0;
settings.dynamic_lineart = SANE_FALSE;
- status = setup_for_scan (dev, settings, SANE_TRUE, SANE_TRUE, SANE_TRUE);
+ status = setup_for_scan (dev, dev->reg, settings, SANE_TRUE, SANE_TRUE, SANE_TRUE);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
- "%s: failed to setup for scan: %s\n", __FUNCTION__,
+ "%s: failed to setup for scan: %s\n", __FUNCTION__,
sane_strstatus (status));
DBGCOMPLETED;
return status;
@@ -3088,7 +3082,7 @@ gl646_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
- "%s: failed to set frontend: %s\n", __FUNCTION__,
+ "%s: failed to set frontend: %s\n", __FUNCTION__,
sane_strstatus (status));
DBGCOMPLETED;
return status;
@@ -3153,7 +3147,7 @@ gl646_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
DBG (DBG_info, "gl646_slow_back_home: scanhead is still moving\n");
- DBG (DBG_proc, "gl646_slow_back_home: end\n");
+ DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -3331,7 +3325,7 @@ gl646_init_regs_for_shading (Genesys_Device * dev)
/* we don't want top offset, but we need right margin to be the same
* than the one for the final scan */
- status = setup_for_scan (dev, settings, SANE_TRUE, SANE_FALSE, SANE_FALSE);
+ status = setup_for_scan (dev, dev->reg, settings, SANE_TRUE, SANE_FALSE, SANE_FALSE);
/* used when sending shading calibration data */
dev->calib_pixels = settings.pixels;
@@ -3377,7 +3371,7 @@ gl646_init_regs_for_shading (Genesys_Device * dev)
/**
- * set up registers for the actual scan. The scan's parameters are given
+ * set up registers for the actual scan. The scan's parameters are given
* through the device settings. It allocates the scan buffers.
*/
static SANE_Status
@@ -3385,36 +3379,44 @@ gl646_init_regs_for_scan (Genesys_Device * dev)
{
SANE_Status status;
+ DBGSTART;
+
/* park head after calibration if needed */
if (dev->scanhead_position_in_steps > 0
&& dev->settings.scan_method == SCAN_METHOD_FLATBED)
{
- status = gl646_slow_back_home (dev, SANE_TRUE);
- if (status != SANE_STATUS_GOOD)
- {
- return status;
-
- }
+ RIE(gl646_slow_back_home (dev, SANE_TRUE));
dev->scanhead_position_in_steps = 0;
}
- return setup_for_scan (dev, dev->settings, SANE_FALSE, SANE_TRUE,
- SANE_TRUE);
+ RIE(setup_for_scan (dev, dev->reg, dev->settings, SANE_FALSE, SANE_TRUE, SANE_TRUE));
+
+ /* gamma is only enabled at final scan time */
+ if (dev->settings.depth < 16)
+ dev->reg[reg_0x05].value |= REG05_GMMENB;
+
+ DBGCOMPLETED;
+ return status;
}
/**
- * set up registers for the actual scan. The scan's parameters are given
+ * set up registers for the actual scan. The scan's parameters are given
* through the device settings. It allocates the scan buffers.
* @param dev scanner's device
+ * @param regs registers to set up
* @param settings settings of scan
* @param split SANE_TRUE if move to scan area is split from scan, SANE_FALSE is
* scan first moves to area
* @param xcorrection take x geometry correction into account (fixed and detected offsets)
* @param ycorrection take y geometry correction into account
*/
-static SANE_Status
-setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
- SANE_Bool split, SANE_Bool xcorrection, SANE_Bool ycorrection)
+GENESYS_STATIC SANE_Status
+setup_for_scan (Genesys_Device * dev,
+ Genesys_Register_Set *regs,
+ Genesys_Settings settings,
+ SANE_Bool split,
+ SANE_Bool xcorrection,
+ SANE_Bool ycorrection)
{
SANE_Status status = SANE_STATUS_GOOD;
SANE_Bool color;
@@ -3423,10 +3425,11 @@ setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
uint16_t startx = 0, endx, pixels;
int move = 0;
- DBG (DBG_proc, "setup_for_scan: start\n");
+ DBGSTART;
DBG (DBG_info,
- "setup_for_scan settings:\nResolution: %ux%uDPI\n"
+ "%s settings:\nResolution: %ux%uDPI\n"
"Lines : %u\nPixels : %u\nStartpos : %.3f/%.3f\nScan mode : %d\nScan method: %s\n\n",
+ __FUNCTION__,
settings.xres, settings.yres, settings.lines, settings.pixels,
settings.tl_x, settings.tl_y, settings.scan_mode,
settings.scan_method == SCAN_METHOD_FLATBED ? "flatbed" : "XPA");
@@ -3441,7 +3444,7 @@ setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
channels = 1;
color = SANE_FALSE;
}
-
+
depth=settings.depth;
if (settings.scan_mode == SCAN_MODE_LINEART)
{
@@ -3479,17 +3482,16 @@ setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
move += (settings.tl_y * dev->motor.optical_ydpi) / MM_PER_INCH;
}
- DBG (DBG_info, "setup_for_scan: move=%d steps\n", move);
+ DBG (DBG_info, "%s: move=%d steps\n", __FUNCTION__, move);
/* security check */
if (move < 0)
{
- DBG (DBG_error,
- "setup_for_scan: overriding negative move value %d\n", move);
+ DBG (DBG_error, "%s: overriding negative move value %d\n", __FUNCTION__, move);
move = 0;
}
}
- DBG (DBG_info, "setup_for_scan: move=%d steps\n", move);
+ DBG (DBG_info, "%s: move=%d steps\n", __FUNCTION__, move);
/* pixels are allways given at full CCD optical resolution */
/* use detected left margin and fixed value */
@@ -3537,7 +3539,7 @@ setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
/* set up correct values for scan (gamma and shading enabled) */
status = gl646_setup_registers (dev,
- dev->reg,
+ regs,
settings,
dev->slope_table0,
dev->slope_table1,
@@ -3548,31 +3550,29 @@ setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
depth);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "setup_for_scan: failed setup registers: %s\n",
- sane_strstatus (status));
+ DBG (DBG_error, "%s: failed setup registers: %s\n", __FUNCTION__, sane_strstatus (status));
return status;
}
/* now post-process values for register and options fine tuning */
/* select color filter based on settings */
- dev->reg[reg_0x04].value &= ~REG04_FILTER;
+ regs[reg_0x04].value &= ~REG04_FILTER;
if (channels == 1)
{
switch (settings.color_filter)
{
/* red */
case 0:
- dev->reg[reg_0x04].value |= 0x04;
+ regs[reg_0x04].value |= 0x04;
break;
/* green */
case 1:
- dev->reg[reg_0x04].value |= 0x08;
+ regs[reg_0x04].value |= 0x08;
break;
/* blue */
case 2:
- dev->reg[reg_0x04].value |= 0x0c;
+ regs[reg_0x04].value |= 0x0c;
break;
default:
break;
@@ -3582,27 +3582,23 @@ setup_for_scan (Genesys_Device * dev, Genesys_Settings settings,
/* send computed slope tables */
status =
gl646_send_slope_table (dev, 0, dev->slope_table0,
- sanei_genesys_read_reg_from_set (dev->reg, 0x21));
+ sanei_genesys_read_reg_from_set (regs, 0x21));
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "setup_for_scan: failed to send slope table 0: %s\n",
- sane_strstatus (status));
+ DBG (DBG_error, "%s: failed to send slope table 0: %s\n", __FUNCTION__, sane_strstatus (status));
return status;
}
status =
gl646_send_slope_table (dev, 1, dev->slope_table1,
- sanei_genesys_read_reg_from_set (dev->reg, 0x6b));
+ sanei_genesys_read_reg_from_set (regs, 0x6b));
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "setup_for_scan: failed to send slope table 1: %s\n",
- sane_strstatus (status));
+ DBG (DBG_error, "%s: failed to send slope table 1: %s\n", __FUNCTION__, sane_strstatus (status));
return status;
}
- DBG (DBG_proc, "setup_for_scan: end\n");
+ DBGCOMPLETED;
return status;
}
@@ -4234,7 +4230,7 @@ ad_fe_coarse_gain_calibration (Genesys_Device * dev, int dpi)
Genesys_Settings settings;
char title[32];
- DBG (DBG_proc, "ad_fe_coarse_gain_calibration: start\n");
+ DBGSTART;
/* setup for a RGB scan, one full sensor's width line */
/* resolution is the one from the final scan */
@@ -4317,12 +4313,12 @@ ad_fe_coarse_gain_calibration (Genesys_Device * dev, int dpi)
DBG (DBG_info, "ad_fe_coarse_gain_calibration: gains=(%d,%d,%d)\n",
dev->frontend.gain[0], dev->frontend.gain[1], dev->frontend.gain[2]);
- DBG (DBG_proc, "ad_fe_coarse_gain_calibration: end\n");
+ DBGCOMPLETED;
return status;
}
/**
- * Alternative coarse gain calibration
+ * Alternative coarse gain calibration
* this on uses the settings from offset_calibration. First scan moves so
* we can go to calibration area for XPA.
* @param dev device for scan
@@ -4343,7 +4339,7 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
{
return ad_fe_coarse_gain_calibration (dev, dev->sensor.optical_res);
}
- DBG (DBG_proc, "gl646_coarse_gain_calibration: start\n");
+ DBGSTART;
/* setup for a RGB scan, one full sensor's width line */
/* resolution is the one from the final scan */
@@ -4352,9 +4348,7 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
/* we are searching a sensor resolution */
if (dpi > dev->sensor.optical_res)
{
- resolution =
- get_closest_resolution (dev->model->ccd_type, dev->sensor.optical_res,
- SANE_TRUE);
+ resolution = dev->sensor.optical_res;
}
else
{
@@ -4371,14 +4365,12 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
if (settings.scan_method == SCAN_METHOD_FLATBED)
{
settings.tl_x = 0;
- settings.pixels =
- (dev->sensor.sensor_pixels * resolution) / dev->sensor.optical_res;
+ settings.pixels = (dev->sensor.sensor_pixels * resolution) / dev->sensor.optical_res;
}
else
{
settings.tl_x = SANE_UNFIX (dev->model->x_offset_ta);
- settings.pixels =
- (SANE_UNFIX (dev->model->x_size_ta) * resolution) / MM_PER_INCH;
+ settings.pixels = (SANE_UNFIX (dev->model->x_size_ta) * resolution) / MM_PER_INCH;
}
settings.lines = CALIBRATION_LINES;
settings.depth = 8;
@@ -4422,8 +4414,7 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
if (status != SANE_STATUS_GOOD)
{
free(line);
- DBG (DBG_error,
- "gl646_coarse_gain_calibration: failed to scan first line\n");
+ DBG (DBG_error, "%s: failed to scan first line\n", __FUNCTION__);
return status;
}
@@ -4438,7 +4429,7 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
pass++;
/* average high level for each channel and compute gain
- to reach the target code
+ to reach the target code
we only use the central half of the CCD data */
for (k = idx; k < idx + channels; k++)
{
@@ -4481,7 +4472,7 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
dev->frontend.gain[k]++;
DBG (DBG_proc,
- "gl646_coarse_gain_calibration: channel %d, average = %.2f, gain = %d\n",
+ "%s: channel %d, average = %.2f, gain = %d\n", __FUNCTION__,
k, average[k], dev->frontend.gain[k]);
}
free (line);
@@ -4493,9 +4484,9 @@ gl646_coarse_gain_calibration (Genesys_Device * dev, int dpi)
dev->frontend.gain[2] = dev->frontend.gain[0];
}
- DBG (DBG_info, "gl646_coarse_gain_calibration: gains=(%d,%d,%d)\n",
+ DBG (DBG_info, "%s: gains=(%d,%d,%d)\n", __FUNCTION__,
dev->frontend.gain[0], dev->frontend.gain[1], dev->frontend.gain[2]);
- DBG (DBG_proc, "gl646_coarse_gain_calibration: end\n");
+ DBGCOMPLETED;
return status;
}
@@ -4537,7 +4528,7 @@ gl646_init_regs_for_warmup (Genesys_Device * dev,
settings.dynamic_lineart = SANE_FALSE;
/* setup for scan */
- status = setup_for_scan (dev, settings, SANE_TRUE, SANE_FALSE, SANE_FALSE);
+ status = setup_for_scan (dev, dev->reg, settings, SANE_TRUE, SANE_FALSE, SANE_FALSE);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
@@ -4551,9 +4542,7 @@ gl646_init_regs_for_warmup (Genesys_Device * dev,
/* don't enable any correction for this scan */
dev->reg[reg_0x01].value &= ~REG01_DVDSET;
- /* XXX STEF XXX
- dev->reg[reg_0x05].value &= ~REG05_GMMENB; */
-
+
/* copy to local_reg */
memcpy (local_reg, dev->reg, (GENESYS_GL646_MAX_REGS + 1) * sizeof (Genesys_Register_Set));
@@ -4569,7 +4558,7 @@ gl646_init_regs_for_warmup (Genesys_Device * dev,
RIE (gl646_set_fe (dev, AFE_SET, settings.xres));
RIE (gl646_bulk_write_register (dev, local_reg, GENESYS_GL646_MAX_REGS));
- DBG (DBG_proc, "gl646_init_regs_for_warmup: end\n");
+ DBGCOMPLETED;
return status;
}
@@ -4605,7 +4594,7 @@ gl646_repark_head (Genesys_Device * dev)
settings.exposure_time = 0;
settings.dynamic_lineart = SANE_FALSE;
- status = setup_for_scan (dev, settings, SANE_FALSE, SANE_FALSE, SANE_FALSE);
+ status = setup_for_scan (dev, dev->reg, settings, SANE_FALSE, SANE_FALSE, SANE_FALSE);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
@@ -4702,7 +4691,7 @@ gl646_init (Genesys_Device * dev)
switch (dev->model->motor_type)
{
- /* set to 11111 to spot bugs, sanei_genesys_exposure_time should
+ /* set to 11111 to spot bugs, sanei_genesys_exposure_time should
have obsoleted this field */
case MOTOR_5345:
dev->settings.exposure_time = 11111;
@@ -4924,15 +4913,13 @@ gl646_init (Genesys_Device * dev)
return SANE_STATUS_GOOD;
}
-#ifndef UNIT_TESTING
-static
-#endif
+GENESYS_STATIC
SANE_Status
gl646_move_to_ta (Genesys_Device * dev)
{
SANE_Status status = SANE_STATUS_GOOD;
- DBG (DBG_proc, "gl646_move_to_ta: starting\n");
+ DBGSTART;
if (simple_move (dev, SANE_UNFIX (dev->model->y_offset_calib_ta)) !=
SANE_STATUS_GOOD)
{
@@ -4940,8 +4927,7 @@ gl646_move_to_ta (Genesys_Device * dev)
"gl646_move_to_ta: failed to move to calibration area\n");
return status;
}
- DBG (DBG_proc, "gl646_move_to_ta: end\n");
-
+ DBGCOMPLETED;
return status;
}
@@ -4957,10 +4943,7 @@ gl646_move_to_ta (Genesys_Device * dev)
* @param shading SANE_TRUE to enable shading correction
* @param data pointer for the data
*/
-#ifndef UNIT_TESTING
-static
-#endif
- SANE_Status
+GENESYS_STATIC SANE_Status
simple_scan (Genesys_Device * dev, Genesys_Settings settings, SANE_Bool move,
SANE_Bool forward, SANE_Bool shading, unsigned char **data)
{
@@ -4990,7 +4973,7 @@ simple_scan (Genesys_Device * dev, Genesys_Settings settings, SANE_Bool move,
{
split = SANE_TRUE;
}
- status = setup_for_scan (dev, settings, split, SANE_FALSE, SANE_FALSE);
+ status = setup_for_scan (dev, dev->reg, settings, split, SANE_FALSE, SANE_FALSE);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "simple_scan: setup_for_scan failed (%s)\n",
@@ -5046,6 +5029,9 @@ simple_scan (Genesys_Device * dev, Genesys_Settings settings, SANE_Bool move,
dev->reg[reg_0x01].value |= REG01_DVDSET;
}
+ /* enable gamma table for the scan */
+ dev->reg[reg_0x05].value |= REG05_GMMENB;
+
/* one table movement for simple scan */
dev->reg[reg_0x02].value &= ~REG02_FASTFED;
@@ -5522,7 +5508,7 @@ gl646_is_compatible_calibration (Genesys_Device * dev,
dev->current_setup.channels, dev->current_setup.xres,
cache->used_setup.channels, cache->used_setup.xres);
- /* a calibration cache is compatible if color mode and x dpi match the user
+ /* a calibration cache is compatible if color mode and x dpi match the user
* requested scan. In the case of CIS scanners, dpi isn't a criteria */
if (dev->model->is_cis == SANE_FALSE)
{
@@ -5798,6 +5784,7 @@ static Genesys_Command_Set gl646_cmd_set = {
gl646_move_to_ta,
NULL,
NULL,
+ NULL,
NULL
};
diff --git a/backend/genesys_gl646.h b/backend/genesys_gl646.h
index e9124fd..9e328c5 100644
--- a/backend/genesys_gl646.h
+++ b/backend/genesys_gl646.h
@@ -6,42 +6,42 @@
Copyright (C) 2005-2009 Pierre Willenbrock <pierre@pirsoft.dnsalias.org>
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#include "genesys.h"
@@ -261,20 +261,36 @@ static
#endif
SANE_Status gl646_public_set_fe (Genesys_Device * dev, uint8_t set);
+GENESYS_STATIC
+SANE_Status
+gl646_save_power (Genesys_Device * dev, SANE_Bool enable);
+
+GENESYS_STATIC
+SANE_Status
+gl646_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home);
+
+GENESYS_STATIC
+SANE_Status
+gl646_move_to_ta (Genesys_Device * dev);
+
/**
* sets up the scanner for a scan, registers, gamma tables, shading tables
* and slope tables, based on the parameter struct.
* @param device device to set up
+ * @param regs registers to set up
* @param settings settings of the scan
* @param split true if move before scan has to be done
- * @param xcorrection true if scanner's X geometry must be taken into account to
- * compute X, ie add left margins
- * @param ycorrection true if scanner's Y geometry must be taken into account to
- * compute Y, ie add top margins
+ * @param xcorrection true if scanner's X geometry must be taken into account to
+ * compute X, ie add left margins
+ * @param ycorrection true if scanner's Y geometry must be taken into account to
+ * compute Y, ie add top margins
*/
-static SANE_Status
-setup_for_scan (Genesys_Device * device, Genesys_Settings settings,
- SANE_Bool split, SANE_Bool xcorrection,
+GENESYS_STATIC SANE_Status
+setup_for_scan (Genesys_Device *device,
+ Genesys_Register_Set *regs,
+ Genesys_Settings settings,
+ SANE_Bool split,
+ SANE_Bool xcorrection,
SANE_Bool ycorrection);
/**
@@ -305,7 +321,7 @@ gl646_setup_registers (Genesys_Device * dev,
static
#endif
SANE_Status
-simple_move (Genesys_Device * dev, SANE_Int distance);
+simple_move (Genesys_Device * dev, SANE_Int distance);
/**
* Does a simple scan of the area given by the settings. Scanned data
@@ -320,7 +336,7 @@ simple_move (Genesys_Device * dev, SANE_Int distance);
* @param data pointer that will point to the scanned data
*/
#ifndef UNIT_TESTING
-static
+static
#endif
SANE_Status
simple_scan (Genesys_Device * dev, Genesys_Settings settings, SANE_Bool move, SANE_Bool forward,
@@ -344,7 +360,7 @@ static SANE_Status write_control (Genesys_Device * dev, int resolution);
static void gl646_init_regs (Genesys_Device * dev);
#ifndef UNIT_TESTING
-static
+static
#endif
SANE_Status gl646_load_document (Genesys_Device * dev);
@@ -576,7 +592,7 @@ static Motor_Master motor_master[] = {
{MOTOR_HP2300, 300, SANE_FALSE, 300, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 3, 2175, 1087, 120, 4905, 337, 0.3, 0.4, 16},
{MOTOR_HP2300, 600, SANE_FALSE, 600, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 3, 8700, 4350, 120, 4905, 337, 0.3, 0.4, 16},
{MOTOR_HP2300,1200, SANE_FALSE,1200, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 3, 17400, 8700, 120, 4905, 337, 0.3, 0.4, 16},
- /* non half ccd settings for 300 dpi
+ /* non half ccd settings for 300 dpi
{MOTOR_HP2300, 300, SANE_TRUE, 300, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 44, 5386, 2175, 120, 4905, 337, 0.3, 0.4, 16},
{MOTOR_HP2300, 300, SANE_FALSE, 300, HALF_STEP, SANE_FALSE, SANE_TRUE , 63, 44, 5386, 2175, 120, 4905, 337, 0.3, 0.4, 16},
*/
diff --git a/backend/genesys_gl841.c b/backend/genesys_gl841.c
index 2b22d2c..2b16c67 100644
--- a/backend/genesys_gl841.c
+++ b/backend/genesys_gl841.c
@@ -9,45 +9,45 @@
Copyright (C) 2006 Laurent Charpentier <laurent_pubs@yahoo.com>
Copyright (C) 2010 Chris Berry <s0457957@sms.ed.ac.uk> and Michael Rickmann <mrickma@gwdg.de>
for Plustek Opticbook 3600 support
-
-
+
+
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
-
+
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#undef BACKEND_NAME
@@ -64,7 +64,7 @@
/* ------------------------------------------------------------------------ */
/* Write to many registers */
-/* Note: There is no known bulk register write,
+/* Note: There is no known bulk register write,
this function is sending single registers instead */
static SANE_Status
gl841_bulk_write_register (Genesys_Device * dev,
@@ -88,7 +88,7 @@ gl841_bulk_write_register (Genesys_Device * dev,
buffer[i * 2 + 0] = reg[i].address;
buffer[i * 2 + 1] = reg[i].value;
-
+
DBG (DBG_io2, "reg[0x%02x] = 0x%02x\n", buffer[i * 2 + 0],
buffer[i * 2 + 1]);
}
@@ -214,13 +214,13 @@ gl841_bulk_read_data (Genesys_Device * dev, uint8_t addr,
uint8_t * data, size_t len)
{
SANE_Status status;
- size_t size;
- uint8_t outdata[8];
+ size_t size, target;
+ uint8_t outdata[8], *buffer;
DBG (DBG_io, "gl841_bulk_read_data: requesting %lu bytes\n",
(u_long) len);
- if (len == 0)
+ if (len == 0)
return SANE_STATUS_GOOD;
status =
@@ -254,12 +254,14 @@ gl841_bulk_read_data (Genesys_Device * dev, uint8_t addr,
return status;
}
- while (len)
+ target = len;
+ buffer = data;
+ while (target)
{
- if (len > BULKIN_MAXSIZE)
+ if (target > BULKIN_MAXSIZE)
size = BULKIN_MAXSIZE;
else
- size = len;
+ size = target;
DBG (DBG_io2,
"gl841_bulk_read_data: trying to read %lu bytes of data\n",
@@ -277,14 +279,18 @@ gl841_bulk_read_data (Genesys_Device * dev, uint8_t addr,
DBG (DBG_io2,
"gl841_bulk_read_data read %lu bytes, %lu remaining\n",
- (u_long) size, (u_long) (len - size));
+ (u_long) size, (u_long) (target - size));
- len -= size;
+ target -= size;
data += size;
}
- DBG (DBG_io, "gl841_bulk_read_data: completed\n");
+ if (DBG_LEVEL >= DBG_data && dev->binary!=NULL)
+ {
+ fwrite(buffer, len, 1, dev->binary);
+ }
+ DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -324,7 +330,7 @@ gl841_set_buffer_address_gamma (Genesys_Device * dev, uint32_t addr)
}
/* Write bulk data (e.g. gamma) */
-static SANE_Status
+GENESYS_STATIC SANE_Status
gl841_bulk_write_data_gamma (Genesys_Device * dev, uint8_t addr,
uint8_t * data, size_t len)
{
@@ -398,7 +404,7 @@ gl841_bulk_write_data_gamma (Genesys_Device * dev, uint8_t addr,
/****************************************************************************
- Mid level functions
+ Mid level functions
****************************************************************************/
static SANE_Bool
@@ -515,6 +521,7 @@ sanei_gl841_setup_sensor (Genesys_Device * dev,
DBG (DBG_proc, "gl841_setup_sensor\n");
+ /* that one is tricky at least ....*/
r = sanei_genesys_get_address (regs, 0x70);
for (i = 0; i < 4; i++, r++)
r->value = dev->sensor.regs_0x08_0x0b[i];
@@ -604,7 +611,7 @@ sanei_gl841_setup_sensor (Genesys_Device * dev,
}
}
-/** Test if the ASIC works
+/** Test if the ASIC works
*/
/*TODO: make this functional*/
static SANE_Status
@@ -670,7 +677,7 @@ sanei_gl841_asic_test (Genesys_Device * dev)
size = 0x40000;
verify_size = size + 0x80;
/* todo: looks like the read size must be a multiple of 128?
- otherwise the read doesn't succeed the second time after the scanner has
+ otherwise the read doesn't succeed the second time after the scanner has
been plugged in. Very strange. */
data = (uint8_t *) malloc (size);
@@ -745,15 +752,15 @@ sanei_gl841_asic_test (Genesys_Device * dev)
if (verify_data[i] != data[i])
{
DBG (DBG_error, "sanei_gl841_asic_test: data verification error\n");
- DBG (DBG_info, "0x%.8x: got %.2x %.2x %.2x %.2x, expected %.2x %.2x %.2x %.2x\n",
- i,
- verify_data[i],
- verify_data[i+1],
- verify_data[i+2],
- verify_data[i+3],
- data[i],
- data[i+1],
- data[i+2],
+ DBG (DBG_info, "0x%.8x: got %.2x %.2x %.2x %.2x, expected %.2x %.2x %.2x %.2x\n",
+ i,
+ verify_data[i],
+ verify_data[i+1],
+ verify_data[i+2],
+ verify_data[i+3],
+ data[i],
+ data[i+1],
+ data[i+2],
data[i+3]);
free (data);
free (verify_data);
@@ -777,7 +784,168 @@ gl841_bulk_full_size (void)
}
/*
- * Set all registers to default values
+ * Set all registers LiDE 80 to default values
+ * (function called only once at the beginning)
+ * we are doing a special case to ease development
+ */
+static void
+gl841_init_lide80 (Genesys_Device * dev)
+{
+ uint8_t val;
+ int index=0;
+
+ INITREG (0x01, 0x82); /* 0x02 = SHDAREA and no CISSET ! */
+ INITREG (0x02, 0x10);
+ INITREG (0x03, 0x50);
+ INITREG (0x04, 0x02);
+ INITREG (0x05, 0x4c); /* 1200 DPI */
+ INITREG (0x06, 0x38); /* 0x38 scanmod=1, pwrbit, GAIN4 */
+ INITREG (0x07, 0x00);
+ INITREG (0x08, 0x00);
+ INITREG (0x09, 0x11);
+ INITREG (0x0a, 0x00);
+
+ INITREG (0x10, 0x40);
+ INITREG (0x11, 0x00);
+ INITREG (0x12, 0x40);
+ INITREG (0x13, 0x00);
+ INITREG (0x14, 0x40);
+ INITREG (0x15, 0x00);
+ INITREG (0x16, 0x00);
+ INITREG (0x17, 0x01);
+ INITREG (0x18, 0x00);
+ INITREG (0x19, 0x06);
+ INITREG (0x1a, 0x00);
+ INITREG (0x1b, 0x00);
+ INITREG (0x1c, 0x00);
+ INITREG (0x1d, 0x04);
+ INITREG (0x1e, 0x10);
+ INITREG (0x1f, 0x04);
+ INITREG (0x20, 0x02);
+ INITREG (0x21, 0x10);
+ INITREG (0x22, 0x20);
+ INITREG (0x23, 0x20);
+ INITREG (0x24, 0x10);
+ INITREG (0x25, 0x00);
+ INITREG (0x26, 0x00);
+ INITREG (0x27, 0x00);
+
+ INITREG (0x29, 0xff);
+
+ INITREG (0x2c, dev->sensor.optical_res>>8);
+ INITREG (0x2d, dev->sensor.optical_res & 0xff);
+ INITREG (0x2e, 0x80);
+ INITREG (0x2f, 0x80);
+ INITREG (0x30, 0x00);
+ INITREG (0x31, 0x10);
+ INITREG (0x32, 0x15);
+ INITREG (0x33, 0x0e);
+ INITREG (0x34, 0x40);
+ INITREG (0x35, 0x00);
+ INITREG (0x36, 0x2a);
+ INITREG (0x37, 0x30);
+ INITREG (0x38, 0x2a);
+ INITREG (0x39, 0xf8);
+
+ INITREG (0x3d, 0x00);
+ INITREG (0x3e, 0x00);
+ INITREG (0x3f, 0x00);
+
+ INITREG (0x52, 0x03);
+ INITREG (0x53, 0x07);
+ INITREG (0x54, 0x00);
+ INITREG (0x55, 0x00);
+ INITREG (0x56, 0x00);
+ INITREG (0x57, 0x00);
+ INITREG (0x58, 0x29);
+ INITREG (0x59, 0x69);
+ INITREG (0x5a, 0x55);
+
+ INITREG (0x5d, 0x20);
+ INITREG (0x5e, 0x41);
+ INITREG (0x5f, 0x40);
+ INITREG (0x60, 0x00);
+ INITREG (0x61, 0x00);
+ INITREG (0x62, 0x00);
+ INITREG (0x63, 0x00);
+ INITREG (0x64, 0x00);
+ INITREG (0x65, 0x00);
+ INITREG (0x66, 0x00);
+ INITREG (0x67, 0x40);
+ INITREG (0x68, 0x40);
+ INITREG (0x69, 0x20);
+ INITREG (0x6a, 0x20);
+ INITREG (0x6c, dev->gpo.value[0]);
+ INITREG (0x6d, dev->gpo.value[1]);
+ INITREG (0x6e, dev->gpo.enable[0]);
+ INITREG (0x6f, dev->gpo.enable[1]);
+ INITREG (0x70, 0x00);
+ INITREG (0x71, 0x05);
+ INITREG (0x72, 0x07);
+ INITREG (0x73, 0x09);
+ INITREG (0x74, 0x00);
+ INITREG (0x75, 0x01);
+ INITREG (0x76, 0xff);
+ INITREG (0x77, 0x00);
+ INITREG (0x78, 0x0f);
+ INITREG (0x79, 0xf0);
+ INITREG (0x7a, 0xf0);
+ INITREG (0x7b, 0x00);
+ INITREG (0x7c, 0x1e);
+ INITREG (0x7d, 0x11);
+ INITREG (0x7e, 0x00);
+ INITREG (0x7f, 0x50);
+ INITREG (0x80, 0x00);
+ INITREG (0x81, 0x00);
+ INITREG (0x82, 0x0f);
+ INITREG (0x83, 0x00);
+ INITREG (0x84, 0x0e);
+ INITREG (0x85, 0x00);
+ INITREG (0x86, 0x0d);
+ INITREG (0x87, 0x02);
+ INITREG (0x88, 0x00);
+ INITREG (0x89, 0x00);
+
+ /* specific scanner settings, clock and gpio first */
+ sanei_genesys_read_register (dev, REG6B, &val);
+ sanei_genesys_write_register (dev, REG6B, 0x0c);
+ sanei_genesys_write_register (dev, 0x06, 0x10);
+ sanei_genesys_write_register (dev, REG6E, 0x6d);
+ sanei_genesys_write_register (dev, REG6F, 0x80);
+ sanei_genesys_write_register (dev, REG6B, 0x0e);
+ sanei_genesys_read_register (dev, REG6C, &val);
+ sanei_genesys_write_register (dev, REG6C, 0x00);
+ sanei_genesys_read_register (dev, REG6D, &val);
+ sanei_genesys_write_register (dev, REG6D, 0x8f);
+ sanei_genesys_read_register (dev, REG6B, &val);
+ sanei_genesys_write_register (dev, REG6B, 0x0e);
+ sanei_genesys_read_register (dev, REG6B, &val);
+ sanei_genesys_write_register (dev, REG6B, 0x0e);
+ sanei_genesys_read_register (dev, REG6B, &val);
+ sanei_genesys_write_register (dev, REG6B, 0x0a);
+ sanei_genesys_read_register (dev, REG6B, &val);
+ sanei_genesys_write_register (dev, REG6B, 0x02);
+ sanei_genesys_read_register (dev, REG6B, &val);
+ sanei_genesys_write_register (dev, REG6B, 0x06);
+
+ sanei_genesys_write_0x8c (dev, 0x10, 0x94);
+ sanei_genesys_write_register (dev, 0x09, 0x10);
+
+ /* set up GPIO : no address, so no bulk write, doesn't written directly either ? */
+ /*
+ dev->reg[reg_0x6c].value = dev->gpo.value[0];
+ dev->reg[reg_0x6d].value = dev->gpo.value[1];
+ dev->reg[reg_0x6e].value = dev->gpo.enable[0];
+ dev->reg[reg_0x6f].value = dev->gpo.enable[1]; */
+
+ dev->reg[reg_0x6b].value |= REG6B_GPO18;
+ dev->reg[reg_0x6b].value &= ~REG6B_GPO17;
+
+ sanei_gl841_setup_sensor (dev, dev->reg, 0, 0);
+}
+
+/*
+ * Set all registers to default values
* (function called only once at the beginning)
*/
static void
@@ -789,6 +957,11 @@ gl841_init_registers (Genesys_Device * dev)
nr = 0;
memset (dev->reg, 0, GENESYS_MAX_REGS * sizeof (Genesys_Register_Set));
+ if (strcmp (dev->model->name, "canon-lide-80") == 0)
+ {
+ gl841_init_lide80(dev);
+ return ;
+ }
for (addr = 1; addr <= 0x0a; addr++)
dev->reg[nr++].address = addr;
@@ -814,12 +987,12 @@ gl841_init_registers (Genesys_Device * dev)
{
dev->reg[reg_0x01].value &= ~REG01_CISSET;
}
-
+
dev->reg[reg_0x02].value = 0x30 /*0x38 */ ; /* auto home, one-table-move, full step */
dev->reg[reg_0x02].value |= REG02_AGOHOME;
dev->reg[reg_0x02].value |= REG02_MTRPWR;
dev->reg[reg_0x02].value |= REG02_FASTFED;
-
+
dev->reg[reg_0x03].value = 0x1f /*0x17 */ ; /* lamp on */
dev->reg[reg_0x03].value |= REG03_AVEENB;
@@ -842,7 +1015,7 @@ gl841_init_registers (Genesys_Device * dev)
else
{
dev->reg[reg_0x05].value |= REG05_DPIHW_2400;
- DBG (DBG_warn,
+ DBG (DBG_warn,
"gl841_init_registers: Cannot handle sensor pixel count %d\n",
dev->sensor.sensor_pixels);
}
@@ -861,9 +1034,9 @@ gl841_init_registers (Genesys_Device * dev)
else
{
dev->reg[reg_0x06].value |= 0x05 << REG06S_SCANMOD; /* 15 clocks/pixel */
- dev->reg[reg_0x09].value = 0; /* 24 MHz CLKSET */
+ dev->reg[reg_0x09].value = 0; /* 24 MHz CLKSET */
}
-
+
dev->reg[reg_0x1e].value = 0xf0; /* watch-dog time */
dev->reg[reg_0x17].value |= 1 << REG17S_TGW;
@@ -879,7 +1052,7 @@ gl841_init_registers (Genesys_Device * dev)
/*BUFSEL*/
dev->reg[reg_0x20].value = 0x20;
-
+
/*LAMPPWM*/
dev->reg[reg_0x29].value = 0xff;
@@ -905,7 +1078,7 @@ gl841_init_registers (Genesys_Device * dev)
/*STOPTIM*/
dev->reg[reg_0x5e].value |= 0x2 << REG5ES_STOPTIM;
- sanei_gl841_setup_sensor (dev, dev->reg, 0, 0);
+ sanei_gl841_setup_sensor (dev, dev->reg, 0, 0);
/* set up GPIO */
dev->reg[reg_0x6c].value = dev->gpo.value[0];
@@ -913,18 +1086,24 @@ gl841_init_registers (Genesys_Device * dev)
dev->reg[reg_0x6e].value = dev->gpo.enable[0];
dev->reg[reg_0x6f].value = dev->gpo.enable[1];
- if (dev->model->gpo_type == GPO_CANONLIDE35)
+ /* TODO there is a switch calling to be written here */
+ if (dev->model->gpo_type == GPO_CANONLIDE35)
+ {
+ dev->reg[reg_0x6b].value |= REG6B_GPO18;
+ dev->reg[reg_0x6b].value &= ~REG6B_GPO17;
+ }
+ if (dev->model->gpo_type == GPO_CANONLIDE80)
{
dev->reg[reg_0x6b].value |= REG6B_GPO18;
dev->reg[reg_0x6b].value &= ~REG6B_GPO17;
}
- if (dev->model->gpo_type == GPO_XP300)
+ if (dev->model->gpo_type == GPO_XP300)
{
dev->reg[reg_0x6b].value |= REG6B_GPO17;
}
- if (dev->model->gpo_type == GPO_DP685)
+ if (dev->model->gpo_type == GPO_DP685)
{
/* REG6B_GPO18 lights on green led */
dev->reg[reg_0x6b].value |= REG6B_GPO17|REG6B_GPO18;
@@ -933,10 +1112,10 @@ gl841_init_registers (Genesys_Device * dev)
DBG (DBG_proc, "gl841_init_registers complete\n");
}
-/* Send slope table for motor movement
+/* Send slope table for motor movement
slope_table in machine byte order
*/
-static SANE_Status
+GENESYS_STATIC SANE_Status
gl841_send_slope_table (Genesys_Device * dev, int table_nr,
uint16_t * slope_table, int steps)
{
@@ -944,6 +1123,7 @@ gl841_send_slope_table (Genesys_Device * dev, int table_nr,
int start_address;
SANE_Status status;
uint8_t *table;
+ char msg[4000];
/*#ifdef WORDS_BIGENDIAN*/
int i;
/*#endif*/
@@ -971,6 +1151,15 @@ gl841_send_slope_table (Genesys_Device * dev, int table_nr,
/*#else
table = (uint8_t*)slope_table;
#endif*/
+ if (DBG_LEVEL >= DBG_io)
+ {
+ sprintf (msg, "write slope %d (%d)=", table_nr, steps);
+ for (i = 0; i < steps; i++)
+ {
+ sprintf (msg+strlen(msg), ",%d", slope_table[i]);
+ }
+ DBG (DBG_io, "%s: %s\n", __FUNCTION__, msg);
+ }
status =
sanei_genesys_set_buffer_address (dev, start_address + table_nr * 0x200);
@@ -1005,13 +1194,88 @@ gl841_send_slope_table (Genesys_Device * dev, int table_nr,
DBG (DBG_proc, "gl841_send_slope_table: completed\n");
return status;
}
-
+
+static SANE_Status
+gl841_set_lide80_fe (Genesys_Device * dev, uint8_t set)
+{
+ SANE_Status status = SANE_STATUS_GOOD;
+
+ DBGSTART;
+
+ if (set == AFE_INIT)
+ {
+ DBG (DBG_proc, "%s(): setting DAC %u\n", __FUNCTION__,
+ dev->model->dac_type);
+
+ /* sets to default values */
+ sanei_genesys_init_fe (dev);
+
+ /* write them to analog frontend */
+ status = sanei_genesys_fe_write_data (dev, 0x00, dev->frontend.reg[0]);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: writing reg 0x00 failed: %s\n", __FUNCTION__,
+ sane_strstatus (status));
+ return status;
+ }
+ status = sanei_genesys_fe_write_data (dev, 0x03, dev->frontend.reg[1]);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: writing reg 0x03 failed: %s\n", __FUNCTION__,
+ sane_strstatus (status));
+ return status;
+ }
+ status = sanei_genesys_fe_write_data (dev, 0x06, dev->frontend.reg[2]);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: writing reg 0x06 failed: %s\n", __FUNCTION__,
+ sane_strstatus (status));
+ return status;
+ }
+ }
+
+ if (set == AFE_SET)
+ {
+ status = sanei_genesys_fe_write_data (dev, 0x00, dev->frontend.reg[0]);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: writing reg 0x00 failed: %s\n", __FUNCTION__,
+ sane_strstatus (status));
+ return status;
+ }
+ status = sanei_genesys_fe_write_data (dev, 0x06, dev->frontend.offset[0]);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: writing offset failed: %s\n", __FUNCTION__,
+ sane_strstatus (status));
+ return status;
+ }
+ status = sanei_genesys_fe_write_data (dev, 0x03, dev->frontend.gain[0]);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: writing gain failed: %s\n", __FUNCTION__,
+ sane_strstatus (status));
+ return status;
+ }
+ }
+
+ return status;
+ DBGCOMPLETED;
+}
+
/* Set values of Analog Device type frontend */
static SANE_Status
gl841_set_ad_fe (Genesys_Device * dev, uint8_t set)
{
SANE_Status status = SANE_STATUS_GOOD;
int i;
+
+ /* special case for LiDE 80 analog frontend */
+ if(dev->model->dac_type==DAC_CANONLIDE80)
+ {
+ return gl841_set_lide80_fe(dev, set);
+ }
+
DBG (DBG_proc, "gl841_set_ad_fe(): start\n");
if (set == AFE_INIT)
{
@@ -1309,7 +1573,7 @@ gl841_set_fe (Genesys_Device * dev, uint8_t set)
*/
static SANE_Status
gl841_init_motor_regs_off(Genesys_Register_Set * reg,
- unsigned int scan_lines)
+ unsigned int scan_lines)
{
unsigned int feedl;
Genesys_Register_Set * r;
@@ -1318,21 +1582,21 @@ gl841_init_motor_regs_off(Genesys_Register_Set * reg,
scan_lines);
feedl = 2;
-
+
r = sanei_genesys_get_address (reg, 0x3d);
r->value = (feedl >> 16) & 0xf;
r = sanei_genesys_get_address (reg, 0x3e);
r->value = (feedl >> 8) & 0xff;
- r = sanei_genesys_get_address (reg, 0x3f);
+ r = sanei_genesys_get_address (reg, 0x3f);
r->value = feedl & 0xff;
- r = sanei_genesys_get_address (reg, 0x5e);
+ r = sanei_genesys_get_address (reg, 0x5e);
r->value &= ~0xe0;
r = sanei_genesys_get_address (reg, 0x25);
r->value = (scan_lines >> 16) & 0xf;
r = sanei_genesys_get_address (reg, 0x26);
r->value = (scan_lines >> 8) & 0xff;
- r = sanei_genesys_get_address (reg, 0x27);
+ r = sanei_genesys_get_address (reg, 0x27);
r->value = scan_lines & 0xff;
r = sanei_genesys_get_address (reg, 0x02);
@@ -1349,43 +1613,95 @@ gl841_init_motor_regs_off(Genesys_Register_Set * reg,
r->value &= ~0x40;
- r = sanei_genesys_get_address (reg, 0x67);
+ r = sanei_genesys_get_address (reg, 0x67);
r->value = 0x3f;
r = sanei_genesys_get_address (reg, 0x68);
r->value = 0x3f;
- r = sanei_genesys_get_address (reg, 0x21);
+ r = sanei_genesys_get_address (reg, REG_STEPNO);
r->value = 0;
-
- r = sanei_genesys_get_address (reg, 0x24);
+
+ r = sanei_genesys_get_address (reg, REG_FASTNO);
r->value = 0;
-
+
r = sanei_genesys_get_address (reg, 0x69);
r->value = 0;
-
+
r = sanei_genesys_get_address (reg, 0x6a);
r->value = 0;
-
+
r = sanei_genesys_get_address (reg, 0x5f);
r->value = 0;
- DBG (DBG_proc, "gl841_init_motor_regs_off : completed. \n");
+ DBGCOMPLETED;
+ return SANE_STATUS_GOOD;
+}
+
+/** @brief write motor table frequency
+ * Write motor frequency data table.
+ * @param dev device to set up motor
+ * @param ydpi motor target resolution
+ * @return SANE_STATUS_GOOD on success
+ */
+GENESYS_STATIC SANE_Status gl841_write_freq(Genesys_Device *dev, unsigned int ydpi)
+{
+SANE_Status status;
+/**< fast table */
+uint8_t tdefault[] = {0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0x36,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xb6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0xf6,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76,0x18,0x76};
+uint8_t t1200[] = {0xc7,0x31,0xc7,0x31,0xc7,0x31,0xc7,0x31,0xc7,0x31,0xc7,0x31,0xc7,0x31,0xc7,0x31,0xc0,0x11,0xc0,0x11,0xc0,0x11,0xc0,0x11,0xc0,0x11,0xc0,0x11,0xc0,0x11,0xc0,0x11,0xc7,0xb1,0xc7,0xb1,0xc7,0xb1,0xc7,0xb1,0xc7,0xb1,0xc7,0xb1,0xc7,0xb1,0xc7,0xb1,0x07,0xe0,0x07,0xe0,0x07,0xe0,0x07,0xe0,0x07,0xe0,0x07,0xe0,0x07,0xe0,0x07,0xe0,0xc7,0xf1,0xc7,0xf1,0xc7,0xf1,0xc7,0xf1,0xc7,0xf1,0xc7,0xf1,0xc7,0xf1,0xc7,0xf1,0xc0,0x51,0xc0,0x51,0xc0,0x51,0xc0,0x51,0xc0,0x51,0xc0,0x51,0xc0,0x51,0xc0,0x51,0xc7,0x71,0xc7,0x71,0xc7,0x71,0xc7,0x71,0xc7,0x71,0xc7,0x71,0xc7,0x71,0xc7,0x71,0x07,0x20,0x07,0x20,0x07,0x20,0x07,0x20,0x07,0x20,0x07,0x20,0x07,0x20,0x07,0x20};
+uint8_t t300[] = {0x08,0x32,0x08,0x32,0x08,0x32,0x08,0x32,0x08,0x32,0x08,0x32,0x08,0x32,0x08,0x32,0x00,0x13,0x00,0x13,0x00,0x13,0x00,0x13,0x00,0x13,0x00,0x13,0x00,0x13,0x00,0x13,0x08,0xb2,0x08,0xb2,0x08,0xb2,0x08,0xb2,0x08,0xb2,0x08,0xb2,0x08,0xb2,0x08,0xb2,0x0c,0xa0,0x0c,0xa0,0x0c,0xa0,0x0c,0xa0,0x0c,0xa0,0x0c,0xa0,0x0c,0xa0,0x0c,0xa0,0x08,0xf2,0x08,0xf2,0x08,0xf2,0x08,0xf2,0x08,0xf2,0x08,0xf2,0x08,0xf2,0x08,0xf2,0x00,0xd3,0x00,0xd3,0x00,0xd3,0x00,0xd3,0x00,0xd3,0x00,0xd3,0x00,0xd3,0x00,0xd3,0x08,0x72,0x08,0x72,0x08,0x72,0x08,0x72,0x08,0x72,0x08,0x72,0x08,0x72,0x08,0x72,0x0c,0x60,0x0c,0x60,0x0c,0x60,0x0c,0x60,0x0c,0x60,0x0c,0x60,0x0c,0x60,0x0c,0x60};
+uint8_t t150[] = {0x0c,0x33,0xcf,0x33,0xcf,0x33,0xcf,0x33,0xcf,0x33,0xcf,0x33,0xcf,0x33,0xcf,0x33,0x40,0x14,0x80,0x15,0x80,0x15,0x80,0x15,0x80,0x15,0x80,0x15,0x80,0x15,0x80,0x15,0x0c,0xb3,0xcf,0xb3,0xcf,0xb3,0xcf,0xb3,0xcf,0xb3,0xcf,0xb3,0xcf,0xb3,0xcf,0xb3,0x11,0xa0,0x16,0xa0,0x16,0xa0,0x16,0xa0,0x16,0xa0,0x16,0xa0,0x16,0xa0,0x16,0xa0,0x0c,0xf3,0xcf,0xf3,0xcf,0xf3,0xcf,0xf3,0xcf,0xf3,0xcf,0xf3,0xcf,0xf3,0xcf,0xf3,0x40,0xd4,0x80,0xd5,0x80,0xd5,0x80,0xd5,0x80,0xd5,0x80,0xd5,0x80,0xd5,0x80,0xd5,0x0c,0x73,0xcf,0x73,0xcf,0x73,0xcf,0x73,0xcf,0x73,0xcf,0x73,0xcf,0x73,0xcf,0x73,0x11,0x60,0x16,0x60,0x16,0x60,0x16,0x60,0x16,0x60,0x16,0x60,0x16,0x60,0x16,0x60};
- return SANE_STATUS_GOOD;
+uint8_t *table;
+
+ DBGSTART;
+ if(dev->model->motor_type == MOTOR_CANONLIDE80)
+ {
+ switch(ydpi)
+ {
+ case 3600:
+ case 1200:
+ table=t1200;
+ break;
+ case 900:
+ case 300:
+ table=t300;
+ break;
+ case 450:
+ case 150:
+ table=t150;
+ break;
+ default:
+ table=tdefault;
+ }
+ RIE(sanei_genesys_write_register(dev, 0x66, 0x00));
+ RIE(sanei_genesys_write_register(dev, 0x5b, 0x0c));
+ RIE(sanei_genesys_write_register(dev, 0x5c, 0x00));
+ RIE(gl841_bulk_write_data_gamma (dev, 0x28, table, 128));
+ RIE(sanei_genesys_write_register(dev, 0x5b, 0x00));
+ RIE(sanei_genesys_write_register(dev, 0x5c, 0x00));
+ }
+ DBGCOMPLETED;
+ return SANE_STATUS_GOOD;
}
-static SANE_Status
+
+#ifndef UNIT_TESTING
+static
+#endif
+SANE_Status
gl841_init_motor_regs(Genesys_Device * dev,
Genesys_Register_Set * reg,
unsigned int feed_steps,/*1/base_ydpi*/
/*maybe float for half/quarter step resolution?*/
unsigned int action,
- unsigned int flags)
+ unsigned int flags)
{
SANE_Status status;
unsigned int fast_exposure;
+ int scan_power_mode;
int use_fast_fed = 0;
uint16_t fast_slope_table[256];
unsigned int fast_slope_steps = 0;
@@ -1399,49 +1715,48 @@ gl841_init_motor_regs(Genesys_Device * dev,
flags);
memset(fast_slope_table,0xff,512);
-
+
gl841_send_slope_table (dev, 0, fast_slope_table, 256);
gl841_send_slope_table (dev, 1, fast_slope_table, 256);
gl841_send_slope_table (dev, 2, fast_slope_table, 256);
gl841_send_slope_table (dev, 3, fast_slope_table, 256);
gl841_send_slope_table (dev, 4, fast_slope_table, 256);
+ gl841_write_freq(dev, dev->motor.base_ydpi / 4);
- if (action == MOTOR_ACTION_FEED || action == MOTOR_ACTION_GO_HOME) {
-/* FEED and GO_HOME can use fastest slopes available */
- fast_slope_steps = 256;
- fast_exposure = sanei_genesys_exposure_time2(
- dev,
- dev->motor.base_ydpi / 4,
- 0,/*step_type*/
- 0,/*last used pixel*/
- 0,
- 0);
-
- DBG (DBG_info, "gl841_init_motor_regs : fast_exposure=%d pixels\n",
- fast_exposure);
- }
+ fast_slope_steps = 256;
+ if (action == MOTOR_ACTION_FEED || action == MOTOR_ACTION_GO_HOME)
+ {
+ /* FEED and GO_HOME can use fastest slopes available */
+ fast_exposure = gl841_exposure_time(dev,
+ dev->motor.base_ydpi / 4,
+ 0,
+ 0,
+ 0,
+ &scan_power_mode);
+ DBG (DBG_info, "%s : fast_exposure=%d pixels\n", __FUNCTION__, fast_exposure);
+ }
if (action == MOTOR_ACTION_HOME_FREE) {
/* HOME_FREE must be able to stop in one step, so do not try to get faster */
- fast_slope_steps = 256;
fast_exposure = dev->motor.slopes[0][0].maximum_start_speed;
}
sanei_genesys_create_slope_table3 (
dev,
- fast_slope_table, 256,
+ fast_slope_table,
+ 256,
fast_slope_steps,
- 0,
+ 0,
fast_exposure,
dev->motor.base_ydpi / 4,
&fast_slope_steps,
&fast_exposure, 0);
-
+
feedl = feed_steps - fast_slope_steps*2;
use_fast_fed = 1;
-
-/* all needed slopes available. we did even decide which mode to use.
+
+/* all needed slopes available. we did even decide which mode to use.
what next?
- transfer slopes
SCAN:
@@ -1475,16 +1790,16 @@ HOME_FREE: 3
r->value = (feedl >> 16) & 0xf;
r = sanei_genesys_get_address (reg, 0x3e);
r->value = (feedl >> 8) & 0xff;
- r = sanei_genesys_get_address (reg, 0x3f);
+ r = sanei_genesys_get_address (reg, 0x3f);
r->value = feedl & 0xff;
- r = sanei_genesys_get_address (reg, 0x5e);
+ r = sanei_genesys_get_address (reg, 0x5e);
r->value &= ~0xe0;
r = sanei_genesys_get_address (reg, 0x25);
r->value = 0;
r = sanei_genesys_get_address (reg, 0x26);
r->value = 0;
- r = sanei_genesys_get_address (reg, 0x27);
+ r = sanei_genesys_get_address (reg, 0x27);
r->value = 0;
r = sanei_genesys_get_address (reg, 0x02);
@@ -1493,7 +1808,7 @@ HOME_FREE: 3
r->value |= 0x10;
- if (action == MOTOR_ACTION_GO_HOME)
+ if (action == MOTOR_ACTION_GO_HOME)
r->value |= 0x06;
else
r->value &= ~0x06;
@@ -1511,38 +1826,40 @@ HOME_FREE: 3
r->value &= ~0x40;
status = gl841_send_slope_table (dev, 3, fast_slope_table, 256);
-
+
if (status != SANE_STATUS_GOOD)
return status;
-
- r = sanei_genesys_get_address (reg, 0x67);
+
+ r = sanei_genesys_get_address (reg, 0x67);
r->value = 0x3f;
r = sanei_genesys_get_address (reg, 0x68);
r->value = 0x3f;
- r = sanei_genesys_get_address (reg, 0x21);
+ r = sanei_genesys_get_address (reg, REG_STEPNO);
r->value = 0;
-
- r = sanei_genesys_get_address (reg, 0x24);
+
+ r = sanei_genesys_get_address (reg, REG_FASTNO);
r->value = 0;
-
+
r = sanei_genesys_get_address (reg, 0x69);
r->value = 0;
-
+
r = sanei_genesys_get_address (reg, 0x6a);
r->value = (fast_slope_steps >> 1) + (fast_slope_steps & 1);
-
+
r = sanei_genesys_get_address (reg, 0x5f);
r->value = (fast_slope_steps >> 1) + (fast_slope_steps & 1);
- DBG (DBG_proc, "gl841_init_motor_regs : completed. \n");
-
- return SANE_STATUS_GOOD;
+ DBGCOMPLETED;
+ return SANE_STATUS_GOOD;
}
-static SANE_Status
+#ifndef UNIT_TESTING
+static
+#endif
+SANE_Status
gl841_init_motor_regs_scan(Genesys_Device * dev,
Genesys_Register_Set * reg,
unsigned int scan_exposure_time,/*pixel*/
@@ -1554,11 +1871,12 @@ gl841_init_motor_regs_scan(Genesys_Device * dev,
unsigned int feed_steps,/*1/base_ydpi*/
/*maybe float for half/quarter step resolution?*/
int scan_power_mode,
- unsigned int flags)
+ unsigned int flags)
{
SANE_Status status;
unsigned int fast_exposure;
int use_fast_fed = 0;
+ int dummy_power_mode;
unsigned int fast_time;
unsigned int slow_time;
uint16_t slow_slope_table[256];
@@ -1586,26 +1904,25 @@ gl841_init_motor_regs_scan(Genesys_Device * dev,
scan_power_mode,
flags);
- fast_exposure = sanei_genesys_exposure_time2(
- dev,
- dev->motor.base_ydpi / 4,
- 0,/*step_type*/
- 0,/*last used pixel*/
- 0,
- scan_power_mode);
-
- DBG (DBG_info, "gl841_init_motor_regs_scan : fast_exposure=%d pixels\n",
- fast_exposure);
+ fast_exposure = gl841_exposure_time(dev,
+ dev->motor.base_ydpi / 4,
+ 0,
+ 0,
+ 0,
+ &dummy_power_mode);
+ DBG (DBG_info, "%s : fast_exposure=%d pixels\n", __FUNCTION__, fast_exposure);
memset(slow_slope_table,0xff,512);
-
+
gl841_send_slope_table (dev, 0, slow_slope_table, 256);
gl841_send_slope_table (dev, 1, slow_slope_table, 256);
gl841_send_slope_table (dev, 2, slow_slope_table, 256);
gl841_send_slope_table (dev, 3, slow_slope_table, 256);
gl841_send_slope_table (dev, 4, slow_slope_table, 256);
+ /* motor frequency table */
+ gl841_write_freq(dev, scan_yres);
/*
we calculate both tables for SCAN. the fast slope step count depends on
@@ -1616,53 +1933,55 @@ gl841_init_motor_regs_scan(Genesys_Device * dev,
dev,
slow_slope_table, 256,
256,
- scan_step_type,
+ scan_step_type,
scan_exposure_time,
scan_yres,
&slow_slope_steps,
NULL,
scan_power_mode);
-
+
sanei_genesys_create_slope_table3 (
dev,
back_slope_table, 256,
256,
- scan_step_type,
+ scan_step_type,
0,
scan_yres,
&back_slope_steps,
NULL,
scan_power_mode);
-
+
if (feed_steps < (slow_slope_steps >> scan_step_type)) {
/*TODO: what should we do here?? go back to exposure calculation?*/
feed_steps = slow_slope_steps >> scan_step_type;
}
-
- if (feed_steps > fast_slope_steps*2 -
- (slow_slope_steps >> scan_step_type))
+
+ if (feed_steps > fast_slope_steps*2 -
+ (slow_slope_steps >> scan_step_type))
fast_slope_steps = 256;
- else
+ else
/* we need to shorten fast_slope_steps here. */
- fast_slope_steps = (feed_steps -
+ fast_slope_steps = (feed_steps -
(slow_slope_steps >> scan_step_type))/2;
-
+
DBG(DBG_info,"gl841_init_motor_regs_scan: Maximum allowed slope steps for fast slope: %d\n",fast_slope_steps);
-
+
fast_slope_time = sanei_genesys_create_slope_table3 (
dev,
fast_slope_table, 256,
fast_slope_steps,
- 0,
+ 0,
fast_exposure,
dev->motor.base_ydpi / 4,
&fast_slope_steps,
&fast_exposure,
scan_power_mode);
-
- if (dev->model->gpo_type == GPO_XP300 || dev->model->gpo_type == GPO_DP685)
+
+ /* fast fed special cases handling */
+ if (dev->model->gpo_type == GPO_XP300
+ || dev->model->gpo_type == GPO_DP685)
{
- /* quirk: looks like at least this scanner is unable to use
+ /* quirk: looks like at least this scanner is unable to use
2-feed mode */
use_fast_fed = 0;
}
@@ -1670,36 +1989,36 @@ gl841_init_motor_regs_scan(Genesys_Device * dev,
use_fast_fed = 0;
DBG(DBG_info,"gl841_init_motor_regs_scan: feed too short, slow move forced.\n");
} else {
-/* for deciding whether we should use fast mode we need to check how long we
- need for (fast)accelerating, moving, decelerating, (TODO: stopping?)
- (slow)accelerating again versus (slow)accelerating and moving. we need
+/* for deciding whether we should use fast mode we need to check how long we
+ need for (fast)accelerating, moving, decelerating, (TODO: stopping?)
+ (slow)accelerating again versus (slow)accelerating and moving. we need
fast and slow tables here.
*/
/*NOTE: scan_exposure_time is per scan_yres*/
/*NOTE: fast_exposure is per base_ydpi/4*/
/*we use full steps as base unit here*/
- fast_time =
+ fast_time =
fast_exposure / 4 *
- (feed_steps - fast_slope_steps*2 -
- (slow_slope_steps >> scan_step_type))
+ (feed_steps - fast_slope_steps*2 -
+ (slow_slope_steps >> scan_step_type))
+ fast_slope_time*2 + slow_slope_time;
- slow_time =
+ slow_time =
(scan_exposure_time * scan_yres) / dev->motor.base_ydpi *
- (feed_steps - (slow_slope_steps >> scan_step_type))
+ (feed_steps - (slow_slope_steps >> scan_step_type))
+ slow_slope_time;
DBG(DBG_info,"gl841_init_motor_regs_scan: Time for slow move: %d\n",
slow_time);
DBG(DBG_info,"gl841_init_motor_regs_scan: Time for fast move: %d\n",
fast_time);
-
+
use_fast_fed = fast_time < slow_time;
}
-
- if (use_fast_fed)
- feedl = feed_steps - fast_slope_steps*2 -
+
+ if (use_fast_fed)
+ feedl = feed_steps - fast_slope_steps*2 -
(slow_slope_steps >> scan_step_type);
- else
+ else
if ((feed_steps << scan_step_type) < slow_slope_steps)
feedl = 0;
else
@@ -1707,7 +2026,7 @@ gl841_init_motor_regs_scan(Genesys_Device * dev,
DBG(DBG_info,"gl841_init_motor_regs_scan: Decided to use %s mode\n",
use_fast_fed?"fast feed":"slow feed");
-/* all needed slopes available. we did even decide which mode to use.
+/* all needed slopes available. we did even decide which mode to use.
what next?
- transfer slopes
SCAN:
@@ -1741,16 +2060,16 @@ HOME_FREE: 3
r->value = (feedl >> 16) & 0xf;
r = sanei_genesys_get_address (reg, 0x3e);
r->value = (feedl >> 8) & 0xff;
- r = sanei_genesys_get_address (reg, 0x3f);
+ r = sanei_genesys_get_address (reg, 0x3f);
r->value = feedl & 0xff;
- r = sanei_genesys_get_address (reg, 0x5e);
+ r = sanei_genesys_get_address (reg, 0x5e);
r->value &= ~0xe0;
r = sanei_genesys_get_address (reg, 0x25);
r->value = (scan_lines >> 16) & 0xf;
r = sanei_genesys_get_address (reg, 0x26);
r->value = (scan_lines >> 8) & 0xff;
- r = sanei_genesys_get_address (reg, 0x27);
+ r = sanei_genesys_get_address (reg, 0x27);
r->value = scan_lines & 0xff;
r = sanei_genesys_get_address (reg, 0x02);
@@ -1776,35 +2095,35 @@ HOME_FREE: 3
r->value &= ~0x40;
status = gl841_send_slope_table (dev, 0, slow_slope_table, 256);
-
+
if (status != SANE_STATUS_GOOD)
return status;
-
+
status = gl841_send_slope_table (dev, 1, back_slope_table, 256);
-
+
if (status != SANE_STATUS_GOOD)
return status;
-
+
status = gl841_send_slope_table (dev, 2, slow_slope_table, 256);
-
+
if (status != SANE_STATUS_GOOD)
return status;
-
+
if (use_fast_fed) {
status = gl841_send_slope_table (dev, 3, fast_slope_table, 256);
-
+
if (status != SANE_STATUS_GOOD)
return status;
}
-
+
if (flags & MOTOR_FLAG_AUTO_GO_HOME){
status = gl841_send_slope_table (dev, 4, fast_slope_table, 256);
-
+
if (status != SANE_STATUS_GOOD)
return status;
}
-
-
+
+
/* now reg 0x21 and 0x24 are available, we can calculate reg 0x22 and 0x23,
reg 0x60-0x62 and reg 0x63-0x65
rule:
@@ -1814,15 +2133,15 @@ HOME_FREE: 3
if (min_restep < slow_slope_steps*2+2)
min_restep = slow_slope_steps*2+2;
/* steps of table 1*/
- if (min_restep < back_slope_steps*2+2)
+ if (min_restep < back_slope_steps*2+2)
min_restep = back_slope_steps*2+2;
/* steps of table 0*/
- r = sanei_genesys_get_address (reg, 0x22);
+ r = sanei_genesys_get_address (reg, REG_FWDSTEP);
r->value = min_restep - slow_slope_steps*2;
/* steps of table 1*/
- r = sanei_genesys_get_address (reg, 0x23);
+ r = sanei_genesys_get_address (reg, REG_BWDSTEP);
r->value = min_restep - back_slope_steps*2;
-
+
/*
for z1/z2:
in dokumentation mentioned variables a-d:
@@ -1830,16 +2149,16 @@ HOME_FREE: 3
b = time needed for reg 0x1f... wouldn't that be reg0x1f*exposure_time?
c = time needed for acceleration, table 1
d = time needed for reg 0x22... wouldn't that be reg0x22*exposure_time?
- z1 = (c+d-1) % exposure_time
+ z1 = (c+d-1) % exposure_time
z2 = (a+b-1) % exposure_time
*/
-/* i don't see any effect of this. i can only guess that this will enhance
+/* i don't see any effect of this. i can only guess that this will enhance
sub-pixel accuracy
z1 = (slope_0_time-1) % exposure_time;
z2 = (slope_0_time-1) % exposure_time;
*/
z1 = z2 = 0;
-
+
DBG (DBG_info, "gl841_init_motor_regs_scan: z1 = %d\n", z1);
DBG (DBG_info, "gl841_init_motor_regs_scan: z2 = %d\n", z2);
r = sanei_genesys_get_address (reg, 0x60);
@@ -1854,40 +2173,39 @@ HOME_FREE: 3
r->value = ((z2 >> 8) & 0xff);
r = sanei_genesys_get_address (reg, 0x65);
r->value = (z2 & 0xff);
-
- r = sanei_genesys_get_address (reg, 0x1e);
- r->value &= 0xf0; /* 0 dummy lines */
- r->value |= scan_dummy; /* dummy lines */
- r = sanei_genesys_get_address (reg, 0x67);
+ r = sanei_genesys_get_address (reg, REG1E);
+ r->value &= REG1E_WDTIME;
+ r->value |= scan_dummy;
+
+ r = sanei_genesys_get_address (reg, 0x67);
r->value = 0x3f | (scan_step_type << 6);
r = sanei_genesys_get_address (reg, 0x68);
r->value = 0x3f;
- r = sanei_genesys_get_address (reg, 0x21);
+ r = sanei_genesys_get_address (reg, REG_STEPNO);
r->value = (slow_slope_steps >> 1) + (slow_slope_steps & 1);
-
- r = sanei_genesys_get_address (reg, 0x24);
+
+ r = sanei_genesys_get_address (reg, REG_FASTNO);
r->value = (back_slope_steps >> 1) + (back_slope_steps & 1);
-
+
r = sanei_genesys_get_address (reg, 0x69);
r->value = (slow_slope_steps >> 1) + (slow_slope_steps & 1);
-
+
r = sanei_genesys_get_address (reg, 0x6a);
r->value = (fast_slope_steps >> 1) + (fast_slope_steps & 1);
-
+
r = sanei_genesys_get_address (reg, 0x5f);
r->value = (fast_slope_steps >> 1) + (fast_slope_steps & 1);
- DBG (DBG_proc, "gl841_init_motor_regs_scan : completed. \n");
-
- return SANE_STATUS_GOOD;
+ DBGCOMPLETED;
+ return SANE_STATUS_GOOD;
}
static int
-gl841_get_dpihw(Genesys_Device * dev)
+gl841_get_dpihw(Genesys_Device * dev)
{
Genesys_Register_Set * r;
r = sanei_genesys_get_address (dev->reg, 0x05);
@@ -1911,7 +2229,7 @@ gl841_init_optical_regs_off(Genesys_Register_Set * reg)
r->value &= ~REG01_SCAN;
DBGCOMPLETED;
- return SANE_STATUS_GOOD;
+ return SANE_STATUS_GOOD;
}
static SANE_Status
@@ -1919,7 +2237,7 @@ gl841_init_optical_regs_scan(Genesys_Device * dev,
Genesys_Register_Set * reg,
unsigned int exposure_time,
unsigned int used_res,
- unsigned int start,
+ unsigned int start,
unsigned int pixels,
int channels,
int depth,
@@ -1934,13 +2252,14 @@ gl841_init_optical_regs_scan(Genesys_Device * dev,
unsigned int i;
Genesys_Register_Set * r;
SANE_Status status;
+ uint16_t expavg, expr, expb, expg;
DBG (DBG_proc, "gl841_init_optical_regs_scan : exposure_time=%d, "
"used_res=%d, start=%d, pixels=%d, channels=%d, depth=%d, "
"half_ccd=%d, flags=%x\n",
exposure_time,
used_res,
- start,
+ start,
pixels,
channels,
depth,
@@ -1948,7 +2267,7 @@ gl841_init_optical_regs_scan(Genesys_Device * dev,
flags);
end = start + pixels;
-
+
status = gl841_set_fe (dev, AFE_SET);
if (status != SANE_STATUS_GOOD)
{
@@ -1957,31 +2276,45 @@ gl841_init_optical_regs_scan(Genesys_Device * dev,
sane_strstatus (status));
return status;
}
-
+
/* adjust used_res for chosen dpihw */
used_res = used_res * gl841_get_dpihw(dev) / dev->sensor.optical_res;
/*
- with half_ccd the optical resolution of the ccd is halfed. We don't apply this
+ with half_ccd the optical resolution of the ccd is halved. We don't apply this
to dpihw, so we need to double dpiset.
-
+
For the scanner only the ratio of dpiset and dpihw is of relevance to scale
down properly.
*/
- if (half_ccd)
+ if (half_ccd)
dpiset = used_res * 2;
else
dpiset = used_res;
-
- if (dev->model->gpo_type == GPO_CANONLIDE35)
+
+ /* gpio part.*/
+ if (dev->model->gpo_type == GPO_CANONLIDE35)
{
-/* gpio part.*/
r = sanei_genesys_get_address (reg, REG6C);
if (half_ccd)
r->value &= ~0x80;
else
r->value |= 0x80;
}
+ if (dev->model->gpo_type == GPO_CANONLIDE80)
+ {
+ r = sanei_genesys_get_address (reg, REG6C);
+ if (half_ccd)
+ {
+ r->value &= ~0x40;
+ r->value |= 0x20;
+ }
+ else
+ {
+ r->value &= ~0x20;
+ r->value |= 0x40;
+ }
+ }
/* enable shading */
r = sanei_genesys_get_address (reg, 0x01);
@@ -1991,8 +2324,8 @@ gl841_init_optical_regs_scan(Genesys_Device * dev,
r->value &= ~REG01_DVDSET;
else
r->value |= REG01_DVDSET;
-
- /* average looks better than deletion, and we are already set up to
+
+ /* average looks better than deletion, and we are already set up to
use one of the average enabled resolutions
*/
r = sanei_genesys_get_address (reg, 0x03);
@@ -2001,7 +2334,7 @@ gl841_init_optical_regs_scan(Genesys_Device * dev,
r->value &= ~REG03_LAMPPWR;
else
r->value |= REG03_LAMPPWR;
-
+
/* exposure times */
r = sanei_genesys_get_address (reg, 0x10);
for (i = 0; i < 6; i++, r++) {
@@ -2044,84 +2377,94 @@ gl841_init_optical_regs_scan(Genesys_Device * dev,
r->value |= REG04_BITSET;
break;
}
-
+
+ /* AFEMOD should depend on FESET, and we should set these
+ * bits separately */
r->value &= ~(REG04_FILTER | REG04_AFEMOD);
- if (channels == 1)
+ if (flags & OPTICAL_FLAG_ENABLE_LEDADD)
+ {
+ r->value |= 0x10; /* no filter */
+ }
+ else if (channels == 1)
{
switch (color_filter)
- {
- case 0:
- r->value |= 0x14; /* red filter */
- break;
- case 2:
- r->value |= 0x1c; /* blue filter */
- break;
- default:
- r->value |= 0x18; /* green filter */
- break;
- }
- }
- else
- {
+ {
+ case 0:
+ r->value |= 0x14; /* red filter */
+ break;
+ case 1:
+ r->value |= 0x18; /* green filter */
+ break;
+ case 2:
+ r->value |= 0x1c; /* blue filter */
+ break;
+ default:
+ r->value |= 0x10; /* no filter */
+ break;
+ }
+ }
+ else
+ {
if (dev->model->ccd_type == CCD_PLUSTEK_3600)
{
r->value |= 0x22; /* slow color pixel by pixel */
}
- else
+ else
{
r->value |= 0x10; /* color pixel by pixel */
}
- }
+ }
/* CIS scanners can do true gray by setting LEDADD */
- if (dev->model->is_cis == SANE_TRUE)
+ r = sanei_genesys_get_address (reg, 0x87);
+ r->value &= ~REG87_LEDADD;
+ if (flags & OPTICAL_FLAG_ENABLE_LEDADD)
{
- r = sanei_genesys_get_address (reg, 0x87);
- r->value &= ~REG87_LEDADD;
- /* we set up LEDADD only when asked */
- if (channels==1 && (flags & OPTICAL_FLAG_ENABLE_LEDADD))
- {
- r->value |= REG87_LEDADD;
- }
+ r->value |= REG87_LEDADD;
+ sanei_genesys_get_double (reg, REG_EXPR, &expr);
+ sanei_genesys_get_double (reg, REG_EXPG, &expg);
+ sanei_genesys_get_double (reg, REG_EXPB, &expb);
+
+ /* use minimal exposure for best image quality */
+ expavg = expg;
+ if (expr < expg)
+ expavg = expr;
+ if (expb < expavg)
+ expavg = expb;
+
+ sanei_genesys_set_double (dev->reg, REG_EXPR, expavg);
+ sanei_genesys_set_double (dev->reg, REG_EXPG, expavg);
+ sanei_genesys_set_double (dev->reg, REG_EXPB, expavg);
}
-
+
/* enable gamma tables */
r = sanei_genesys_get_address (reg, 0x05);
if (flags & OPTICAL_FLAG_DISABLE_GAMMA)
r->value &= ~REG05_GMMENB;
else
r->value |= REG05_GMMENB;
-
+
/* sensor parameters */
sanei_gl841_setup_sensor (dev, dev->reg, 1, half_ccd);
-
+
r = sanei_genesys_get_address (reg, 0x29);
r->value = 255; /*<<<"magic" number, only suitable for cis*/
-
- r = sanei_genesys_get_address (reg, 0x2c);
- r->value = HIBYTE (dpiset);
- r = sanei_genesys_get_address (reg, 0x2d);
- r->value = LOBYTE (dpiset);
-
- r = sanei_genesys_get_address (reg, 0x30);
- r->value = HIBYTE (start);
- r = sanei_genesys_get_address (reg, 0x31);
- r->value = LOBYTE (start);
- r = sanei_genesys_get_address (reg, 0x32);
- r->value = HIBYTE (end);
- r = sanei_genesys_get_address (reg, 0x33);
- r->value = LOBYTE (end);
-
-/* words(16bit) before gamma, conversion to 8 bit or lineart*/
- words_per_line = (pixels * dpiset) / gl841_get_dpihw(dev);
-
+
+ sanei_genesys_set_double(reg, REG_DPISET, dpiset);
+ sanei_genesys_set_double(reg, REG_STRPIXEL, start);
+ sanei_genesys_set_double(reg, REG_ENDPIXEL, end);
+ DBG( DBG_io2, "%s: STRPIXEL=%d, ENDPIXEL=%d\n",__FUNCTION__,start,end);
+
+ /* words(16bit) before gamma, conversion to 8 bit or lineart*/
+ words_per_line = (pixels * dpiset) / gl841_get_dpihw(dev);
+
words_per_line *= channels;
if (depth == 1)
words_per_line = (words_per_line >> 3) + ((words_per_line & 7)?1:0);
else
words_per_line *= depth / 8;
-
+
dev->wpl = words_per_line;
dev->bpl = words_per_line;
@@ -2131,22 +2474,18 @@ gl841_init_optical_regs_scan(Genesys_Device * dev,
r->value = HIBYTE (LOWORD (words_per_line));
r = sanei_genesys_get_address (reg, 0x37);
r->value = LOBYTE (LOWORD (words_per_line));
-
- r = sanei_genesys_get_address (reg, 0x38);
- r->value = HIBYTE (exposure_time);
- r = sanei_genesys_get_address (reg, 0x39);
- r->value = LOBYTE (exposure_time);
+
+ sanei_genesys_set_double(reg, REG_LPERIOD, exposure_time);
r = sanei_genesys_get_address (reg, 0x34);
r->value = dev->sensor.dummy_pixel;
- DBG (DBG_proc, "gl841_init_optical_regs_scan : completed. \n");
- return SANE_STATUS_GOOD;
+ DBGCOMPLETED;
+ return SANE_STATUS_GOOD;
}
-
-static int
-gl841_get_led_exposure(Genesys_Device * dev)
+static int
+gl841_get_led_exposure(Genesys_Device * dev)
{
int d,r,g,b,m;
if (!dev->model->is_cis)
@@ -2161,17 +2500,94 @@ gl841_get_led_exposure(Genesys_Device * dev)
m = g;
if (m < b)
m = b;
-
+
return m + d;
}
+/** @brief compute exposure time
+ * Compute exposure time for the device and the given scan resolution,
+ * also compute scan_power_mode
+ */
+GENESYS_STATIC int
+gl841_exposure_time(Genesys_Device *dev,
+ float slope_dpi,
+ int scan_step_type,
+ int start,
+ int used_pixels,
+ int *scan_power_mode)
+{
+int exposure_time = 0;
+int exposure_time2 = 0;
+int led_exposure;
+
+ *scan_power_mode=0;
+ led_exposure=gl841_get_led_exposure(dev);
+ exposure_time = sanei_genesys_exposure_time2(
+ dev,
+ slope_dpi,
+ scan_step_type,
+ start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
+ led_exposure,
+ *scan_power_mode);
+
+ while(*scan_power_mode + 1 < dev->motor.power_mode_count) {
+ exposure_time2 = sanei_genesys_exposure_time2(
+ dev,
+ slope_dpi,
+ scan_step_type,
+ start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
+ led_exposure,
+ *scan_power_mode + 1);
+ if (exposure_time < exposure_time2)
+ break;
+ exposure_time = exposure_time2;
+ (*scan_power_mode)++;
+ }
+
+ return exposure_time;
+}
+
+/**@brief compute scan_step_type
+ * Try to do at least 4 steps per line. if that is impossible we will have to
+ * live with that.
+ * @param dev device
+ * @param yres motor resolution
+ */
+GENESYS_STATIC int
+gl841_scan_step_type(Genesys_Device *dev, int yres)
+{
+int scan_step_type=0;
+
+ /* TODO : check if there is a bug around the use of max_step_type */
+ /* should be <=1, need to chek all devices entry in genesys_devices */
+ if (yres*4 < dev->motor.base_ydpi || dev->motor.max_step_type <= 0)
+ {
+ scan_step_type = 0;
+ }
+ else if (yres*4 < dev->motor.base_ydpi*2 || dev->motor.max_step_type <= 1)
+ {
+ scan_step_type = 1;
+ }
+ else
+ {
+ scan_step_type = 2;
+ }
+
+ /* this motor behaves differently */
+ if (dev->model->motor_type==MOTOR_CANONLIDE80)
+ {
+ /* driven by 'frequency' tables ? */
+ scan_step_type = 0;
+ }
+
+ return scan_step_type;
+}
+
/* set up registers for an actual scan
*
* this function sets up the scanner to scan in normal or single line mode
*/
-#ifndef UNIT_TESTING
-static
-#endif
+GENESYS_STATIC
SANE_Status
gl841_init_scan_regs (Genesys_Device * dev,
Genesys_Register_Set * reg,
@@ -2192,20 +2608,22 @@ gl841_init_scan_regs (Genesys_Device * dev,
int bytes_per_line;
int move;
unsigned int lincnt;
- int exposure_time, exposure_time2, led_exposure;
+ int exposure_time;
+ int scan_power_mode;
int i;
int stagger;
+ int avg;
int slope_dpi = 0;
int dummy = 0;
int scan_step_type = 1;
- int scan_power_mode = 0;
int max_shift;
size_t requested_buffer_size, read_buffer_size;
SANE_Bool half_ccd; /* false: full CCD res is used, true, half max CCD res is used */
int optical_res;
SANE_Status status;
+ unsigned int oflags; /**> optical flags */
DBG (DBG_info,
"gl841_init_scan_regs settings:\n"
@@ -2281,34 +2699,32 @@ independent of our calculated values:
if (i < 2 || (flags & SCAN_FLAG_USE_OPTICAL_RES)) /* optical_res >= xres > optical_res/2 */
used_res = optical_res;
else if (i < 3) /* optical_res/2 >= xres > optical_res/3 */
- used_res = optical_res/2;
+ used_res = optical_res/2;
else if (i < 4) /* optical_res/3 >= xres > optical_res/4 */
- used_res = optical_res/3;
+ used_res = optical_res/3;
else if (i < 5) /* optical_res/4 >= xres > optical_res/5 */
- used_res = optical_res/4;
+ used_res = optical_res/4;
else if (i < 6) /* optical_res/5 >= xres > optical_res/6 */
- used_res = optical_res/5;
+ used_res = optical_res/5;
else if (i < 8) /* optical_res/6 >= xres > optical_res/8 */
- used_res = optical_res/6;
+ used_res = optical_res/6;
else if (i < 10) /* optical_res/8 >= xres > optical_res/10 */
- used_res = optical_res/8;
+ used_res = optical_res/8;
else if (i < 12) /* optical_res/10 >= xres > optical_res/12 */
- used_res = optical_res/10;
+ used_res = optical_res/10;
else if (i < 15) /* optical_res/12 >= xres > optical_res/15 */
- used_res = optical_res/12;
+ used_res = optical_res/12;
else
used_res = optical_res/15;
/* compute scan parameters values */
/* pixels are allways given at half or full CCD optical resolution */
/* use detected left margin and fixed value */
-/* start */
+ /* start */
/* add x coordinates */
- start =
- ((dev->sensor.CCD_start_xoffset + startx) * used_res) /
- dev->sensor.optical_res;
+ start = ((dev->sensor.CCD_start_xoffset + startx) * used_res) / dev->sensor.optical_res;
-/* needs to be aligned for used_res */
+ /* needs to be aligned for used_res */
start = (start * optical_res) / used_res;
start += dev->sensor.dummy_pixel + 1;
@@ -2316,10 +2732,19 @@ independent of our calculated values:
if (stagger > 0)
start |= 1;
+ /* in case of SHDAREA, we need to align start
+ * on pixel average factor, startx is different of
+ * 0 only when calling for function to setup for
+ * scan, where shading data needs to be align */
+ if((dev->reg[reg_0x01].value & REG01_SHDAREA) != 0)
+ {
+ avg=optical_res/used_res;
+ start=(start/avg)*avg;
+ }
+
/* compute correct pixels number */
-/* pixels */
- used_pixels =
- (pixels * optical_res) / xres;
+ /* pixels */
+ used_pixels = (pixels * optical_res) / xres;
/* round up pixels number if needed */
if (used_pixels * xres < pixels * optical_res)
@@ -2327,8 +2752,8 @@ independent of our calculated values:
/* dummy */
/* dummy lines: may not be usefull, for instance 250 dpi works with 0 or 1
- dummy line. Maybe the dummy line adds correctness since the motor runs
- slower (higher dpi)
+ dummy line. Maybe the dummy line adds correctness since the motor runs
+ slower (higher dpi)
*/
/* for cis this creates better aligned color lines:
dummy \ scanned lines
@@ -2355,86 +2780,64 @@ dummy \ scanned lines
/* slope_dpi */
/* cis color scan is effectively a gray scan with 3 gray lines per color
line and a FILTER of 0 */
- if (dev->model->is_cis)
+ if (dev->model->is_cis)
slope_dpi = yres*channels;
else
slope_dpi = yres;
slope_dpi = slope_dpi * (1 + dummy);
-/* scan_step_type */
-/* Try to do at least 4 steps per line. if that is impossible we will have to
- live with that
- */
- if (yres*4 < dev->motor.base_ydpi
- || dev->motor.max_step_type <= 0)
- scan_step_type = 0;
- else if (yres*4 < dev->motor.base_ydpi*2
- || dev->motor.max_step_type <= 1)
- scan_step_type = 1;
- else
- scan_step_type = 2;
-
-/* exposure_time */
- led_exposure = gl841_get_led_exposure(dev);
-
- exposure_time = sanei_genesys_exposure_time2(
- dev,
- slope_dpi,
- scan_step_type,
- start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
- led_exposure,
- scan_power_mode);
-
- while(scan_power_mode + 1 < dev->motor.power_mode_count) {
- exposure_time2 = sanei_genesys_exposure_time2(
- dev,
- slope_dpi,
- scan_step_type,
- start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
- led_exposure,
- scan_power_mode + 1);
- if (exposure_time < exposure_time2)
- break;
- exposure_time = exposure_time2;
- scan_power_mode++;
- }
-
-
- DBG (DBG_info, "gl841_init_scan_regs : exposure_time=%d pixels\n",
- exposure_time);
+ scan_step_type = gl841_scan_step_type(dev, yres);
+ exposure_time = gl841_exposure_time(dev,
+ slope_dpi,
+ scan_step_type,
+ start,
+ used_pixels,
+ &scan_power_mode);
+ DBG (DBG_info, "%s : exposure_time=%d pixels\n", __FUNCTION__, exposure_time);
-/*** optical parameters ***/
+ /*** optical parameters ***/
/* in case of dynamic lineart, we use an internal 8 bit gray scan
* to generate 1 lineart data */
if(flags & SCAN_FLAG_DYNAMIC_LINEART)
{
depth=8;
}
- if (depth == 16)
- flags |= SCAN_FLAG_DISABLE_GAMMA;
- status = gl841_init_optical_regs_scan(dev,
- reg,
+ oflags=0;
+ if (flags & SCAN_FLAG_DISABLE_SHADING)
+ {
+ oflags |= OPTICAL_FLAG_DISABLE_SHADING;
+ }
+ if ((flags & SCAN_FLAG_DISABLE_GAMMA) || (depth==16))
+ {
+ oflags |= OPTICAL_FLAG_DISABLE_GAMMA;
+ }
+ if (flags & SCAN_FLAG_DISABLE_LAMP)
+ {
+ oflags |= OPTICAL_FLAG_DISABLE_LAMP;
+ }
+ if (flags & SCAN_FLAG_ENABLE_LEDADD)
+ {
+ oflags |= OPTICAL_FLAG_ENABLE_LEDADD;
+ }
+
+ status = gl841_init_optical_regs_scan(dev,
+ reg,
exposure_time,
used_res,
- start,
+ start,
used_pixels,
channels,
depth,
half_ccd,
color_filter,
- ((flags & SCAN_FLAG_DISABLE_SHADING)?
- OPTICAL_FLAG_DISABLE_SHADING:0) |
- ((flags & SCAN_FLAG_DISABLE_GAMMA)?
- OPTICAL_FLAG_DISABLE_GAMMA:0) |
- ((flags & SCAN_FLAG_DISABLE_LAMP)?
- OPTICAL_FLAG_DISABLE_LAMP:0)
- );
-
+ oflags);
if (status != SANE_STATUS_GOOD)
+ {
return status;
-
+ }
+
/*** motor parameters ***/
/* scanned area must be enlarged by max color shift needed */
@@ -2482,7 +2885,7 @@ dummy \ scanned lines
/*** prepares data reordering ***/
/* words_per_line */
- bytes_per_line = (used_pixels * used_res) / optical_res;
+ bytes_per_line = (used_pixels * used_res) / optical_res;
bytes_per_line = (bytes_per_line * channels * depth) / 8;
requested_buffer_size = 8 * bytes_per_line;
@@ -2500,13 +2903,13 @@ dummy \ scanned lines
RIE(sanei_genesys_buffer_free(&(dev->lines_buffer)));
RIE(sanei_genesys_buffer_alloc(&(dev->lines_buffer), read_buffer_size));
-
+
RIE(sanei_genesys_buffer_free(&(dev->shrink_buffer)));
- RIE(sanei_genesys_buffer_alloc(&(dev->shrink_buffer),
+ RIE(sanei_genesys_buffer_alloc(&(dev->shrink_buffer),
requested_buffer_size));
-
+
RIE(sanei_genesys_buffer_free(&(dev->out_buffer)));
- RIE(sanei_genesys_buffer_alloc(&(dev->out_buffer),
+ RIE(sanei_genesys_buffer_alloc(&(dev->out_buffer),
(8 * dev->settings.pixels * channels * depth) / 8));
@@ -2534,12 +2937,12 @@ dummy \ scanned lines
/* theory :
target_size =
(dev->settings.pixels * dev->settings.lines * channels * depth) / 8;
- but it suffers from integer overflow so we do the following:
+ but it suffers from integer overflow so we do the following:
- 1 bit color images store color data byte-wise, eg byte 0 contains
- 8 bits of red data, byte 1 contains 8 bits of green, byte 2 contains
+ 1 bit color images store color data byte-wise, eg byte 0 contains
+ 8 bits of red data, byte 1 contains 8 bits of green, byte 2 contains
8 bits of blue.
- This does not fix the overflow, though.
+ This does not fix the overflow, though.
644mp*16 = 10gp, leading to an overflow
-- pierre
*/
@@ -2578,14 +2981,14 @@ gl841_calculate_current_setup (Genesys_Device * dev)
int used_res;
int used_pixels;
unsigned int lincnt;
- int exposure_time, exposure_time2, led_exposure;
+ int exposure_time;
+ int scan_power_mode;
int i;
int stagger;
int slope_dpi = 0;
int dummy = 0;
int scan_step_type = 1;
- int scan_power_mode = 0;
int max_shift;
SANE_Bool half_ccd; /* false: full CCD res is used, true, half max CCD res is used */
@@ -2669,21 +3072,21 @@ gl841_calculate_current_setup (Genesys_Device * dev)
if (i < 2) /* optical_res >= xres > optical_res/2 */
used_res = optical_res;
else if (i < 3) /* optical_res/2 >= xres > optical_res/3 */
- used_res = optical_res/2;
+ used_res = optical_res/2;
else if (i < 4) /* optical_res/3 >= xres > optical_res/4 */
- used_res = optical_res/3;
+ used_res = optical_res/3;
else if (i < 5) /* optical_res/4 >= xres > optical_res/5 */
- used_res = optical_res/4;
+ used_res = optical_res/4;
else if (i < 6) /* optical_res/5 >= xres > optical_res/6 */
- used_res = optical_res/5;
+ used_res = optical_res/5;
else if (i < 8) /* optical_res/6 >= xres > optical_res/8 */
- used_res = optical_res/6;
+ used_res = optical_res/6;
else if (i < 10) /* optical_res/8 >= xres > optical_res/10 */
- used_res = optical_res/8;
+ used_res = optical_res/8;
else if (i < 12) /* optical_res/10 >= xres > optical_res/12 */
- used_res = optical_res/10;
+ used_res = optical_res/10;
else if (i < 15) /* optical_res/12 >= xres > optical_res/15 */
- used_res = optical_res/12;
+ used_res = optical_res/12;
else
used_res = optical_res/15;
@@ -2692,7 +3095,7 @@ gl841_calculate_current_setup (Genesys_Device * dev)
/* use detected left margin and fixed value */
/* start */
/* add x coordinates */
- start =
+ start =
((dev->sensor.CCD_start_xoffset + startx) * used_res) /
dev->sensor.optical_res;
@@ -2715,8 +3118,8 @@ gl841_calculate_current_setup (Genesys_Device * dev)
/* dummy */
/* dummy lines: may not be usefull, for instance 250 dpi works with 0 or 1
- dummy line. Maybe the dummy line adds correctness since the motor runs
- slower (higher dpi)
+ dummy line. Maybe the dummy line adds correctness since the motor runs
+ slower (higher dpi)
*/
/* for cis this creates better aligned color lines:
dummy \ scanned lines
@@ -2743,53 +3146,21 @@ dummy \ scanned lines
/* slope_dpi */
/* cis color scan is effectively a gray scan with 3 gray lines per color
line and a FILTER of 0 */
- if (dev->model->is_cis)
+ if (dev->model->is_cis)
slope_dpi = yres*channels;
else
slope_dpi = yres;
slope_dpi = slope_dpi * (1 + dummy);
-/* scan_step_type */
-/* Try to do at least 4 steps per line. if that is impossible we will have to
- live with that
- */
- if (yres*4 < dev->motor.base_ydpi
- || dev->motor.max_step_type <= 0)
- scan_step_type = 0;
- else if (yres*4 < dev->motor.base_ydpi*2
- || dev->motor.max_step_type <= 1)
- scan_step_type = 1;
- else
- scan_step_type = 2;
-
- led_exposure = gl841_get_led_exposure(dev);
-
-/* exposure_time */
- exposure_time = sanei_genesys_exposure_time2(
- dev,
- slope_dpi,
- scan_step_type,
- start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
- led_exposure,
- scan_power_mode);
-
- while(scan_power_mode + 1 < dev->motor.power_mode_count) {
- exposure_time2 = sanei_genesys_exposure_time2(
- dev,
- slope_dpi,
- scan_step_type,
- start+used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/
- led_exposure,
- scan_power_mode + 1);
- if (exposure_time < exposure_time2)
- break;
- exposure_time = exposure_time2;
- scan_power_mode++;
- }
-
- DBG (DBG_info, "gl841_calculate_current_setup : exposure_time=%d pixels\n",
- exposure_time);
+ scan_step_type = gl841_scan_step_type(dev, yres);
+ exposure_time = gl841_exposure_time(dev,
+ slope_dpi,
+ scan_step_type,
+ start,
+ used_pixels,
+ &scan_power_mode);
+ DBG (DBG_info, "%s : exposure_time=%d pixels\n", __FUNCTION__, exposure_time);
/* scanned area must be enlarged by max color shift needed */
max_shift=sanei_genesys_compute_max_shift(dev,channels,yres,0);
@@ -2808,7 +3179,7 @@ dummy \ scanned lines
dev->current_setup.stagger = stagger;
dev->current_setup.max_shift = max_shift + stagger;
- DBG (DBG_proc, "gl841_calculate_current_setup: completed\n");
+ DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -2835,7 +3206,7 @@ gl841_set_motor_power (Genesys_Register_Set * regs, SANE_Bool set)
}
static void
-gl841_set_lamp_power (Genesys_Device * dev,
+gl841_set_lamp_power (Genesys_Device * dev,
Genesys_Register_Set * regs, SANE_Bool set)
{
Genesys_Register_Set * r;
@@ -2878,16 +3249,16 @@ gl841_set_lamp_power (Genesys_Device * dev,
static SANE_Status
gl841_save_power(Genesys_Device * dev, SANE_Bool enable) {
uint8_t val;
-
+
DBG(DBG_proc, "gl841_save_power: enable = %d\n", enable);
if (enable)
{
- if (dev->model->gpo_type == GPO_CANONLIDE35)
+ if (dev->model->gpo_type == GPO_CANONLIDE35)
{
-/* expect GPIO17 to be enabled, and GPIO9 to be disabled,
+/* expect GPIO17 to be enabled, and GPIO9 to be disabled,
while GPIO8 is disabled*/
-/* final state: GPIO8 disabled, GPIO9 enabled, GPIO17 disabled,
+/* final state: GPIO8 disabled, GPIO9 enabled, GPIO17 disabled,
GPIO18 disabled*/
sanei_genesys_read_register(dev, REG6D, &val);
@@ -2898,7 +3269,7 @@ gl841_save_power(Genesys_Device * dev, SANE_Bool enable) {
/*enable GPIO9*/
sanei_genesys_read_register(dev, REG6C, &val);
sanei_genesys_write_register(dev, REG6C, val | 0x01);
-
+
/*disable GPO17*/
sanei_genesys_read_register(dev, REG6B, &val);
sanei_genesys_write_register(dev, REG6B, val & ~REG6B_GPO17);
@@ -2923,14 +3294,14 @@ gl841_save_power(Genesys_Device * dev, SANE_Bool enable) {
gl841_set_fe (dev, AFE_POWER_SAVE);
- }
- else
+ }
+ else
{
- if (dev->model->gpo_type == GPO_CANONLIDE35)
+ if (dev->model->gpo_type == GPO_CANONLIDE35)
{
-/* expect GPIO17 to be enabled, and GPIO9 to be disabled,
+/* expect GPIO17 to be enabled, and GPIO9 to be disabled,
while GPIO8 is disabled*/
-/* final state: GPIO8 enabled, GPIO9 disabled, GPIO17 enabled,
+/* final state: GPIO8 enabled, GPIO9 disabled, GPIO17 enabled,
GPIO18 enabled*/
sanei_genesys_read_register(dev, REG6D, &val);
@@ -2959,7 +3330,7 @@ gl841_save_power(Genesys_Device * dev, SANE_Bool enable) {
dev->calib_reg[reg_0x6b].value |= REG6B_GPO18;
}
- if (dev->model->gpo_type == GPO_DP665
+ if (dev->model->gpo_type == GPO_DP665
|| dev->model->gpo_type == GPO_DP685)
{
sanei_genesys_read_register(dev, REG6B, &val);
@@ -3049,7 +3420,7 @@ gl841_set_powersaving (Genesys_Device * dev,
local_reg[5].value = exposure_time & 255; /* lowbyte */
status =
- gl841_bulk_write_register (dev, local_reg,
+ gl841_bulk_write_register (dev, local_reg,
sizeof (local_reg)/sizeof (local_reg[0]));
if (status != SANE_STATUS_GOOD)
DBG (DBG_error,
@@ -3060,13 +3431,19 @@ gl841_set_powersaving (Genesys_Device * dev,
return status;
}
-static SANE_Status
+#ifndef UNIT_TESTING
+static
+#endif
+SANE_Status
gl841_start_action (Genesys_Device * dev)
{
return sanei_genesys_write_register (dev, 0x0f, 0x01);
}
-static SANE_Status
+#ifndef UNIT_TESTING
+static
+#endif
+SANE_Status
gl841_stop_action (Genesys_Device * dev)
{
Genesys_Register_Set local_reg[GENESYS_GL841_MAX_REGS+1];
@@ -3113,12 +3490,12 @@ gl841_stop_action (Genesys_Device * dev)
return status;
}
- /* looks like writing the right registers to zero is enough to get the chip
- out of scan mode into command mode, actually triggering(writing to
+ /* looks like writing the right registers to zero is enough to get the chip
+ out of scan mode into command mode, actually triggering(writing to
register 0x0f) seems to be unnecessary */
loop = 10;
- while (loop > 0)
+ while (loop > 0)
{
status = sanei_genesys_read_register(dev, 0x40, &val40);
if (DBG_LEVEL >= DBG_io)
@@ -3133,7 +3510,7 @@ gl841_stop_action (Genesys_Device * dev)
DBGCOMPLETED;
return status;
}
-
+
/* if scanner is in command mode, we are done */
if (!(val40 & REG40_DATAENB) && !(val40 & REG40_MOTMFLG))
{
@@ -3154,7 +3531,7 @@ gl841_get_paper_sensor(Genesys_Device * dev, SANE_Bool * paper_loaded)
{
SANE_Status status;
uint8_t val;
-
+
status = sanei_genesys_read_register(dev, REG6D, &val);
if (status != SANE_STATUS_GOOD)
{
@@ -3186,7 +3563,7 @@ gl841_eject_document (Genesys_Device * dev)
DBG (DBG_proc, "gl841_eject_document: finished\n");
return SANE_STATUS_GOOD;
}
-
+
memset (local_reg, 0, sizeof (local_reg));
val = 0;
@@ -3275,7 +3652,7 @@ gl841_eject_document (Genesys_Device * dev)
}
feed_mm = SANE_UNFIX(dev->model->eject_feed);
- if (dev->document)
+ if (dev->document)
{
feed_mm += SANE_UNFIX(dev->model->post_scan);
}
@@ -3288,13 +3665,13 @@ gl841_eject_document (Genesys_Device * dev)
sane_strstatus (status));
return status;
}
-
+
/* now feed for extra <number> steps */
loop = 0;
while (loop < 300) /* do not wait longer then 30 seconds */
{
unsigned int steps;
-
+
status = sanei_genesys_read_feed_steps(dev, &steps);
if (status != SANE_STATUS_GOOD)
{
@@ -3341,9 +3718,9 @@ gl841_load_document (Genesys_Device * dev)
DBG (DBG_proc, "gl841_load_document\n");
while (loop > 0) /* do not wait longer then 30 seconds */
{
-
+
RIE(gl841_get_paper_sensor(dev, &paper_loaded));
-
+
if (paper_loaded)
{
DBG (DBG_info,
@@ -3426,7 +3803,7 @@ gl841_detect_document_end (Genesys_Device * dev)
/* the current scancnt is also the final one, so we use it to
* compute total bytes to read. We also add the line count to eject document */
total_bytes_to_read=(scancnt+postcnt)*dev->wpl;
-
+
DBG (DBG_io, "%s: old total_bytes_to_read=%u\n",__FUNCTION__,(unsigned int)dev->total_bytes_to_read);
DBG (DBG_io, "%s: new total_bytes_to_read=%u\n",__FUNCTION__,(unsigned int)total_bytes_to_read);
@@ -3453,9 +3830,17 @@ gl841_begin_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
{
SANE_Status status;
Genesys_Register_Set local_reg[4];
+ uint8_t val;
DBG (DBG_proc, "gl841_begin_scan\n");
+ if (dev->model->gpo_type == GPO_CANONLIDE80)
+ {
+ RIE (sanei_genesys_read_register (dev, REG6B, &val));
+ val = REG6B_GPO18;
+ RIE (sanei_genesys_write_register (dev, REG6B, val));
+ }
+
local_reg[0].address = 0x03;
if (dev->model->ccd_type != CCD_PLUSTEK_3600)
{
@@ -3479,7 +3864,7 @@ gl841_begin_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
local_reg[3].value = 0x00; /* do not start motor yet */
status =
- gl841_bulk_write_register (dev, local_reg,
+ gl841_bulk_write_register (dev, local_reg,
sizeof (local_reg)/sizeof (local_reg[0]));
if (status != SANE_STATUS_GOOD)
{
@@ -3522,7 +3907,7 @@ gl841_end_scan (Genesys_Device * dev, Genesys_Register_Set __sane_unused__ * reg
return status;
}
}
-
+
DBG (DBG_proc, "gl841_end_scan: completed\n");
return status;
@@ -3530,7 +3915,7 @@ gl841_end_scan (Genesys_Device * dev, Genesys_Register_Set __sane_unused__ * reg
/* Moves the slider to steps */
#ifndef UNIT_TESTING
-static
+static
#endif
SANE_Status
gl841_feed (Genesys_Device * dev, int steps)
@@ -3540,15 +3925,12 @@ gl841_feed (Genesys_Device * dev, int steps)
uint8_t val;
int loop;
- DBG (DBG_proc, "gl841_feed (steps = %d)\n",
- steps);
+ DBG (DBG_proc, "gl841_feed (steps = %d)\n", steps);
- status =
- gl841_stop_action (dev);
+ status = gl841_stop_action (dev);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "gl841_feed: failed to stop action: %s\n",
+ DBG (DBG_error, "gl841_feed: failed to stop action: %s\n",
sane_strstatus (status));
return status;
}
@@ -3557,12 +3939,9 @@ gl841_feed (Genesys_Device * dev, int steps)
gl841_init_optical_regs_off(local_reg);
- gl841_init_motor_regs(dev,local_reg,
- steps,MOTOR_ACTION_FEED,0);
+ gl841_init_motor_regs(dev,local_reg, steps,MOTOR_ACTION_FEED,0);
- status =
- gl841_bulk_write_register (dev, local_reg,
- GENESYS_GL841_MAX_REGS);
+ status = gl841_bulk_write_register (dev, local_reg, GENESYS_GL841_MAX_REGS);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
@@ -3579,8 +3958,7 @@ gl841_feed (Genesys_Device * dev, int steps)
sane_strstatus (status));
gl841_stop_action (dev);
/* send original registers */
- gl841_bulk_write_register (dev, dev->reg,
- GENESYS_GL841_MAX_REGS);
+ gl841_bulk_write_register (dev, dev->reg, GENESYS_GL841_MAX_REGS);
return status;
}
@@ -3595,7 +3973,7 @@ gl841_feed (Genesys_Device * dev, int steps)
sane_strstatus (status));
return status;
}
-
+
if (!(val & REG41_MOTORENB)) /* motor enabled */
{
DBG (DBG_proc, "gl841_feed: finished\n");
@@ -3636,14 +4014,20 @@ gl841_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
DBG (DBG_proc, "gl841_slow_back_home: finished\n");
return SANE_STATUS_GOOD;
}
-
- /* reset gpio pin */
+
+ /* reset gpio pin */
if (dev->model->gpo_type == GPO_CANONLIDE35)
{
RIE (sanei_genesys_read_register (dev, REG6C, &val));
val = dev->gpo.value[0];
RIE (sanei_genesys_write_register (dev, REG6C, val));
}
+ if (dev->model->gpo_type == GPO_CANONLIDE80)
+ {
+ RIE (sanei_genesys_read_register (dev, REG6B, &val));
+ val = REG6B_GPO18 | REG6B_GPO17;
+ RIE (sanei_genesys_write_register (dev, REG6B, val));
+ }
gl841_save_power(dev, SANE_FALSE);
/* first read gives HOME_SENSOR true */
@@ -3706,7 +4090,7 @@ gl841_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
memcpy (local_reg, dev->reg, (GENESYS_GL841_MAX_REGS+1) * sizeof (Genesys_Register_Set));
gl841_init_motor_regs(dev,local_reg, 65536,MOTOR_ACTION_GO_HOME,0);
-
+
/* set up for reverse and no scan */
r = sanei_genesys_get_address (local_reg, REG02);
r->value |= REG02_MTRREV;
@@ -3800,7 +4184,7 @@ gl841_search_start_position (Genesys_Device * dev)
SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE);
if(status!=SANE_STATUS_GOOD)
{
- DBG (DBG_error, "%s: failed to init scan registers: %s\n", __FUNCTION__,
+ DBG (DBG_error, "%s: failed to init scan registers: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
@@ -3810,7 +4194,7 @@ gl841_search_start_position (Genesys_Device * dev)
gl841_bulk_write_register (dev, local_reg, GENESYS_GL841_MAX_REGS);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error, "%s: failed to bulk write registers: %s\n", __FUNCTION__,
+ DBG (DBG_error, "%s: failed to bulk write registers: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
@@ -3868,7 +4252,7 @@ gl841_search_start_position (Genesys_Device * dev)
/* update regs to copy ASIC internal state */
memcpy (dev->reg, local_reg, (GENESYS_GL841_MAX_REGS + 1) * sizeof (Genesys_Register_Set));
-/*TODO: find out where sanei_genesys_search_reference_point
+/*TODO: find out where sanei_genesys_search_reference_point
stores information, and use that correctly*/
status =
sanei_genesys_search_reference_point (dev, data, 0, dpi, pixels,
@@ -3886,7 +4270,7 @@ gl841_search_start_position (Genesys_Device * dev)
return SANE_STATUS_GOOD;
}
-/*
+/*
* sets up register for coarse gain calibration
* todo: check it for scanners using it */
static SANE_Status
@@ -3896,8 +4280,7 @@ gl841_init_regs_for_coarse_calibration (Genesys_Device * dev)
uint8_t channels;
uint8_t cksel;
- DBG (DBG_proc, "gl841_init_regs_for_coarse_calibration\n");
-
+ DBGSTART;
cksel = (dev->calib_reg[reg_0x18].value & REG18_CKSEL) + 1; /* clock speed = 1..4 clocks */
@@ -3913,7 +4296,7 @@ gl841_init_regs_for_coarse_calibration (Genesys_Device * dev)
dev->settings.yres,
0,
0,
- dev->sensor.optical_res / cksel,
+ dev->sensor.optical_res / cksel, /* XXX STEF XXX !!! */
20,
16,
channels,
@@ -3945,13 +4328,11 @@ gl841_init_regs_for_coarse_calibration (Genesys_Device * dev)
return status;
}
- DBG (DBG_proc,
- "gl841_init_register_for_coarse_calibration: completed\n");
/* if (DBG_LEVEL >= DBG_info)
sanei_gl841_print_registers (dev->calib_reg);*/
-
+ DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -3962,14 +4343,25 @@ gl841_init_regs_for_shading (Genesys_Device * dev)
{
SANE_Status status;
SANE_Int ydpi;
+ float starty=0;
- DBG (DBG_proc, "gl841_init_regs_for_shading: lines = %d\n", (int)dev->calib_lines);
+ DBGSTART;
+ DBG (DBG_proc, "%s: lines = %d\n", __FUNCTION__, (int)(dev->calib_lines));
+
+ /* initial calibration reg values */
+ memcpy (dev->calib_reg, dev->reg, GENESYS_GL841_MAX_REGS * sizeof (Genesys_Register_Set));
ydpi = dev->motor.base_ydpi;
- if (dev->motor.motor_id == MOTOR_PLUSTEK_3600) /* TODO PLUSTEK_3600: 1200dpi not yet working, produces dark bar */
+ if (dev->model->motor_type == MOTOR_PLUSTEK_3600) /* TODO PLUSTEK_3600: 1200dpi not yet working, produces dark bar */
{
ydpi = 600;
}
+ if (dev->model->motor_type == MOTOR_CANONLIDE80)
+ {
+ ydpi = gl841_get_dpihw(dev);
+ /* get over extra dark area for this model */
+ starty = 140;
+ }
dev->calib_channels = 3;
dev->calib_lines = dev->model->shading_lines;
@@ -3978,7 +4370,7 @@ gl841_init_regs_for_shading (Genesys_Device * dev)
dev->settings.xres,
ydpi,
0,
- 0,
+ starty,
(dev->sensor.sensor_pixels * dev->settings.xres) / dev->sensor.optical_res,
dev->calib_lines,
16,
@@ -3986,36 +4378,27 @@ gl841_init_regs_for_shading (Genesys_Device * dev)
dev->settings.color_filter,
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
-/* we don't handle differing shading areas very well */
-/* SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE |*/
- SCAN_FLAG_IGNORE_LINE_DISTANCE |
- SCAN_FLAG_USE_OPTICAL_RES
- );
-
- dev->calib_pixels = dev->current_setup.pixels;
-
+ SCAN_FLAG_USE_OPTICAL_RES |
+ /*SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE |*/
+ SCAN_FLAG_IGNORE_LINE_DISTANCE);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "gl841_init_registers_for_shading: failed to setup scan: %s\n",
- sane_strstatus (status));
+ DBG (DBG_error, "%s: failed to setup scan: %s\n", __FUNCTION__, sane_strstatus (status));
return status;
}
- dev->scanhead_position_in_steps += dev->calib_lines;
+ dev->calib_pixels = dev->current_setup.pixels;
+ dev->scanhead_position_in_steps += dev->calib_lines + starty;
- status =
- gl841_bulk_write_register (dev, dev->calib_reg, GENESYS_GL841_MAX_REGS);
+ status = gl841_bulk_write_register (dev, dev->calib_reg, GENESYS_GL841_MAX_REGS);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "gl841_init_registers_for_shading: failed to bulk write registers: %s\n",
+ DBG (DBG_error, "%s: failed to bulk write registers: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
- DBG (DBG_proc, "gl841_init_regs_for_shading: completed\n");
-
+ DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -4063,9 +4446,9 @@ gl841_init_regs_for_scan (Genesys_Device * dev)
assumption: steps are expressed at maximum motor resolution
- we need:
- SANE_Fixed y_offset;
- SANE_Fixed y_size;
+ we need:
+ SANE_Fixed y_offset;
+ SANE_Fixed y_size;
SANE_Fixed y_offset_calib;
mm_to_steps()=motor dpi / 2.54 / 10=motor dpi / MM_PER_INCH */
@@ -4076,7 +4459,9 @@ gl841_init_regs_for_scan (Genesys_Device * dev)
move = 0;
if (dev->model->flags & GENESYS_FLAG_SEARCH_START)
- move += SANE_UNFIX (dev->model->y_offset_calib);
+ {
+ move += SANE_UNFIX (dev->model->y_offset_calib);
+ }
DBG (DBG_info, "gl841_init_regs_for_scan: move=%f steps\n", move);
@@ -4097,18 +4482,21 @@ gl841_init_regs_for_scan (Genesys_Device * dev)
flags=0;
- /* we enable true gray for cis scanners only, and just when doing
+ /* we enable true gray for cis scanners only, and just when doing
* scan since color calibration is OK for this mode
*/
flags = 0;
-
+
+ /* true gray (led add for cis scanners) */
if(dev->model->is_cis && dev->settings.true_gray
- &&dev->model->ccd_type != CCD_CANONLIDE35)
+ && dev->settings.scan_mode != SCAN_MODE_COLOR)
{
- flags |= OPTICAL_FLAG_ENABLE_LEDADD;
+ DBG (DBG_io, "%s: activating LEDADD\n", __FUNCTION__);
+ flags |= SCAN_FLAG_ENABLE_LEDADD;
}
+
/* enable emulated lineart from gray data */
- if(dev->settings.scan_mode == SCAN_MODE_LINEART
+ if(dev->settings.scan_mode == SCAN_MODE_LINEART
&& dev->settings.dynamic_lineart)
{
flags |= SCAN_FLAG_DYNAMIC_LINEART;
@@ -4126,7 +4514,7 @@ gl841_init_regs_for_scan (Genesys_Device * dev)
channels,
dev->settings.color_filter,
flags);
-
+
if (status != SANE_STATUS_GOOD)
return status;
@@ -4192,7 +4580,7 @@ gl841_send_gamma_table (Genesys_Device * dev)
-needs working coarse/gain
*/
-static SANE_Status
+GENESYS_STATIC SANE_Status
gl841_led_calibration (Genesys_Device * dev)
{
int num_pixels;
@@ -4205,8 +4593,9 @@ gl841_led_calibration (Genesys_Device * dev)
int avg[3], avga, avge;
int turn;
char fn[20];
- uint16_t expr, expg, expb;
+ uint16_t exp[3], target;
Genesys_Register_Set *r;
+ int move;
SANE_Bool acceptable = SANE_FALSE;
@@ -4214,21 +4603,22 @@ gl841_led_calibration (Genesys_Device * dev)
uint16_t min_exposure=500;
uint16_t max_exposure;
- DBG (DBG_proc, "gl841_led_calibration\n");
-
+ DBGSTART;
- if (dev->model->gpo_type == GPO_CANONLIDE35)
+ /* feed to white strip if needed */
+ if (dev->model->y_offset_calib>0)
{
- status = gl841_feed(dev, 280);/*feed to white strip. canon lide 35 only.*/
-
+ move = SANE_UNFIX (dev->model->y_offset_calib);
+ move = (move * (dev->motor.base_ydpi)) / MM_PER_INCH;
+ DBG (DBG_io, "%s: move=%d lines\n", __FUNCTION__, move);
+ status = gl841_feed(dev, move);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "gl841_led_calibration: failed to feed: %s\n",
- sane_strstatus (status));
+ DBG (DBG_error, "%s: failed to feed: %s\n", __FUNCTION__,
+ sane_strstatus (status));
return status;
}
- }
+ }
/* offset calibration is always done in color mode */
channels = 3;
@@ -4254,7 +4644,7 @@ gl841_led_calibration (Genesys_Device * dev)
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error,
- "gl841_led_calibration: failed to setup scan: %s\n",
+ "%s: failed to setup scan: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
@@ -4269,7 +4659,7 @@ gl841_led_calibration (Genesys_Device * dev)
if (!line)
return SANE_STATUS_NO_MEM;
-/*
+/*
we try to get equal bright leds here:
loop:
@@ -4277,23 +4667,24 @@ gl841_led_calibration (Genesys_Device * dev)
adjust exposure times
*/
- expr = (dev->sensor.regs_0x10_0x1d[0] << 8) | dev->sensor.regs_0x10_0x1d[1];
- expg = (dev->sensor.regs_0x10_0x1d[2] << 8) | dev->sensor.regs_0x10_0x1d[3];
- expb = (dev->sensor.regs_0x10_0x1d[4] << 8) | dev->sensor.regs_0x10_0x1d[5];
+ exp[0] = (dev->sensor.regs_0x10_0x1d[0] << 8) | dev->sensor.regs_0x10_0x1d[1];
+ exp[1] = (dev->sensor.regs_0x10_0x1d[2] << 8) | dev->sensor.regs_0x10_0x1d[3];
+ exp[2] = (dev->sensor.regs_0x10_0x1d[4] << 8) | dev->sensor.regs_0x10_0x1d[5];
turn = 0;
/* max exposure is set to ~2 time initial average
* exposure, or 2 time last calibration exposure */
- max_exposure=((expr+expg+expb)/3)*2;
+ max_exposure=((exp[0]+exp[1]+exp[2])/3)*2;
+ target=dev->sensor.gain_white_ref*256;
do {
- dev->sensor.regs_0x10_0x1d[0] = (expr >> 8) & 0xff;
- dev->sensor.regs_0x10_0x1d[1] = expr & 0xff;
- dev->sensor.regs_0x10_0x1d[2] = (expg >> 8) & 0xff;
- dev->sensor.regs_0x10_0x1d[3] = expg & 0xff;
- dev->sensor.regs_0x10_0x1d[4] = (expb >> 8) & 0xff;
- dev->sensor.regs_0x10_0x1d[5] = expb & 0xff;
+ dev->sensor.regs_0x10_0x1d[0] = (exp[0] >> 8) & 0xff;
+ dev->sensor.regs_0x10_0x1d[1] = exp[0] & 0xff;
+ dev->sensor.regs_0x10_0x1d[2] = (exp[1] >> 8) & 0xff;
+ dev->sensor.regs_0x10_0x1d[3] = exp[1] & 0xff;
+ dev->sensor.regs_0x10_0x1d[4] = (exp[2] >> 8) & 0xff;
+ dev->sensor.regs_0x10_0x1d[5] = exp[2] & 0xff;
r = &(dev->calib_reg[reg_0x10]);
for (i = 0; i < 6; i++, r++) {
@@ -4301,14 +4692,12 @@ gl841_led_calibration (Genesys_Device * dev)
RIE (sanei_genesys_write_register (dev, 0x10+i, dev->sensor.regs_0x10_0x1d[i]));
}
- RIE (gl841_bulk_write_register
- (dev, dev->calib_reg, GENESYS_GL841_MAX_REGS));
+ RIE (gl841_bulk_write_register (dev, dev->calib_reg, GENESYS_GL841_MAX_REGS));
- DBG (DBG_info,
- "gl841_led_calibration: starting first line reading\n");
+ DBG (DBG_info, "%s: starting line reading\n", __FUNCTION__);
RIE (gl841_begin_scan (dev, dev->calib_reg, SANE_TRUE));
RIE (sanei_genesys_read_data_from_scanner (dev, line, total_size));
-
+
if (DBG_LEVEL >= DBG_data) {
snprintf(fn,20,"led_%d.pnm",turn);
sanei_genesys_write_pnm_file (fn,
@@ -4317,15 +4706,14 @@ gl841_led_calibration (Genesys_Device * dev)
channels,
num_pixels, 1);
}
-
- acceptable = SANE_TRUE;
-
+
+ /* compute average */
for (j = 0; j < channels; j++)
{
avg[j] = 0;
for (i = 0; i < num_pixels; i++)
{
- if (dev->model->is_cis)
+ if (dev->model->is_cis)
val =
line[i * 2 + j * 2 * num_pixels + 1] * 256 +
line[i * 2 + j * 2 * num_pixels];
@@ -4339,82 +4727,212 @@ gl841_led_calibration (Genesys_Device * dev)
avg[j] /= num_pixels;
}
- DBG(DBG_info,"gl841_led_calibration: average: "
- "%d,%d,%d\n",
- avg[0],avg[1],avg[2]);
+ DBG(DBG_info,"%s: average: %d,%d,%d\n", __FUNCTION__, avg[0], avg[1], avg[2]);
acceptable = SANE_TRUE;
-
+
+ /* exposure is acceptable if each color is in the %5 range
+ * of other color channels */
if (avg[0] < avg[1] * 0.95 || avg[1] < avg[0] * 0.95 ||
avg[0] < avg[2] * 0.95 || avg[2] < avg[0] * 0.95 ||
avg[1] < avg[2] * 0.95 || avg[2] < avg[1] * 0.95)
+ {
+ acceptable = SANE_FALSE;
+ }
+
+ /* led exposure is not acceptable if white level is too low
+ * ~80 hardcoded value for white level */
+ if(avg[0]<20000 || avg[1]<20000 || avg[2]<20000)
+ {
acceptable = SANE_FALSE;
+ }
- if (!acceptable) {
- avga = (avg[0]+avg[1]+avg[2])/3;
- expr = (expr * avga) / avg[0];
- expg = (expg * avga) / avg[1];
- expb = (expb * avga) / avg[2];
-/*
- keep the resulting exposures below this value.
- too long exposure drives the ccd into saturation.
- we may fix this by relying on the fact that
- we get a striped scan without shading, by means of
- statistical calculation
-*/
- avge = (expr + expg + expb) / 3;
+ /* for scanners using target value */
+ if(target>0)
+ {
+ acceptable = SANE_TRUE;
+ for(i=0;i<3;i++)
+ {
+ /* we accept +- 2% delta from target */
+ if(abs(avg[i]-target)>target/50)
+ {
+ exp[i]=(exp[i]*target)/avg[i];
+ acceptable = SANE_FALSE;
+ }
+ }
+ }
+ else
+ {
+ if (!acceptable)
+ {
+ avga = (avg[0]+avg[1]+avg[2])/3;
+ exp[0] = (exp[0] * avga) / avg[0];
+ exp[1] = (exp[1] * avga) / avg[1];
+ exp[2] = (exp[2] * avga) / avg[2];
+ /*
+ keep the resulting exposures below this value.
+ too long exposure drives the ccd into saturation.
+ we may fix this by relying on the fact that
+ we get a striped scan without shading, by means of
+ statistical calculation
+ */
+ avge = (exp[0] + exp[1] + exp[2]) / 3;
+
+ if (avge > max_exposure) {
+ exp[0] = (exp[0] * max_exposure) / avge;
+ exp[1] = (exp[1] * max_exposure) / avge;
+ exp[2] = (exp[2] * max_exposure) / avge;
+ }
+ if (avge < min_exposure) {
+ exp[0] = (exp[0] * min_exposure) / avge;
+ exp[1] = (exp[1] * min_exposure) / avge;
+ exp[2] = (exp[2] * min_exposure) / avge;
+ }
- if (avge > max_exposure) {
- expr = (expr * max_exposure) / avge;
- expg = (expg * max_exposure) / avge;
- expb = (expb * max_exposure) / avge;
- }
- if (avge < min_exposure) {
- expr = (expr * min_exposure) / avge;
- expg = (expg * min_exposure) / avge;
- expb = (expb * min_exposure) / avge;
- }
-
- }
+ }
+ }
RIE (gl841_stop_action (dev));
turn++;
} while (!acceptable && turn < 100);
-
- DBG(DBG_info,"gl841_led_calibration: acceptable exposure: %d,%d,%d\n",
- expr,expg,expb);
+
+ DBG(DBG_info,"%s: acceptable exposure: %d,%d,%d\n", __FUNCTION__, exp[0],exp[1],exp[2]);
/* cleanup before return */
free (line);
gl841_slow_back_home(dev, SANE_TRUE);
- DBG (DBG_proc, "gl841_led_calibration: completed\n");
+ DBGCOMPLETED;
return status;
}
/** @brief calibration for AD frontend devices
- * experiments show that modifying offset is of little (if no) influence
- * so we just return
- * CHRIS: This was added from gl646.c as again offset seems to make no
- * difference
- *
- * TODO PLUSTEK_3600 Michael Rickmann:
- * offset calibration makes a lot of a difference but currently
- * makes everything to dark
+ * offset calibration assumes that the scanning head is on a black area
+ * For LiDE80 analog frontend
+ * 0x0003 : is gain and belongs to [0..63]
+ * 0x0006 : is offset
+ * We scan a line with no gain until average offset reaches the target
*/
static SANE_Status
ad_fe_offset_calibration (Genesys_Device * dev)
{
SANE_Status status = SANE_STATUS_GOOD;
+ int num_pixels;
+ int total_size;
+ uint8_t *line;
+ int i;
+ int average;
+ int turn;
+ char fn[20];
+ int top;
+ int bottom;
+ int target;
+
+ DBGSTART;
- DBG (DBG_proc, "ad_fe_offset_calibration: start\n");
- DBG (DBG_info, "ad_fe_offset_calibration: offset=(%d,%d,%d)\n",
- dev->frontend.offset[0], dev->frontend.offset[1],
- dev->frontend.offset[2]);
- DBG (DBG_proc, "ad_fe_offset_calibration: end\n");
+ /* don't impact 3600 behavior since we can't test it */
+ if (dev->model->ccd_type == CCD_PLUSTEK_3600)
+ {
+ DBGCOMPLETED;
+ return status;
+ }
+
+ status = gl841_init_scan_regs (dev,
+ dev->calib_reg,
+ dev->settings.xres,
+ dev->settings.yres,
+ 0,
+ 0,
+ (dev->sensor.sensor_pixels*dev->settings.xres) / dev->sensor.optical_res,
+ 1,
+ 8,
+ 3,
+ dev->settings.color_filter,
+ SCAN_FLAG_DISABLE_SHADING |
+ SCAN_FLAG_DISABLE_GAMMA |
+ SCAN_FLAG_SINGLE_LINE |
+ SCAN_FLAG_IGNORE_LINE_DISTANCE |
+ SCAN_FLAG_USE_OPTICAL_RES);
+
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error,
+ "gl841_offset_calibration: failed to setup scan: %s\n",
+ sane_strstatus (status));
+ return status;
+ }
+
+ num_pixels = dev->current_setup.pixels;
+ total_size = num_pixels * 3 * 2 * 1;
+
+ line = malloc (total_size);
+ if (line==NULL)
+ {
+ DBGCOMPLETED;
+ return SANE_STATUS_NO_MEM;
+ }
+
+ dev->frontend.gain[0] = 0x00;
+ dev->frontend.gain[1] = 0x00;
+ dev->frontend.gain[2] = 0x00;
+
+ /* loop on scan until target offset is reached */
+ turn=0;
+ target=24;
+ bottom=0;
+ top=255;
+ do {
+ /* set up offset mid range */
+ dev->frontend.offset[0] = (top+bottom)/2;
+ dev->frontend.offset[1] = (top+bottom)/2;
+ dev->frontend.offset[2] = (top+bottom)/2;
+
+ /* scan line */
+ DBG (DBG_info, "%s: starting line reading\n",__FUNCTION__);
+ gl841_bulk_write_register (dev, dev->calib_reg, GENESYS_GL841_MAX_REGS);
+ gl841_set_fe(dev, AFE_SET);
+ gl841_begin_scan (dev, dev->calib_reg, SANE_TRUE);
+ sanei_genesys_read_data_from_scanner (dev, line, total_size);
+ gl841_stop_action (dev);
+ if (DBG_LEVEL >= DBG_data) {
+ snprintf(fn,20,"offset_%02d.pnm",turn);
+ sanei_genesys_write_pnm_file (fn, line, 8, 3, num_pixels, 1);
+ }
+
+ /* search for minimal value */
+ average=0;
+ for(i=0;i<total_size;i++)
+ {
+ average+=line[i];
+ }
+ average/=total_size;
+ DBG (DBG_data, "%s: average=%d\n", __FUNCTION__, average);
+
+ /* if min value is above target, the current value becomes the new top
+ * else it is the new bottom */
+ if(average>target)
+ {
+ top=(top+bottom)/2;
+ }
+ else
+ {
+ bottom=(top+bottom)/2;
+ }
+ turn++;
+ } while ((top-bottom)>1 && turn < 100);
+
+ dev->frontend.offset[0]=0;
+ dev->frontend.offset[1]=0;
+ dev->frontend.offset[2]=0;
+ free(line);
+ DBG (DBG_info, "%s: offset=(%d,%d,%d)\n", __FUNCTION__,
+ dev->frontend.offset[0],
+ dev->frontend.offset[1],
+ dev->frontend.offset[2]);
+ DBGCOMPLETED;
return status;
}
@@ -4425,7 +4943,7 @@ ad_fe_offset_calibration (Genesys_Device * dev)
this function expects the slider to be where?
*/
-static SANE_Status
+GENESYS_STATIC SANE_Status
gl841_offset_calibration (Genesys_Device * dev)
{
int num_pixels;
@@ -4443,14 +4961,14 @@ gl841_offset_calibration (Genesys_Device * dev)
SANE_Bool acceptable = SANE_FALSE;
int mintgt = 0x400;
+ DBG (DBG_proc, "gl841_offset_calibration\n");
+
/* Analog Device fronted have a different calibration */
- if (dev->model->dac_type == DAC_PLUSTEK_3600)
+ if ((dev->reg[reg_0x04].value & REG04_FESET) == 0x02)
{
return ad_fe_offset_calibration (dev);
}
- DBG (DBG_proc, "gl841_offset_calibration\n");
-
/* offset calibration is always done in color mode */
channels = 3;
@@ -4501,15 +5019,15 @@ gl841_offset_calibration (Genesys_Device * dev)
/*okay. the sensor black level is now at -260mV. we only get 0 from AFE...*/
/* we should probably do real calibration here:
* -detect acceptable offset with binary search
- * -calculate offset from this last version
+ * -calculate offset from this last version
*
- * acceptable offset means
+ * acceptable offset means
* - few completely black pixels(<10%?)
* - few completely white pixels(<10%?)
*
- * final offset should map the minimum not completely black
+ * final offset should map the minimum not completely black
* pixel to 0(16 bits)
- *
+ *
* this does account for dummy pixels at the end of ccd
* this assumes slider is at black strip(which is not quite as black as "no
* signal").
@@ -4534,8 +5052,8 @@ gl841_offset_calibration (Genesys_Device * dev)
for (j=0; j < channels; j++) {
off[j] = (offh[j]+offl[j])/2;
dev->frontend.offset[j] = off[j];
- }
-
+ }
+
status = gl841_set_fe(dev, AFE_SET);
if (status != SANE_STATUS_GOOD)
@@ -4551,7 +5069,7 @@ gl841_offset_calibration (Genesys_Device * dev)
RIEF2 (gl841_begin_scan (dev, dev->calib_reg, SANE_TRUE), first_line, second_line);
RIEF2 (sanei_genesys_read_data_from_scanner (dev, first_line, total_size), first_line, second_line);
-
+
if (DBG_LEVEL >= DBG_data) {
snprintf(fn,20,"offset1_%02d.pnm",turn);
sanei_genesys_write_pnm_file (fn,
@@ -4560,9 +5078,9 @@ gl841_offset_calibration (Genesys_Device * dev)
channels,
num_pixels, 1);
}
-
+
acceptable = SANE_TRUE;
-
+
for (j = 0; j < channels; j++)
{
cmin[j] = 0;
@@ -4570,7 +5088,7 @@ gl841_offset_calibration (Genesys_Device * dev)
for (i = 0; i < num_pixels; i++)
{
- if (dev->model->is_cis)
+ if (dev->model->is_cis)
val =
first_line[i * 2 + j * 2 * num_pixels + 1] * 256 +
first_line[i * 2 + j * 2 * num_pixels];
@@ -4595,7 +5113,7 @@ gl841_offset_calibration (Genesys_Device * dev)
offl[0] = off[0];
else
offl[j] = off[j];
- }
+ }
if (cmax[j] > num_pixels/100) {
acceptable = SANE_FALSE;
if (dev->model->is_cis)
@@ -4618,7 +5136,7 @@ gl841_offset_calibration (Genesys_Device * dev)
turn++;
} while (!acceptable && turn < 100);
-
+
DBG(DBG_info,"gl841_offset_calibration: acceptable offsets: %d,%d,%d\n",
off[0],off[1],off[2]);
@@ -4626,12 +5144,12 @@ gl841_offset_calibration (Genesys_Device * dev)
for (j = 0; j < channels; j++)
{
off1[j] = off[j];
-
+
min1[j] = 65536;
-
- for (i = 0; i < num_pixels; i++)
+
+ for (i = 0; i < num_pixels; i++)
{
- if (dev->model->is_cis)
+ if (dev->model->is_cis)
val =
first_line[i * 2 + j * 2 * num_pixels + 1] * 256 +
first_line[i * 2 + j * 2 * num_pixels];
@@ -4643,20 +5161,20 @@ gl841_offset_calibration (Genesys_Device * dev)
min1[j] = val;
}
}
-
+
offl[0] = off[0];
offl[1] = off[0];
offl[2] = off[0];
turn = 0;
-
+
do {
-
+
for (j=0; j < channels; j++) {
off[j] = (offh[j]+offl[j])/2;
dev->frontend.offset[j] = off[j];
- }
-
+ }
+
status = gl841_set_fe(dev, AFE_SET);
if (status != SANE_STATUS_GOOD)
@@ -4668,25 +5186,25 @@ gl841_offset_calibration (Genesys_Device * dev)
sane_strstatus (status));
return status;
}
-
+
DBG (DBG_info,
"gl841_offset_calibration: starting second line reading\n");
RIEF2 (gl841_bulk_write_register
(dev, dev->calib_reg, GENESYS_GL841_MAX_REGS), first_line, second_line);
RIEF2 (gl841_begin_scan (dev, dev->calib_reg, SANE_TRUE), first_line, second_line);
RIEF2 (sanei_genesys_read_data_from_scanner (dev, second_line, total_size), first_line, second_line);
-
+
if (DBG_LEVEL >= DBG_data) {
- snprintf(fn,20,"offset2_%d.pnm",turn);
+ snprintf(fn,20,"offset2_%02d.pnm",turn);
sanei_genesys_write_pnm_file (fn,
second_line,
16,
channels,
num_pixels, 1);
}
-
+
acceptable = SANE_TRUE;
-
+
for (j = 0; j < channels; j++)
{
cmin[j] = 0;
@@ -4694,7 +5212,7 @@ gl841_offset_calibration (Genesys_Device * dev)
for (i = 0; i < num_pixels; i++)
{
- if (dev->model->is_cis)
+ if (dev->model->is_cis)
val =
second_line[i * 2 + j * 2 * num_pixels + 1] * 256 +
second_line[i * 2 + j * 2 * num_pixels];
@@ -4714,7 +5232,7 @@ gl841_offset_calibration (Genesys_Device * dev)
offl[0] = off[0];
else
offl[j] = off[j];
- }
+ }
if (cmax[j] > num_pixels/100) {
acceptable = SANE_FALSE;
if (dev->model->is_cis)
@@ -4738,7 +5256,7 @@ gl841_offset_calibration (Genesys_Device * dev)
turn++;
} while (!acceptable && turn < 100);
-
+
DBG(DBG_info,"gl841_offset_calibration: acceptable offsets: %d,%d,%d\n",
off[0],off[1],off[2]);
@@ -4746,12 +5264,12 @@ gl841_offset_calibration (Genesys_Device * dev)
for (j = 0; j < channels; j++)
{
off2[j] = off[j];
-
+
min2[j] = 65536;
- for (i = 0; i < num_pixels; i++)
+ for (i = 0; i < num_pixels; i++)
{
- if (dev->model->is_cis)
+ if (dev->model->is_cis)
val =
second_line[i * 2 + j * 2 * num_pixels + 1] * 256 +
second_line[i * 2 + j * 2 * num_pixels];
@@ -4770,11 +5288,11 @@ gl841_offset_calibration (Genesys_Device * dev)
DBG(DBG_info,"gl841_offset_calibration: second set: %d/%d,%d/%d,%d/%d\n",
off2[0],min2[0],off2[1],min2[1],off2[2],min2[2]);
-/*
+/*
calculate offset for each channel
based on minimal pixel value min1 at offset off1 and minimal pixel value min2
at offset off2
-
+
to get min at off, values are linearly interpolated:
min=real+off*fact
min1=real+off1*fact
@@ -4833,16 +5351,16 @@ gl841_offset_calibration (Genesys_Device * dev)
}
-/* alternative coarse gain calibration
+/* alternative coarse gain calibration
this on uses the settings from offset_calibration and
uses only one scanline
*/
/*
with offset and coarse calibration we only want to get our input range into
- a reasonable shape. the fine calibration of the upper and lower bounds will
+ a reasonable shape. the fine calibration of the upper and lower bounds will
be done with shading.
*/
-static SANE_Status
+GENESYS_STATIC SANE_Status
gl841_coarse_gain_calibration (Genesys_Device * dev, int dpi)
{
int num_pixels;
@@ -4853,18 +5371,22 @@ gl841_coarse_gain_calibration (Genesys_Device * dev, int dpi)
int max[3];
float gain[3];
int val;
+ int lines=1;
+ int move;
- DBG (DBG_proc, "gl841_coarse_gain_calibration dpi=%d\n", dpi);
+ DBG (DBG_proc, "%s: dpi=%d\n", __FUNCTION__, dpi);
- if (dev->model->gpo_type == GPO_CANONLIDE35)
+ /* feed to white strip if needed */
+ if (dev->model->y_offset_calib>0)
{
- status = gl841_feed(dev, 280);/*feed to white strip. canon lide 35 only.*/
-
+ move = SANE_UNFIX (dev->model->y_offset_calib);
+ move = (move * (dev->motor.base_ydpi)) / MM_PER_INCH;
+ DBG (DBG_io, "%s: move=%d lines\n", __FUNCTION__, move);
+ status = gl841_feed(dev, move);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "gl841_coarse_gain_calibration: failed to feed: %s\n",
- sane_strstatus (status));
+ DBG (DBG_error, "%s: failed to feed: %s\n", __FUNCTION__,
+ sane_strstatus (status));
return status;
}
}
@@ -4879,7 +5401,7 @@ gl841_coarse_gain_calibration (Genesys_Device * dev, int dpi)
0,
0,
(dev->sensor.sensor_pixels*dev->settings.xres) / dev->sensor.optical_res,
- 1,
+ lines,
16,
channels,
dev->settings.color_filter,
@@ -4892,18 +5414,16 @@ gl841_coarse_gain_calibration (Genesys_Device * dev, int dpi)
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "gl841_coarse_calibration: failed to setup scan: %s\n",
+ DBG (DBG_error, "%s: failed to setup scan: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
- RIE (gl841_bulk_write_register
- (dev, dev->calib_reg, GENESYS_GL841_MAX_REGS));
+ RIE (gl841_bulk_write_register (dev, dev->calib_reg, GENESYS_GL841_MAX_REGS));
num_pixels = dev->current_setup.pixels;
- total_size = num_pixels * channels * 2 * 1; /* colors * bytes_per_color * scan lines */
+ total_size = num_pixels * channels * 2 * lines; /* colors * bytes_per_color * scan lines */
line = malloc (total_size);
if (!line)
@@ -4913,18 +5433,17 @@ gl841_coarse_gain_calibration (Genesys_Device * dev, int dpi)
RIEF (sanei_genesys_read_data_from_scanner (dev, line, total_size), line);
if (DBG_LEVEL >= DBG_data)
- sanei_genesys_write_pnm_file ("coarse.pnm", line, 16,
- channels, num_pixels, 1);
+ sanei_genesys_write_pnm_file ("coarse.pnm", line, 16, channels, num_pixels, lines);
/* average high level for each channel and compute gain
- to reach the target code
+ to reach the target code
we only use the central half of the CCD data */
for (j = 0; j < channels; j++)
{
max[j] = 0;
for (i = 0; i < num_pixels; i++)
{
- if (dev->model->is_cis)
+ if (dev->model->is_cis)
val =
line[i * 2 + j * 2 * num_pixels + 1] * 256 +
line[i * 2 + j * 2 * num_pixels];
@@ -4941,24 +5460,28 @@ gl841_coarse_gain_calibration (Genesys_Device * dev, int dpi)
if (dev->model->dac_type == DAC_CANONLIDE35 ||
dev->model->dac_type == DAC_WOLFSON_XP300 ||
- dev->model->dac_type == DAC_WOLFSON_DSM600) {
+ dev->model->dac_type == DAC_WOLFSON_DSM600)
+ {
gain[j] *= 0.69;/*seems we don't get the real maximum. empirically derived*/
- if (283 - 208/gain[j] > 255)
+ if (283 - 208/gain[j] > 255)
dev->frontend.gain[j] = 255;
else if (283 - 208/gain[j] < 0)
dev->frontend.gain[j] = 0;
else
dev->frontend.gain[j] = 283 - 208/gain[j];
- }
+ }
+ else if (dev->model->dac_type == DAC_CANONLIDE80)
+ {
+ dev->frontend.gain[j] = gain[j]*12;
+ }
- DBG (DBG_proc,
- "gl841_coarse_gain_calibration: channel %d, max=%d, gain = %f, setting:%d\n",
+ DBG (DBG_proc, "%s: channel %d, max=%d, gain = %f, setting:%d\n", __FUNCTION__,
j, max[j], gain[j],dev->frontend.gain[j]);
}
for (j = 0; j < channels; j++)
{
- if(gain[j] > 10)
+ if(gain[j] > 10)
{
DBG (DBG_error0, "**********************************************\n");
DBG (DBG_error0, "**********************************************\n");
@@ -4975,7 +5498,7 @@ gl841_coarse_gain_calibration (Genesys_Device * dev, int dpi)
return SANE_STATUS_JAMMED;
#endif
}
-
+
}
if (dev->model->is_cis) {
@@ -4986,19 +5509,23 @@ gl841_coarse_gain_calibration (Genesys_Device * dev, int dpi)
dev->frontend.gain[2] = dev->frontend.gain[1] = dev->frontend.gain[0];
}
- if (channels == 1)
+ if (channels == 1)
{
dev->frontend.gain[0] = dev->frontend.gain[1];
dev->frontend.gain[2] = dev->frontend.gain[1];
}
-
+
free (line);
+ DBG (DBG_info, "%s: gain=(%d,%d,%d)\n", __FUNCTION__,
+ dev->frontend.gain[0],
+ dev->frontend.gain[1],
+ dev->frontend.gain[2]);
RIE (gl841_stop_action (dev));
gl841_slow_back_home(dev, SANE_TRUE);
- DBG (DBG_proc, "gl841_coarse_gain_calibration: completed\n");
+ DBGCOMPLETED;
return status;
}
@@ -5069,7 +5596,7 @@ gl841_init_regs_for_warmup (Genesys_Device * dev,
* as a by-product, also check for lock
*/
#ifndef UNIT_TESTING
-static
+static
#endif
SANE_Status
sanei_gl841_repark_head (Genesys_Device * dev)
@@ -5077,7 +5604,7 @@ sanei_gl841_repark_head (Genesys_Device * dev)
SANE_Status status;
DBG (DBG_proc, "sanei_gl841_repark_head\n");
-
+
status = gl841_feed(dev,232);
if (status != SANE_STATUS_GOOD)
@@ -5095,7 +5622,7 @@ sanei_gl841_repark_head (Genesys_Device * dev)
}
static SANE_Status
-gl841_is_compatible_calibration (Genesys_Device * dev,
+gl841_is_compatible_calibration (Genesys_Device * dev,
Genesys_Calibration_Cache *cache,
int for_overwrite)
{
@@ -5146,7 +5673,7 @@ gl841_is_compatible_calibration (Genesys_Device * dev,
return SANE_STATUS_GOOD;
}
-/*
+/*
* initialize ASIC : registers, motor tables, and gamma tables
* then ensure scanner's head is at home
*/
@@ -5181,16 +5708,15 @@ gl841_init (Genesys_Device * dev)
dev->settings.color_filter = 0;
- /* Set default values for registers */
- gl841_init_registers (dev);
-
/* ASIC reset */
RIE (sanei_genesys_write_register (dev, 0x0e, 0x01));
RIE (sanei_genesys_write_register (dev, 0x0e, 0x00));
+ /* Set default values for registers */
+ gl841_init_registers (dev);
+
/* Write initial registers */
- RIE (gl841_bulk_write_register
- (dev, dev->reg, GENESYS_GL841_MAX_REGS));
+ RIE (gl841_bulk_write_register (dev, dev->reg, GENESYS_GL841_MAX_REGS));
/* Test ASIC and RAM */
if (!(dev->model->flags & GENESYS_FLAG_LAZY_INIT))
@@ -5246,7 +5772,7 @@ gl841_init (Genesys_Device * dev)
dev->sensor.gamma[i]);
}
}
-
+
/* send gamma tables */
status = gl841_send_gamma_table (dev);
if (status != SANE_STATUS_GOOD)
@@ -5320,8 +5846,9 @@ gl841_update_hardware_sensors (Genesys_Scanner * s)
*/
SANE_Status status = SANE_STATUS_GOOD;
uint8_t val;
-
- if (s->dev->model->gpo_type == GPO_CANONLIDE35)
+
+ if (s->dev->model->gpo_type == GPO_CANONLIDE35
+ || s->dev->model->gpo_type == GPO_CANONLIDE80)
{
RIE(sanei_genesys_read_register(s->dev, REG6D, &val));
@@ -5352,7 +5879,7 @@ gl841_update_hardware_sensors (Genesys_Scanner * s)
/** @brief search for a full width black or white strip.
* This function searches for a black or white stripe across the scanning area.
- * When searching backward, the searched area must completely be of the desired
+ * When searching backward, the searched area must completely be of the desired
* color since this area will be used for calibration which scans forward.
* @param dev scanner device
* @param forward SANE_TRUE if searching forward, SANE_FALSE if searching backward
@@ -5665,6 +6192,127 @@ gl841_search_strip (Genesys_Device * dev, SANE_Bool forward, SANE_Bool black)
return status;
}
+/**
+ * Send shading calibration data. The buffer is considered to always hold values
+ * for all the channels.
+ */
+GENESYS_STATIC
+SANE_Status
+gl841_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
+{
+ SANE_Status status = SANE_STATUS_GOOD;
+ uint32_t length, x, factor, pixels, i;
+ uint32_t half;
+ uint32_t lines, channels;
+ uint16_t dpiset, dpihw, strpixel ,endpixel, beginpixel;
+ uint8_t *buffer,*ptr,*src;
+
+ DBGSTART;
+ DBG( DBG_io2, "%s: writing %d bytes of shading data\n",__FUNCTION__,size);
+
+ /* old method if no SHDAREA */
+ if((dev->reg[reg_0x01].value & REG01_SHDAREA) == 0)
+ {
+ /* start address */
+ status = sanei_genesys_set_buffer_address (dev, 0x0000);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: failed to set buffer address: %s\n", __FUNCTION__,
+ sane_strstatus (status));
+ return status;
+ }
+
+ /* shading data whole line */
+ status = dev->model->cmd_set->bulk_write_data (dev, 0x3c, data, size);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: failed to send shading table: %s\n", __FUNCTION__,
+ sane_strstatus (status));
+ return status;
+ }
+ DBGCOMPLETED;
+ return status;
+ }
+
+ /* data is whole line, we extract only the part for the scanned area */
+ length = (uint32_t) (size / 3);
+ sanei_genesys_get_double(dev->reg,REG_STRPIXEL,&strpixel);
+ sanei_genesys_get_double(dev->reg,REG_ENDPIXEL,&endpixel);
+ DBG( DBG_io2, "%s: STRPIXEL=%d, ENDPIXEL=%d, PIXELS=%d\n",__FUNCTION__,strpixel,endpixel,endpixel-strpixel);
+
+ /* compute deletion/average factor */
+ sanei_genesys_get_double(dev->reg,REG_DPISET,&dpiset);
+ dpihw = gl841_get_dpihw(dev);
+ half=dev->current_setup.half_ccd+1;
+ factor=dpihw/dpiset;
+ DBG( DBG_io2, "%s: dpihw=%d, dpiset=%d, half_ccd=%d, factor=%d\n",__FUNCTION__,dpihw,dpiset,half-1,factor);
+
+ /* binary data logging */
+ if(DBG_LEVEL>=DBG_data)
+ {
+ dev->binary=fopen("binary.pnm","wb");
+ sanei_genesys_get_triple(dev->reg, REG_LINCNT, &lines);
+ channels=dev->current_setup.channels;
+ if(dev->binary!=NULL)
+ {
+ fprintf(dev->binary,"P5\n%d %d\n%d\n",(endpixel-strpixel)/factor*channels,lines/channels,255);
+ }
+ }
+
+ /* turn pixel value into bytes 2x16 bits words */
+ strpixel*=2*2; /* 2 words of 2 bytes */
+ endpixel*=2*2;
+ pixels=endpixel-strpixel;
+
+ /* shading pixel begin is start pixel minus start pixel during shading
+ * calibration. Currently only cases handled are full and half ccd resolution.
+ */
+ beginpixel = dev->sensor.CCD_start_xoffset / half;
+ beginpixel += dev->sensor.dummy_pixel + 1;
+ DBG(DBG_io2, "%s: ORIGIN PIXEL=%d\n", __FUNCTION__, beginpixel);
+ beginpixel = (strpixel-beginpixel*2*2)/factor;
+ DBG(DBG_io2, "%s: BEGIN PIXEL=%d\n",__FUNCTION__,beginpixel/4);
+
+ DBG(DBG_io2, "%s: using chunks of %d bytes (%d shading data pixels)\n",__FUNCTION__,length, length/4);
+ buffer=(uint8_t *)malloc(pixels);
+ memset(buffer,0,pixels);
+
+ /* write actual shading data contigously
+ * channel by channel, starting at addr 0x0000
+ * */
+ for(i=0;i<3;i++)
+ {
+ /* copy data to work buffer and process it */
+ /* coefficent destination */
+ ptr=buffer;
+
+ /* iterate on both sensor segment, data has been averaged,
+ * so is in the right order and we only have to copy it */
+ for(x=0;x<pixels;x+=4)
+ {
+ /* coefficient source */
+ src=data+x+beginpixel+i*length;
+ ptr[0]=src[0];
+ ptr[1]=src[1];
+ ptr[2]=src[2];
+ ptr[3]=src[3];
+
+ /* next shading coefficient */
+ ptr+=4;
+ }
+
+ /* 0x5400 alignment for LIDE80 internal memory */
+ RIEF(sanei_genesys_set_buffer_address (dev, 0x5400*i), buffer);
+ RIEF(dev->model->cmd_set->bulk_write_data (dev, 0x3c, buffer, pixels), buffer);
+ }
+
+ free(buffer);
+ DBGCOMPLETED;
+
+ return status;
+}
+
+
/** the gl841 command set */
static Genesys_Command_Set gl841_cmd_set = {
"gl841-generic", /* the name of this set */
@@ -5718,8 +6366,9 @@ static Genesys_Command_Set gl841_cmd_set = {
gl841_is_compatible_calibration,
NULL,
- NULL,
+ gl841_send_shading_data,
gl841_calculate_current_setup,
+ NULL,
NULL
};
diff --git a/backend/genesys_gl841.h b/backend/genesys_gl841.h
index bbf2ee1..bbb79f1 100644
--- a/backend/genesys_gl841.h
+++ b/backend/genesys_gl841.h
@@ -3,42 +3,42 @@
Copyright (C) 2011-2013 Stphane Voltz <stef.dev@free.fr>
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#include "genesys.h"
@@ -157,11 +157,25 @@
#define REG1DS_TGSHLD 0
+#define REG1E 0x1e
#define REG1E_WDTIME 0xf0
#define REG1ES_WDTIME 4
#define REG1E_LINESEL 0x0f
#define REG1ES_LINESEL 0
+#define REG_EXPR 0x10
+#define REG_EXPG 0x12
+#define REG_EXPB 0x14
+#define REG_STEPNO 0x21
+#define REG_FWDSTEP 0x22
+#define REG_BWDSTEP 0x23
+#define REG_FASTNO 0x24
+#define REG_LINCNT 0x25
+#define REG_DPISET 0x2c
+#define REG_STRPIXEL 0x30
+#define REG_ENDPIXEL 0x32
+#define REG_LPERIOD 0x38
+
#define REG40_HISPDFLG 0x04
#define REG40_MOTMFLG 0x02
#define REG40_DATAENB 0x01
@@ -231,8 +245,8 @@
#define REG6C_GPIOL 0xff
#define REG6D 0x6d
-
#define REG6E 0x6e
+#define REG6F 0x6f
#define REG87_LEDADD 0x04
@@ -348,8 +362,13 @@ enum
reg_0x85,
reg_0x86,
reg_0x87,
+ reg_0x88,
+ reg_0x89,
GENESYS_GL841_MAX_REGS
};
+
+#define INITREG(adr,val) {dev->reg[index].address=adr;dev->reg[index].value=val;index++;}
+
/**
* prototypes declaration in case of unit testing
*/
@@ -387,4 +406,51 @@ sanei_gl841_repark_head (Genesys_Device * dev);
SANE_Status
gl841_feed (Genesys_Device * dev, int steps);
+SANE_Status
+gl841_init_motor_regs_scan(Genesys_Device * dev,
+ Genesys_Register_Set * reg,
+ unsigned int scan_exposure_time,
+ float scan_yres,
+ int scan_step_type,
+ unsigned int scan_lines,
+ unsigned int scan_dummy,
+ unsigned int feed_steps,
+ int scan_power_mode,
+ unsigned int flags) ;
+
+SANE_Status
+gl841_stop_action (Genesys_Device * dev);
+
+SANE_Status
+gl841_start_action (Genesys_Device * dev);
+
+SANE_Status
+gl841_init_motor_regs(Genesys_Device * dev,
+ Genesys_Register_Set * reg,
+ unsigned int feed_steps,
+ unsigned int action,
+ unsigned int flags);
+
+SANE_Status gl841_send_slope_table (Genesys_Device * dev, int table_nr, uint16_t * slope_table, int steps);
+
+SANE_Status gl841_bulk_write_data_gamma (Genesys_Device * dev, uint8_t addr, uint8_t * data, size_t len);
+
+SANE_Status gl841_offset_calibration (Genesys_Device * dev);
+
+SANE_Status gl841_coarse_gain_calibration (Genesys_Device * dev, int dpi);
+
+SANE_Status gl841_led_calibration (Genesys_Device * dev);
+
+SANE_Status gl841_send_shading_data (Genesys_Device * dev, uint8_t * data, int size);
+
+int gl841_scan_step_type(Genesys_Device *dev, int yres);
+SANE_Status gl841_write_freq(Genesys_Device *dev, unsigned int ydpi);
#endif
+
+GENESYS_STATIC
+int gl841_exposure_time(Genesys_Device *dev,
+ float slope_dpi,
+ int scan_step_type,
+ int start,
+ int used_pixels,
+ int *scan_power_mode);
diff --git a/backend/genesys_gl843.c b/backend/genesys_gl843.c
index 3648d09..2b0d8fa 100644
--- a/backend/genesys_gl843.c
+++ b/backend/genesys_gl843.c
@@ -1,45 +1,45 @@
/* sane - Scanner Access Now Easy.
Copyright (C) 2010-2013 Stphane Voltz <stef.dev@free.fr>
-
-
+
+
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
-
+
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#undef BACKEND_NAME
@@ -294,7 +294,7 @@ gl843_bulk_read_data (Genesys_Device * dev, uint8_t addr,
}
/****************************************************************************
- Mid level functions
+ Mid level functions
****************************************************************************/
static SANE_Bool
@@ -439,7 +439,7 @@ static Sensor_Profile *get_sensor_profile(int sensor_type, int dpi, int flags)
}
else
{
- if(sp[i].dpi>=dpi
+ if(sp[i].dpi>=dpi
&& sp[i].dpi<sp[idx].dpi)
{
idx=i;
@@ -485,7 +485,7 @@ gl843_setup_sensor (Genesys_Device * dev, Genesys_Register_Set * regs, int dpi,i
if (r)
r->value = sensor->regs_0x52_0x5e[i];
}
-
+
/* specific registers */
r = sanei_genesys_get_address (regs, 0x0c);
if (r)
@@ -664,7 +664,7 @@ gl843_init_registers (Genesys_Device * dev)
SETREG (0x94, 0xff);
SETREG (0xab, 0x50);
}
-
+
/* so many time burnt for this register ....*/
if (strcmp (dev->model->name, "canon-canoscan-4400f") != 0
&&strcmp (dev->model->name, "canon-canoscan-8400f") != 0)
@@ -683,7 +683,7 @@ gl843_init_registers (Genesys_Device * dev)
SETREG (0x06, 0xd8); /* SCANMOD=110, PWRBIT and GAIN4 */
SETREG (0x0a, 0x18);
SETREG (0x0b, 0x69);
-
+
/* CIS exposure is used for XPA lamp movement */
SETREG (0x10, 0x2c);
SETREG (0x11, 0x09);
@@ -698,7 +698,7 @@ gl843_init_registers (Genesys_Device * dev)
SETREG (0x71, 0x02);
SETREG (0x72, 0x00);
SETREG (0x73, 0x00);
-
+
SETREG (0x80, 0x50);
SETREG (0x9d, 0x08);
SETREG (0xab, 0x40);
@@ -710,7 +710,7 @@ gl843_init_registers (Genesys_Device * dev)
SETREG (0x9b, 0x80);
SETREG (0xac, 0x00);
}
-
+
if (strcmp (dev->model->name, "canon-canoscan-4400f") == 0)
{
SETREG (0x06, 0xf0); /* SCANMOD=111, PWRBIT and no GAIN4 */
@@ -732,7 +732,7 @@ gl843_init_registers (Genesys_Device * dev)
sanei_genesys_set_double(dev->reg,REG_EXPG,0x9c40);
sanei_genesys_set_double(dev->reg,REG_EXPB,0x9c40);
}
-
+
if (strcmp (dev->model->name, "canon-canoscan-8400f") == 0)
{
SETREG (0x03, 0x1c);
@@ -775,7 +775,7 @@ gl843_init_registers (Genesys_Device * dev)
DBGCOMPLETED;
}
-/* Send slope table for motor movement
+/* Send slope table for motor movement
slope_table in machine byte order
*/
#ifndef UNIT_TESTING
@@ -1032,7 +1032,7 @@ gl843_init_motor_regs_scan (Genesys_Device * dev,
feedl<<=scan_step_type;
dist = scan_steps;
- if (use_fast_fed)
+ if (use_fast_fed)
{
dist += fast_steps*2;
}
@@ -1089,7 +1089,7 @@ gl843_init_motor_regs_scan (Genesys_Device * dev,
{
r->value = 0x50;
coeff=dev->sensor.optical_res/sanei_genesys_compute_dpihw(dev, scan_yres);
- if (dev->model->motor_type == MOTOR_KVSS080)
+ if (dev->model->motor_type == MOTOR_KVSS080)
{
if(coeff>=1)
{
@@ -1130,7 +1130,7 @@ static int gl843_compute_exposure(Genesys_Device *dev, int xres, int flags)
/** @brief setup optical related registers
* start and pixels are expressed in optical sensor resolution coordinate
- * space.
+ * space.
* @param dev device to use
* @param reg registers to set up
* @param exposure exposure time to use
@@ -1190,7 +1190,7 @@ gl843_init_optical_regs_scan (Genesys_Device * dev,
/* sensor parameters */
gl843_setup_sensor (dev, reg, dpihw, flags);
- /* resolution is divided according to CKSEL which is known once sensor is set up */
+ /* resolution is divided according to CKSEL which is known once sensor is set up */
r = sanei_genesys_get_address (reg, REG18);
cksel= (r->value & REG18_CKSEL)+1;
DBG (DBG_io2, "%s: cksel=%d\n", __FUNCTION__, cksel);
@@ -1208,8 +1208,8 @@ gl843_init_optical_regs_scan (Genesys_Device * dev,
used_pixels=endx-startx;
/* in case of stagger we have to start at an odd coordinate */
- if ((flags & OPTICAL_FLAG_STAGGER)
- &&((startx & 1)==0))
+ if ((flags & OPTICAL_FLAG_STAGGER)
+ &&((startx & 1)==0))
{
startx++;
endx++;
@@ -1218,7 +1218,7 @@ gl843_init_optical_regs_scan (Genesys_Device * dev,
status = gl843_set_fe (dev, AFE_SET);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error, "%s: failed to set frontend: %s\n", __FUNCTION__,
+ DBG (DBG_error, "%s: failed to set frontend: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
@@ -1450,7 +1450,7 @@ gl843_init_scan_regs (Genesys_Device * dev,
/* stagger starting at 2400, and not applied for calibration */
stagger = 0;
- if ( (yres>1200)
+ if ( (yres>1200)
&& ((flags & SCAN_FLAG_IGNORE_LINE_DISTANCE)==0)
&& (dev->model->flags & GENESYS_FLAG_STAGGERED_LINE))
{
@@ -1458,7 +1458,7 @@ gl843_init_scan_regs (Genesys_Device * dev,
}
DBG (DBG_info, "%s : stagger=%d lines\n", __FUNCTION__, stagger);
- /* we enable true gray for cis scanners only, and just when doing
+ /* we enable true gray for cis scanners only, and just when doing
* scan since color calibration is OK for this mode
*/
oflags = 0;
@@ -1495,7 +1495,7 @@ gl843_init_scan_regs (Genesys_Device * dev,
/* use detected left margin and fixed value */
/* start */
start = startx;
-
+
/* compute correct pixels number */
used_pixels = (pixels * optical_res) / xres;
DBG (DBG_info, "%s: used_pixels=%d\n", __FUNCTION__, used_pixels);
@@ -1566,7 +1566,7 @@ gl843_init_scan_regs (Genesys_Device * dev,
/*** motor parameters ***/
/* it seems base_dpi of the G4050 motor is changed above 600 dpi*/
- if (dev->model->motor_type == MOTOR_G4050 && yres>600)
+ if (dev->model->motor_type == MOTOR_G4050 && yres>600)
{
dev->ld_shift_r = (dev->model->ld_shift_r*3800)/dev->motor.base_ydpi;
dev->ld_shift_g = (dev->model->ld_shift_g*3800)/dev->motor.base_ydpi;
@@ -1797,7 +1797,7 @@ gl843_calculate_current_setup (Genesys_Device * dev)
DBG (DBG_info, "%s : exposure=%d pixels\n", __FUNCTION__, exposure);
/* it seems base_dpi of the G4050 motor is changed above 600 dpi*/
- if (dev->model->motor_type == MOTOR_G4050 && yres>600)
+ if (dev->model->motor_type == MOTOR_G4050 && yres>600)
{
dev->ld_shift_r = (dev->model->ld_shift_r*3800)/dev->motor.base_ydpi;
dev->ld_shift_g = (dev->model->ld_shift_g*3800)/dev->motor.base_ydpi;
@@ -1901,7 +1901,7 @@ gl843_save_power (Genesys_Device * dev, SANE_Bool enable)
return SANE_STATUS_INVAL;
/* switch KV-SS080 lamp off */
- if (dev->model->gpo_type == GPO_KVSS080)
+ if (dev->model->gpo_type == GPO_KVSS080)
{
RIE(sanei_genesys_read_register (dev, REG6C, &val));
if(enable)
@@ -1978,7 +1978,7 @@ gl843_stop_action (Genesys_Device * dev)
status = sanei_genesys_write_register (dev, REG01, val);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error, "%s: failed to write register 01: %s\n", __FUNCTION__,
+ DBG (DBG_error, "%s: failed to write register 01: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
@@ -2110,7 +2110,7 @@ gl843_detect_document_end (Genesys_Device * dev)
flines);
}
- /* adjust number of bytes to read
+ /* adjust number of bytes to read
* we need to read the final bytes which are word per line * number of last lines
* to have doc leaving feeder */
lines =
@@ -2149,7 +2149,7 @@ gl843_detect_document_end (Genesys_Device * dev)
if (flines > lines)
{
/* change the value controlling communication with the frontend :
- * total bytes to read is current value plus the number of remaining lines
+ * total bytes to read is current value plus the number of remaining lines
* multiplied by bytes per line */
sublines = flines - lines;
@@ -2419,13 +2419,13 @@ gl843_end_scan (Genesys_Device * dev, Genesys_Register_Set * reg,
if (val & (REG03_XPASEL|REG03_LAMPPWR))
{
sanei_genesys_read_register (dev, REGA6, &val);
-
+
/* switch on regular lamp */
val |= 0x40;
/* no XPA lamp power (2 bits for level: __11 ____) */
val &= ~0x30;
-
+
RIE (sanei_genesys_write_register (dev, REGA6, val));
}
@@ -2459,7 +2459,7 @@ static SANE_Status gl843_park_xpa_lamp (Genesys_Device * dev)
Genesys_Register_Set *r;
uint8_t val;
int loop = 0;
-
+
DBGSTART;
/* copy scan settings */
@@ -2470,7 +2470,7 @@ static SANE_Status gl843_park_xpa_lamp (Genesys_Device * dev)
/* clear scan and feed count */
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT | REG0D_CLRMCNT));
-
+
/* set up for reverse and no scan */
r = sanei_genesys_get_address (local_reg, REG02);
r->value |= REG02_MTRREV;
@@ -2591,7 +2591,7 @@ gl843_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
memcpy (local_reg, dev->reg, GENESYS_GL843_MAX_REGS * sizeof (Genesys_Register_Set));
resolution=sanei_genesys_get_lowest_ydpi(dev);
- gl843_init_scan_regs (dev,
+ status = gl843_init_scan_regs (dev,
local_reg,
resolution,
resolution,
@@ -2607,10 +2607,18 @@ gl843_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
SCAN_FLAG_DISABLE_GAMMA |
SCAN_FLAG_DISABLE_BUFFER_FULL_MOVE |
SCAN_FLAG_IGNORE_LINE_DISTANCE);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error,
+ "gl843_slow_back_home: failed to set up registers: %s\n",
+ sane_strstatus (status));
+ DBGCOMPLETED;
+ return status;
+ }
/* clear scan and feed count */
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT | REG0D_CLRMCNT));
-
+
/* set up for reverse and no scan */
r = sanei_genesys_get_address (local_reg, REG02);
r->value |= REG02_MTRREV;
@@ -2795,7 +2803,7 @@ gl843_search_start_position (Genesys_Device * dev)
return SANE_STATUS_GOOD;
}
-/*
+/*
* sets up register for coarse gain calibration
* todo: check it for scanners using it */
static SANE_Status
@@ -2879,7 +2887,7 @@ gl843_feed (Genesys_Device * dev, unsigned int steps)
memcpy (local_reg, dev->reg, GENESYS_GL843_MAX_REGS * sizeof (Genesys_Register_Set));
resolution=sanei_genesys_get_lowest_ydpi(dev);
- gl843_init_scan_regs (dev,
+ status = gl843_init_scan_regs (dev,
local_reg,
resolution,
resolution,
@@ -2895,15 +2903,23 @@ gl843_feed (Genesys_Device * dev, unsigned int steps)
SCAN_FLAG_DISABLE_GAMMA |
SCAN_FLAG_FEEDING |
SCAN_FLAG_IGNORE_LINE_DISTANCE);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error,
+ "gl843_feed: failed to set up registers: %s\n",
+ sane_strstatus (status));
+ DBGCOMPLETED;
+ return status;
+ }
/* clear scan and feed count */
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT));
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRMCNT));
-
+
/* set up for no scan */
r = sanei_genesys_get_address (local_reg, REG01);
r->value &= ~REG01_SCAN;
-
+
/* send registers */
RIE (dev->model->cmd_set->bulk_write_register (dev, local_reg, GENESYS_GL843_MAX_REGS));
@@ -2925,7 +2941,7 @@ gl843_feed (Genesys_Device * dev, unsigned int steps)
status = sanei_genesys_get_status (dev, &val);
}
while (status == SANE_STATUS_GOOD && !(val & FEEDFSH));
-
+
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -2941,7 +2957,7 @@ gl843_init_regs_for_shading (Genesys_Device * dev)
uint16_t strpixel;
DBGSTART;
-
+
/* initial calibration reg values */
memcpy (dev->calib_reg, dev->reg, GENESYS_GL843_MAX_REGS * sizeof (Genesys_Register_Set));
@@ -3053,7 +3069,7 @@ gl843_init_regs_for_scan (Genesys_Device * dev)
flags = 0;
/* enable emulated lineart from gray data */
- if(dev->settings.scan_mode == SCAN_MODE_LINEART
+ if(dev->settings.scan_mode == SCAN_MODE_LINEART
&& dev->settings.dynamic_lineart)
{
flags |= SCAN_FLAG_DYNAMIC_LINEART;
@@ -3080,7 +3096,7 @@ gl843_init_regs_for_scan (Genesys_Device * dev)
return SANE_STATUS_GOOD;
}
-/**
+/**
* This function sends gamma tables to ASIC
*/
static SANE_Status
@@ -3210,7 +3226,7 @@ gl843_led_calibration (Genesys_Device * dev)
if (!line)
return SANE_STATUS_NO_MEM;
-/*
+/*
we try to get equal bright leds here:
loop:
@@ -3294,9 +3310,9 @@ gl843_led_calibration (Genesys_Device * dev)
/*
keep the resulting exposures below this value.
too long exposure drives the ccd into saturation.
- we may fix this by relying on the fact that
+ we may fix this by relying on the fact that
we get a striped scan without shading, by means of
- statistical calculation
+ statistical calculation
*/
avge = (expr + expg + expb) / 3;
@@ -3561,13 +3577,13 @@ gl843_offset_calibration (Genesys_Device * dev)
}
-/* alternative coarse gain calibration
+/* alternative coarse gain calibration
this on uses the settings from offset_calibration and
uses only one scanline
*/
/*
with offset and coarse calibration we only want to get our input range into
- a reasonable shape. the fine calibration of the upper and lower bounds will
+ a reasonable shape. the fine calibration of the upper and lower bounds will
be done with shading.
*/
static SANE_Status
@@ -3781,7 +3797,7 @@ gl843_init_regs_for_warmup (Genesys_Device * dev,
return SANE_STATUS_GOOD;
}
-/**
+/**
* set up GPIO/GPOE for idle state
WRITE GPIO[17-21]= GPIO19
WRITE GPOE[17-21]= GPOE21 GPOE20 GPOE19 GPOE18
@@ -3842,7 +3858,7 @@ gl843_boot (Genesys_Device * dev, SANE_Bool cold)
RIE (sanei_genesys_write_register (dev, 0x0e, 0x01));
RIE (sanei_genesys_write_register (dev, 0x0e, 0x00));
}
-
+
if(dev->usb_mode == 1)
{
val = 0x14;
@@ -3898,7 +3914,7 @@ gl843_boot (Genesys_Device * dev, SANE_Bool cold)
/* setup gpio */
RIE (gl843_init_gpio (dev));
-
+
gl843_feed (dev, 300);
usleep (100000);
@@ -3993,7 +4009,7 @@ SANE_Status gl843_move_to_ta (Genesys_Device * dev)
/** @brief search for a full width black or white strip.
* This function searches for a black or white stripe across the scanning area.
- * When searching backward, the searched area must completely be of the desired
+ * When searching backward, the searched area must completely be of the desired
* color since this area will be used for calibration which scans forward.
* @param dev scanner device
* @param forward SANE_TRUE if searching forward, SANE_FALSE if searching backward
@@ -4310,7 +4326,7 @@ gl843_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
uint16_t dpiset, strpixel, endpixel, startx, factor;
DBGSTART;
-
+
offset=0;
length=size;
r = sanei_genesys_get_address (dev->reg, REG01);
@@ -4337,7 +4353,7 @@ gl843_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
sanei_genesys_get_double(dev->reg,REG_ENDPIXEL,&endpixel);
strpixel*=tgtime;
endpixel*=tgtime;
-
+
/* 16 bit words, 2 words per color, 3 color channels */
offset=(strpixel-startx)*2*2*3;
length=(endpixel-strpixel)*2*2*3;
@@ -4378,13 +4394,13 @@ gl843_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
free(final_data);
return status;
}
-
+
status = dev->model->cmd_set->bulk_write_data (dev, 0x3c, final_data, count);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "%s: failed to send shading table: %s\n", __FUNCTION__, sane_strstatus (status));
}
-
+
free(final_data);
DBGCOMPLETED;
return status;
@@ -4446,7 +4462,8 @@ static Genesys_Command_Set gl843_cmd_set = {
gl843_move_to_ta,
gl843_send_shading_data,
gl843_calculate_current_setup,
- gl843_boot
+ gl843_boot,
+ NULL
};
SANE_Status
diff --git a/backend/genesys_gl843.h b/backend/genesys_gl843.h
index 241a2ed..f31f0ee 100644
--- a/backend/genesys_gl843.h
+++ b/backend/genesys_gl843.h
@@ -3,42 +3,42 @@
Copyright (C) 2010-2013 Stphane Voltz <stef.dev@free.fr>
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#include "genesys.h"
diff --git a/backend/genesys_gl846.c b/backend/genesys_gl846.c
index 5e1f0f4..3991693 100644
--- a/backend/genesys_gl846.c
+++ b/backend/genesys_gl846.c
@@ -1,45 +1,45 @@
/* sane - Scanner Access Now Easy.
Copyright (C) 2012-2013 Stphane Voltz <stef.dev@free.fr>
-
-
+
+
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
-
+
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
/** @file
@@ -62,7 +62,7 @@
/** @brief read scanned data
* Read in 0xeff0 maximum sized blocks. This read is done in 2
- * parts if not multple of 512. First read is rounded to a multiple of 512 bytes, last read fetches the
+ * parts if not multple of 512. First read is rounded to a multiple of 512 bytes, last read fetches the
* remainder. Read addr is always 0x10000000 with the memory layout setup.
* @param dev device to read data from
* @param addr address within ASIC memory space, unused but kept for API
@@ -128,7 +128,7 @@ gl846_bulk_read_data (Genesys_Device * dev, uint8_t addr,
read /= 512;
read *= 512;
}
-
+
DBG (DBG_io2,
"gl846_bulk_read_data: trying to read %lu bytes of data\n",
(u_long) read);
@@ -180,7 +180,7 @@ gl846_bulk_read_data (Genesys_Device * dev, uint8_t addr,
}
/****************************************************************************
- Mid level functions
+ Mid level functions
****************************************************************************/
static SANE_Bool
@@ -304,7 +304,7 @@ static Sensor_Profile *get_sensor_profile(int sensor_type, int dpi)
}
else
{
- if(sensors[i].dpi>=dpi
+ if(sensors[i].dpi>=dpi
&& sensors[i].dpi<sensors[idx].dpi)
{
idx=i;
@@ -560,7 +560,7 @@ gl846_init_registers (Genesys_Device * dev)
DBGCOMPLETED;
}
-/**@brief send slope table for motor movement
+/**@brief send slope table for motor movement
* Send slope_table in machine byte order
* @param dev device to send slope table
* @param table_nr index of the slope table in ASIC memory
@@ -633,7 +633,7 @@ gl846_set_adi_fe (Genesys_Device * dev, uint8_t set)
/* wait for FE to be ready */
status = sanei_genesys_get_status (dev, &val8);
- while (val8 & REG41_FEBUSY);
+ while (val8 & REG41_FEBUSY)
{
usleep (10000);
status = sanei_genesys_get_status (dev, &val8);
@@ -776,7 +776,7 @@ gl846_init_motor_regs_scan (Genesys_Device * dev,
use_fast_fed=0;
/* no fast fed since feed works well */
- if(dev->settings.yres==4444 && feed_steps>100
+ if(dev->settings.yres==4444 && feed_steps>100
&& ((flags & MOTOR_FLAG_FEED)==0))
{
use_fast_fed=1;
@@ -845,7 +845,7 @@ gl846_init_motor_regs_scan (Genesys_Device * dev,
/* correct move distance by acceleration and deceleration amounts */
feedl=feed_steps;
- if (use_fast_fed)
+ if (use_fast_fed)
{
feedl<<=fast_step_type;
dist=(scan_steps+2*fast_steps)*factor;
@@ -887,7 +887,7 @@ gl846_init_motor_regs_scan (Genesys_Device * dev,
*/
/* if quarter step, bipolar Vref2 */
- /* XXX STEF XXX GPIO
+ /* XXX STEF XXX GPIO
if (scan_step_type > 1)
{
if (scan_step_type < 3)
@@ -1021,11 +1021,11 @@ gl846_init_optical_regs_scan (Genesys_Device * dev,
"half_ccd=%d, flags=%x\n", exposure_time,
used_res, start, pixels, channels, depth, half_ccd, flags);
- /* resolution is divided according to CKSEL */
+ /* resolution is divided according to CKSEL */
r = sanei_genesys_get_address (reg, REG18);
cksel= (r->value & REG18_CKSEL)+1;
DBG (DBG_io2, "%s: cksel=%d\n", __FUNCTION__, cksel);
-
+
/* to manage high resolution device while keeping good
* low resolution scanning speed, we make hardware dpi vary */
dpihw=sanei_genesys_compute_dpihw(dev, used_res * cksel);
@@ -1040,7 +1040,7 @@ gl846_init_optical_regs_scan (Genesys_Device * dev,
/* start and end coordinate in optical dpi coordinates */
startx = start/cksel+dev->sensor.CCD_start_xoffset;
used_pixels=pixels/cksel;
-
+
/* end of sensor window */
endx = startx + used_pixels;
@@ -1184,7 +1184,7 @@ gl846_init_optical_regs_scan (Genesys_Device * dev,
{
r->value |= REG87_LEDADD;
}
- /* RGB weighting
+ /* RGB weighting
r = sanei_genesys_get_address (reg, 0x01);
r->value &= ~REG01_TRUEGRAY;
if (channels == 1 && (flags & OPTICAL_FLAG_ENABLE_LEDADD))
@@ -1229,7 +1229,7 @@ gl846_init_optical_regs_scan (Genesys_Device * dev,
DBG (DBG_io2, "%s: dev->len =%lu\n", __FUNCTION__, (unsigned long)dev->len);
DBG (DBG_io2, "%s: dev->dist =%lu\n", __FUNCTION__, (unsigned long)dev->dist);
DBG (DBG_io2, "%s: dev->segnb =%lu\n", __FUNCTION__, (unsigned long)dev->segnb);
-
+
words_per_line *= channels;
dev->wpl = words_per_line;
@@ -1248,7 +1248,7 @@ gl846_init_optical_regs_scan (Genesys_Device * dev,
r = sanei_genesys_get_address (reg, 0x34);
r->value = dev->sensor.dummy_pixel;
-
+
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -1383,7 +1383,7 @@ gl846_init_scan_regs (Genesys_Device * dev,
depth = 8;
}
- /* we enable true gray for cis scanners only, and just when doing
+ /* we enable true gray for cis scanners only, and just when doing
* scan since color calibration is OK for this mode
*/
oflags = 0;
@@ -1393,7 +1393,7 @@ gl846_init_scan_regs (Genesys_Device * dev,
oflags |= OPTICAL_FLAG_DISABLE_GAMMA;
if(flags & SCAN_FLAG_DISABLE_LAMP)
oflags |= OPTICAL_FLAG_DISABLE_LAMP;
-
+
if (dev->model->is_cis && dev->settings.true_gray)
{
oflags |= OPTICAL_FLAG_ENABLE_LEDADD;
@@ -1504,12 +1504,12 @@ gl846_init_scan_regs (Genesys_Device * dev,
/* theory :
target_size =
(dev->settings.pixels * dev->settings.lines * channels * depth) / 8;
- but it suffers from integer overflow so we do the following:
+ but it suffers from integer overflow so we do the following:
- 1 bit color images store color data byte-wise, eg byte 0 contains
- 8 bits of red data, byte 1 contains 8 bits of green, byte 2 contains
+ 1 bit color images store color data byte-wise, eg byte 0 contains
+ 8 bits of red data, byte 1 contains 8 bits of green, byte 2 contains
8 bits of blue.
- This does not fix the overflow, though.
+ This does not fix the overflow, though.
644mp*16 = 10gp, leading to an overflow
-- pierre
*/
@@ -1969,13 +1969,13 @@ gl846_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
}
memcpy (local_reg, dev->reg, GENESYS_GL846_MAX_REGS * sizeof (Genesys_Register_Set));
-
+
resolution=sanei_genesys_get_lowest_ydpi(dev);
-
+
/* TODO add scan_mode to the API */
scan_mode= dev->settings.scan_mode;
dev->settings.scan_mode=SCAN_MODE_LINEART;
- gl846_init_scan_regs (dev,
+ status = gl846_init_scan_regs (dev,
local_reg,
resolution,
resolution,
@@ -1989,11 +1989,19 @@ gl846_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
SCAN_FLAG_IGNORE_LINE_DISTANCE);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error,
+ "gl846_slow_back_home: failed to set up registers: %s\n",
+ sane_strstatus (status));
+ DBGCOMPLETED;
+ return status;
+ }
dev->settings.scan_mode=scan_mode;
/* clear scan and feed count */
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT | REG0D_CLRMCNT));
-
+
/* set up for reverse */
r = sanei_genesys_get_address (local_reg, REG02);
r->value |= REG02_MTRREV;
@@ -2153,7 +2161,7 @@ gl846_search_start_position (Genesys_Device * dev)
memcpy (dev->reg, local_reg,
GENESYS_GL846_MAX_REGS * sizeof (Genesys_Register_Set));
-/*TODO: find out where sanei_genesys_search_reference_point
+/*TODO: find out where sanei_genesys_search_reference_point
stores information, and use that correctly*/
status =
sanei_genesys_search_reference_point (dev, data, 0, dpi, pixels,
@@ -2171,7 +2179,7 @@ gl846_search_start_position (Genesys_Device * dev)
return SANE_STATUS_GOOD;
}
-/*
+/*
* sets up register for coarse gain calibration
* todo: check it for scanners using it */
static SANE_Status
@@ -2255,7 +2263,7 @@ gl846_feed (Genesys_Device * dev, unsigned int steps)
memcpy (local_reg, dev->reg, GENESYS_GL846_MAX_REGS * sizeof (Genesys_Register_Set));
resolution=sanei_genesys_get_lowest_ydpi(dev);
- gl846_init_scan_regs (dev,
+ status = gl846_init_scan_regs (dev,
local_reg,
resolution,
resolution,
@@ -2270,6 +2278,14 @@ gl846_feed (Genesys_Device * dev, unsigned int steps)
SCAN_FLAG_DISABLE_GAMMA |
SCAN_FLAG_FEEDING |
SCAN_FLAG_IGNORE_LINE_DISTANCE);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error,
+ "gl846_feed: failed to set up registers: %s\n",
+ sane_strstatus (status));
+ DBGCOMPLETED;
+ return status;
+ }
/* set exposure to zero */
sanei_genesys_set_triple(local_reg,REG_EXPR,0);
@@ -2279,11 +2295,11 @@ gl846_feed (Genesys_Device * dev, unsigned int steps)
/* clear scan and feed count */
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT));
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRMCNT));
-
+
/* set up for no scan */
r = sanei_genesys_get_address (local_reg, REG01);
r->value &= ~REG01_SCAN;
-
+
/* send registers */
RIE (dev->model->cmd_set->bulk_write_register (dev, local_reg, GENESYS_GL846_MAX_REGS));
@@ -2308,7 +2324,7 @@ gl846_feed (Genesys_Device * dev, unsigned int steps)
/* then stop scanning */
RIE(gl846_stop_action (dev));
-
+
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -2335,7 +2351,7 @@ gl846_init_regs_for_shading (Genesys_Device * dev)
DBG (DBG_io, "%s: calib_lines = %d\n", __FUNCTION__, (unsigned int)dev->calib_lines);
DBG (DBG_io, "%s: calib_pixels = %d\n", __FUNCTION__, (unsigned int)dev->calib_pixels);
- /* this is aworkaround insufficent distance for slope
+ /* this is aworkaround insufficent distance for slope
* motor acceleration TODO special motor slope for shading */
move=1;
if(dev->calib_resolution<1200)
@@ -2364,7 +2380,7 @@ gl846_init_regs_for_shading (Genesys_Device * dev)
DBG (DBG_error, "%s: failed to setup scan: %s\n", __FUNCTION__, sane_strstatus (status));
return status;
}
-
+
status = dev->model->cmd_set->bulk_write_register (dev, dev->calib_reg, GENESYS_GL846_MAX_REGS);
if (status != SANE_STATUS_GOOD)
{
@@ -2421,9 +2437,9 @@ gl846_init_regs_for_scan (Genesys_Device * dev)
assumption: steps are expressed at maximum motor resolution
- we need:
- SANE_Fixed y_offset;
- SANE_Fixed y_size;
+ we need:
+ SANE_Fixed y_offset;
+ SANE_Fixed y_size;
SANE_Fixed y_offset_calib;
mm_to_steps()=motor dpi / 2.54 / 10=motor dpi / MM_PER_INCH */
@@ -2453,7 +2469,7 @@ gl846_init_regs_for_scan (Genesys_Device * dev)
}
move=500;
}
-
+
DBG (DBG_info, "gl846_init_regs_for_scan: move=%f steps\n", move);
DBG (DBG_info, "%s: move=%f steps\n", __FUNCTION__, move);
@@ -2465,7 +2481,7 @@ gl846_init_regs_for_scan (Genesys_Device * dev)
flags = 0;
/* emulated lineart from gray data is required for now */
- if(dev->settings.scan_mode == SCAN_MODE_LINEART
+ if(dev->settings.scan_mode == SCAN_MODE_LINEART
&& dev->settings.dynamic_lineart)
{
flags |= SCAN_FLAG_DYNAMIC_LINEART;
@@ -2489,7 +2505,7 @@ gl846_init_regs_for_scan (Genesys_Device * dev)
if (status != SANE_STATUS_GOOD)
return status;
-
+
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -2512,7 +2528,7 @@ gl846_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
DBGSTART;
DBG( DBG_io2, "%s: writing %d bytes of shading data\n",__FUNCTION__,size);
- /* shading data is plit in 3 (up to 5 with IR) areas
+ /* shading data is plit in 3 (up to 5 with IR) areas
write(0x10014000,0x00000dd8)
URB 23429 bulk_out len 3544 wrote 0x33 0x10 0x....
write(0x1003e000,0x00000dd8)
@@ -2542,14 +2558,14 @@ gl846_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
fprintf(dev->binary,"P5\n%d %d\n%d\n",(endpixel-strpixel)/factor*channels,lines/channels,255);
}
}
-
+
pixels=endpixel-strpixel;
/* since we're using SHDAREA, substract startx coordinate from shading */
strpixel-=((dev->sensor.CCD_start_xoffset*600)/dev->sensor.optical_res);
-
+
/* turn pixel value into bytes 2x16 bits words */
- strpixel*=2*2;
+ strpixel*=2*2;
pixels*=2*2;
/* allocate temporary buffer */
@@ -2578,18 +2594,19 @@ gl846_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
ptr[1]=src[1];
ptr[2]=src[2];
ptr[3]=src[3];
-
+
/* next shading coefficient */
ptr+=4;
}
- RIE (sanei_genesys_read_register (dev, 0xd0+i, &val));
+ RIEF (sanei_genesys_read_register (dev, 0xd0+i, &val), buffer);
addr = val * 8192 + 0x10000000;
status = sanei_genesys_write_ahb (dev->dn, dev->usb_mode, addr, pixels, buffer);
if (status != SANE_STATUS_GOOD)
{
DBG (DBG_error, "gl846_send_shading_data; write to AHB failed (%s)\n",
sane_strstatus (status));
+ free(buffer);
return status;
}
}
@@ -2640,7 +2657,7 @@ gl846_led_calibration (Genesys_Device * dev)
used_res=sanei_genesys_compute_dpihw(dev,dev->settings.xres);
sensor=get_sensor_profile(dev->model->ccd_type, used_res);
num_pixels = (dev->sensor.sensor_pixels*used_res)/dev->sensor.optical_res;
-
+
/* initial calibration reg values */
memcpy (dev->calib_reg, dev->reg, GENESYS_GL846_MAX_REGS * sizeof (Genesys_Register_Set));
@@ -2770,18 +2787,18 @@ gl846_led_calibration (Genesys_Device * dev)
/* cleanup before return */
free (line);
-
+
/* go back home */
if(move>20)
{
status=gl846_slow_back_home (dev, SANE_TRUE);
}
-
+
DBGCOMPLETED;
return status;
}
-/**
+/**
* set up GPIO/GPOE for idle state
*/
static SANE_Status
@@ -2805,7 +2822,7 @@ gl846_init_gpio (Genesys_Device * dev)
RIE (sanei_genesys_write_register (dev, REGA7, gpios[idx].ra7));
RIE (sanei_genesys_write_register (dev, REGA6, gpios[idx].ra6));
-
+
RIE (sanei_genesys_write_register (dev, REG6B, gpios[idx].r6b));
RIE (sanei_genesys_write_register (dev, REG6C, gpios[idx].r6c));
RIE (sanei_genesys_write_register (dev, REG6D, gpios[idx].r6d));
@@ -2819,7 +2836,7 @@ gl846_init_gpio (Genesys_Device * dev)
return status;
}
-/**
+/**
* set memory layout by filling values in dedicated registers
*/
static SANE_Status
@@ -2867,7 +2884,7 @@ gl846_init_memory_layout (Genesys_Device * dev)
*/
#ifndef UNIT_TESTING
static
-#endif
+#endif
SANE_Status
gl846_boot (Genesys_Device * dev, SANE_Bool cold)
{
@@ -2882,7 +2899,7 @@ gl846_boot (Genesys_Device * dev, SANE_Bool cold)
RIE (sanei_genesys_write_register (dev, 0x0e, 0x01));
RIE (sanei_genesys_write_register (dev, 0x0e, 0x00));
}
-
+
if(dev->usb_mode == 1)
{
val = 0x14;
@@ -2950,7 +2967,7 @@ SANE_Status gl846_init (Genesys_Device * dev)
DBG_INIT ();
DBGSTART;
-
+
status=sanei_genesys_asic_init(dev, GENESYS_GL846_MAX_REGS);
DBGCOMPLETED;
@@ -2990,7 +3007,7 @@ gl846_update_hardware_sensors (Genesys_Scanner * s)
/** @brief search for a full width black or white strip.
* This function searches for a black or white stripe across the scanning area.
- * When searching backward, the searched area must completely be of the desired
+ * When searching backward, the searched area must completely be of the desired
* color since this area will be used for calibration which scans forward.
* @param dev scanner device
* @param forward SANE_TRUE if searching forward, SANE_FALSE if searching backward
@@ -3013,7 +3030,15 @@ gl846_search_strip (Genesys_Device * dev, SANE_Bool forward, SANE_Bool black)
DBG (DBG_proc, "gl846_search_strip %s %s\n", black ? "black" : "white",
forward ? "forward" : "reverse");
- gl846_set_fe (dev, AFE_SET);
+ status = gl846_set_fe (dev, AFE_SET);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error,
+ "gl846_search_strip: gl846_set_fe() failed: %s\n",
+ sane_strstatus(status));
+ return status;
+ }
+
status = gl846_stop_action (dev);
if (status != SANE_STATUS_GOOD)
{
@@ -3415,7 +3440,7 @@ gl846_offset_calibration (Genesys_Device * dev)
snprintf(title,20,"offset%03d.pnm",bottom);
sanei_genesys_write_pnm_file (title, first_line, bpp, channels, pixels, lines);
}
-
+
bottomavg = dark_average (first_line, pixels, lines, channels, black_pixels);
DBG (DBG_io2, "gl846_offset_calibration: bottom avg=%d\n", bottomavg);
@@ -3429,7 +3454,7 @@ gl846_offset_calibration (Genesys_Device * dev)
DBG (DBG_info, "gl846_offset_calibration: starting second line reading\n");
RIEF2 (gl846_begin_scan (dev, dev->calib_reg, SANE_TRUE), first_line, second_line);
RIEF2 (sanei_genesys_read_data_from_scanner (dev, second_line, total_size), first_line, second_line);
-
+
topavg = dark_average (second_line, pixels, lines, channels, black_pixels);
DBG (DBG_io2, "gl846_offset_calibration: top avg=%d\n", topavg);
@@ -3572,24 +3597,10 @@ gl846_coarse_gain_calibration (Genesys_Device * dev, int dpi)
max[j] = 0;
for (i = pixels/4; i < (pixels*3/4); i++)
{
- if(bpp==16)
- {
- if (dev->model->is_cis)
- val =
- line[i * 2 + j * 2 * pixels + 1] * 256 +
- line[i * 2 + j * 2 * pixels];
- else
- val =
- line[i * 2 * channels + 2 * j + 1] * 256 +
- line[i * 2 * channels + 2 * j];
- }
- else
- {
if (dev->model->is_cis)
val = line[i + j * pixels];
else
val = line[i * channels + j];
- }
max[j] += val;
}
@@ -3619,12 +3630,6 @@ gl846_coarse_gain_calibration (Genesys_Device * dev, int dpi)
dev->frontend.gain[2] = dev->frontend.gain[1] = dev->frontend.gain[0];
}
- if (channels == 1)
- {
- dev->frontend.gain[0] = dev->frontend.gain[1];
- dev->frontend.gain[2] = dev->frontend.gain[1];
- }
-
free (line);
RIE (gl846_stop_action (dev));
@@ -3691,7 +3696,8 @@ static Genesys_Command_Set gl846_cmd_set = {
NULL,
gl846_send_shading_data,
gl846_calculate_current_setup,
- gl846_boot
+ gl846_boot,
+ NULL
};
SANE_Status
diff --git a/backend/genesys_gl846.h b/backend/genesys_gl846.h
index 58e9702..d57f149 100644
--- a/backend/genesys_gl846.h
+++ b/backend/genesys_gl846.h
@@ -3,42 +3,42 @@
Copyright (C) 2012-2013 Stphane Voltz <stef.dev@free.fr>
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#include "genesys.h"
@@ -566,7 +566,7 @@ gl846_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home);
#ifndef UNIT_TESTING
static
-#endif
+#endif
SANE_Status
gl846_boot (Genesys_Device * dev, SANE_Bool cold);
@@ -696,7 +696,7 @@ static Motor_Profile gl846_motors[]={
/* Image Formula 101 */
{MOTOR_IMG101, 11000, HALF_STEP , img101_high},
{MOTOR_PLUSTEK3800, 11000, HALF_STEP , img101_high},
-
+
/* end of database entry */
{0, 0, 0, NULL},
};
diff --git a/backend/genesys_gl847.c b/backend/genesys_gl847.c
index 7c6a3c3..7c4d19c 100644
--- a/backend/genesys_gl847.c
+++ b/backend/genesys_gl847.c
@@ -1,45 +1,45 @@
/* sane - Scanner Access Now Easy.
Copyright (C) 2010-2013 Stphane Voltz <stef.dev@free.fr>
-
-
+
+
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
-
+
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#undef BACKEND_NAME
@@ -58,7 +58,7 @@
/** @brief read scanned data
* Read in 0xeff0 maximum sized blocks. This read is done in 2
- * parts if not multple of 512. First read is rounded to a multiple of 512 bytes, last read fetches the
+ * parts if not multple of 512. First read is rounded to a multiple of 512 bytes, last read fetches the
* remainder. Read addr is always 0x10000000 with the memory layout setup.
* @param dev device to read data from
* @param addr address within ASIC memory space, unused but kept for API
@@ -124,7 +124,7 @@ gl847_bulk_read_data (Genesys_Device * dev, uint8_t addr,
read /= 512;
read *= 512;
}
-
+
DBG (DBG_io2,
"gl847_bulk_read_data: trying to read %lu bytes of data\n",
(u_long) read);
@@ -176,7 +176,7 @@ gl847_bulk_read_data (Genesys_Device * dev, uint8_t addr,
}
/****************************************************************************
- Mid level functions
+ Mid level functions
****************************************************************************/
static SANE_Bool
@@ -300,7 +300,7 @@ static Sensor_Profile *get_sensor_profile(int sensor_type, int dpi)
}
else
{
- if(sensors[i].dpi>=dpi
+ if(sensors[i].dpi>=dpi
&& sensors[i].dpi<sensors[idx].dpi)
{
idx=i;
@@ -583,7 +583,7 @@ gl847_init_registers (Genesys_Device * dev)
DBGCOMPLETED;
}
-/**@brief send slope table for motor movement
+/**@brief send slope table for motor movement
* Send slope_table in machine byte order
* @param dev device to send slope table
* @param table_nr index of the slope table in ASIC memory
@@ -759,7 +759,7 @@ gl847_set_fe (Genesys_Device * dev, uint8_t set)
DBG (DBG_proc, "gl847_set_fe (%s)\n",
set == AFE_INIT ? "init" : set == AFE_SET ? "set" : set ==
AFE_POWER_SAVE ? "powersave" : "huh?");
-
+
RIE (sanei_genesys_read_register (dev, REG04, &val));
/* route to AD devices */
@@ -819,7 +819,7 @@ gl847_init_motor_regs_scan (Genesys_Device * dev,
use_fast_fed=0;
/* no fast fed since feed works well */
- if(dev->settings.yres==4444 && feed_steps>100
+ if(dev->settings.yres==4444 && feed_steps>100
&& ((flags & MOTOR_FLAG_FEED)==0))
{
use_fast_fed=1;
@@ -888,7 +888,7 @@ gl847_init_motor_regs_scan (Genesys_Device * dev,
/* correct move distance by acceleration and deceleration amounts */
feedl=feed_steps;
- if (use_fast_fed)
+ if (use_fast_fed)
{
feedl<<=fast_step_type;
dist=(scan_steps+2*fast_steps)*factor;
@@ -1045,11 +1045,11 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
"half_ccd=%d, flags=%x\n", exposure_time,
used_res, start, pixels, channels, depth, half_ccd, flags);
- /* resolution is divided according to CKSEL */
+ /* resolution is divided according to CKSEL */
r = sanei_genesys_get_address (reg, REG18);
cksel= (r->value & REG18_CKSEL)+1;
DBG (DBG_io2, "%s: cksel=%d\n", __FUNCTION__, cksel);
-
+
/* to manage high resolution device while keeping good
* low resolution scanning speed, we make hardware dpi vary */
dpihw=sanei_genesys_compute_dpihw(dev, used_res * cksel);
@@ -1064,7 +1064,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
/* start and end coordinate in optical dpi coordinates */
startx = start/cksel+dev->sensor.CCD_start_xoffset;
used_pixels=pixels/cksel;
-
+
/* end of sensor window */
endx = startx + used_pixels;
@@ -1208,7 +1208,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
{
r->value |= REG87_LEDADD;
}
- /* RGB weighting
+ /* RGB weighting
r = sanei_genesys_get_address (reg, 0x01);
r->value &= ~REG01_TRUEGRAY;
if (channels == 1 && (flags & OPTICAL_FLAG_ENABLE_LEDADD))
@@ -1253,7 +1253,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
DBG (DBG_io2, "%s: dev->len =%lu\n", __FUNCTION__, (unsigned long)dev->len);
DBG (DBG_io2, "%s: dev->dist =%lu\n", __FUNCTION__, (unsigned long)dev->dist);
DBG (DBG_io2, "%s: dev->segnb =%lu\n", __FUNCTION__, (unsigned long)dev->segnb);
-
+
words_per_line *= channels;
dev->wpl = words_per_line;
@@ -1272,7 +1272,7 @@ gl847_init_optical_regs_scan (Genesys_Device * dev,
r = sanei_genesys_get_address (reg, 0x34);
r->value = dev->sensor.dummy_pixel;
-
+
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -1407,7 +1407,7 @@ gl847_init_scan_regs (Genesys_Device * dev,
depth = 8;
}
- /* we enable true gray for cis scanners only, and just when doing
+ /* we enable true gray for cis scanners only, and just when doing
* scan since color calibration is OK for this mode
*/
oflags = 0;
@@ -1417,7 +1417,7 @@ gl847_init_scan_regs (Genesys_Device * dev,
oflags |= OPTICAL_FLAG_DISABLE_GAMMA;
if(flags & SCAN_FLAG_DISABLE_LAMP)
oflags |= OPTICAL_FLAG_DISABLE_LAMP;
-
+
if (dev->model->is_cis && dev->settings.true_gray)
{
oflags |= OPTICAL_FLAG_ENABLE_LEDADD;
@@ -1528,12 +1528,12 @@ gl847_init_scan_regs (Genesys_Device * dev,
/* theory :
target_size =
(dev->settings.pixels * dev->settings.lines * channels * depth) / 8;
- but it suffers from integer overflow so we do the following:
+ but it suffers from integer overflow so we do the following:
- 1 bit color images store color data byte-wise, eg byte 0 contains
- 8 bits of red data, byte 1 contains 8 bits of green, byte 2 contains
+ 1 bit color images store color data byte-wise, eg byte 0 contains
+ 8 bits of red data, byte 1 contains 8 bits of green, byte 2 contains
8 bits of blue.
- This does not fix the overflow, though.
+ This does not fix the overflow, though.
644mp*16 = 10gp, leading to an overflow
-- pierre
*/
@@ -1989,13 +1989,13 @@ gl847_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
}
memcpy (local_reg, dev->reg, GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
-
+
resolution=sanei_genesys_get_lowest_ydpi(dev);
-
+
/* TODO add scan_mode to the API */
scan_mode= dev->settings.scan_mode;
dev->settings.scan_mode=SCAN_MODE_LINEART;
- gl847_init_scan_regs (dev,
+ status = gl847_init_scan_regs (dev,
local_reg,
resolution,
resolution,
@@ -2009,11 +2009,20 @@ gl847_slow_back_home (Genesys_Device * dev, SANE_Bool wait_until_home)
SCAN_FLAG_DISABLE_SHADING |
SCAN_FLAG_DISABLE_GAMMA |
SCAN_FLAG_IGNORE_LINE_DISTANCE);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error,
+ "gl847_slow_back_home: failed to set up registers: %s\n",
+ sane_strstatus (status));
+ DBGCOMPLETED;
+ return status;
+ }
+
dev->settings.scan_mode=scan_mode;
/* clear scan and feed count */
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT | REG0D_CLRMCNT));
-
+
/* set up for reverse */
r = sanei_genesys_get_address (local_reg, REG02);
r->value |= REG02_MTRREV;
@@ -2173,7 +2182,7 @@ gl847_search_start_position (Genesys_Device * dev)
memcpy (dev->reg, local_reg,
GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
-/*TODO: find out where sanei_genesys_search_reference_point
+/*TODO: find out where sanei_genesys_search_reference_point
stores information, and use that correctly*/
status =
sanei_genesys_search_reference_point (dev, data, 0, dpi, pixels,
@@ -2191,7 +2200,7 @@ gl847_search_start_position (Genesys_Device * dev)
return SANE_STATUS_GOOD;
}
-/*
+/*
* sets up register for coarse gain calibration
* todo: check it for scanners using it */
static SANE_Status
@@ -2276,7 +2285,7 @@ gl847_feed (Genesys_Device * dev, unsigned int steps)
memcpy (local_reg, dev->reg, GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
resolution=sanei_genesys_get_lowest_ydpi(dev);
- gl847_init_scan_regs (dev,
+ status = gl847_init_scan_regs (dev,
local_reg,
resolution,
resolution,
@@ -2291,6 +2300,14 @@ gl847_feed (Genesys_Device * dev, unsigned int steps)
SCAN_FLAG_DISABLE_GAMMA |
SCAN_FLAG_FEEDING |
SCAN_FLAG_IGNORE_LINE_DISTANCE);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error,
+ "gl847_feed: failed to set up registers: %s\n",
+ sane_strstatus (status));
+ DBGCOMPLETED;
+ return status;
+ }
/* set exposure to zero */
sanei_genesys_set_triple(local_reg,REG_EXPR,0);
@@ -2300,11 +2317,11 @@ gl847_feed (Genesys_Device * dev, unsigned int steps)
/* clear scan and feed count */
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRLNCNT));
RIE (sanei_genesys_write_register (dev, REG0D, REG0D_CLRMCNT));
-
+
/* set up for no scan */
r = sanei_genesys_get_address (local_reg, REG01);
r->value &= ~REG01_SCAN;
-
+
/* send registers */
RIE (dev->model->cmd_set->bulk_write_register (dev, local_reg, GENESYS_GL847_MAX_REGS));
@@ -2329,7 +2346,7 @@ gl847_feed (Genesys_Device * dev, unsigned int steps)
/* then stop scanning */
RIE(gl847_stop_action (dev));
-
+
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -2356,7 +2373,7 @@ gl847_init_regs_for_shading (Genesys_Device * dev)
DBG (DBG_io, "%s: calib_lines = %d\n", __FUNCTION__, (int)dev->calib_lines);
DBG (DBG_io, "%s: calib_pixels = %d\n", __FUNCTION__, (int)dev->calib_pixels);
- /* this is aworkaround insufficent distance for slope
+ /* this is aworkaround insufficent distance for slope
* motor acceleration TODO special motor slope for shading */
move=1;
if(dev->calib_resolution<1200)
@@ -2385,7 +2402,7 @@ gl847_init_regs_for_shading (Genesys_Device * dev)
DBG (DBG_error, "%s: failed to setup scan: %s\n", __FUNCTION__, sane_strstatus (status));
return status;
}
-
+
status = dev->model->cmd_set->bulk_write_register (dev, dev->calib_reg, GENESYS_GL847_MAX_REGS);
if (status != SANE_STATUS_GOOD)
{
@@ -2442,9 +2459,9 @@ gl847_init_regs_for_scan (Genesys_Device * dev)
assumption: steps are expressed at maximum motor resolution
- we need:
- SANE_Fixed y_offset;
- SANE_Fixed y_size;
+ we need:
+ SANE_Fixed y_offset;
+ SANE_Fixed y_size;
SANE_Fixed y_offset_calib;
mm_to_steps()=motor dpi / 2.54 / 10=motor dpi / MM_PER_INCH */
@@ -2474,7 +2491,7 @@ gl847_init_regs_for_scan (Genesys_Device * dev)
}
move=500;
}
-
+
DBG (DBG_info, "gl124_init_regs_for_scan: move=%f steps\n", move);
DBG (DBG_info, "%s: move=%f steps\n", __FUNCTION__, move);
@@ -2486,7 +2503,7 @@ gl847_init_regs_for_scan (Genesys_Device * dev)
flags = 0;
/* emulated lineart from gray data is required for now */
- if(dev->settings.scan_mode == SCAN_MODE_LINEART
+ if(dev->settings.scan_mode == SCAN_MODE_LINEART
&& dev->settings.dynamic_lineart)
{
flags |= SCAN_FLAG_DYNAMIC_LINEART;
@@ -2510,7 +2527,7 @@ gl847_init_regs_for_scan (Genesys_Device * dev)
if (status != SANE_STATUS_GOOD)
return status;
-
+
DBGCOMPLETED;
return SANE_STATUS_GOOD;
}
@@ -2533,7 +2550,7 @@ gl847_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
DBGSTART;
DBG( DBG_io2, "%s: writing %d bytes of shading data\n",__FUNCTION__,size);
- /* shading data is plit in 3 (up to 5 with IR) areas
+ /* shading data is plit in 3 (up to 5 with IR) areas
write(0x10014000,0x00000dd8)
URB 23429 bulk_out len 3544 wrote 0x33 0x10 0x....
write(0x1003e000,0x00000dd8)
@@ -2563,14 +2580,14 @@ gl847_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
fprintf(dev->binary,"P5\n%d %d\n%d\n",(endpixel-strpixel)/factor*channels,lines/channels,255);
}
}
-
+
pixels=endpixel-strpixel;
/* since we're using SHDAREA, substract startx coordinate from shading */
strpixel-=((dev->sensor.CCD_start_xoffset*600)/dev->sensor.optical_res);
-
+
/* turn pixel value into bytes 2x16 bits words */
- strpixel*=2*2;
+ strpixel*=2*2;
pixels*=2*2;
/* allocate temporary buffer */
@@ -2599,7 +2616,7 @@ gl847_send_shading_data (Genesys_Device * dev, uint8_t * data, int size)
ptr[1]=src[1];
ptr[2]=src[2];
ptr[3]=src[3];
-
+
/* next shading coefficient */
ptr+=4;
}
@@ -2661,7 +2678,7 @@ gl847_led_calibration (Genesys_Device * dev)
used_res=sanei_genesys_compute_dpihw(dev,dev->settings.xres);
sensor=get_sensor_profile(dev->model->ccd_type, used_res);
num_pixels = (dev->sensor.sensor_pixels*used_res)/dev->sensor.optical_res;
-
+
/* initial calibration reg values */
memcpy (dev->calib_reg, dev->reg, GENESYS_GL847_MAX_REGS * sizeof (Genesys_Register_Set));
@@ -2791,18 +2808,18 @@ gl847_led_calibration (Genesys_Device * dev)
/* cleanup before return */
free (line);
-
+
/* go back home */
if(move>20)
{
status=gl847_slow_back_home (dev, SANE_TRUE);
}
-
+
DBGCOMPLETED;
return status;
}
-/**
+/**
* set up GPIO/GPOE for idle state
*/
static SANE_Status
@@ -2826,10 +2843,10 @@ gl847_init_gpio (Genesys_Device * dev)
RIE (sanei_genesys_write_register (dev, REGA7, gpios[idx].ra7));
RIE (sanei_genesys_write_register (dev, REGA6, gpios[idx].ra6));
-
+
RIE (sanei_genesys_write_register (dev, REG6E, gpios[idx].r6e));
RIE (sanei_genesys_write_register (dev, REG6C, 0x00));
-
+
RIE (sanei_genesys_write_register (dev, REG6B, gpios[idx].r6b));
RIE (sanei_genesys_write_register (dev, REG6C, gpios[idx].r6c));
RIE (sanei_genesys_write_register (dev, REG6D, gpios[idx].r6d));
@@ -2843,7 +2860,7 @@ gl847_init_gpio (Genesys_Device * dev)
return status;
}
-/**
+/**
* set memory layout by filling values in dedicated registers
*/
static SANE_Status
@@ -3004,7 +3021,7 @@ SANE_Status gl847_init (Genesys_Device * dev)
DBG_INIT ();
DBGSTART;
-
+
status=sanei_genesys_asic_init(dev, GENESYS_GL847_MAX_REGS);
DBGCOMPLETED;
@@ -3050,7 +3067,7 @@ gl847_update_hardware_sensors (Genesys_Scanner * s)
/** @brief search for a full width black or white strip.
* This function searches for a black or white stripe across the scanning area.
- * When searching backward, the searched area must completely be of the desired
+ * When searching backward, the searched area must completely be of the desired
* color since this area will be used for calibration which scans forward.
* @param dev scanner device
* @param forward SANE_TRUE if searching forward, SANE_FALSE if searching backward
@@ -3476,7 +3493,7 @@ gl847_offset_calibration (Genesys_Device * dev)
snprintf(title,20,"offset%03d.pnm",bottom);
sanei_genesys_write_pnm_file (title, first_line, bpp, channels, pixels, lines);
}
-
+
bottomavg = dark_average (first_line, pixels, lines, channels, black_pixels);
DBG (DBG_io2, "gl847_offset_calibration: bottom avg=%d\n", bottomavg);
@@ -3490,7 +3507,7 @@ gl847_offset_calibration (Genesys_Device * dev)
DBG (DBG_info, "gl847_offset_calibration: starting second line reading\n");
RIEF2 (gl847_begin_scan (dev, dev->calib_reg, SANE_TRUE),first_line, second_line);
RIEF2 (sanei_genesys_read_data_from_scanner (dev, second_line, total_size),first_line, second_line);
-
+
topavg = dark_average (second_line, pixels, lines, channels, black_pixels);
DBG (DBG_io2, "gl847_offset_calibration: top avg=%d\n", topavg);
@@ -3752,7 +3769,8 @@ static Genesys_Command_Set gl847_cmd_set = {
NULL,
gl847_send_shading_data,
gl847_calculate_current_setup,
- gl847_boot
+ gl847_boot,
+ NULL
};
SANE_Status
diff --git a/backend/genesys_gl847.h b/backend/genesys_gl847.h
index d787f43..9901e23 100644
--- a/backend/genesys_gl847.h
+++ b/backend/genesys_gl847.h
@@ -3,42 +3,42 @@
Copyright (C) 2010-2013 Stphane Voltz <stef.dev@free.fr>
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#include "genesys.h"
@@ -653,7 +653,7 @@ static uint32_t lide200_high[] = { 31680, 31680, 31680, 31680, 31680, 31680, 316
static uint32_t lide700_medium[] = { 46876,2342,2342,2342,2342,2342,2342,2342,2342,2302,2286,2274,2266,2258,2252,2244,2240,2234,2228,2224,2218,2216,2210,2208,2202,2200,2194,2192,2190,2186,2182,2180,2176,2174,2172,2170,2166,2162,2160,2156,2154,2152,2150,2150,2146,2144,2142,2140,2136,2134,2132,2130,2130,2128,2124,2122,2120,2120,2118,2116,2112,2112,2110,2108,2106,2106,2104,2102,2102,2098,2096,2094,2094,2092,2090,2090,2086,2084,2084,2082,2082,2080,2078,2078,2076,2074,2074,2070,2070,2068,2066,2066,2064,2064,2062,2062,2060,2058,2058,2054,2054,2052,2052,2050,2050,2048,2048,2046,2046,2044,2042,2042,2040,2040,2038,2038,2034,2034,2032,2032,2030,2030,2028,2028,2026,2026,2022,2022};
static uint32_t lide700_high[] = { 46876,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864,15864};
/* 5190 trop
- * 5186 pas assez
+ * 5186 pas assez
*/
/*
static uint32_t lide200_max[] = { 124992, 124992, 124992, 124992, 124992, 124992, 124992, 124992, 124992, 124992, 124992, 124992, 124992, 124992, 124992, 124992, 124992, 2219,2212,2205,2198,2190,2183,2176,2168,2161,2154,2146,2139,2132,2125,2117,2110,2103,2095,2088,2081,2073,2066,2059,2052,2044,2037,2030,2022,2015,2008,2001,1993,1986,1979,1971,1964,1957,1949,1942,1935,1928,1920,1913,1906,1898,1891,1884,1876,1869,1862,1855,1847,1840,1833,1825,1818,1811,1803,1796,1789,1782,1774,1767,1760,1752,1745,1738,1731,1723,1716,1709,1701,1694,1687,1679,1672,1665,1658,1650,1643,1636,1628,1621,1614,1606,1599,1592,1585,1577,1570,1563,1555,1548,1541,1533,1526,1519,1512,1504,1497,1490,1482,1475,1468,1461,1453,1446,1439,1431,1424,1417,1409,1402,1395,1388,1380,1373,1366,1358,1351,1344,1336,1329,1322,1315,1307,1300,1293,1285,1278,1271,1263,1256,1249,1242,1234,1227,1220,1212,1205,1198,1191,1183,1176,1169,1161,1154,1147,1139,1132,1125,1118,1110,1103,1096,1088,1081,1074,1066,1059,1052,1045,1037,1030,1023,1015,1008,1001,993,986,979,972,964,957,950,942,935,928,921,913,906,899,891,884,877,869,862,855,848,840,833,826,818,811,804,796,789,782,775,767,760,753,745,738,731,723,716,709,702,694,687,680,672,665,658,651,643,636,629,621,614,607,599,592,585,578,570,563,556,534,534, 0};
@@ -671,7 +671,7 @@ static Motor_Profile gl847_motors[]={
{MOTOR_CANONLIDE100, 1432, HALF_STEP , lide200_base},
{MOTOR_CANONLIDE100, 2712, QUARTER_STEP, lide200_medium},
{MOTOR_CANONLIDE100, 5280, EIGHTH_STEP , lide200_high},
-
+
/* LiDE 200 */
{MOTOR_CANONLIDE200, 2848, HALF_STEP , lide200_base},
{MOTOR_CANONLIDE200, 1424, HALF_STEP , lide200_base},
diff --git a/backend/genesys_low.c b/backend/genesys_low.c
index 62563ae..f28b72c 100644
--- a/backend/genesys_low.c
+++ b/backend/genesys_low.c
@@ -1,45 +1,45 @@
/* sane - Scanner Access Now Easy.
Copyright (C) 2010-2013 Stphane Voltz <stef.dev@free.fr>
-
-
+
+
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
-
+
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#undef BACKEND_NAME
#define BACKEND_NAME genesys_low
@@ -261,7 +261,7 @@ sanei_genesys_read_hregister (Genesys_Device * dev, uint16_t reg, uint8_t * val)
/**
* Write to one GL847 ASIC register
-URB 10 control 0x40 0x04 0x83 0x00 len 2 wrote 0xa6 0x04
+URB 10 control 0x40 0x04 0x83 0x00 len 2 wrote 0xa6 0x04
*/
static SANE_Status
sanei_genesys_write_gl847_register (Genesys_Device * dev, uint8_t reg, uint8_t val)
@@ -310,8 +310,8 @@ sanei_genesys_write_register (Genesys_Device * dev, uint16_t reg, uint8_t val)
/* route to gl847 function if needed */
if(dev->model->asic_type==GENESYS_GL847
- || dev->model->asic_type==GENESYS_GL845
- || dev->model->asic_type==GENESYS_GL846
+ || dev->model->asic_type==GENESYS_GL845
+ || dev->model->asic_type==GENESYS_GL846
|| dev->model->asic_type==GENESYS_GL124)
{
return sanei_genesys_write_gl847_register(dev, reg, val);
@@ -346,7 +346,7 @@ sanei_genesys_write_register (Genesys_Device * dev, uint16_t reg, uint8_t val)
return status;
}
-/**
+/**
* @brief write command to 0x8c endpoint
* Write a value to 0x8c end point (end access), for USB firmware related operations
* Known values are 0x0f, 0x11 for USB 2.0 data transfer and 0x0f,0x14 for USB1.1
@@ -475,10 +475,10 @@ SANE_Status
sanei_genesys_set_buffer_address (Genesys_Device * dev, uint32_t addr)
{
SANE_Status status;
-
+
if(dev->model->asic_type==GENESYS_GL847
- || dev->model->asic_type==GENESYS_GL845
- || dev->model->asic_type==GENESYS_GL846
+ || dev->model->asic_type==GENESYS_GL845
+ || dev->model->asic_type==GENESYS_GL846
|| dev->model->asic_type==GENESYS_GL124)
{
DBG (DBG_warn,
@@ -943,13 +943,18 @@ sanei_genesys_get_triple(Genesys_Register_Set *regs, uint16_t addr, uint32_t *va
return SANE_STATUS_GOOD;
}
-/* Checks if the scan buffer is empty */
+/** @brief Check if the scanner's internal data buffer is empty
+ * @param *dev device to test for data
+ * @param *empty return value
+ * @return empty will be set to SANE_TRUE if there is no scanned data.
+ **/
SANE_Status
sanei_genesys_test_buffer_empty (Genesys_Device * dev, SANE_Bool * empty)
{
uint8_t val = 0;
SANE_Status status;
+ usleep(1000);
status = sanei_genesys_get_status (dev, &val);
if (status != SANE_STATUS_GOOD)
{
@@ -961,6 +966,10 @@ sanei_genesys_test_buffer_empty (Genesys_Device * dev, SANE_Bool * empty)
if (dev->model->cmd_set->test_buffer_empty_bit (val))
{
+ /* fix timing issue on USB3 (or just may be too fast) hardware
+ * spotted by John S. Weber <jweber53@gmail.com>
+ */
+ usleep(1000);
DBG (DBG_io2, "sanei_genesys_test_buffer_empty: buffer is empty\n");
*empty = SANE_TRUE;
return SANE_STATUS_GOOD;
@@ -1210,7 +1219,7 @@ SANE_Status sanei_genesys_generate_gamma_buffer(Genesys_Device * dev,
max,
dev->settings.contrast,
dev->settings.brightness);
- for (i = 0; i < size-1; i++)
+ for (i = 0; i < size; i++)
{
value=dev->sensor.gamma_table[GENESYS_RED][i];
value=lut[value];
@@ -1230,7 +1239,7 @@ SANE_Status sanei_genesys_generate_gamma_buffer(Genesys_Device * dev,
}
else
{
- for (i = 0; i < size-1; i++)
+ for (i = 0; i < size; i++)
{
value=dev->sensor.gamma_table[GENESYS_RED][i];
gamma[i * 2 + size * 0 + 0] = value & 0xff;
@@ -1258,7 +1267,7 @@ SANE_Status sanei_genesys_generate_gamma_buffer(Genesys_Device * dev,
/** @brief send gamma table to scanner
* This function sends generic gamma table (ie ones built with
- * provided gamma) or the user defined one if provided by
+ * provided gamma) or the user defined one if provided by
* fontend. Used by gl846+ ASICs
* @param dev device to write to
*/
@@ -1317,10 +1326,14 @@ sanei_genesys_send_gamma_table (Genesys_Device * dev)
}
/** @brief initialize device
- * initialize backend and ASIC : registers, motor tables, and gamma tables
- * then ensure scanner's head is at home. Designed for gl846+ ASICs
+ * Initialize backend and ASIC : registers, motor tables, and gamma tables
+ * then ensure scanner's head is at home. Designed for gl846+ ASICs.
+ * Detects cold boot (ie first boot since device plugged) in this case
+ * an extensice setup up is done at hardware level.
+ *
* @param dev device to initialize
* @param max_regs umber of maximum used registers
+ * @return SANE_STATUS_GOOD in case of success
*/
SANE_Status
sanei_genesys_asic_init (Genesys_Device * dev, int max_regs)
@@ -1328,7 +1341,8 @@ sanei_genesys_asic_init (Genesys_Device * dev, int max_regs)
SANE_Status status;
uint8_t val;
SANE_Bool cold = SANE_TRUE;
- int size, i;
+ int size; /**< size of the device's gamma table */
+ int i;
DBGSTART;
@@ -1354,7 +1368,26 @@ sanei_genesys_asic_init (Genesys_Device * dev, int max_regs)
}
}
- /* check if the device has already been initialized and powered up
+ /* setup gamma tables */
+ size = 256;
+ for(i=0;i<3;i++)
+ {
+ FREE_IFNOT_NULL (dev->sensor.gamma_table[i]);
+ dev->sensor.gamma_table[i] = (uint16_t *) malloc (2 * size);
+ if (dev->sensor.gamma_table[i] == NULL)
+ {
+ DBG (DBG_error, "%s: could not allocate memory for gamma table %d\n",
+ __FUNCTION__, i);
+ return SANE_STATUS_NO_MEM;
+ }
+ sanei_genesys_create_gamma_table (dev->sensor.gamma_table[i],
+ size,
+ 65535,
+ 65535,
+ dev->sensor.gamma[i]);
+ }
+
+ /* check if the device has already been initialized and powered up
* we read register 6 and check PWRBIT, if reset scanner has been
* freshly powered up. This bit will be set to later so that following
* reads can detect power down/up cycle*/
@@ -1380,9 +1413,6 @@ sanei_genesys_asic_init (Genesys_Device * dev, int max_regs)
/* now hardware part is OK, set up device struct */
FREE_IFNOT_NULL (dev->white_average_data);
FREE_IFNOT_NULL (dev->dark_average_data);
- FREE_IFNOT_NULL (dev->sensor.gamma_table[0]);
- FREE_IFNOT_NULL (dev->sensor.gamma_table[1]);
- FREE_IFNOT_NULL (dev->sensor.gamma_table[2]);
dev->settings.color_filter = 0;
@@ -1392,28 +1422,6 @@ sanei_genesys_asic_init (Genesys_Device * dev, int max_regs)
/* Set analog frontend */
RIE (dev->model->cmd_set->set_fe (dev, AFE_INIT));
- /* init gamma tables */
- size = 256;
-
- for(i=0;i<3;i++)
- {
- if (dev->sensor.gamma_table[i] == NULL)
- {
- dev->sensor.gamma_table[i] = (uint16_t *) malloc (2 * size);
- if (dev->sensor.gamma_table[i] == NULL)
- {
- DBG (DBG_error, "%s: could not allocate memory for gamma table %d\n",
- __FUNCTION__, i);
- return SANE_STATUS_NO_MEM;
- }
- sanei_genesys_create_gamma_table (dev->sensor.gamma_table[i],
- size,
- 65535,
- 65535,
- dev->sensor.gamma[i]);
- }
- }
-
dev->oe_buffer.buffer = NULL;
dev->already_initialized = SANE_TRUE;
@@ -1429,7 +1437,7 @@ sanei_genesys_asic_init (Genesys_Device * dev, int max_regs)
}
/**
- * Wait for the scanning head to park
+ * Wait for the scanning head to park
*/
SANE_Status
sanei_genesys_wait_for_home (Genesys_Device * dev)
@@ -1437,6 +1445,7 @@ sanei_genesys_wait_for_home (Genesys_Device * dev)
SANE_Status status;
uint8_t val;
int loop;
+ int max=300;
DBGSTART;
@@ -1492,7 +1501,14 @@ sanei_genesys_wait_for_home (Genesys_Device * dev)
}
++loop;
}
- while (loop < 300 && !(val & HOMESNR) && status == SANE_STATUS_GOOD);
+ while (loop < max && !(val & HOMESNR) && status == SANE_STATUS_GOOD);
+
+ /* if after the timeout, head is still not parked, error out */
+ if(loop >= max && !(val & HOMESNR) && status == SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "%s: failed to reach park position %ds\n", __FUNCTION__, max/10);
+ return SANE_STATUS_IO_ERROR;
+ }
DBGCOMPLETED;
return status;
@@ -1638,8 +1654,8 @@ Motor_Profile *profile;
/* required speed */
target=((exposure * dpi) / base_dpi)>>step_type;
- DBG (DBG_io2, "%s: target=%d\n", __FUNCTION__, target);
-
+ DBG (DBG_io2, "%s: exposure=%d, dpi=%d, target=%d\n", __FUNCTION__, exposure, dpi, target);
+
/* fill result with target speed */
for(i=0;i<SLOPE_TABLE_SIZE;i++)
slope[i]=target;
@@ -1650,7 +1666,7 @@ Motor_Profile *profile;
i=0;
sum=0;
- /* first step is used unmodified */
+ /* first step is always used unmodified */
current=profile->table[0];
/* loop on profile copying and apply step type */
@@ -1662,6 +1678,14 @@ Motor_Profile *profile;
current=profile->table[i]>>step_type;
}
+ /* ensure last step is required speed in case profile doesn't contain it */
+ if(current!=0 && current<target)
+ {
+ slope[i]=target;
+ sum+=slope[i];
+ i++;
+ }
+
/* range checking */
if(profile->table[i]==0 && DBG_LEVEL >= DBG_warn && current>target)
{
@@ -1747,7 +1771,11 @@ int sanei_genesys_get_lowest_dpi(Genesys_Device *dev)
/** @brief check is a cache entry may be used
* Compares current settings with the cache entry and return
* SANE_TRUE if they are compatible.
- */
+ * A calibration cache is compatible if color mode and x dpi match the user
+ * requested scan. In the case of CIS scanners, dpi isn't a criteria.
+ * flatbed cache entries are considred too old and then expires if they
+ * are older than the expiration time option, forcing calibration at least once
+ * then given time. */
SANE_Status
sanei_genesys_is_compatible_calibration (Genesys_Device * dev,
Genesys_Calibration_Cache * cache,
@@ -1760,27 +1788,25 @@ sanei_genesys_is_compatible_calibration (Genesys_Device * dev,
SANE_Status status;
DBGSTART;
-
+
if(dev->model->cmd_set->calculate_current_setup==NULL)
{
- DBG (DBG_proc,
- "sanei_genesys_is_compatible_calibration: no calculate_setup, non compatible cache\n");
+ DBG (DBG_proc, "%s: no calculate_setup, non compatible cache\n", __FUNCTION__);
return SANE_STATUS_UNSUPPORTED;
}
status = dev->model->cmd_set->calculate_current_setup (dev);
if (status != SANE_STATUS_GOOD)
{
- DBG (DBG_error,
- "sanei_genesys_is_compatible_calibration: failed to calculate current setup: %s\n",
+ DBG (DBG_error, "%s: failed to calculate current setup: %s\n", __FUNCTION__,
sane_strstatus (status));
return status;
}
dev->current_setup.scan_method = dev->settings.scan_method;
- DBG (DBG_proc, "sanei_genesys_is_compatible_calibration: checking\n");
-
- /* a calibration cache is compatible if color mode and x dpi match the user
+ DBG (DBG_proc, "%s: checking\n", __FUNCTION__);
+
+ /* a calibration cache is compatible if color mode and x dpi match the user
* requested scan. In the case of CIS scanners, dpi isn't a criteria */
if (dev->model->is_cis == SANE_FALSE)
{
@@ -1796,39 +1822,36 @@ sanei_genesys_is_compatible_calibration (Genesys_Device * dev,
resolution=sanei_genesys_compute_dpihw(dev,dev->settings.xres);
compatible = (resolution == ((int) sanei_genesys_compute_dpihw(dev,cache->used_setup.xres)));
}
+ DBG (DBG_io, "%s: after resolution check current compatible=%d\n", __FUNCTION__, compatible);
if (dev->current_setup.half_ccd != cache->used_setup.half_ccd)
{
- DBG (DBG_io,
- "sanei_genesys_is_compatible_calibration: half_ccd=%d, used=%d\n",
+ DBG (DBG_io, "%s: half_ccd=%d, used=%d\n", __FUNCTION__,
dev->current_setup.half_ccd, cache->used_setup.half_ccd);
compatible = 0;
}
if (dev->current_setup.scan_method != cache->used_setup.scan_method)
{
- DBG (DBG_io,
- "sanei_genesys_is_compatible_calibration: current method=%d, used=%d\n",
+ DBG (DBG_io, "%s: current method=%d, used=%d\n", __FUNCTION__,
dev->current_setup.scan_method, cache->used_setup.scan_method);
compatible = 0;
}
if (!compatible)
{
- DBG (DBG_proc,
- "sanei_genesys_is_compatible_calibration: completed, non compatible cache\n");
+ DBG (DBG_proc, "%s: completed, non compatible cache\n", __FUNCTION__);
return SANE_STATUS_UNSUPPORTED;
}
- /* a cache entry expires after 60 minutes for non sheetfed scanners */
+ /* a cache entry expires after afetr expiration time for non sheetfed scanners */
/* this is not taken into account when overwriting cache entries */
#ifdef HAVE_SYS_TIME_H
- if(for_overwrite == SANE_FALSE)
+ if(for_overwrite == SANE_FALSE && dev->settings.expiration_time >=0)
{
gettimeofday (&time, NULL);
- if ((time.tv_sec - cache->last_calibration > 60 * 60)
+ if ((time.tv_sec - cache->last_calibration > dev->settings.expiration_time*60)
&& (dev->model->is_sheetfed == SANE_FALSE)
&& (dev->settings.scan_method == SCAN_METHOD_FLATBED))
{
- DBG (DBG_proc,
- "sanei_genesys_is_compatible_calibration: expired entry, non compatible cache\n");
+ DBG (DBG_proc, "%s: expired entry, non compatible cache\n", __FUNCTION__);
return SANE_STATUS_UNSUPPORTED;
}
}
diff --git a/backend/genesys_low.h b/backend/genesys_low.h
index 1d5ef22..b5a0a8f 100644
--- a/backend/genesys_low.h
+++ b/backend/genesys_low.h
@@ -8,44 +8,44 @@
Copyright (C) 2006 Laurent Charpentier <laurent_pubs@yahoo.com>
Parts of the structs have been taken from the gt68xx backend by
Sergey Vlasov <vsu@altlinux.ru> et al.
-
+
This file is part of the SANE package.
-
+
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
-
+
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
-
+
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
-
+
As a special exception, the authors of SANE give permission for
additional uses of the libraries contained in this release of SANE.
-
+
The exception is that, if you link a SANE library with other files
to produce an executable, this does not by itself cause the
resulting executable to be covered by the GNU General Public
License. Your use of that executable is in no way restricted on
account of linking the SANE library code into it.
-
+
This exception does not, however, invalidate any other reasons why
the executable file might be covered by the GNU General Public
License.
-
+
If you submit changes to SANE to the maintainers to be included in
a subsequent release, you agree by submitting the changes that
those changes may be distributed with this exception intact.
-
+
If you write modifications of your own for SANE, it is your choice
whether to permit this exception to apply to your modifications.
- If you do not wish that, delete this exception notice.
+ If you do not wish that, delete this exception notice.
*/
#ifndef GENESYS_LOW_H
@@ -67,7 +67,7 @@
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
-#ifdef HAVE_MKDIR
+#ifdef HAVE_MKDIR
#include <sys/stat.h>
#include <sys/types.h>
#endif
@@ -81,6 +81,12 @@
#include "../include/_stdint.h"
+#ifndef UNIT_TESTING
+#define GENESYS_STATIC static
+#else
+#define GENESYS_STATIC
+#endif
+
#define DBG_error0 0 /* errors/warnings printed even with devuglevel 0 */
#define DBG_error 1 /* fatal errors */
#define DBG_init 2 /* initialization and scanning time messages */
@@ -140,11 +146,11 @@
#define GENESYS_FLAG_SKIP_WARMUP (1 << 4) /**< skip genesys_warmup() */
/** @brief offset calibration flag
* signals that the scanner does offset calibration. In this case off_calibration() and
- * coarse_gain_calibration() functions must be implemented
+ * coarse_gain_calibration() functions must be implemented
*/
#define GENESYS_FLAG_OFFSET_CALIBRATION (1 << 5)
#define GENESYS_FLAG_SEARCH_START (1 << 6) /**< do start search before scanning */
-#define GENESYS_FLAG_REPARK (1 << 7) /**< repark head (and check for lock) by
+#define GENESYS_FLAG_REPARK (1 << 7) /**< repark head (and check for lock) by
moving without scanning */
#define GENESYS_FLAG_DARK_CALIBRATION (1 << 8) /**< do dark calibration */
#define GENESYS_FLAG_STAGGERED_LINE (1 << 9) /**< pixel columns are shifted vertically for hi-res modes */
@@ -286,8 +292,8 @@ typedef struct
SANE_Int maximum_speed; /* maximum speed allowed. Unit: pixeltime/step */
SANE_Int minimum_steps; /* number of steps used for default curve */
float g; /* power for non-linear acceleration curves. */
-/* vs*(1-i^g)+ve*(i^g) where
- vs = start speed, ve = end speed,
+/* vs*(1-i^g)+ve*(i^g) where
+ vs = start speed, ve = end speed,
i = 0.0 for first entry and i = 1.0 for last entry in default table*/
} Genesys_Motor_Slope;
@@ -310,7 +316,6 @@ typedef enum Genesys_Color_Order
Genesys_Color_Order;
-#define MAX_SCANNERS 50
#define MAX_RESOLUTIONS 13
#define MAX_DPI 4
@@ -346,6 +351,7 @@ Genesys_Color_Order;
#define DAC_CS8400F 17
#define DAC_IMG101 18
#define DAC_PLUSTEK3800 19
+#define DAC_CANONLIDE80 20
#define CCD_UMAX 0
#define CCD_ST12 1 /* SONY ILX548: 5340 Pixel ??? */
@@ -375,6 +381,9 @@ Genesys_Color_Order;
#define CCD_IMG101 25
#define CCD_PLUSTEK3800 26
#define CIS_CANONLIDE210 27
+#define CIS_CANONLIDE80 28
+#define CIS_CANONLIDE220 29
+#define CIS_CANONLIDE120 30
#define GPO_UMAX 0
#define GPO_ST12 1
@@ -400,6 +409,7 @@ Genesys_Color_Order;
#define GPO_CS8400F 21
#define GPO_IMG101 22
#define GPO_PLUSTEK3800 23
+#define GPO_CANONLIDE80 24
#define MOTOR_UMAX 0
#define MOTOR_5345 1
@@ -424,6 +434,7 @@ Genesys_Color_Order;
#define MOTOR_IMG101 21
#define MOTOR_PLUSTEK3800 22
#define MOTOR_CANONLIDE210 23
+#define MOTOR_CANONLIDE80 24
/* Forward typedefs */
@@ -474,8 +485,8 @@ typedef struct Genesys_Command_Set
SANE_Status (*save_power) (Genesys_Device * dev, SANE_Bool enable);
void (*set_motor_power) (Genesys_Register_Set * regs, SANE_Bool set);
- void (*set_lamp_power) (Genesys_Device * dev,
- Genesys_Register_Set * regs,
+ void (*set_lamp_power) (Genesys_Device * dev,
+ Genesys_Register_Set * regs,
SANE_Bool set);
SANE_Status (*begin_scan) (Genesys_Device * dev,
@@ -499,9 +510,9 @@ typedef struct Genesys_Command_Set
SANE_Bool wait_until_home);
SANE_Status (*bulk_write_register) (Genesys_Device * dev,
- Genesys_Register_Set * reg,
+ Genesys_Register_Set * reg,
size_t elems);
- SANE_Status (*bulk_write_data) (Genesys_Device * dev, uint8_t addr,
+ SANE_Status (*bulk_write_data) (Genesys_Device * dev, uint8_t addr,
uint8_t * data, size_t len);
SANE_Status (*bulk_read_data) (Genesys_Device * dev, uint8_t addr,
@@ -511,7 +522,7 @@ typedef struct Genesys_Command_Set
If possible, just get information for given option.
The sensor state in Genesys_Scanner.val[] should be merged with the
new sensor state, using the information that was last read by the frontend
- in Genesys_Scanner.last_val[], in such a way that a button up/down
+ in Genesys_Scanner.last_val[], in such a way that a button up/down
relative to Genesys_Scanner.last_val[] is not lost.
*/
SANE_Status (*update_hardware_sensors) (struct Genesys_Scanner * s);
@@ -532,7 +543,7 @@ typedef struct Genesys_Command_Set
*/
SANE_Status (*eject_document) (Genesys_Device * dev);
/**
- * search for an black or white area in forward or reverse
+ * search for an black or white area in forward or reverse
* direction */
SANE_Status (*search_strip) (Genesys_Device * dev, SANE_Bool forward, SANE_Bool black);
@@ -562,6 +573,24 @@ typedef struct Genesys_Command_Set
*/
SANE_Status (*asic_boot) (Genesys_Device * dev, SANE_Bool cold);
+ /**
+ * Scan register setting interface
+ */
+ SANE_Status (*init_scan_regs) (Genesys_Device * dev,
+ Genesys_Register_Set * reg,
+ float xres,
+ float yres,
+ float startx,
+ float starty,
+ float pixels,
+ float lines,
+ unsigned int depth,
+ unsigned int channels,
+ int scan_method,
+ int scan_mode,
+ int color_filter,
+ unsigned int flags);
+
} Genesys_Command_Set;
/** @brief structure to describe a scanner model
@@ -583,7 +612,7 @@ typedef struct Genesys_Model
SANE_Int bpp_color_values[MAX_DPI]; /* possible depths in color mode */
SANE_Fixed x_offset; /* Start of scan area in mm */
- SANE_Fixed y_offset; /* Start of scan area in mm (Amount of
+ SANE_Fixed y_offset; /* Start of scan area in mm (Amount of
feeding needed to get to the medium) */
SANE_Fixed x_size; /* Size of scan area in mm */
SANE_Fixed y_size; /* Size of scan area in mm */
@@ -600,7 +629,7 @@ typedef struct Genesys_Model
SANE_Fixed post_scan; /* Size of scan area after paper sensor stops
sensing document in mm */
- SANE_Fixed eject_feed; /* Amount of feeding needed to eject document
+ SANE_Fixed eject_feed; /* Amount of feeding needed to eject document
after finishing scanning in mm */
/* Line-distance correction (in pixel at optical_ydpi) for CCD scanners */
@@ -654,7 +683,7 @@ typedef struct
unsigned int color_filter;
/**< true if scan is true gray, false if monochrome scan */
- int true_gray;
+ int true_gray;
/**< lineart threshold */
int threshold;
@@ -678,6 +707,9 @@ typedef struct
/**< value for brightness enhancement in the [-100..100] range */
int brightness;
+
+ /**< cahe entries expiration time */
+ int expiration_time;
} Genesys_Settings;
typedef struct Genesys_Current_Setup
@@ -691,7 +723,7 @@ typedef struct Genesys_Current_Setup
float xres; /* used xres */
float yres; /* used yres*/
SANE_Bool half_ccd; /* half ccd mode */
- SANE_Int stagger;
+ SANE_Int stagger;
SANE_Int max_shift; /* max shift of any ccd component, including staggered pixels*/
} Genesys_Current_Setup;
@@ -780,7 +812,7 @@ struct Genesys_Device
size_t wpl; /**< asic's word per line */
Genesys_Current_Setup current_setup; /* contains the real used values */
-
+
/**< look up table used in dynamic rasterization */
unsigned char lineart_lut[256];
@@ -850,7 +882,7 @@ typedef struct {
#define SCAN_FLAG_CALIBRATION 0x100
#define SCAN_FLAG_FEEDING 0x200
#define SCAN_FLAG_USE_XPA 0x400
-
+#define SCAN_FLAG_ENABLE_LEDADD 0x800
#define MOTOR_FLAG_AUTO_GO_HOME 0x01
#define MOTOR_FLAG_DISABLE_BUFFER_FULL_MOVE 0x02
#define MOTOR_FLAG_FEED 0x04
@@ -995,7 +1027,7 @@ extern void
sanei_genesys_create_gamma_table (uint16_t * gamma_table, int size,
float maximum, float gamma_max,
float gamma);
-
+
extern SANE_Status sanei_genesys_send_gamma_table (Genesys_Device * dev);
extern SANE_Status sanei_genesys_start_motor (Genesys_Device * dev);
@@ -1054,7 +1086,7 @@ sanei_genesys_wait_for_home(Genesys_Device *dev);
extern SANE_Status
sanei_genesys_asic_init(Genesys_Device *dev, SANE_Bool cold);
-extern
+extern
int sanei_genesys_compute_dpihw(Genesys_Device *dev, int xres);
extern
@@ -1173,7 +1205,7 @@ compute_planar_coefficients (Genesys_Device * dev,
unsigned int channels,
unsigned int cmat[3],
unsigned int offset,
- unsigned int coeff,
+ unsigned int coeff,
unsigned int target);
void
@@ -1190,6 +1222,10 @@ compute_shifted_coefficients (Genesys_Device * dev,
SANE_Status
probe_genesys_devices (void);
+
+SANE_Status genesys_flatbed_calibration (Genesys_Device *dev);
+
+SANE_Status genesys_send_shading_coefficient (Genesys_Device *dev);
#endif
diff --git a/backend/hp3900_debug.c b/backend/hp3900_debug.c
index 18f6136..eb7d45c 100644
--- a/backend/hp3900_debug.c
+++ b/backend/hp3900_debug.c
@@ -597,7 +597,7 @@ dbg_tiff_save (char *sFile, SANE_Int width, SANE_Int height, SANE_Int depth,
}
else
DBG (DBG_ERR,
- "- dbg_tiff_save: Enviroment HOME variable does not exist\n");
+ "- dbg_tiff_save: Environment HOME variable does not exist\n");
}
#else
/* silent gcc */
diff --git a/backend/hp3900_sane.c b/backend/hp3900_sane.c
index a1c381c..b815572 100644
--- a/backend/hp3900_sane.c
+++ b/backend/hp3900_sane.c
@@ -1405,7 +1405,7 @@ options_init (TScanner * scanner)
pDesc->title = SANE_I18N ("Scanner model");
pDesc->desc =
SANE_I18N
- ("Allows to test device behaviour with other supported models");
+ ("Allows one to test device behaviour with other supported models");
pDesc->type = SANE_TYPE_STRING;
pDesc->size = max_string_size (scanner->list_models);
pDesc->constraint_type = SANE_CONSTRAINT_STRING_LIST;
diff --git a/backend/hp5590.c b/backend/hp5590.c
index 8db3d5e..7b1cd60 100644
--- a/backend/hp5590.c
+++ b/backend/hp5590.c
@@ -1239,6 +1239,14 @@ convert_to_rgb (struct hp5590_scanner *scanner, SANE_Byte *data, SANE_Int size)
buf[i*6+5] = ptr[2*i+bytes_per_color*2];
}
}
+
+ /* Invert pixels in case of TMA Negatives source has been selected */
+ if (scanner->source == SOURCE_TMA_NEGATIVES)
+ {
+ for (i = 0; i < bytes_per_line; i++)
+ buf[i] ^= 0xff;
+ }
+
memcpy (ptr, buf, bytes_per_line);
}
free (buf);
diff --git a/backend/hs2p-scsi.c b/backend/hs2p-scsi.c
index 82640e9..a14e6cb 100644
--- a/backend/hs2p-scsi.c
+++ b/backend/hs2p-scsi.c
@@ -1283,9 +1283,9 @@ hs2p_send_gamma (HS2P_Scanner * s)
_lto3b (len, &out.cmd.len[0]); /* 19 bytes max */
out.gamma[0] = 0x08; /* Gamma ID for Download table */
out.gamma[1] = 0x08; /* The Number of gray scale (M) = 8 */
- for (i = 2; i < 2 + GAMMA_LENGTH; i++)
+ for (i = 0; i < GAMMA_LENGTH; i++)
{
- out.gamma[i] = s->gamma_table[i];
+ out.gamma[i + 2] = s->gamma_table[i];
}
status = sanei_scsi_cmd (s->fd, &out, sizeof (out), NULL, NULL);
diff --git a/backend/ibm.c b/backend/ibm.c
index 729c140..3ab7890 100644
--- a/backend/ibm.c
+++ b/backend/ibm.c
@@ -248,11 +248,13 @@ attach (const char *devnam, Ibm_Device ** devp)
dev->sane.name = strdup (devnam);
dev->sane.vendor = "IBM";
- str = malloc (16 + 1);
- memset (str, 0, sizeof (str));
- strncpy (str, (char *)ibuf.product, sizeof(ibuf.product));
- strncpy (str + sizeof(ibuf.revision), (char *)ibuf.revision, sizeof(ibuf.revision));
- str[sizeof(ibuf.product) + sizeof(ibuf.revision)] = '\0';
+ str = malloc (sizeof(ibuf.product) + sizeof(ibuf.revision) + 1);
+ if (str)
+ {
+ str[0] = '\0';
+ strncat (str, (char *)ibuf.product, sizeof(ibuf.product));
+ strncat (str, (char *)ibuf.revision, sizeof(ibuf.revision));
+ }
dev->sane.model = str;
dev->sane.type = "flatbed scanner";
diff --git a/backend/kodakaio.c b/backend/kodakaio.c
index 8c4583a..42b59a5 100644
--- a/backend/kodakaio.c
+++ b/backend/kodakaio.c
@@ -1,7 +1,7 @@
/*
* kodakaio.c - SANE library for Kodak ESP Aio scanners.
*
- * Copyright (C) 2011-2013 Paul Newall
+ * Copyright (C) 2011-2015 Paul Newall
*
* Based on the Magicolor sane backend:
* Based on the epson2 sane backend:
@@ -14,19 +14,32 @@
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation, version 2.
- * Using avahi now 25/11/12 for net autodiscovery. Use configure option --enable-avahi
+ * Modified 30/12/14 to fix bug where network connection was broken after 30s of idle time.
+ * The connection is now made in sane_start and ended in sane_cancel.
* 01/01/13 Now with adf, the scan can be padded to make up the full page length,
* or the page can terminate at the end of the paper. This is a selectable option.
+ * 25/11/12 Using avahi now for net autodiscovery. Use configure option --enable-avahi
*/
-/* convenient lines to paste
-export SANE_DEBUG_KODAKAIO=10
+/*
+Packages to add to a clean ubuntu install
+libavahi-common-dev
+libusb-dev
+libsnmp-dev
+
+convenient lines to paste
+export SANE_DEBUG_KODAKAIO=20
for ubuntu prior to 12.10
-./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-avahi --disable-latex BACKENDS=kodakaio
+./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --enable-avahi --disable-latex BACKENDS="kodakaio test"
for ubuntu 12.10
-./configure --prefix=/usr --libdir=/usr/lib/i386-linux-gnu --sysconfdir=/etc --localstatedir=/var --enable-avahi --disable-latex BACKENDS=kodakaio
+./configure --prefix=/usr --libdir=/usr/lib/i386-linux-gnu --sysconfdir=/etc --localstatedir=/var --enable-avahi --disable-latex BACKENDS="kodakaio test"
+
+for ubuntu 14.10
+./configure --prefix=/usr --libdir=/usr/lib/x86_64-linux-gnu --sysconfdir=/etc --localstatedir=/var --enable-avahi --disable-latex BACKENDS="kodakaio test"
+
+If you want to use the test backend, for example with sane-troubleshoot, you should enable it in /etc/sane.d/dll.conf
*/
@@ -50,20 +63,14 @@ for ubuntu 12.10
*/
/* FUNCTION-TREE
sane_init
- sane_start
- k_init_parametersta
- k_lock_scanner
- k_set_scanning_parameters
- print_params
- k_start_scan
- cmd_start_scan
- print_status
- k_send
- kodakaio_txrxack
sane_open
device_detect
+ k_dev_init
+ open_scanner
+ close_scanner
sane_get_devices
init_options
+ (open_scanner - moved to sane_start 27/12/14 )
sane_control_option
getvalue
setvalue
@@ -71,6 +78,18 @@ for ubuntu 12.10
change_source
activateOption
deactivateOption
+ sane_start
+ open_scanner
+ k_init_parametersta
+ k_lock_scanner
+ k_hello
+ k_set_scanning_parameters
+ print_params
+ k_start_scan
+ cmd_start_scan
+ print_status
+ k_send
+ kodakaio_txrxack
sane_get_parameters
print_params
sane_read
@@ -78,6 +97,11 @@ for ubuntu 12.10
cmd_read_data (reads one block)
k_recv
cmp_array
+ sane_cancel
+ cmd_cancel_scan
+ close_scanner
+ sane_close
+ (close_scanner - moved to sane_cancel 27/12/14)
sane_exit
free_devices
k_recv
@@ -89,7 +113,9 @@ for ubuntu 12.10
open_scanner
sanei_kodakaio_net_open
close_scanner
- sanei_kodakaio_net_close
+ k_scan_finish
+ cmd_cancel_scan
+ sanei_kodakaio_net_close or sanei_usb_close
detect_usb
kodakaio_getNumberOfUSBProductIds
attach_one_config - (Passed to sanei_configure_attach)
@@ -126,8 +152,8 @@ for ubuntu 12.10
#define KODAKAIO_VERSION 02
-#define KODAKAIO_REVISION 4
-#define KODAKAIO_BUILD 6
+#define KODAKAIO_REVISION 7
+#define KODAKAIO_BUILD 2
/* for usb (but also used for net though it's not required). */
#define MAX_BLOCK_SIZE 32768
@@ -214,10 +240,12 @@ static int K_SNMP_Timeout = 3000; /* used for any auto detection method */
static int K_Scan_Data_Timeout = 10000;
static int K_Request_Timeout = 5000;
+/* static int bitposn=0; was used to pack bits into bytes in lineart mode */
+
/* This file is used to store directly the raster returned by the scanner for debugging
If RawScanPath has no length it will not be created */
FILE *RawScan = NULL;
-/* example: unsigned char RawScanPath[] = "TestRawScan.pgm"; */
+/* example: char RawScanPath[] = "TestRawScan.pgm"; */
char RawScanPath[] = ""; /* empty path means no raw scan file is made */
/*
@@ -566,16 +594,17 @@ commandtype, max depth, pointer to depth list
* The depth variable gets updated when the bit depth is modified.
*/
+/* could be affecting what data sane delivers */
static struct mode_param mode_params[] = {
- /* {0x00, 1, 1}, // Lineart, 1 color, 1 bit */
+ {0x03, 3, 24}, /* Color, 3 colors, 24 bit */
{0x02, 1, 8}, /* Grayscale, 1 color, 8 bit */
- {0x03, 3, 24} /* Color, 3 colors, 24 bit */
+ {0x00, 1, 1} /* Lineart, 1 color, 8 bit (was 8 bit) */
};
static SANE_String_Const mode_list[] = {
- /* SANE_VALUE_SCAN_MODE_LINEART, */
- SANE_VALUE_SCAN_MODE_GRAY,
SANE_VALUE_SCAN_MODE_COLOR,
+ SANE_VALUE_SCAN_MODE_GRAY,
+ SANE_VALUE_SCAN_MODE_LINEART,
NULL
};
@@ -602,6 +631,9 @@ static SANE_String_Const source_list[] = {
NULL
};
+static const SANE_Range percent_range_fixed = {SANE_FIX(0.0), SANE_FIX(100.0), SANE_FIX(1.0)};
+/*static const SANE_Range percent_range_int = {0, 100, 1};*/
+
/* prototypes */
static SANE_Status attach_one_usb(SANE_String_Const devname);
static SANE_Status attach_one_net(SANE_String_Const devname, unsigned int device);
@@ -659,11 +691,12 @@ print_status(KodakAio_Scanner *s,int level)
/****************************************************************************
* Low-level Network communication functions ****************************************************************************/
-/* We don't have a packet wrapper, which holds packet size etc., so we
- don't have to use a *read_raw and a *_read function... */
static int
kodakaio_net_read(struct KodakAio_Scanner *s, unsigned char *buf, size_t wanted,
SANE_Status * status)
+/* there seems to be a condition where this returns no error and no data without detecting a timeout
+That is probably if the scanner disconnected the network connection
+*/
{
size_t size, read = 0;
struct pollfd fds[1];
@@ -676,7 +709,7 @@ kodakaio_net_read(struct KodakAio_Scanner *s, unsigned char *buf, size_t wanted,
fds[0].events = POLLIN;
fds[0].revents = 0;
if ((pollreply = poll (fds, 1, K_Request_Timeout)) <= 0) {
- if (pollreply ==0)
+ if (pollreply == 0)
DBG(1, "net poll timeout\n");
else
/* pollreply is -ve */
@@ -684,21 +717,22 @@ kodakaio_net_read(struct KodakAio_Scanner *s, unsigned char *buf, size_t wanted,
*status = SANE_STATUS_IO_ERROR;
return read;
}
- else if(fds[0].revents & POLLIN) {
+ else if((fds[0].revents & POLLIN) && !(fds[0].revents & (POLLERR | POLLHUP | POLLNVAL))) {
while (read < wanted) {
+ DBG(50, "reading: read %lu, wanted %lu\n",read, wanted);
size = sanei_tcp_read(s->fd, buf + read, wanted - read);
-
- if (size == 0)
- break;
-
+ if (size == 0) {
+ DBG(1, "No data read. Scanner may have disconnected\n");
+ break;
+ }
read += size;
}
-/* this error removed 28/12/12 because adf scans end with less data than wanted
- if (read < wanted)
+ if (read == 0)
*status = SANE_STATUS_IO_ERROR;
- */
+
DBG(32, "net read %d bytes:%x,%x,%x,%x,%x,%x,%x,%x\n",read,buf[0],buf[1],buf[2],buf[3],buf[4],buf[5],buf[6],buf[7]);
+
return read;
}
else
@@ -706,7 +740,7 @@ kodakaio_net_read(struct KodakAio_Scanner *s, unsigned char *buf, size_t wanted,
return read;
}
-/* kodak does not pad commands like magicolor, so there's only a write_raw function */
+
static int
sanei_kodakaio_net_write_raw(struct KodakAio_Scanner *s,
const unsigned char *buf, size_t buf_size,
@@ -832,6 +866,7 @@ k_recv(KodakAio_Scanner * s, void *buf, ssize_t buf_size,
this function called by a number of others
In USB mode, this function will wait until data is available for a maximum of SCANNER_READ_TIMEOUT seconds.
+In NET mode the timeout is in kodakaio_net_read
*/
ssize_t n = 0;
char fmt_buf[25];
@@ -847,6 +882,10 @@ In USB mode, this function will wait until data is available for a maximum of SC
DBG(min(16,DBG_READ), "[%ld] %s: net req size = %ld ", (long) time_start, __func__, (long) buf_size);
n = kodakaio_net_read(s, buf, buf_size, status);
DBG(min(16,DBG_READ), "returned %d\n", n);
+ if (*status != SANE_STATUS_GOOD) {
+ DBG(1, "%s: err returned from kodakaio_net_read, %s\n", __func__, sane_strstatus(*status));
+ }
+
} else if (s->hw->connection == SANE_KODAKAIO_USB) {
/* Start the clock for USB timeout */
@@ -922,17 +961,30 @@ kodakaio_txrx(KodakAio_Scanner *s, unsigned char *txbuf, unsigned char *rxbuf)
/* Sends 8 byte data to scanner and returns reply and appropriate status. */
{
SANE_Status status;
+ ssize_t n = 0;
k_send(s, txbuf, 8, &status);
if (status != SANE_STATUS_GOOD) {
DBG(1, "%s: tx err, %s\n", __func__, sane_strstatus(status));
return status;
}
- k_recv(s, rxbuf, 8, &status);
+ n = k_recv(s, rxbuf, 8, &status);
if (status != SANE_STATUS_GOOD) {
DBG(1, "%s: %s gave rx err, %s\n", __func__, "txvalue", sane_strstatus(status));
return status;
}
+ if (n == 0) {
+ DBG(1, "%s: try 1 k_recv returned 0 bytes with status %s\n", __func__, sane_strstatus(status));
+ n = k_recv(s, rxbuf, 8, &status);
+ if (status != SANE_STATUS_GOOD) {
+ DBG(1, "%s: %s gave rx err, %s\n", __func__, "txvalue", sane_strstatus(status));
+ return status;
+ }
+ if (n == 0) {
+ DBG(1, "%s: try 2 k_recv returned 0 bytes with status %s\n", __func__, sane_strstatus(status));
+ return status;
+ }
+ }
return status;
}
@@ -962,7 +1014,8 @@ and returns appropriate status
s->adf_loaded = SANE_TRUE;
DBG(5, "%s: News - docs in ADF\n", __func__);
}
- else if (rxbuf[4] != 0x01 && s->adf_loaded == SANE_TRUE) {
+ else if (rxbuf[4] !=
+0x01 && s->adf_loaded == SANE_TRUE) {
s->adf_loaded = SANE_FALSE;
DBG(5, "%s: News - ADF is empty\n", __func__);
}
@@ -976,6 +1029,27 @@ and returns appropriate status
return status;
}
+/* unused function
+static ssize_t
+kodakaio_rxflush(KodakAio_Scanner *s)
+
+Tries to get 64 byte reply
+and returns number of bytes read
+
+{
+ SANE_Status status;
+ unsigned char rxbuf[64];
+ ssize_t n = 0;
+
+ n = k_recv(s, rxbuf, 64, &status);
+ if (status != SANE_STATUS_GOOD) {
+ DBG(1, "%s: %s gave rx err, %s\n", __func__, "status", sane_strstatus(status));
+ }
+ DBG(5, "%s: flushed, %d bytes\n", __func__, (int)n);
+ return n;
+}
+*/
+
/*
* high-level communication commands
*/
@@ -988,6 +1062,13 @@ k_hello (KodakAio_Scanner * s)
char fmt_buf[25];
DBG(5, "%s\n", __func__);
+
+/* check that there is nothing already in the input buffer before starting
+kodakaio_rxflush(s);
+*/
+/* preset the reply, so I can see if it gets changed */
+reply[0] = 0; reply[1] = 1; reply[2] = 2; reply[3] = 3; reply[4] = 4; reply[5] = 5; reply[6] = 6; reply[7] = 7;
+
if((status = kodakaio_txrx(s, KodakEsp_V, reply))!= SANE_STATUS_GOOD) {
DBG(1, "%s: KodakEsp_V failure, %s\n", __func__, sane_strstatus(status));
return SANE_STATUS_IO_ERROR;
@@ -998,6 +1079,8 @@ k_hello (KodakAio_Scanner * s)
DBG(1, "%s: KodakEsp_v err, got %s\n", __func__, fmt_buf);
return SANE_STATUS_IO_ERROR;
}
+
+
DBG(5, "%s: OK %s\n", __func__, sane_strstatus(status));
return status;
}
@@ -1045,12 +1128,24 @@ cmd_cancel_scan (SANE_Handle handle)
unsigned char reply[8];
/* adf added 20/2/12 should it be adf? or adf with paper in? */
if (strcmp(source_list[s->val[OPT_SOURCE].w], ADF_STR) == 0) { /* adf */
- if (kodakaio_txrxack(s, KodakEsp_F, reply)!= SANE_STATUS_GOOD) return SANE_STATUS_IO_ERROR;
- if (kodakaio_txrxack(s, KodakEsp_UnLock, reply)!= SANE_STATUS_GOOD) return SANE_STATUS_IO_ERROR;
+ if (kodakaio_txrxack(s, KodakEsp_F, reply)!= SANE_STATUS_GOOD)
+ {
+ DBG(1, "%s: KodakEsp_F command failed\n", __func__);
+ return SANE_STATUS_IO_ERROR;
+ }
+ if (kodakaio_txrxack(s, KodakEsp_UnLock, reply)!= SANE_STATUS_GOOD)
+ {
+ DBG(1, "%s: KodakEsp_UnLock command failed\n", __func__);
+ return SANE_STATUS_IO_ERROR;
+ }
DBG(5, "%s unlocked the scanner with adf F U\n", __func__);
}
else { /* no adf */
- if (kodakaio_txrxack(s, KodakEsp_UnLock, reply)!= SANE_STATUS_GOOD) return SANE_STATUS_IO_ERROR;
+ if (kodakaio_txrxack(s, KodakEsp_UnLock, reply)!= SANE_STATUS_GOOD)
+ {
+ DBG(1, "%s: KodakEsp_UnLock command failed\n", __func__);
+ return SANE_STATUS_IO_ERROR;
+ }
DBG(5, "%s unlocked the scanner U\n", __func__);
}
s->scanning = SANE_FALSE;
@@ -1084,6 +1179,7 @@ Old mc cmd read this stuff from the scanner. I don't think kodak can do that eas
return status;
}
+/* Set color curve command, low level, sends commands to the scanner*/
static SANE_Status
cmd_set_color_curve(SANE_Handle handle, unsigned char col)
{
@@ -1093,11 +1189,12 @@ cmd_set_color_curve(SANE_Handle handle, unsigned char col)
unsigned char tx_col[8];
unsigned char rx[8];
unsigned char tx_curve[256];
- unsigned char i;
+ int i; /* 7/9/14 was unsigned char and that stopped the loop that made the linear curve from going to 255 */
DBG(32, "%s: start\n", __func__);
tx_col[0]=0x1b; tx_col[1]='S'; tx_col[2]='K'; tx_col[3]=col; tx_col[4]=0; tx_col[5]=0; tx_col[6]=0; tx_col[7]=0;
/* linear curve now but could send tailor made curves in future */
- for(i=0;i<255;++i) tx_curve[i]=i;
+ for(i=0;i<=255;++i) tx_curve[i]=i; /* 7/9/14 was i<255 the missing elements caused speckles */
+
k_send(s, tx_col, 8, &status);
if (status != SANE_STATUS_GOOD) {
DBG(1, "%s: tx err, %s\n", __func__, "curve command");
@@ -1113,7 +1210,7 @@ cmd_set_color_curve(SANE_Handle handle, unsigned char col)
return status;
}
-/* Set scanning parameters command low level */
+/* Set scanning parameters command, low level, sends commands to the scanner*/
static SANE_Status
cmd_set_scanning_parameters(SANE_Handle handle,
int resolution,
@@ -1210,8 +1307,6 @@ unsigned int i;
return 0;
}
-
-
static SANE_Status
cmd_read_data (SANE_Handle handle, unsigned char *buf, size_t *len)
{
@@ -1283,11 +1378,11 @@ But it seems that the scanner takes care of that, and gives you the ack as a sep
}
}
else {
- DBG(min(1,DBG_READ), "%s: tiny read, got %d bytes of %d\n", __func__, bytecount, *len);
+ DBG(min(1,DBG_READ), "%s: tiny read, got %d bytes of %d\n", __func__, (int) bytecount, *len);
return SANE_STATUS_IO_ERROR;
}
if (*len > s->params.bytes_per_line) {
- /* store average colour as background. That's not the ideal method but it's easy to implement. */
+ /* store average colour as background. That's not the ideal method but it's easy to implement. What's it used for? */
lines = *len / s->params.bytes_per_line;
s->background[0] = 0;
s->background[1] = 0;
@@ -1545,11 +1640,11 @@ k_set_scanning_parameters(KodakAio_Scanner * s)
s->params.bytes_per_line *= 3;
/* Calculate how many bytes per line will be returned by the scanner.
- magicolor needed this because it uses padding. Scan bytes per line != image bytes per line
+ magicolor needed this because it uses padding so scan bytes per line != image bytes per line.
* The values needed for this are returned by get_scanning_parameters */
- s->scan_bytes_per_line = 3 * ceil (scan_pixels_per_line * s->params.depth / 8.0);
+ s->scan_bytes_per_line = 3 * ceil (scan_pixels_per_line); /* we always scan in colour 8 bit */
s->data_len = s->scan_bytes_per_line * floor (s->height * dpi / optres + 0.5); /* NB this is the length for a full scan */
- DBG (1, "Check: scan_bytes_per_line = %d s->params.bytes_per_line = %d \n", s->scan_bytes_per_line, s->params.bytes_per_line);
+ DBG (5, "Check: scan_bytes_per_line = %d s->params.bytes_per_line = %d \n", s->scan_bytes_per_line, s->params.bytes_per_line);
/* k_setup_block_mode at the start of each page for adf to work */
status = k_setup_block_mode (s);
@@ -1604,10 +1699,14 @@ k_copy_image_data(KodakAio_Scanner * s, SANE_Byte * data, SANE_Int max_length,
uncompressed data is RRRR...GGGG...BBBB per line */
{
SANE_Int bytes_available;
+ SANE_Int threshold;
DBG (min(18,DBG_READ), "%s: bytes_read in line: %d\n", __func__, s->bytes_read_in_line);
*length = 0;
+ threshold = 255 - (int) (SANE_UNFIX(s->val[OPT_THRESHOLD].w) * 255.0 / 100.0 + 0.5); /* 255 - for the grey scale version */
+ DBG (20, "%s: threshold: %d\n", __func__, threshold);
+
while ((max_length >= s->params.bytes_per_line) && (s->ptr < s->end)) {
SANE_Int bytes_to_copy = s->scan_bytes_per_line - s->bytes_read_in_line;
/* First, fill the line buffer for the current line: */
@@ -1635,23 +1734,36 @@ uncompressed data is RRRR...GGGG...BBBB per line */
*length += s->params.bytes_per_line;
for (i=0; i< s->params.pixels_per_line; ++i) {
+ /* different behaviour for each mode */
if (s->val[OPT_MODE].w == MODE_COLOR){
- /*interlace */
- *data++ = 255-line[0]; /*red */
- *data++ = 255-line[s->params.pixels_per_line]; /*green */
- *data++ = 255-line[2 * s->params.pixels_per_line]; /*blue */
+ /*interlace was subtracting from 255 until 6/9/14 */
+ *data++ = 255-line[0]; /*red */
+ *data++ = 255-line[s->params.pixels_per_line]; /*green */
+ *data++ = 255-line[2 * s->params.pixels_per_line]; /*blue */
+ }
+ else if (s->val[OPT_MODE].w == MODE_LINEART) { /* gives 1 bit output */
+ /*output image location*/
+ int offset = i % 8;
+ unsigned char mask = 0x80 >> offset;
+ /*set if any colour is over the threshold */
+ if (line[0] < threshold || line[s->params.pixels_per_line] < threshold || line[2 * s->params.pixels_per_line] < threshold)
+ *data &= ~mask; /* white clear the bit in mask */
+ else
+ *data |= mask; /* black set the bit in mask */
+
+ if (offset == 7 || i == s->params.pixels_per_line-1)
+ data++; /* move on a byte if the byte is full or the line is complete */
}
- else { /* grey */
- /*Average*/
- *data++ = (255-line[0]
+ else { /* greyscale - Average the 3 colours */
+ *data++ = (255-line[0]
+255-line[s->params.pixels_per_line]
+255-line[2 * s->params.pixels_per_line])
/ 3;
}
- line++;
+ line++;
}
/*debug file The same for color or grey because the scan is colour */
if (RawScan != NULL) {
@@ -1716,21 +1828,22 @@ k_init_parametersta(KodakAio_Scanner * s)
SANE_UNFIX(s->val[OPT_BR_X].w), SANE_UNFIX(s->val[OPT_BR_Y].w));
/*
- * The default color depth is stored in mode_params.depth:
+ * The default color depth is stored in mode_params.depth:‭
*/
if (mode_params[s->val[OPT_MODE].w].depth == 1)
s->params.depth = 1;
else {
- DBG(20, "%s: setting depth = s->val[OPT_BIT_DEPTH].w = %d\n", __func__,s->val[OPT_BIT_DEPTH].w);
s->params.depth = s->val[OPT_BIT_DEPTH].w;
}
+ DBG(20, "%s: bit depth = s->params.depth = %d\n", __func__,s->params.depth);
s->params.last_frame = SANE_TRUE;
s->params.bytes_per_line = 3 * ceil (s->params.depth * s->params.pixels_per_line / 8.0);
-/* kodak only scans in color and conversion to grey is done in the driver
+/* kodak only scans in color and conversion to grey or lineart is done in the driver
s->params.format = SANE_FRAME_RGB; */
- DBG(20, "%s: s->val[OPT_MODE].w = %d (color is %d)\n", __func__,s->val[OPT_MODE].w, MODE_COLOR);
+ DBG(20, "%s: s->val[OPT_MODE].w = %d (color is %d)\n", __func__,s->val[OPT_MODE].w, MODE_COLOR);
if (s->val[OPT_MODE].w == MODE_COLOR) s->params.format = SANE_FRAME_RGB;
+ else if (s->val[OPT_MODE].w == MODE_LINEART) s->params.format = SANE_FRAME_GRAY;
else s->params.format = SANE_FRAME_GRAY;
DBG(20, "%s: format=%d, bytes_per_line=%d, lines=%d\n", __func__, s->params.format, s->params.bytes_per_line, s->params.lines);
@@ -1761,19 +1874,16 @@ you don't know how many blocks there will be in advance because their size may b
SANE_Status status = SANE_STATUS_GOOD;
size_t buf_len = 0;
- /* did we passed everything we read to sane? */
+ /* have we passed everything we read to sane? */
if (s->ptr == s->end) {
-
if (s->eof)
return SANE_STATUS_EOF;
s->counter++;
-
if (s->bytes_unread >= s->block_len)
buf_len = s->block_len;
else
buf_len = s->bytes_unread;
-
DBG(min(20,DBG_READ), "%s: block %d, size %lu\n", __func__,
s->counter, (unsigned long) buf_len);
@@ -1810,9 +1920,7 @@ you don't know how many blocks there will be in advance because their size may b
return SANE_STATUS_IO_ERROR;
}
}
-
}
-
s->end = s->buf + buf_len;
s->ptr = s->buf;
}
@@ -1858,7 +1966,6 @@ get_device_from_identification (const char *ident, const char *vid, const char *
return NULL;
}
-
/*
* close_scanner()
*
@@ -2184,6 +2291,7 @@ static void resolve_callback(
AvahiLookupResultFlags flags,
AVAHI_GCC_UNUSED void* userdata) {
+ AvahiStringList *vid_pair_list = NULL, *pid_pair_list = NULL;
char *pidkey, *pidvalue;
char *vidkey, *vidvalue;
size_t valuesize;
@@ -2204,20 +2312,40 @@ static void resolve_callback(
avahi_address_snprint(a, sizeof(a), address);
/* Output short for Kodak ESP */
- DBG(min(10,DBG_AUTO), "%s:%u %s ", a,port,host_name);
- avahi_string_list_get_pair(avahi_string_list_find(txt, "vid"),
- &vidkey, &vidvalue, &valuesize);
- DBG(min(10,DBG_AUTO), "%s=%s ", vidkey, vidvalue);
- avahi_string_list_get_pair(avahi_string_list_find(txt, "pid"),
- &pidkey, &pidvalue, &valuesize);
- DBG(min(10,DBG_AUTO), "%s=%s\n", pidkey, pidvalue);
+ DBG(min(10,DBG_AUTO), "%s:%u %s\n", a,port,host_name);
+
+ vid_pair_list = avahi_string_list_find(txt, "vid");
+ if(vid_pair_list != NULL) {
+ avahi_string_list_get_pair(vid_pair_list, &vidkey, &vidvalue, &valuesize);
+ DBG(min(10,DBG_AUTO), "%s=%s ", vidkey, vidvalue);
+ }
+ else DBG(min(10,DBG_AUTO), "failed to find key vid\n");
+ pid_pair_list = avahi_string_list_find(txt, "pid");
+ if(pid_pair_list != NULL) {
+ avahi_string_list_get_pair(pid_pair_list, &pidkey, &pidvalue, &valuesize);
+ DBG(min(10,DBG_AUTO), "%s=%s\n", pidkey, pidvalue);
+ }
+ else DBG(min(10,DBG_AUTO), "failed to find key pid\n");
+
+ if(pid_pair_list != NULL && vid_pair_list != NULL) {
ProcessAvahiDevice(name, vidvalue, pidvalue, a);
- avahi_free(vidkey); avahi_free(vidvalue);
- avahi_free(pidkey); avahi_free(pidvalue);
+ }
+ else DBG(min(10,DBG_AUTO), "didn't call ProcessAvahiDevice\n");
+
+ if(vid_pair_list != NULL) {
+ avahi_free(vidkey);
+ avahi_free(vidvalue);
+ DBG(min(15,DBG_AUTO), "vidkey and vidvalue freed\n");
+ }
+ if(pid_pair_list != NULL) {
+ avahi_free(pidkey);
+ avahi_free(pidvalue);
+ DBG(min(15,DBG_AUTO), "pidkey and pidvalue freed\n");
+ }
}
}
-
+ DBG(min(10,DBG_AUTO), "ending resolve_callback\n");
avahi_service_resolver_free(r);
}
@@ -2619,8 +2747,32 @@ init_options(KodakAio_Scanner *s)
s->opt[OPT_MODE].size = max_string_size(mode_list);
s->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
s->opt[OPT_MODE].constraint.string_list = mode_list;
- s->val[OPT_MODE].w = 0; /* Binary */
- DBG(20, "%s: mode_list has first entry %s\n", __func__, mode_list[0]);
+ s->val[OPT_MODE].w = MODE_COLOR; /* default */
+ DBG(20, "%s: mode_list has first entry %s, default mode is %s\n", __func__, mode_list[0],mode_list[s->val[OPT_MODE].w]);
+
+ /* theshold the sane std says should be SANE_TYPE_FIXED 0..100 but all other backends seem to use INT 0..255 */
+ s->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD;
+ s->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD;
+ s->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD;
+ s->opt[OPT_THRESHOLD].type = SANE_TYPE_FIXED;
+ s->opt[OPT_THRESHOLD].unit = SANE_UNIT_PERCENT;
+ s->opt[OPT_THRESHOLD].size = sizeof(SANE_Word);
+ s->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE;
+ s->opt[OPT_THRESHOLD].constraint.range = &percent_range_fixed;
+ s->val[OPT_THRESHOLD].w = SANE_FIX(50.0);
+ DBG(20, "%s: threshold initialised to fixed %f\n", __func__, SANE_UNFIX(s->val[OPT_THRESHOLD].w));
+
+ /* theshold the sane std says should be SANE_TYPE_FIXED 0..100 but all other backends seem to use INT 0..255
+ s->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD;
+ s->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD;
+ s->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD;
+ s->opt[OPT_THRESHOLD].type = SANE_TYPE_INT;
+ s->opt[OPT_THRESHOLD].unit = SANE_UNIT_PERCENT;
+ s->opt[OPT_THRESHOLD].size = sizeof(SANE_Word);
+ s->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE;
+ s->opt[OPT_THRESHOLD].constraint.range = &percent_range_int;
+ s->val[OPT_THRESHOLD].w = 51;
+ DBG(20, "%s: threshold initialised to int %d\n", __func__, s->val[OPT_THRESHOLD].w); */
/* bit depth */
s->opt[OPT_BIT_DEPTH].name = SANE_NAME_BIT_DEPTH;
@@ -2656,6 +2808,17 @@ init_options(KodakAio_Scanner *s)
s->val[OPT_RESOLUTION].w = s->hw->cap->dpi_range.min;
+ /* trial option for debugging
+ s->opt[OPT_TRIALOPT].name = "trialoption";
+ s->opt[OPT_TRIALOPT].title = "trialoption";
+ s->opt[OPT_TRIALOPT].desc = "trialoption";
+ s->opt[OPT_TRIALOPT].type = SANE_TYPE_INT;
+ s->opt[OPT_TRIALOPT].unit = SANE_UNIT_NONE;
+ s->opt[OPT_TRIALOPT].size = sizeof(SANE_Word);
+ s->opt[OPT_TRIALOPT].constraint_type = SANE_CONSTRAINT_RANGE;
+ s->opt[OPT_TRIALOPT].constraint.range = &percent_range_int;
+ s->val[OPT_TRIALOPT].w = 1; */
+
/* preview */
s->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW;
s->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW;
@@ -2831,12 +2994,13 @@ maybe we should only be rebuilding the source list here? */
*handle = (SANE_Handle) s;
+/* moving the open scanner section below to sane_start 27/12/14
status = open_scanner(s);
if (status != SANE_STATUS_GOOD) {
free(s);
return status;
}
-
+*/
return status;
}
@@ -2853,8 +3017,11 @@ sane_close(SANE_Handle handle)
s = (KodakAio_Scanner *) handle;
DBG(2, "%s: called\n", __func__);
+/* moving the close scanner section below to sane_cancel 27/12/14 */
if (s->fd != -1)
close_scanner(s);
+/* end of section */
+
if(RawScan != NULL)
fclose(RawScan);
RawScan = NULL;
@@ -2867,7 +3034,7 @@ sane_get_option_descriptor(SANE_Handle handle, SANE_Int option)
/* this may be a sane call, but it happens way too often to have DBG level 2 */
KodakAio_Scanner *s = (KodakAio_Scanner *) handle;
- DBG(20, "%s: called for option %d\n", __func__, option);
+ DBG(30, "%s: called for option %d\n", __func__, option);
if (option < 0 || option >= NUM_OPTIONS)
return NULL;
@@ -2922,7 +3089,7 @@ getvalue(SANE_Handle handle, SANE_Int option, void *value)
case OPT_NUM_OPTS:
case OPT_BIT_DEPTH:
-/* case OPT_BRIGHTNESS: */
+ /* case OPT_TRIALOPT: */
case OPT_RESOLUTION:
case OPT_PREVIEW:
case OPT_TL_X:
@@ -2930,6 +3097,13 @@ getvalue(SANE_Handle handle, SANE_Int option, void *value)
case OPT_BR_X:
case OPT_BR_Y:
*((SANE_Word *) value) = sval->w;
+ DBG(20, "%s: got option %d as %d\n", __func__, option, *((SANE_Word *) value));
+ break;
+
+ case OPT_THRESHOLD:
+ *((SANE_Word *) value) = sval->w;
+ DBG(20, "%s: got option %d as %f\n", __func__, option, SANE_UNFIX(*((SANE_Word *) value)));
+ /*DBG(20, "%s: got option %d as %d\n", __func__, option, *((SANE_Word *) value));*/
break;
case OPT_MODE:
@@ -2942,9 +3116,11 @@ getvalue(SANE_Handle handle, SANE_Int option, void *value)
break;
default:
+ DBG(20, "%s: returning inval\n", __func__);
return SANE_STATUS_INVAL;
}
+ DBG(20, "%s: returning good\n", __func__);
return SANE_STATUS_GOOD;
}
@@ -3050,18 +3226,23 @@ setvalue(SANE_Handle handle, SANE_Int option, void *value, SANE_Int *info)
case OPT_MODE:
{
sval->w = optindex;
- /* if binary, then disable the bit depth selection */
- if (optindex == 0) {
+ /* if binary, then disable the bit depth selection and enable threshold */
+ if (optindex == MODE_LINEART) {
+ DBG(17, "%s: binary mode setting depth to 1\n", __func__);
+ s->val[OPT_BIT_DEPTH].w = 1;
s->opt[OPT_BIT_DEPTH].cap |= SANE_CAP_INACTIVE;
+ s->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE;
} else {
- if (s->hw->cap->depth_list[0] == 1)
- s->opt[OPT_BIT_DEPTH].cap |=
- SANE_CAP_INACTIVE;
- else {
- s->opt[OPT_BIT_DEPTH].cap &=
- ~SANE_CAP_INACTIVE;
- s->val[OPT_BIT_DEPTH].w =
- mode_params[optindex].depth;
+ if (s->hw->cap->depth_list[0] == 1) { /* only one entry in the list ? */
+ DBG(17, "%s: non-binary mode but only one depth available\n", __func__);
+ s->val[OPT_BIT_DEPTH].w = s->hw->cap->depth_list[1];
+ s->opt[OPT_BIT_DEPTH].cap |= SANE_CAP_INACTIVE;
+ s->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
+ } else { /* there is a list to choose from ? */
+ DBG(17, "%s: non-binary mode and depth list available\n", __func__);
+ s->opt[OPT_BIT_DEPTH].cap &= ~SANE_CAP_INACTIVE;
+ s->val[OPT_BIT_DEPTH].w = mode_params[optindex].depth;
+ s->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE; /* does not work in xsane ? */
}
}
reload = SANE_TRUE;
@@ -3074,6 +3255,13 @@ setvalue(SANE_Handle handle, SANE_Int option, void *value, SANE_Int *info)
reload = SANE_TRUE;
break;
+ case OPT_THRESHOLD:
+ sval->w = *((SANE_Word *) value);
+ DBG(17, "setting threshold to %f\n", SANE_UNFIX(sval->w));
+ /*DBG(17, "setting threshold to %d\n", sval->w);*/
+ /*reload = SANE_TRUE; what does this do?*/
+ break;
+
case OPT_RESOLUTION:
sval->w = *((SANE_Word *) value);
DBG(17, "setting resolution to %d\n", sval->w);
@@ -3109,7 +3297,7 @@ setvalue(SANE_Handle handle, SANE_Int option, void *value, SANE_Int *info)
sval->w = *((SANE_Word *) value);
break;
-/* case OPT_BRIGHTNESS: */
+ /* case OPT_TRIALOPT: */
case OPT_PREVIEW: /* needed? */
sval->w = *((SANE_Word *) value);
break;
@@ -3131,14 +3319,14 @@ sane_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action,
void *value, SANE_Int *info)
{
KodakAio_Scanner *s = (KodakAio_Scanner *) handle;
- DBG(2, "%s: action = %x, option = %d %s\n", __func__, action, option, s->opt[option].name);
-
if (option < 0 || option >= NUM_OPTIONS)
{
- DBG(1, "%s: option num = %d (%s) out of range\n", __func__, option, s->opt[option].name);
+ DBG(1, "%s: option num = %d out of range (0..%d)\n", __func__, option, NUM_OPTIONS - 1);
return SANE_STATUS_INVAL;
}
+ DBG(5, "%s: action = %x, option = %d %s\n", __func__, action, option, s->opt[option].name);
+
if (info != NULL)
*info = 0;
@@ -3209,6 +3397,16 @@ sane_start(SANE_Handle handle)
* them to s->params
Only set scanning params the first time, or after a cancel
try change 22/2/12 take lock scanner out of k_set_scanning_parameters */
+
+/* moved open_scanner here 27/12/14 from sane_open */
+ status = open_scanner(s);
+ if (status != SANE_STATUS_GOOD) {
+ free(s);
+ return status;
+ }
+/* end of open scanner section */
+
+
status = k_lock_scanner(s);
if (status != SANE_STATUS_GOOD) {
DBG(1, "could not lock scanner\n");
@@ -3299,24 +3497,24 @@ sane_read(SANE_Handle handle, SANE_Byte *data, SANE_Int max_length,
return status;
}
-/*
- * void sane_cancel(SANE_Handle handle)
- *
- * Set the cancel flag to true. The next time the backend requests data
- * from the scanner the CAN message will be sent.
- */
void
sane_cancel(SANE_Handle handle)
{
+ SANE_Status status;
KodakAio_Scanner *s = (KodakAio_Scanner *) handle;
DBG(2, "%s: called\n", __func__);
-/* used to set cancelling flag to tell sane_read to cancel
-changed 20/2/12
- s->canceling = SANE_TRUE;
-*/
- cmd_cancel_scan(s);
+ status = cmd_cancel_scan(s);
+ if (status != SANE_STATUS_GOOD)
+ DBG(1, "%s: cmd_cancel_scan failed: %s\n", __func__,
+ sane_strstatus(status));
+
+/* moved from close scanner section 27/12/14 */
+ if (s->fd != -1)
+ close_scanner(s);
+/* end of section */
+
}
/*
diff --git a/backend/kodakaio.h b/backend/kodakaio.h
index f2265f5..6804e3b 100644
--- a/backend/kodakaio.h
+++ b/backend/kodakaio.h
@@ -97,8 +97,10 @@ enum {
OPT_NUM_OPTS = 0,
OPT_MODE_GROUP,
OPT_MODE,
+ OPT_THRESHOLD,
OPT_BIT_DEPTH,
OPT_RESOLUTION,
+ OPT_TRIALOPT, /* for debuggging */
OPT_PREVIEW,
OPT_SOURCE,
OPT_ADF_MODE,
@@ -163,6 +165,7 @@ struct KodakAio_Scanner
SANE_Int left, top; /* in optres units? */
SANE_Int width, height; /* in optres units? */
+ /* SANE_Int threshold; 0..255 for lineart*/
/* image block data */
SANE_Int data_len;
@@ -192,7 +195,7 @@ struct mode_param
};
enum {
- MODE_GRAY, MODE_COLOR
+ MODE_COLOR, MODE_GRAY, MODE_LINEART
};
#endif
diff --git a/backend/lexmark_low.c b/backend/lexmark_low.c
index ae0db2c..821b621 100644
--- a/backend/lexmark_low.c
+++ b/backend/lexmark_low.c
@@ -1965,7 +1965,7 @@ sanei_lexmark_low_search_home_bwd (Lexmark_Device * dev)
available. The number of lines (or number of buffers in our buffer space)
is calculated from the size of the data available from the scanner. The
number of buffers is calculated as the space required to hold 1.5 times
- the the size of the data available from the scanner.
+ the size of the data available from the scanner.
After data is read from the scanner each line is checked if it is on the
home dot. Lines are continued to be read until we are no longer on the home
diff --git a/backend/magicolor.c b/backend/magicolor.c
index e3cd80d..660f517 100644
--- a/backend/magicolor.c
+++ b/backend/magicolor.c
@@ -103,7 +103,8 @@
* | | | | | | | | | | | | | | |
*/
static struct MagicolorCmd magicolor_cmd[] = {
- {"mc1690mf", CMD, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, NET, 0x00, 0x01, 0x02, 0x03}
+ {"mc1690mf", CMD, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, NET, 0x00, 0x01, 0x02, 0x03},
+ {"mc4690mf", CMD, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x12, NET, 0x00, 0x01, 0x02, 0x03},
};
static SANE_Int magicolor_default_resolutions[] = {150, 300, 600};
@@ -121,7 +122,20 @@ static struct MagicolorCap magicolor_cap[] = {
{0, SANE_FIX(0x13f8 * MM_PER_INCH / 600), 0}, {0, SANE_FIX(0x1b9c * MM_PER_INCH / 600), 0}, /* FBF x/y ranges (TODO!) */
SANE_TRUE, SANE_FALSE, /* non-duplex ADF, x/y ranges (TODO!) */
{0, SANE_FIX(0x1390 * MM_PER_INCH / 600), 0}, {0, SANE_FIX(0x20dc * MM_PER_INCH / 600), 0},
- }
+ },
+
+ /* KONICA MINOLTA magicolor 4690MF, USB ID 0x132b:2079 */
+ {
+ 0x2079, "mc4690mf", "KONICA MINOLTA magicolor 4690MF",
+ "FIXME", /* FIXME: fill in the correct OID! */
+ 0x03, 0x85,
+ 600, {150, 600, 0}, magicolor_default_resolutions, 3, /* 600 dpi max, 3 resolutions */
+ 8, magicolor_default_depths, /* color depth 8 default, 1 and 8 possible */
+ {1, 9, 0}, /* brightness ranges (TODO!) */
+ {0, SANE_FIX(0x13f8 * MM_PER_INCH / 600), 0}, {0, SANE_FIX(0x1b9c * MM_PER_INCH / 600), 0}, /* FBF x/y ranges (TODO!) */
+ SANE_TRUE, SANE_TRUE, /* duplex ADF, x/y ranges (TODO!) */
+ {0, SANE_FIX(0x1390 * MM_PER_INCH / 600), 0}, {0, SANE_FIX(0x20dc * MM_PER_INCH / 600), 0},
+ },
};
@@ -373,6 +387,7 @@ sanei_magicolor_net_close(struct Magicolor_Scanner *s)
SANE_Word sanei_magicolor_usb_product_ids[] = {
0x2089, /* magicolor 1690MF */
+ 0x2079, /* magicolor 4690MF */
0 /* last entry - this is used for devices that are specified
in the config file as "usb <vendor> <product>" */
};
@@ -1176,7 +1191,12 @@ mc_set_scanning_parameters(Magicolor_Scanner * s)
/* ADF used? */
if (strcmp(source_list[s->val[OPT_SOURCE].w], ADF_STR) == 0) {
/* Use ADF */
- source = 0x01;
+ if (s->val[OPT_ADF_MODE].w == 0) {
+ source = 0x01;
+ } else {
+ /* Use duplex */
+ source = 0x02;
+ }
} else {
source = 0x00;
}
@@ -1670,6 +1690,7 @@ detect_usb(struct Magicolor_Scanner *s)
DBG(2, "found valid Magicolor scanner: 0x%x/0x%x (vendorID/productID)\n",
vendor, product);
+ mc_set_device(s, product);
return SANE_STATUS_GOOD;
}
diff --git a/backend/microtek2.c b/backend/microtek2.c
index d56e568..8fdf497 100644
--- a/backend/microtek2.c
+++ b/backend/microtek2.c
@@ -4013,7 +4013,7 @@ get_scan_mode_and_depth(Microtek2_Scanner *ms,
/* This function translates the strings for the possible modes and */
/* bitdepth into a more conveniant format as needed for SET WINDOW. */
/* bits_per_pixel is the number of bits per color one pixel needs */
- /* when transferred from the the scanner, bits_perpixel_out is the */
+ /* when transferred from the scanner, bits_perpixel_out is the */
/* number of bits per color one pixel uses when transferred to the */
/* frontend. These may be different. For example, with a depth of 4 */
/* two pixels per byte are transferred from the scanner, but only one */
@@ -7453,7 +7453,7 @@ segreg_proc_data(Microtek2_Scanner *ms)
save_current_src = ms->buf.current_src;
if ( ms->buf.free_lines < ms->src_max_lines )
{
- ms->buf.current_src = ++ms->buf.current_src % 2;
+ ms->buf.current_src = !ms->buf.current_src;
ms->buf.src_buf = ms->buf.src_buffer[ms->buf.current_src];
ms->buf.free_lines = ms->buf.free_max_lines;
}
diff --git a/backend/mustek_pp_ccd300.c b/backend/mustek_pp_ccd300.c
index c5351a4..41ad0ec 100644
--- a/backend/mustek_pp_ccd300.c
+++ b/backend/mustek_pp_ccd300.c
@@ -940,10 +940,10 @@ get_color_line_101x (Mustek_pp_Handle * dev, SANE_Byte * buf)
wait_bank_change (dev, priv->bank_count, 1);
reset_bank_count (dev);
if (priv->ccd_line >= (priv->line_step >> SANE_FIXED_SCALE_SHIFT))
- priv->redline = ++priv->redline % priv->green_offs;
+ priv->redline = (priv->redline + 1) % priv->green_offs;
if (priv->ccd_line >=
priv->blue_offs + (priv->line_step >> SANE_FIXED_SCALE_SHIFT))
- priv->blueline = ++priv->blueline % priv->blue_offs;
+ priv->blueline = (priv->blueline + 1) % priv->blue_offs;
continue;
}
@@ -979,7 +979,7 @@ get_color_line_101x (Mustek_pp_Handle * dev, SANE_Byte * buf)
}
- priv->redline = ++priv->redline % priv->green_offs;
+ priv->redline = (priv->redline + 1) % priv->green_offs;
if (priv->ccd_line >= priv->green_offs && gogreen)
{
@@ -1013,7 +1013,7 @@ get_color_line_101x (Mustek_pp_Handle * dev, SANE_Byte * buf)
if (priv->ccd_line >=
priv->blue_offs + (priv->line_step >> SANE_FIXED_SCALE_SHIFT))
- priv->blueline = ++priv->blueline % priv->blue_offs;
+ priv->blueline = (priv->blueline + 1) % priv->blue_offs;
if (gogreen)
{
@@ -1660,7 +1660,7 @@ ccd300_open (SANE_String port, SANE_Int caps, SANE_Int * fd)
if (caps & ~(CAP_NOTHING | CAP_INVERT | CAP_LAMP_OFF))
{
- DBG (1, "ccd300_open: called with unknonw capabilities (%#02x)\n",
+ DBG (1, "ccd300_open: called with unknown capabilities (%#02x)\n",
caps);
return SANE_STATUS_INVAL;
}
@@ -1816,7 +1816,7 @@ ccd300_config (SANE_Handle handle, SANE_String_Const optname,
}
else
{
- DBG (1, "ccd300_config: unkown option ``%s''", optname);
+ DBG (1, "ccd300_config: unknown option ``%s''", optname);
return SANE_STATUS_INVAL;
}
diff --git a/backend/mustek_pp_cis.c b/backend/mustek_pp_cis.c
index 026734f..d5ef86d 100644
--- a/backend/mustek_pp_cis.c
+++ b/backend/mustek_pp_cis.c
@@ -2086,7 +2086,7 @@ cis_calibrate (Mustek_PP_CIS_dev * dev)
* It seems that the width of the black border is being measured at
* this stage, possibly multiple times till it stabilizes.
* I assume that the buffer is read 100 times to allow the lamp to
- * warm up and that the the width of the black border is then being
+ * warm up and that the width of the black border is then being
* measured till it stabilizes. That would explain the minimum number
* of 102 iterations that I've seen.
*
diff --git a/backend/net.c b/backend/net.c
index 16fba2f..4beb45d 100644
--- a/backend/net.c
+++ b/backend/net.c
@@ -140,7 +140,7 @@ static int hang_over;
client/server have different endianness. A value of -1 means, that there's
no left over; otherwise the value has to be casted to SANE_Byte. left_over
means, that there is a remaining byte from a previous call to sane_read,
- which already is in the the correct byte order, but could not be returned,
+ which already is in the correct byte order, but could not be returned,
e.g. because the frontend requested only one byte per call.
*/
static int left_over;
@@ -1044,9 +1044,14 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
continue;
}
-
+#ifdef WITH_AVAHI
+ avahi_threaded_poll_lock (avahi_thread);
+#endif /* WITH_AVAHI */
DBG (2, "sane_init: trying to add %s\n", device_name);
add_device (device_name, 0);
+#ifdef WITH_AVAHI
+ avahi_threaded_poll_unlock (avahi_thread);
+#endif /* WITH_AVAHI */
}
fclose (fp);
@@ -1090,8 +1095,14 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
if (host[0] == '\0')
continue;
#endif /* ENABLE_IPV6 */
+#ifdef WITH_AVAHI
+ avahi_threaded_poll_lock (avahi_thread);
+#endif /* WITH_AVAHI */
DBG (2, "sane_init: trying to add %s\n", host);
add_device (host, 0);
+#ifdef WITH_AVAHI
+ avahi_threaded_poll_unlock (avahi_thread);
+#endif /* WITH_AVAHI */
}
free (copy);
}
@@ -1507,7 +1518,13 @@ sane_open (SANE_String_Const full_name, SANE_Handle * meta_handle)
DBG (1,
"sane_open: device %s not found, trying to register it anyway\n",
nd_name);
+#ifdef WITH_AVAHI
+ avahi_threaded_poll_lock (avahi_thread);
+#endif /* WITH_AVAHI */
status = add_device (nd_name, &dev);
+#ifdef WITH_AVAHI
+ avahi_threaded_poll_unlock (avahi_thread);
+#endif /* WITH_AVAHI */
if (status != SANE_STATUS_GOOD)
{
DBG (1, "sane_open: could not open device\n");
diff --git a/backend/niash.c b/backend/niash.c
index 7bc8a25..950df21 100644
--- a/backend/niash.c
+++ b/backend/niash.c
@@ -81,15 +81,14 @@ typedef enum
optGroupEnhancement,
optThreshold,
-
- optLast,
-/* put temporarily disabled options here after optLast */
-
+#ifdef EXPERIMENTAL
optGroupMisc,
optLamp,
optCalibrate,
- optGamma /* analog gamma = single number */
+ optGamma, /* analog gamma = single number */
+#endif
+ optLast
} EOptionIndex;
@@ -150,10 +149,12 @@ static const SANE_Range rangeGammaTable = { 0, 255, 1 };
/* available scanner resolutions */
static const SANE_Int setResolutions[] = { 4, 75, 150, 300, 600 };
+#ifdef EXPERIMENTAL
/* range of an analog gamma */
static const SANE_Range rangeGamma = { SANE_FIX (0.25), SANE_FIX (4.0),
SANE_FIX (0.0)
};
+#endif
/* interpolate a sane gamma table to a hardware appropriate one
just in case the sane gamma table would be smaller */
@@ -260,18 +261,15 @@ _bytesPerLineColor (int pixelsPerLine)
/* dummy*/
static void
-_rgb2rgb (unsigned char *buffer, int pixels, int threshold)
+_rgb2rgb (unsigned char __sane_unused__ *buffer, int __sane_unused__ pixels, int __sane_unused__ threshold)
{
/* make the compiler content */
- buffer = buffer;
- pixels = pixels;
- threshold = threshold;
}
/* convert 24bit RGB to 8bit GRAY */
static void
-_rgb2gray (unsigned char *buffer, int pixels, int threshold)
+_rgb2gray (unsigned char *buffer, int pixels, int __sane_unused__ threshold)
{
#define WEIGHT_R 27
#define WEIGHT_G 54
@@ -283,9 +281,6 @@ _rgb2gray (unsigned char *buffer, int pixels, int threshold)
int acc = 0;
int x;
- /* make the compiler content */
- threshold = threshold;
-
for (x = 0; x < nbyte; ++x)
{
acc += aWeight[x % BYTES_PER_PIXEL_COLOR] * buffer[x];
@@ -685,6 +680,7 @@ _InitOptions (TScanner * s)
pDesc->size = 0;
break;
+#ifdef EXPERIMENTAL
case optGamma:
pDesc->name = SANE_NAME_ANALOG_GAMMA;
pDesc->title = SANE_TITLE_ANALOG_GAMMA;
@@ -695,6 +691,7 @@ _InitOptions (TScanner * s)
pDesc->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
pVal->w = startUpGamma;
break;
+#endif
case optGammaTable:
pDesc->name = SANE_NAME_GAMMA_VECTOR;
@@ -707,6 +704,7 @@ _InitOptions (TScanner * s)
pVal->wa = s->aGammaTable;
break;
+#ifdef EXPERIMENTAL
case optGroupMisc:
pDesc->title = SANE_I18N ("Miscellaneous");
pDesc->type = SANE_TYPE_GROUP;
@@ -731,7 +729,7 @@ _InitOptions (TScanner * s)
pDesc->cap = SANE_CAP_SOFT_SELECT;
pDesc->size = 0;
break;
-
+#endif
case optGroupMode:
pDesc->title = SANE_I18N ("Scan Mode");
pDesc->desc = "";
@@ -824,11 +822,8 @@ _ReportDevice (TScannerModel * pModel, const char *pszDeviceName)
/*****************************************************************************/
SANE_Status
-sane_init (SANE_Int * piVersion, SANE_Auth_Callback pfnAuth)
+sane_init (SANE_Int * piVersion, SANE_Auth_Callback __sane_unused__ pfnAuth)
{
- /* prevent compiler from complaing about unused parameters */
- pfnAuth = pfnAuth;
-
DBG_INIT ();
DBG (DBG_MSG, "sane_init\n");
@@ -869,15 +864,13 @@ sane_exit (void)
SANE_Status
-sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
+sane_get_devices (const SANE_Device *** device_list, SANE_Bool __sane_unused__ local_only)
{
TDevListEntry *pDev;
int i;
DBG (DBG_MSG, "sane_get_devices\n");
- local_only = local_only;
-
if (_pSaneDevList)
{
free (_pSaneDevList);
@@ -984,17 +977,32 @@ sane_control_option (SANE_Handle h, SANE_Int n, SANE_Action Action,
void *pVal, SANE_Int * pInfo)
{
TScanner *s;
- SANE_Bool fVal;
static char szTable[100];
int *pi;
int i;
SANE_Int info;
- SANE_Bool fLampIsOn;
SANE_Status status;
+#ifdef EXPERIMENTAL
+ SANE_Bool fLampIsOn;
+ SANE_Bool fVal;
SANE_Bool fSame;
+#endif
DBG (DBG_MSG, "sane_control_option: option %d, action %d\n", n, Action);
+ if ((n < optCount) || (n >= optLast))
+ {
+ return SANE_STATUS_UNSUPPORTED;
+ }
+
+ if (Action == SANE_ACTION_GET_VALUE || Action == SANE_ACTION_SET_VALUE)
+ {
+ if (pVal == NULL)
+ {
+ return SANE_STATUS_INVAL;
+ }
+ }
+
s = (TScanner *) h;
info = 0;
@@ -1007,7 +1015,9 @@ sane_control_option (SANE_Handle h, SANE_Int n, SANE_Action Action,
/* Get options of type SANE_Word */
case optCount:
case optDPI:
+#ifdef EXPERIMENTAL
case optGamma:
+#endif
case optTLX:
case optTLY:
case optBRX:
@@ -1031,6 +1041,7 @@ sane_control_option (SANE_Handle h, SANE_Int n, SANE_Action Action,
strcpy ((char *) pVal, modeList[s->aValues[optMode].w]);
break;
+#ifdef EXPERIMENTAL
/* Get options of type SANE_Bool */
case optLamp:
GetLamp (&s->HWParams, &fLampIsOn);
@@ -1041,6 +1052,7 @@ sane_control_option (SANE_Handle h, SANE_Int n, SANE_Action Action,
/* although this option has nothing to read,
it's added here to avoid a warning when running scanimage --help */
break;
+#endif
default:
DBG (DBG_MSG, "SANE_ACTION_GET_VALUE: Invalid option (%d)\n", n);
@@ -1061,7 +1073,9 @@ sane_control_option (SANE_Handle h, SANE_Int n, SANE_Action Action,
case optCount:
return SANE_STATUS_INVAL;
+#ifdef EXPERIMENTAL
case optGamma:
+#endif
case optThreshold:
case optDPI:
@@ -1081,14 +1095,17 @@ sane_control_option (SANE_Handle h, SANE_Int n, SANE_Action Action,
return status;
}
+#ifdef EXPERIMENTAL
/* check values if they are equal */
fSame = s->aValues[n].w == *(SANE_Word *) pVal;
+#endif
/* set the values */
s->aValues[n].w = *(SANE_Word *) pVal;
DBG (DBG_MSG,
"sane_control_option: SANE_ACTION_SET_VALUE %d = %d\n", n,
(int) s->aValues[n].w);
+#ifdef EXPERIMENTAL
if (n == optGamma)
{
if (!fSame && optLast > optGammaTable)
@@ -1097,6 +1114,7 @@ sane_control_option (SANE_Handle h, SANE_Int n, SANE_Action Action,
}
_SetScalarGamma (s->aGammaTable, s->aValues[n].w);
}
+#endif
break;
case optGammaTable:
@@ -1159,6 +1177,7 @@ sane_control_option (SANE_Handle h, SANE_Int n, SANE_Action Action,
+#ifdef EXPERIMENTAL
case optLamp:
fVal = *(SANE_Bool *) pVal;
DBG (DBG_MSG, "lamp %s\n", fVal ? "on" : "off");
@@ -1171,6 +1190,7 @@ sane_control_option (SANE_Handle h, SANE_Int n, SANE_Action Action,
case optCalibrate:
/* SimpleCalib(&s->HWParams); */
break;
+#endif
default:
DBG (DBG_ERR, "SANE_ACTION_SET_VALUE: Invalid option (%d)\n", n);
@@ -1458,13 +1478,10 @@ sane_cancel (SANE_Handle h)
SANE_Status
-sane_set_io_mode (SANE_Handle h, SANE_Bool m)
+sane_set_io_mode (SANE_Handle __sane_unused__ h, SANE_Bool m)
{
DBG (DBG_MSG, "sane_set_io_mode %s\n", m ? "non-blocking" : "blocking");
- /* prevent compiler from complaining about unused parameters */
- h = h;
-
if (m)
{
return SANE_STATUS_UNSUPPORTED;
@@ -1474,13 +1491,8 @@ sane_set_io_mode (SANE_Handle h, SANE_Bool m)
SANE_Status
-sane_get_select_fd (SANE_Handle h, SANE_Int * fd)
+sane_get_select_fd (SANE_Handle __sane_unused__ h, SANE_Int * __sane_unused__ fd)
{
DBG (DBG_MSG, "sane_select_fd\n");
-
- /* prevent compiler from complaining about unused parameters */
- h = h;
- fd = fd;
-
return SANE_STATUS_UNSUPPORTED;
}
diff --git a/backend/pieusb.c b/backend/pieusb.c
new file mode 100644
index 0000000..4b07304
--- /dev/null
+++ b/backend/pieusb.c
@@ -0,0 +1,1422 @@
+/* sane - Scanner Access Now Easy.
+
+ pieusb.c
+
+ Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+/* =========================================================================
+ *
+ * SANE interface to three Reflecta USB scanners with USB-id 0x05e3/0x0145:
+ * - Reflecta CrystalScan 7200 (model id 0x30)
+ * - Reflecta ProScan 7200 (model id 0x36)
+ * - Reflecta 6000 Multiple Slide Scanner (model id 0x3A)
+ *
+ * ========================================================================= */
+
+#define DEBUG_NOT_STATIC
+/* --------------------------------------------------------------------------
+ *
+ * INCLUDES
+ *
+ * --------------------------------------------------------------------------*/
+
+#include "../include/sane/config.h"
+/* Standard includes for various utiliy functions */
+#include <stdio.h> /* for FILE */
+#include <string.h> /* for strlen */
+#include <stdlib.h> /* for NULL */
+#include <stdint.h>
+#include <math.h>
+
+/* Configuration defines */
+#include "../include/sane/config.h"
+
+/* SANE includes */
+#include "../include/sane/sane.h"
+#include "../include/sane/saneopts.h"
+#include "../include/sane/sanei_usb.h"
+#include "../include/sane/sanei_config.h"
+
+/* Backend includes */
+#define BACKEND_NAME pieusb
+#include "../include/sane/sanei_backend.h"
+#include "pieusb.h"
+#include "pieusb_specific.h"
+
+#define CAN_DO_4_CHANNEL_TIFF
+
+#ifdef CAN_DO_4_CHANNEL_TIFF
+extern void write_tiff_rgbi_header (FILE *fptr, int width, int height, int depth, int resolution, const char *icc_profile);
+#endif
+
+/* --------------------------------------------------------------------------
+ *
+ * DEFINES
+ *
+ * --------------------------------------------------------------------------*/
+
+/* Build number of this backend */
+#define BUILD 1
+
+/* Configuration filename */
+#define PIEUSB_CONFIG_FILE "pieusb.conf"
+
+/* Debug error levels */
+#define DBG_error 1 /* errors */
+#define DBG_warning 3 /* warnings */
+#define DBG_info 5 /* information */
+#define DBG_info_sane 7 /* information sane interface level */
+#define DBG_inquiry 8 /* inquiry data */
+#define DBG_info_proc 9 /* information pieusb backend functions */
+#define DBG_info_scan 11 /* information scanner commands */
+#define DBG_info_usb 13 /* information usb level functions */
+
+/* --------------------------------------------------------------------------
+ *
+ * SUPPORTED DEVICES SPECIFICS
+ *
+ * --------------------------------------------------------------------------*/
+
+struct Pieusb_USB_Device_Entry* pieusb_supported_usb_device_list = NULL;
+struct Pieusb_USB_Device_Entry pieusb_supported_usb_device; /* for searching */
+
+/* --------------------------------------------------------------------------
+ *
+ * LISTS OF ACTIVE DEVICE DEFINITIONS AND SCANNERS
+ *
+ * --------------------------------------------------------------------------*/
+
+Pieusb_Device_Definition *pieusb_definition_list_head = NULL;
+static Pieusb_Scanner *first_handle = NULL;
+static const SANE_Device **devlist = NULL;
+
+/* --------------------------------------------------------------------------
+ *
+ * SANE INTERFACE
+ *
+ * --------------------------------------------------------------------------*/
+
+/**
+ * Initializes the debugging system, the USB system, the version code and
+ * 'attaches' available scanners, i.e. creates device definitions for all
+ * scanner devices found.
+ *
+ * @param version_code
+ * @param authorize
+ * @return SANE_STATUS_GOOD
+ */
+SANE_Status
+sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize)
+{
+ FILE *fp;
+ char config_line[PATH_MAX];
+ SANE_Word vendor_id;
+ SANE_Word product_id;
+ SANE_Word model_number;
+ SANE_Status status;
+ int i;
+
+ /* Initialize debug logging */
+ DBG_INIT ();
+
+ DBG (DBG_info_sane, "sane_init() build %d\n", BUILD);
+
+ /* Set version code to current major, minor and build number */
+ /* TODO: use V_MINOR instead or SANE_CURRENT_MINOR? If so, why? */
+ if (version_code)
+ *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD);
+
+ /* Initialize usb */
+ sanei_usb_init ();
+ sanei_usb_set_timeout (30 * 1000); /* 30 sec timeout */
+
+ /* There are currently 3 scanners hardcoded into this backend, see below.
+ * The config file may add other scanners using a line like
+ * usb 0x1234 0x5678 0x9A
+ * where the first two hex numbers are vendor and product id, and the last
+ * number is the model number. Unfortunately, this is not according to the
+ * config file standard. Anyone any suggestions? */
+
+ /* Create default list */
+ pieusb_supported_usb_device_list = calloc (4, sizeof(struct Pieusb_USB_Device_Entry));
+ if (pieusb_supported_usb_device_list == NULL)
+ return SANE_STATUS_NO_MEM;
+ /* Reflecta CrystalScan 7200, model number 0x30 */
+ pieusb_supported_usb_device_list[0].vendor = 0x05e3;
+ pieusb_supported_usb_device_list[0].product = 0x0145;
+ pieusb_supported_usb_device_list[0].model = 0x30;
+ /* Reflecta ProScan 7200, model number 0x36 */
+ pieusb_supported_usb_device_list[1].vendor = 0x05e3;
+ pieusb_supported_usb_device_list[1].product = 0x0145;
+ pieusb_supported_usb_device_list[1].model = 0x36;
+ /* Reflecta 6000 Multiple Slide Scanner */
+ pieusb_supported_usb_device_list[2].vendor = 0x05e3;
+ pieusb_supported_usb_device_list[2].product = 0x0142;
+ pieusb_supported_usb_device_list[2].model = 0x3a;
+ /* end of list */
+ pieusb_supported_usb_device_list[3].vendor = 0;
+ pieusb_supported_usb_device_list[3].product = 0;
+ pieusb_supported_usb_device_list[3].model = 0;
+
+ /* Add entries from config file */
+ fp = sanei_config_open (PIEUSB_CONFIG_FILE);
+ if (!fp) {
+ DBG (DBG_info_sane, "sane_init() did not find a config file, using default list of supported devices\n");
+ } else {
+ while (sanei_config_read (config_line, sizeof (config_line), fp)) {
+ /* Ignore line comments and empty lines */
+ if (config_line[0] == '#') continue;
+ if (strlen (config_line) == 0) continue;
+ /* Ignore lines which do not begin with 'usb ' */
+ if (strncmp (config_line, "usb ", 4) != 0) continue;
+ /* Parse vendor-id, product-id and model number and add to list */
+ DBG (DBG_info_sane, "sane_init() config file parsing %s\n", config_line);
+ status = sanei_pieusb_parse_config_line(config_line, &vendor_id, &product_id, &model_number);
+ if (status == SANE_STATUS_GOOD) {
+ DBG (DBG_info_sane, "sane_init() config file lists device %04x %04x %02x\n",vendor_id, product_id, model_number);
+ if (!sanei_pieusb_supported_device_list_contains(vendor_id, product_id, model_number)) {
+ DBG (DBG_info_sane, "sane_init() adding device %04x %04x %02x\n",vendor_id, product_id, model_number);
+ sanei_pieusb_supported_device_list_add(vendor_id, product_id, model_number);
+ } else {
+ DBG (DBG_info_sane, "sane_init() list already contains %04x %04x %02x\n", vendor_id, product_id, model_number);
+ }
+ } else {
+ DBG (DBG_info_sane, "sane_init() config file parsing %s: error\n", config_line);
+ }
+ }
+ fclose (fp);
+ }
+
+ /* Loop through supported device list */
+ i = 0;
+ while (pieusb_supported_usb_device_list[i].vendor != 0) {
+ /* Check if the supported device is present. If so, create a device
+ * definition structure for it.
+ * The variable pieusb_supported_usb_device is set to current values,
+ * which are used in the callback. */
+ pieusb_supported_usb_device.vendor = pieusb_supported_usb_device_list[i].vendor;
+ pieusb_supported_usb_device.product = pieusb_supported_usb_device_list[i].product;
+ pieusb_supported_usb_device.model = pieusb_supported_usb_device_list[i].model;
+ pieusb_supported_usb_device.device_number = -1; /* No device number (yet) */
+ DBG( DBG_info_sane, "sane_init() looking for Reflecta scanner %04x %04x model %02x\n", pieusb_supported_usb_device.vendor, pieusb_supported_usb_device.product, pieusb_supported_usb_device.model);
+ sanei_usb_find_devices (pieusb_supported_usb_device.vendor, pieusb_supported_usb_device.product, sanei_pieusb_find_device_callback);
+ i++;
+ }
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Backend exit.
+ * Clean up allocated memory.
+ */
+void
+sane_exit (void)
+{
+ Pieusb_Device_Definition *dev, *next;
+
+ DBG (DBG_info_sane, "sane_exit()\n");
+
+ for (dev = pieusb_definition_list_head; dev; dev = next) {
+ next = dev->next;
+ free((void *)dev->sane.name);
+ free((void *)dev->sane.vendor);
+ free((void *)dev->sane.model);
+ free (dev->version);
+ free (dev);
+ }
+ pieusb_definition_list_head = NULL;
+
+ if (devlist) {
+ free (devlist);
+ devlist = NULL;
+ }
+}
+
+/**
+ * Create a SANE device list from the device list generated by sane_init().
+ *
+ * @param device_list List of SANE_Device elements
+ * @param local_only If true, disregard network scanners. Not applicable for USB scanners.
+ * @return SANE_STATUS_GOOD, or SANE_STATUS_NO_MEM if the list cannot be allocated
+ */
+SANE_Status
+sane_get_devices (const SANE_Device *** device_list, SANE_Bool __sane_unused__ local_only)
+{
+ Pieusb_Device_Definition *dev;
+ int i;
+
+ DBG (DBG_info_sane, "sane_get_devices\n");
+
+ /* Create SANE_DEVICE list from device list created in sane_init() */
+ i = 0;
+ for (dev = pieusb_definition_list_head; dev; dev = dev->next) {
+ i++;
+ }
+ if (devlist) {
+ free (devlist);
+ }
+ devlist = malloc ((i + 1) * sizeof (devlist[0]));
+ if (!devlist) {
+ return SANE_STATUS_NO_MEM;
+ }
+ i = 0;
+ for (dev = pieusb_definition_list_head; dev; dev = dev->next) {
+ devlist[i++] = &dev->sane;
+ }
+ devlist[i] = NULL;
+ *device_list = devlist;
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Open the scanner with the given devicename and return a handle to it, which
+ * is a pointer to a Pieusb_Scanner struct. The handle will be an input to
+ * a couple of other functions of the SANE interface.
+ *
+ * @param devicename Name of the device, corresponds to SANE_Device.name
+ * @param handle handle to scanner (pointer to a Pieusb_Scanner struct)
+ * @return SANE_STATUS_GOOD if the device has been opened
+ */
+SANE_Status
+sane_open (SANE_String_Const devicename, SANE_Handle * handle)
+{
+ Pieusb_Device_Definition *dev;
+ SANE_Status status;
+ Pieusb_Scanner *scanner, *s;
+
+ DBG (DBG_info_sane, "sane_open(%s)\n", devicename);
+
+ /* Search for devicename */
+ if (devicename[0]) {
+ for (dev = pieusb_definition_list_head; dev; dev = dev->next) {
+ if (strcmp (dev->sane.name, devicename) == 0) {
+ break;
+ }
+ }
+ if (!dev) {
+ /* Is it a valid USB device? */
+ SANE_Word vendor;
+ SANE_Word product;
+ int i = 0;
+
+ status = sanei_usb_get_vendor_product_byname (devicename, &vendor, &product);
+ if (status != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "sane_open: sanei_usb_get_vendor_product_byname failed %s\n", devicename);
+ return status;
+ }
+ /* Get vendor-product-model & verify that is is supported */
+ /* Loop through supported device list */
+ while (pieusb_supported_usb_device_list[i].vendor != 0) {
+ /* Check if vendor and product match */
+ if (pieusb_supported_usb_device_list[i].vendor == vendor
+ && pieusb_supported_usb_device_list[i].product == product) {
+ /* Check if a supported device is present
+ * If so, create a device definition structure for it. */
+ /* Set pieusb_supported_usb_device to current values: these are used in callback */
+ pieusb_supported_usb_device.vendor = vendor;
+ pieusb_supported_usb_device.product = product;
+ pieusb_supported_usb_device.model = pieusb_supported_usb_device_list[i].model;
+ pieusb_supported_usb_device.device_number = -1;
+ sanei_usb_find_devices (vendor, product, sanei_pieusb_find_device_callback);
+ if (pieusb_supported_usb_device.device_number == -1) {
+ /* Did not succeed in opening the USB device, which is an error.
+ * This error is not caught by sanei_usb_find_devices(), so handle
+ * it here. */
+ DBG (DBG_error, "sane_open: sanei_usb_find_devices did not open device %s\n", devicename);
+ return SANE_STATUS_INVAL;
+ }
+ }
+ i++;
+ }
+ /* Now rescan the device list to see if it is present */
+ for (dev = pieusb_definition_list_head; dev; dev = dev->next) {
+ if (strcmp (dev->sane.name, devicename) == 0) {
+ break;
+ }
+ }
+ }
+ } else {
+ /* empty devicename -> use first device */
+ dev = pieusb_definition_list_head;
+ }
+ /* If no device found, return error */
+ if (!dev) {
+ return SANE_STATUS_INVAL;
+ }
+
+ /* Now create a scanner structure to return */
+
+ /* Check if we are not opening the same scanner again. */
+ for (s = first_handle; s; s = s->next) {
+ if (s->device->sane.name == devicename) {
+ *handle = s;
+ return SANE_STATUS_GOOD;
+ }
+ }
+
+ /* Create a new scanner instance */
+ scanner = malloc (sizeof (*scanner));
+ if (!scanner) {
+ return SANE_STATUS_NO_MEM;
+ }
+ memset (scanner, 0, sizeof (*scanner));
+ scanner->device = dev;
+ sanei_usb_open (dev->sane.name, &scanner->device_number);
+ scanner->cancel_request = 0;
+ scanner->shading_data_present = SANE_FALSE;
+ /* Options and buffers */
+ (void)sanei_pieusb_init_options (scanner);
+
+ /* wait for warmup */
+ status = sanei_pieusb_wait_ready (scanner, 0);
+ if (status != SANE_STATUS_GOOD) {
+ sanei_usb_close(scanner->device_number);
+ free (scanner);
+ DBG (DBG_error, "sane_open: scanner not ready\n");
+ return status;
+ }
+
+ /* First time settings */
+ /* ? */
+ /* Insert newly opened handle into list of open handles: */
+ scanner->next = first_handle;
+ first_handle = scanner;
+
+ *handle = scanner;
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Close the scanner and remove the scanner from the list of active scanners.
+ *
+ * @param handle Scanner handle
+ */
+void
+sane_close (SANE_Handle handle)
+{
+ Pieusb_Scanner *prev, *scanner;
+ SANE_Int k;
+
+ DBG (DBG_info_sane, "sane_close()\n");
+
+ /* Find handle in list of open handles: */
+ prev = 0;
+ for (scanner = first_handle; scanner; scanner = scanner->next) {
+ if (scanner == handle) {
+ break;
+ }
+ prev = scanner;
+ }
+ /* Not a handle we know about. This may happen since all different backend
+ * scanner instances are all cast to SANE_Handle (a void pointer) */
+ if (!scanner) {
+ DBG (DBG_error, "sane_close(): invalid handle %p\n", handle);
+ return;
+ }
+
+ /* Stop scan if still scanning */
+ if (scanner->scanning) {
+ sanei_pieusb_on_cancel(scanner);
+ }
+
+ /* USB scanners may be still open here */
+ if (scanner->device_number >= 0) {
+ sanei_usb_reset (scanner->device_number);
+ sanei_usb_close (scanner->device_number);
+ }
+ /* Remove handle from list */
+ if (prev) {
+ prev->next = scanner->next;
+ } else {
+ first_handle = scanner->next;
+ }
+
+ /* Free scanner related allocated memory and the scanner itself */
+ /*TODO: check if complete */
+ if (scanner->buffer.data) sanei_pieusb_buffer_delete(&scanner->buffer);
+ free (scanner->ccd_mask);
+ for (k=0; k<4; k++) free (scanner->shading_ref[k]);
+ free (scanner->val[OPT_MODE].s);
+ free (scanner->val[OPT_HALFTONE_PATTERN].s);
+ free (scanner);
+}
+
+/**
+ * Get option descriptor. Return the option descriptor with the given index
+ *
+ * @param handle Scanner handle
+ * @param option Index of option descriptor to return
+ * @return The option descriptor
+ */
+const SANE_Option_Descriptor *
+sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
+{
+ Pieusb_Scanner *scanner = handle;
+
+ DBG (DBG_info_proc, "sane_get_option_descriptor() option=%d\n", option);
+
+ if ((unsigned) option >= NUM_OPTIONS)
+ {
+ return 0;
+ }
+
+ return scanner->opt + option;
+}
+
+/**
+ * Set or inquire the current value of option number 'option' of the device
+ * represented by the given handle.
+ *
+ * @param handle Scanner handle
+ * @param option Index of option to set or get
+ * @param action Determines if the option value is read or set
+ * @param val Pointer to value to set or get
+ * @param info About set result. May be NULL.
+ * @return SANE_STATUS_GOOD, or SANE_STATUS_INVAL if a parameter cannot be set
+ */
+SANE_Status
+sane_control_option (SANE_Handle handle, SANE_Int option, SANE_Action action,
+ void *val, SANE_Int * info)
+{
+ Pieusb_Scanner *scanner = handle;
+ SANE_Status status;
+ SANE_Word cap;
+ SANE_String_Const name;
+
+ DBG(DBG_info_sane,"sane_control_option()\n");
+ if (info) {
+ *info = 0;
+ }
+
+ /* Don't set or get options while the scanner is busy */
+ if (scanner->scanning) {
+ DBG(DBG_error,"Device busy scanning, no option returned\n");
+ return SANE_STATUS_DEVICE_BUSY;
+ }
+
+ /* Check if option index is between bounds */
+ if ((unsigned) option >= NUM_OPTIONS) {
+ DBG(DBG_error,"Index too large, no option returned\n");
+ return SANE_STATUS_INVAL;
+ }
+
+ /* Check if option is switched on */
+ cap = scanner->opt[option].cap;
+ if (!SANE_OPTION_IS_ACTIVE (cap))
+ {
+ DBG(DBG_error,"Option inactive (%s)\n", scanner->opt[option].name);
+ return SANE_STATUS_INVAL;
+ }
+
+ /* Get name of option */
+ name = scanner->opt[option].name;
+ if (!name)
+ {
+ name = "(no name)";
+ }
+
+ /* */
+ switch (action) {
+ case SANE_ACTION_GET_VALUE:
+
+ DBG (DBG_info_sane, "get %s [#%d]\n", name, option);
+
+ switch (option) {
+
+ /* word options: */
+ case OPT_NUM_OPTS:
+ case OPT_BIT_DEPTH:
+ case OPT_RESOLUTION:
+ case OPT_TL_X:
+ case OPT_TL_Y:
+ case OPT_BR_X:
+ case OPT_BR_Y:
+ case OPT_THRESHOLD:
+ case OPT_SHARPEN:
+ case OPT_SHADING_ANALYSIS:
+ case OPT_FAST_INFRARED:
+ case OPT_ADVANCE_SLIDE:
+ case OPT_CORRECT_SHADING:
+ case OPT_CORRECT_INFRARED:
+ case OPT_CLEAN_IMAGE:
+ case OPT_SMOOTH_IMAGE:
+ case OPT_TRANSFORM_TO_SRGB:
+ case OPT_INVERT_IMAGE:
+ case OPT_PREVIEW:
+ case OPT_SAVE_SHADINGDATA:
+ case OPT_SAVE_CCDMASK:
+ case OPT_LIGHT:
+ case OPT_DOUBLE_TIMES:
+ case OPT_SET_EXPOSURE_R:
+ case OPT_SET_EXPOSURE_G:
+ case OPT_SET_EXPOSURE_B:
+ case OPT_SET_EXPOSURE_I:
+ case OPT_SET_GAIN_R:
+ case OPT_SET_GAIN_G:
+ case OPT_SET_GAIN_B:
+ case OPT_SET_GAIN_I:
+ case OPT_SET_OFFSET_R:
+ case OPT_SET_OFFSET_G:
+ case OPT_SET_OFFSET_B:
+ case OPT_SET_OFFSET_I:
+ *(SANE_Word *) val = scanner->val[option].w;
+ DBG (DBG_info_sane, "get %s [#%d] val=%d\n", name, option,scanner->val[option].w);
+ return SANE_STATUS_GOOD;
+
+ /* word-array options: => for exposure gain offset? */
+ case OPT_CROP_IMAGE:
+ memcpy (val, scanner->val[option].wa, scanner->opt[option].size);
+ return SANE_STATUS_GOOD;
+
+ /* string options */
+ case OPT_MODE:
+ case OPT_CALIBRATION_MODE:
+ case OPT_GAIN_ADJUST:
+ case OPT_HALFTONE_PATTERN:
+ strcpy (val, scanner->val[option].s);
+ DBG (DBG_info_sane, "get %s [#%d] val=%s\n", name, option,scanner->val[option].s);
+ return SANE_STATUS_GOOD;
+ }
+ break;
+
+ case SANE_ACTION_SET_VALUE:
+
+ switch (scanner->opt[option].type) {
+ case SANE_TYPE_INT:
+ DBG (DBG_info_sane, "set %s [#%d] to %d, size=%d\n", name, option, *(SANE_Word *) val, scanner->opt[option].size);
+ break;
+ case SANE_TYPE_FIXED:
+ DBG (DBG_info_sane, "set %s [#%d] to %f\n", name, option, SANE_UNFIX (*(SANE_Word *) val));
+ break;
+ case SANE_TYPE_STRING:
+ DBG (DBG_info_sane, "set %s [#%d] to %s\n", name, option, (char *) val);
+ break;
+ case SANE_TYPE_BOOL:
+ DBG (DBG_info_sane, "set %s [#%d] to %d\n", name, option, *(SANE_Word *) val);
+ break;
+ default:
+ DBG (DBG_info_sane, "set %s [#%d]\n", name, option);
+ }
+ /* Check if option can be set */
+ if (!SANE_OPTION_IS_SETTABLE (cap)) {
+ return SANE_STATUS_INVAL;
+ }
+ /* Check if new value within bounds */
+ status = sanei_constrain_value (scanner->opt + option, val, info);
+ if (status != SANE_STATUS_GOOD) {
+ return status;
+ }
+ /* Set option and handle info return */
+ switch (option)
+ {
+ /* (mostly) side-effect-free word options: */
+ case OPT_BIT_DEPTH:
+ case OPT_RESOLUTION:
+ case OPT_TL_X:
+ case OPT_TL_Y:
+ case OPT_BR_X:
+ case OPT_BR_Y:
+ case OPT_SHARPEN:
+ case OPT_SHADING_ANALYSIS:
+ case OPT_FAST_INFRARED:
+ if (info) {
+ *info |= SANE_INFO_RELOAD_PARAMS;
+ }
+ /* fall through */
+ case OPT_NUM_OPTS:
+ case OPT_PREVIEW:
+ case OPT_ADVANCE_SLIDE:
+ case OPT_CORRECT_SHADING:
+ case OPT_CORRECT_INFRARED:
+ case OPT_CLEAN_IMAGE:
+ case OPT_SMOOTH_IMAGE:
+ case OPT_TRANSFORM_TO_SRGB:
+ case OPT_INVERT_IMAGE:
+ case OPT_SAVE_SHADINGDATA:
+ case OPT_SAVE_CCDMASK:
+ case OPT_THRESHOLD:
+ case OPT_LIGHT:
+ case OPT_DOUBLE_TIMES:
+ case OPT_SET_GAIN_R:
+ case OPT_SET_GAIN_G:
+ case OPT_SET_GAIN_B:
+ case OPT_SET_GAIN_I:
+ case OPT_SET_OFFSET_R:
+ case OPT_SET_OFFSET_G:
+ case OPT_SET_OFFSET_B:
+ case OPT_SET_OFFSET_I:
+ case OPT_SET_EXPOSURE_R:
+ case OPT_SET_EXPOSURE_G:
+ case OPT_SET_EXPOSURE_B:
+ case OPT_SET_EXPOSURE_I:
+ scanner->val[option].w = *(SANE_Word *) val;
+ break;
+
+ /* side-effect-free word-array options: */
+ case OPT_CROP_IMAGE:
+ memcpy (scanner->val[option].wa, val, scanner->opt[option].size);
+ break;
+
+ /* options with side-effects: */
+ case OPT_MODE:
+ {
+ /* Free current setting */
+ if (scanner->val[option].s) {
+ free (scanner->val[option].s);
+ }
+ /* New setting */
+ scanner->val[option].s = (SANE_Char *) strdup (val);
+ /* Info */
+ if (info) {
+ *info |= SANE_INFO_RELOAD_OPTIONS | SANE_INFO_RELOAD_PARAMS;
+ }
+ break;
+ }
+
+ case OPT_CALIBRATION_MODE:
+ case OPT_GAIN_ADJUST:
+ case OPT_HALFTONE_PATTERN:
+ {
+ /* Free current setting */
+ if (scanner->val[option].s) {
+ free (scanner->val[option].s);
+ }
+ /* New setting */
+ scanner->val[option].s = (SANE_Char *) strdup (val);
+ break;
+ }
+
+ }
+
+ /* Check the whole set */
+ if (sanei_pieusb_analyse_options(scanner)) {
+ return SANE_STATUS_GOOD;
+ } else {
+ return SANE_STATUS_INVAL;
+ }
+
+ break;
+ default:
+ return SANE_STATUS_INVAL;
+ break;
+ }
+ return SANE_STATUS_INVAL;
+}
+
+/**
+ * Obtain the current scan parameters. The returned parameters are guaranteed
+ * to be accurate between the time a scan has been started (sane start() has
+ * been called) and the completion of that request. Outside of that window, the
+ * returned values are best-effort estimates of what the parameters will be when
+ * sane start() gets invoked. - says the SANE standard.
+ *
+ * @param handle Scanner handle
+ * @param params Scan parameters
+ * @return SANE_STATUS_GOOD
+ */
+SANE_Status
+sane_get_parameters (SANE_Handle handle, SANE_Parameters * params)
+{
+ Pieusb_Scanner *scanner = handle;
+ const char *mode;
+ double resolution, width, height;
+ SANE_Int colors;
+
+ DBG (DBG_info_sane, "sane_get_parameters\n");
+
+ if (params) {
+
+ if (scanner->scanning) {
+ /* sane_start() initialized a SANE_Parameters struct in the scanner */
+ DBG (DBG_info_sane, "sane_get_parameters from scanner values\n");
+ params->bytes_per_line = scanner->scan_parameters.bytes_per_line;
+ params->depth = scanner->scan_parameters.depth;
+ params->format = scanner->scan_parameters.format;
+ params->last_frame = scanner->scan_parameters.last_frame;
+ params->lines = scanner->scan_parameters.lines;
+ params->pixels_per_line = scanner->scan_parameters.pixels_per_line;
+ } else {
+ /* Calculate appropriate values from option settings */
+ DBG (DBG_info_sane, "sane_get_parameters from option values\n");
+ if (scanner->val[OPT_PREVIEW].b) {
+ resolution = scanner->device->fast_preview_resolution;
+ } else {
+ resolution = SANE_UNFIX(scanner->val[OPT_RESOLUTION].w);
+ }
+ DBG (DBG_info_sane, " resolution %f\n", resolution);
+ width = SANE_UNFIX(scanner->val[OPT_BR_X].w)-SANE_UNFIX(scanner->val[OPT_TL_X].w);
+ height = SANE_UNFIX(scanner->val[OPT_BR_Y].w)-SANE_UNFIX(scanner->val[OPT_TL_Y].w);
+ DBG (DBG_info_sane, " width x height: %f x %f\n", width, height);
+ params->lines = height / MM_PER_INCH * resolution;
+ params->pixels_per_line = width / MM_PER_INCH * resolution;
+ mode = scanner->val[OPT_MODE].s;
+ if (strcmp(mode, SANE_VALUE_SCAN_MODE_LINEART) == 0) {
+ params->format = SANE_FRAME_GRAY;
+ params->depth = 1;
+ colors = 1;
+ } else if(strcmp(mode, SANE_VALUE_SCAN_MODE_HALFTONE) == 0) {
+ params->format = SANE_FRAME_GRAY;
+ params->depth = 1;
+ colors = 1;
+ } else if(strcmp(mode, SANE_VALUE_SCAN_MODE_GRAY) == 0) {
+ params->format = SANE_FRAME_GRAY;
+ params->depth = scanner->val[OPT_BIT_DEPTH].w;
+ colors = 1;
+ } else if(strcmp(mode, SANE_VALUE_SCAN_MODE_RGBI) == 0) {
+ params->format = SANE_FRAME_RGB; /* was: SANE_FRAME_RGBI */
+ params->depth = scanner->val[OPT_BIT_DEPTH].w;
+ colors = 4;
+ } else { /* SANE_VALUE_SCAN_MODE_COLOR */
+ params->format = SANE_FRAME_RGB;
+ params->depth = scanner->val[OPT_BIT_DEPTH].w;
+ colors = 3;
+ }
+ DBG (DBG_info_sane, " colors: %d\n", colors);
+ if (params->depth == 1) {
+ params->bytes_per_line = colors * (params->pixels_per_line + 7)/8;
+ } else if (params->depth <= 8) {
+ params->bytes_per_line = colors * params->pixels_per_line;
+ } else if (params->depth <= 16) {
+ params->bytes_per_line = 2 * colors * params->pixels_per_line;
+ }
+ params->last_frame = SANE_TRUE;
+ }
+
+ DBG(DBG_info_sane,"sane_get_parameters(): SANE parameters\n");
+ DBG(DBG_info_sane," format = %d\n",params->format);
+ DBG(DBG_info_sane," last_frame = %d\n",params->last_frame);
+ DBG(DBG_info_sane," bytes_per_line = %d\n",params->bytes_per_line);
+ DBG(DBG_info_sane," pixels_per_line = %d\n",params->pixels_per_line);
+ DBG(DBG_info_sane," lines = %d\n",params->lines);
+ DBG(DBG_info_sane," depth = %d\n",params->depth);
+
+ } else {
+
+ DBG(DBG_info_sane," no params argument, no values returned\n");
+
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Initiates aquisition of an image from the scanner.
+ * SCAN Phase 1: initialization and calibration
+ * (SCAN Phase 2: line-by-line scan & read is not implemented)
+ * SCAN Phase 3: get CCD-mask
+ * SCAN phase 4: scan slide and save data in scanner buffer
+
+ * @param handle Scanner handle
+ * @return
+ */
+SANE_Status
+sane_start (SANE_Handle handle)
+{
+ struct Pieusb_Scanner *scanner = handle;
+ struct Pieusb_Command_Status status;
+ SANE_Byte colors;
+ const char *mode;
+ SANE_Bool shading_correction_relevant;
+ SANE_Bool infrared_post_processing_relevant;
+ SANE_Status st;
+ SANE_Int bytes_per_line;
+
+ SANE_Int shading_width;
+ SANE_Int shading_idx;
+
+ struct Pieusb_Exposure_Time exptime = {
+ 0x93, /* code 0x93 */
+ 3 * 2 * sizeof(SANE_Int), /* number of bytes in rest of structure */
+ { { 0x02, 100 }, { 0x04, 100 }, { 0x08, 100 } }
+ };
+
+ struct Pieusb_Highlight_Shadow shadow = {
+ 0x94, /* code 0x94 */
+ 3 * 2 * sizeof(SANE_Int), /* number of bytes in rest of structure */
+ { { 0x02, 100 }, { 0x04, 100 }, { 0x08, 100 } }
+ };
+
+ DBG (DBG_info_sane, "sane_start()\n");
+
+ /* ----------------------------------------------------------------------
+ *
+ * Exit if currently scanning
+ *
+ * ---------------------------------------------------------------------- */
+ if (scanner->scanning) {
+ DBG (DBG_error, "sane_start(): scanner is already scanning, exiting\n");
+ return SANE_STATUS_DEVICE_BUSY;
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Exit with pause if not warmed up
+ *
+ * ---------------------------------------------------------------------- */
+
+ sanei_pieusb_cmd_read_state (scanner->device_number, &(scanner->state), &status);
+ if (status.pieusb_status != PIEUSB_STATUS_GOOD) {
+ if (status.pieusb_status == PIEUSB_STATUS_DEVICE_BUSY)
+ return SANE_STATUS_DEVICE_BUSY; /* was: SANE_STATUS_WARMING_UP */
+ DBG (DBG_error, "sane_start(): warmed up check returns status: %s\n", sane_strstatus (sanei_pieusb_convert_status(status.pieusb_status)));
+ return SANE_STATUS_IO_ERROR;
+ }
+ if (scanner->state.warmingUp) {
+ DBG (DBG_error, "sane_start(): warming up, exiting\n");
+ /* Seen SANE_STATUS_WARMING_UP in scanimage => enabled */
+ sleep (10); /* scanimage does not pause, so do it here */
+ return SANE_STATUS_DEVICE_BUSY; /* was: SANE_STATUS_WARMING_UP */
+ }
+
+ /* ----------------------------------------------------------------------
+ * set exposure time
+ * ---------------------------------------------------------------------- */
+
+ sanei_pieusb_cmd_set_exposure_time (scanner->device_number, &exptime, &status);
+ if (status.pieusb_status != PIEUSB_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start(): sanei_pieusb_cmd_set_exposure_time failed: %d\n", status.pieusb_status);
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* ----------------------------------------------------------------------
+ * set highlight shadow
+ * ---------------------------------------------------------------------- */
+
+ sanei_pieusb_cmd_set_highlight_shadow (scanner->device_number, &shadow, &status);
+ if (status.pieusb_status != PIEUSB_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start(): sanei_pieusb_cmd_set_highlight_shadow failed: %d\n", status.pieusb_status);
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* ----------------------------------------------------------------------
+ * get calibration info
+ * ---------------------------------------------------------------------- */
+
+ sanei_pieusb_cmd_get_shading_parms (scanner->device_number, scanner->device->shading_parameters, &status);
+ if (status.pieusb_status != PIEUSB_STATUS_GOOD) {
+ DBG (DBG_error, "sane_scan: sanei_pieusb_cmd_get_shading_parms failed: %d\n", status.pieusb_status);
+ return SANE_STATUS_INVAL;
+ }
+ shading_width = scanner->device->shading_parameters[0].pixelsPerLine;
+ DBG (DBG_info, "shading_width %d\n", shading_width);
+ for (shading_idx = 0; shading_idx < SHADING_PARAMETERS_INFO_COUNT; shading_idx++) {
+ scanner->shading_ref[shading_idx] =
+ realloc(scanner->shading_ref[shading_idx], 2 * shading_width * sizeof(SANE_Int));
+ if (scanner->shading_ref[shading_idx] == NULL) {
+ return SANE_STATUS_NO_MEM;
+ }
+ }
+ scanner->ccd_mask = realloc (scanner->ccd_mask, shading_width);
+ scanner->ccd_mask_size = shading_width;
+ if (scanner->ccd_mask == NULL) {
+ return SANE_STATUS_NO_MEM;
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Standard run does;
+ * - set exposure time 0x0A/0x13
+ * - set highlight shadow 0x0A/0x14
+ * - read shading parameters 0x0A/0x95/0x08
+ * - set scan frame 0x0A/0x12
+ * "12 00 0a00 80 00 0300 0000 b829 e31a"
+ * => 0:12 1:0 2:10 4:80 5:0 6:3 8:0 10:10680 12:6883
+ * - read gain offset 0xD7
+ * - set gain offset 0xDC
+ * - set mode 0x15
+ * "00 0f 2c01 80 04 04 00 01 0a 00 00 00 80 10 00"
+ * size res pass dpt frm ord bitmap ptn thr
+ * 15 300 RGB 8 inx intel 1=sharpen 0 128
+ * 3=skipshad
+ *
+ * ---------------------------------------------------------------------- */
+
+ /* ----------------------------------------------------------------------
+ *
+ * Show and check options
+ *
+ * ---------------------------------------------------------------------- */
+ sanei_pieusb_print_options (scanner);
+ if (!sanei_pieusb_analyse_options (scanner)) {
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Set scan frame
+ *
+ * ---------------------------------------------------------------------- */
+ if (sanei_pieusb_set_frame_from_options (scanner) != SANE_STATUS_GOOD) {
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Function 17
+ *
+ * ---------------------------------------------------------------------- */
+
+ sanei_pieusb_cmd_17 (scanner->device_number, 1, &status);
+ if (status.pieusb_status != PIEUSB_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start(): sanei_pieusb_cmd_17 failed: %d\n", status.pieusb_status);
+ return SANE_STATUS_IO_ERROR;
+ }
+ st = sanei_pieusb_wait_ready (scanner, 0);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start(): scanner not ready after sanei_pieusb_cmd_17: %d\n", st);
+ return st;
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Get & set initial gains and offsets
+ *
+ * There does not seem to be much reason to set exposure/gain/offset
+ * now, but it does make a large difference in speed, because it
+ * creates a small BADF-table. This is probably because without SET GAIN
+ * OFFSET, extraEntries has a random value (it is not initialised).
+ *
+ * TODO: test if this may be done just once, in sane_open().
+ *
+ * ---------------------------------------------------------------------- */
+
+ if (sanei_pieusb_set_gain_offset (scanner, scanner->val[OPT_CALIBRATION_MODE].s) != SANE_STATUS_GOOD) {
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ st = sanei_pieusb_wait_ready (scanner, 0);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start: scanner not ready %d\n", st);
+ return st;
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Set mode
+ *
+ * ---------------------------------------------------------------------- */
+ if (sanei_pieusb_set_mode_from_options (scanner) != SANE_STATUS_GOOD) {
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Lamp on
+ *
+ * ---------------------------------------------------------------------- */
+ sanei_pieusb_cmd_slide (scanner->device_number, SLIDE_LAMP_ON, &status);
+ if (status.pieusb_status != PIEUSB_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start(): sanei_pieusb_cmd_slide failed: %d\n", status.pieusb_status);
+ return SANE_STATUS_IO_ERROR;
+ }
+ st = sanei_pieusb_wait_ready (scanner, 0);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start: scanner not ready %d\n", st);
+ return st;
+ }
+
+ /* Enter SCAN phase 1 */
+ DBG (DBG_info_sane, "sane_start(): scan phase 1\n");
+
+ /* ----------------------------------------------------------------------
+ *
+ * Start scan & wait until device ready
+ *
+ * ---------------------------------------------------------------------- */
+ scanner->scanning = SANE_TRUE;
+ scanner->cancel_request = SANE_FALSE;
+ for (;;) {
+ sanei_pieusb_cmd_start_scan (scanner->device_number, &status);
+ if (status.pieusb_status != PIEUSB_STATUS_WARMING_UP)
+ break;
+ sleep(5);
+ }
+ sanei_pieusb_wait_ready (scanner, 0);
+ if ((status.pieusb_status == PIEUSB_STATUS_MUST_CALIBRATE)
+ || (scanner->val[OPT_SHADING_ANALYSIS].b != 0)) {
+
+ /* Overriding skip calibration */
+ DBG (DBG_info_sane, "sane_start(): process shading data\n");
+
+ /* ------------------------------------------------------------------
+ *
+ * Get and set gain and offset
+ * Get settings from scanner, from preview data, from options,
+ * or use defaults.
+ *
+ * ------------------------------------------------------------------ */
+ if (sanei_pieusb_set_gain_offset (scanner, scanner->val[OPT_CALIBRATION_MODE].s) != SANE_STATUS_GOOD) {
+ sanei_pieusb_cmd_stop_scan (scanner->device_number, &status);
+ scanner->scanning = SANE_FALSE;
+ return SANE_STATUS_IO_ERROR;
+ }
+ /* ------------------------------------------------------------------
+ *
+ * Obtain shading data
+ * Get parameters from scanner->device->shading_parameters[0] although
+ * it's 45 lines, scanner->ccd_mask_size pixels, 16 bit depth in all cases.
+ *
+ * ------------------------------------------------------------------ */
+ if (sanei_pieusb_get_shading_data (scanner) != SANE_STATUS_GOOD) {
+ sanei_pieusb_cmd_stop_scan (scanner->device_number, &status);
+ scanner->scanning = SANE_FALSE;
+ return SANE_STATUS_IO_ERROR;
+ }
+ }
+
+ /* Enter SCAN phase 2 */
+ DBG (DBG_info_sane, "sane_start(): scan phase 2\n");
+
+ /* SCAN phase 2 (line-by-line scan) not implemented */
+
+ st = sanei_pieusb_wait_ready (scanner, 0);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start: scanner not ready %d\n", st);
+ return st;
+ }
+
+ /* Enter SCAN phase 3 */
+
+ DBG (DBG_info_sane, "sane_start(): scan phase 3\n");
+
+ /* Handle cancel request */
+ if (scanner->cancel_request) {
+ return sanei_pieusb_on_cancel (scanner);
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Get CCD mask
+ *
+ * ---------------------------------------------------------------------- */
+
+ if (sanei_pieusb_get_ccd_mask (scanner) != SANE_STATUS_GOOD) {
+ sanei_pieusb_cmd_stop_scan (scanner->device_number, &status);
+ scanner->scanning = SANE_FALSE;
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* Enter SCAN phase 4 */
+
+ /* ----------------------------------------------------------------------
+ *
+ * Read scan parameters & wait until ready for reading
+ *
+ * ---------------------------------------------------------------------- */
+ if (sanei_pieusb_get_parameters (scanner, &bytes_per_line) != SANE_STATUS_GOOD) {
+ sanei_pieusb_cmd_stop_scan (scanner->device_number, &status);
+ scanner->scanning = SANE_FALSE;
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ st = sanei_pieusb_wait_ready (scanner, 0);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start: scanner not ready %d\n", st);
+ return st;
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Prepare read buffer
+ * Currently this buffer is always a memory mapped buffer
+ * Might be faster to use RAM buffers for small images (such as preview)
+ *
+ * ---------------------------------------------------------------------- */
+ colors = 0x00;
+ switch (scanner->mode.passes) {
+ case SCAN_FILTER_RED: colors = 0x01; break;
+ case SCAN_FILTER_GREEN: colors = 0x02; break;
+ case SCAN_FILTER_BLUE: colors = 0x04; break;
+ case SCAN_FILTER_INFRARED: colors = 0x08; break;
+ case SCAN_ONE_PASS_COLOR: colors = 0x07; break;
+ case SCAN_ONE_PASS_RGBI: colors = 0x0F; break;
+ }
+ if (scanner->buffer.data) sanei_pieusb_buffer_delete(&scanner->buffer); /* free resources from previous invocation */
+ st = sanei_pieusb_buffer_create (&(scanner->buffer), scanner->scan_parameters.pixels_per_line,
+ scanner->scan_parameters.lines, colors,
+ scanner->scan_parameters.depth);
+ if (st != SANE_STATUS_GOOD) {
+ scanner->scanning = SANE_FALSE;
+ return st;
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Read all image data into the buffer
+ *
+ * ---------------------------------------------------------------------- */
+ if (sanei_pieusb_get_scan_data (scanner, bytes_per_line) != SANE_STATUS_GOOD) {
+ scanner->scanning = SANE_FALSE;
+ return SANE_STATUS_IO_ERROR;
+ }
+ sleep(2);
+ st = sanei_pieusb_wait_ready (scanner, 0);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start(): scanner not ready after sanei_pieusb_get_scan_data: %d\n", st);
+ scanner->scanning = SANE_FALSE;
+ return st;
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Advance to next slide (except for preview)
+ *
+ * ---------------------------------------------------------------------- */
+ if (scanner->val[OPT_ADVANCE_SLIDE].b && !scanner->val[OPT_PREVIEW].b) {
+ sanei_pieusb_cmd_slide (scanner->device_number, SLIDE_NEXT, &status);
+ if (status.pieusb_status != PIEUSB_STATUS_GOOD) {
+ DBG (DBG_error, "sane_start(): sanei_pieusb_cmd_slide failed: %d\n", status.pieusb_status);
+
+ }
+ }
+
+ /* ----------------------------------------------------------------------
+ *
+ * Post processing:
+ * 1. Correct for shading
+ * 2. Remove R-component from IR data
+ * 3. Remove dust
+ *
+ * ---------------------------------------------------------------------- */
+
+ mode = scanner->val[OPT_MODE].s;
+ if (strcmp(mode, SANE_VALUE_SCAN_MODE_LINEART) == 0) {
+ shading_correction_relevant = SANE_FALSE; /* Shading correction irrelavant at bit depth 1 */
+ infrared_post_processing_relevant = SANE_FALSE; /* No infrared, no postprocessing */
+ } else if (strcmp(mode, SANE_VALUE_SCAN_MODE_HALFTONE) == 0) {
+ shading_correction_relevant = SANE_FALSE; /* Shading correction irrelavant at bit depth 1 */
+ infrared_post_processing_relevant = SANE_FALSE; /* No infrared, no postprocessing */
+ } else if (strcmp(mode, SANE_VALUE_SCAN_MODE_GRAY) == 0) {
+ shading_correction_relevant = SANE_TRUE;
+ infrared_post_processing_relevant = SANE_FALSE; /* No infrared, no postprocessing */
+ } else if (scanner->val[OPT_PREVIEW].b) {
+ /* Catch preview here, otherwise next ifs get complicated */
+ shading_correction_relevant = SANE_TRUE;
+ infrared_post_processing_relevant = SANE_FALSE;
+ } else if (strcmp(mode, SANE_VALUE_SCAN_MODE_RGBI) == 0) {
+ shading_correction_relevant = SANE_TRUE;
+ infrared_post_processing_relevant = SANE_TRUE;
+ } else if (strcmp(mode, SANE_VALUE_SCAN_MODE_COLOR) == 0 && scanner->val[OPT_CLEAN_IMAGE].b) {
+ shading_correction_relevant = SANE_TRUE;
+ infrared_post_processing_relevant = SANE_TRUE;
+ } else { /* SANE_VALUE_SCAN_MODE_COLOR */
+ shading_correction_relevant = SANE_TRUE;
+ infrared_post_processing_relevant = SANE_TRUE;
+ }
+ if (scanner->val[OPT_CORRECT_SHADING].b && shading_correction_relevant) {
+ if (scanner->shading_data_present) {
+ sanei_pieusb_correct_shading (scanner, &scanner->buffer);
+ } else {
+ DBG(DBG_warning, "sane_start(): unable to correct for shading, no shading data available\n");
+ }
+ }
+ if ((scanner->val[OPT_CORRECT_INFRARED].b || scanner->val[OPT_CLEAN_IMAGE].b) && !scanner->val[OPT_PREVIEW].b && infrared_post_processing_relevant) {
+ /* Create array of pointers to color planes R, G, B, I */
+ SANE_Uint *planes[PLANES];
+ SANE_Int N;
+ N = scanner->buffer.width * scanner->buffer.height;
+ planes[0] = scanner->buffer.data;
+ planes[1] = scanner->buffer.data + N;
+ planes[2] = scanner->buffer.data + 2 * N;
+ planes[3] = scanner->buffer.data + 3 * N;
+ sanei_ir_init ();
+ sanei_pieusb_post (scanner, planes, scanner->buffer.colors);
+ }
+
+ /* Save preview data. Preview data only used once to set gain and offset. */
+ if (scanner->val[OPT_PREVIEW].b) {
+ sanei_pieusb_analyze_preview(scanner);
+ } else {
+ scanner->preview_done = SANE_FALSE;
+ }
+
+ /* Modify buffer in case the buffer has infrared, but no infrared should be returned */
+ if (scanner->buffer.colors == PLANES && (strcmp(mode,SANE_VALUE_SCAN_MODE_COLOR) == 0 && scanner->val[OPT_CLEAN_IMAGE].b)) {
+ DBG(DBG_info_sane, "sane_start(): modifying buffer to ignore I\n");
+ /* Base buffer parameters */
+ scanner->buffer.colors = 3;
+ /* Derived quantities */
+ scanner->buffer.image_size_bytes = scanner->buffer.colors * scanner->buffer.height * scanner->buffer.line_size_bytes;
+ scanner->buffer.color_index_infrared = -1;
+ scanner->buffer.bytes_unread = scanner->buffer.bytes_unread * 3 / 4;
+ scanner->buffer.bytes_written = scanner->buffer.bytes_written * 3 / 4;
+ }
+
+ return SANE_STATUS_GOOD;
+
+}
+
+/**
+ * Read image data from the scanner buffer.
+ *
+ * @param handle
+ * @param buf
+ * @param max_len
+ * @param len
+ * @return
+ */
+SANE_Status
+sane_read (SANE_Handle handle, SANE_Byte * buf, SANE_Int max_len, SANE_Int * len)
+{
+
+ struct Pieusb_Scanner *scanner = handle;
+ SANE_Int return_size;
+
+ DBG(DBG_info_sane, "sane_read(): requested %d bytes\n", max_len);
+
+ /* No reading if not scanning */
+ if (!scanner->scanning) {
+ *len = 0;
+ return SANE_STATUS_IO_ERROR; /* SANE standard does not allow a SANE_STATUS_INVAL return */
+ }
+
+ /* Handle cancel request */
+ if (scanner->cancel_request) {
+ return sanei_pieusb_on_cancel(scanner);
+ }
+#if 0
+ /* Return image data, just read from scanner buffer */
+ DBG(DBG_info_sane, "sane_read():\n");
+ DBG(DBG_info_sane, " image size %d\n", scanner->buffer.image_size_bytes);
+ DBG(DBG_info_sane, " unread %d\n", scanner->buffer.bytes_unread);
+ DBG(DBG_info_sane, " read %d\n", scanner->buffer.bytes_read);
+ DBG(DBG_info_sane, " max_len %d\n", max_len);
+#endif
+ if (scanner->buffer.bytes_read > scanner->buffer.image_size_bytes) {
+ /* Test if not reading past buffer boundaries */
+ DBG(DBG_error, "sane_read(): reading past buffer boundaries (contains %d, read %d)\n", scanner->buffer.image_size_bytes, scanner->buffer.bytes_read);
+ *len = 0;
+ sanei_pieusb_on_cancel(scanner);
+ return SANE_STATUS_EOF;
+ } else if (scanner->buffer.bytes_read == scanner->buffer.image_size_bytes) {
+ /* Return EOF since all data of this frame has already been read. */
+ *len = 0;
+ scanner->scanning = SANE_FALSE;
+ return SANE_STATUS_EOF;
+ } else if (scanner->buffer.bytes_unread >= max_len) {
+ /* Already enough data to return, do not read */
+ DBG(DBG_info_sane, "sane_read(): buffer suffices (contains %d, requested %d)\n", scanner->buffer.bytes_unread, max_len);
+ return_size = max_len;
+ } else if (scanner->buffer.bytes_read + scanner->buffer.bytes_unread == scanner->buffer.image_size_bytes) {
+ /* All the remaining data is in the buffer, do not read */
+ DBG(DBG_info_sane, "sane_read(): buffer suffices (contains %d, requested %d, last batch though)\n", scanner->buffer.bytes_unread, max_len);
+ return_size = scanner->buffer.bytes_unread;
+ } else {
+ /* Should not happen in this implementation - all data read by sane_start() */
+ DBG(DBG_error, "sane_read(): shouldn't be here...\n");
+ return SANE_STATUS_IO_ERROR;
+ }
+
+ /* Check */
+ if (return_size == 0 && scanner->buffer.bytes_read < scanner->buffer.image_size_bytes) {
+ DBG(DBG_error, "sane_read(): unable to service read request, %d bytes in frame, %d read\n", scanner->buffer.image_size_bytes, scanner->buffer.bytes_read);
+ }
+
+ /* Return the available data: Output return_size bytes from buffer */
+ sanei_pieusb_buffer_get(&scanner->buffer, buf, max_len, len);
+#if 0
+ DBG(DBG_info_sane, "sane_read(): currently read %.2f lines of %d\n",
+ (double)scanner->buffer.bytes_written/(scanner->buffer.line_size_bytes*scanner->buffer.colors),
+ scanner->buffer.height);
+ DBG(DBG_info_sane, "sane_read(): returning %d bytes (requested %d), returned %d of %d \n",
+ *len, max_len,scanner->buffer.bytes_read, scanner->buffer.image_size_bytes);
+#endif
+ return SANE_STATUS_GOOD;
+
+}
+
+/**
+ * Request cancellation of current scanning process.
+ *
+ * @param handle Scanner handle
+ */
+void
+sane_cancel (SANE_Handle handle)
+{
+ struct Pieusb_Scanner *scanner = handle;
+
+ DBG (DBG_info_sane, "sane_cancel\n");
+
+ if (scanner->scanning) {
+ scanner->cancel_request = 1;
+ }
+}
+
+/**
+ * Set the I/O mode of handle h. The I/O mode can be either blocking or
+ * non-blocking, but for USB devices, only blocking mode is supported.
+ *
+ * @param handle Scanner handle
+ * @param non_blocking
+ * @return SANE_STATUS_UNSUPPORTED;
+ */
+SANE_Status
+sane_set_io_mode (SANE_Handle handle, SANE_Bool non_blocking)
+{
+ /* Pieusb_Scanner *scanner = handle; */
+
+ DBG (DBG_info_sane, "sane_set_io_mode: handle = %p, non_blocking = %s\n", handle, non_blocking == SANE_TRUE ? "true" : "false");
+
+ if (non_blocking) {
+ return SANE_STATUS_UNSUPPORTED;
+ }
+
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Obtain a file-descriptor for the scanner that is readable if image data is
+ * available. The select file-descriptor is returned in *fd.
+ * The function has not been implemented since USB-device only operate in
+ * blocking mode.
+ *
+ * @param handle Scanner handle
+ * @param fd File descriptor with imae data
+ * @return SANE_STATUS_INVAL
+ */
+SANE_Status
+sane_get_select_fd (SANE_Handle handle, SANE_Int * fd)
+{
+ DBG(DBG_info_sane,"sane_get_select_fd(): not supported (only for non-blocking IO)\n");
+ handle = handle;
+ fd = fd;
+ return SANE_STATUS_UNSUPPORTED;
+}
diff --git a/backend/pieusb.conf.in b/backend/pieusb.conf.in
new file mode 100644
index 0000000..ec5ba7e
--- /dev/null
+++ b/backend/pieusb.conf.in
@@ -0,0 +1,9 @@
+# pieusb.conf: Configuration file for PIE/Reflecta USB scanner
+# Read man sane-pieusb for documentation
+
+# Autodetect
+# Reflecta 6000 Multiple Slide Scanner
+usb 0x05e3 0x0142
+# Reflecta CrystalScan 7200
+# Reflecta ProScan 7200
+usb 0x05e3 0x0145
diff --git a/backend/pieusb.h b/backend/pieusb.h
new file mode 100644
index 0000000..10ce106
--- /dev/null
+++ b/backend/pieusb.h
@@ -0,0 +1,105 @@
+/* sane - Scanner Access Now Easy.
+
+ pieusb.h
+
+ Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+#ifndef PIEUSB_H
+#define PIEUSB_H
+
+#include "../include/sane/config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+#define BACKEND_NAME pieusb
+
+#include "../include/sane/sane.h"
+#include "../include/sane/sanei_usb.h"
+#include "../include/sane/sanei_debug.h"
+
+
+#include "pieusb_scancmd.h"
+#include "pieusb_usb.h"
+
+
+/* --------------------------------------------------------------------------
+ *
+ * SUPPORTED DEVICES SPECIFICS
+ *
+ * --------------------------------------------------------------------------*/
+
+/* List of default supported scanners by vendor-id, product-id and model number.
+ * A default list will be created in sane_init(), and entries in the config file
+ * will be added to it. */
+
+struct Pieusb_USB_Device_Entry
+{
+ SANE_Word vendor; /* USB vendor identifier */
+ SANE_Word product; /* USB product identifier */
+ SANE_Word model; /* USB model number */
+ SANE_Int device_number; /* USB device number if the device is present */
+};
+
+extern struct Pieusb_USB_Device_Entry* pieusb_supported_usb_device_list;
+extern struct Pieusb_USB_Device_Entry pieusb_supported_usb_device; /* for searching */
+
+struct Pieusb_Device_Definition;
+extern struct Pieusb_Device_Definition *pieusb_definition_list_head;
+
+/* Debug error levels */
+#define DBG_error 1 /* errors */
+#define DBG_warning 3 /* warnings */
+#define DBG_info 5 /* information */
+#define DBG_info_sane 7 /* information sane interface level */
+#define DBG_inquiry 8 /* inquiry data */
+#define DBG_info_proc 9 /* information pieusb backend functions */
+#define DBG_info_scan 11 /* information scanner commands */
+#define DBG_info_usb 13 /* information usb level functions */
+#define DBG_info_buffer 15 /* information buffer functions */
+
+/* R G B I */
+#define PLANES 4
+
+#endif /* PIEUSB_H */
diff --git a/backend/pieusb_buffer.c b/backend/pieusb_buffer.c
new file mode 100644
index 0000000..53bd867
--- /dev/null
+++ b/backend/pieusb_buffer.c
@@ -0,0 +1,644 @@
+/* sane - Scanner Access Now Easy.
+
+ pieusb_buffer.c
+
+ Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+/* =========================================================================
+ *
+ * Read buffer
+ *
+ * Data obtained from the scanner cannot be presented to the frontend immediately.
+ * The scanner returns data in the 'index' or 'line' color format, which means it
+ * returns data in batches which contain a single color of a scan line.
+ *
+ * These must finally be converted into the SANE data format (data for a single
+ * pixel in consecutive bytes). Apart from that, sane_read() must be able to
+ * return any amount of data bytes.
+ *
+ * In between, data processing may be necessary, usually requiring the whole
+ * image to be available.
+ *
+ * To accommodate all this, the buffer stores all samples as 16-bit values, even
+ * if the original values are 8-bit or even 1 bit. This is a waste of space, but
+ * makes processing much easier, and it is only temporary.
+ *
+ * The read buffer is constructed by a call to buffer_create(), which initializes
+ * the buffer based on width, height, number of colors and depth. The buffer
+ * contains data organized in color planes, with each plane consisting of lines,
+ * each line of a fixed number of (single color) pixels, and each pixel of a fixed
+ * number of bits (or bytes).
+ *
+ * The buffer maintains read and write pointers.
+ *
+ * Multi-color data with a bit depth of 1 are packed in single color bytes, so
+ * the data obtained from the scanner does not need conversion.
+ *
+ * ========================================================================= */
+
+#define DEBUG_DECLARE_ONLY
+
+/* Configuration defines */
+#include "../include/sane/config.h"
+
+/* SANE includes */
+#include "../include/sane/sane.h"
+#include "../include/sane/saneopts.h"
+#include "../include/sane/sanei_usb.h"
+#include "../include/sane/sanei_config.h"
+
+/* Backend includes */
+#define BACKEND_NAME pieusb
+#include "../include/sane/sanei_backend.h"
+#include "pieusb.h"
+
+#include "pieusb_specific.h"
+#include "pieusb_buffer.h"
+
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+
+#include <stdio.h>
+#include <fcntl.h>
+#include <sys/mman.h>
+#include <endian.h>
+
+/* When creating the release backend, make complains about unresolved external
+ * le16toh, although it finds the include <endian.h> */
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+ #define le16toh(x) (x)
+#else
+ #define le16toh(x) __bswap_16 (x)
+#endif
+
+static void buffer_update_read_index(struct Pieusb_Read_Buffer* buffer, int increment);
+
+/* READER */
+
+/**
+ * Initialize the buffer.
+ * A scanner has a Pieusb_Read_Buffer struct as one of its members.
+ *
+ * @param buffer the buffer to initialize
+ * @param width number of pixels on a line (row)
+ * @param height number of lines in the buffer (pixels in a column)
+ * @param colors bitmap specifying the colors in the scanned data (bitmap: 0000 IBGR)
+ * @param depth number of bits of a color
+ * @param bigendian how to store multi-byte values: bigendian if true
+ * @param maximum_size maximum size of buffer (-1 = size of image)
+ */
+
+SANE_Status
+sanei_pieusb_buffer_create(struct Pieusb_Read_Buffer* buffer, SANE_Int width, SANE_Int height, SANE_Byte color_spec, SANE_Byte depth)
+{
+ int k, result;
+ unsigned int buffer_size_bytes;
+ unsigned char g;
+
+ /* Base parameters */
+ buffer->width = width;
+ buffer->height = height;
+ buffer->colors = 0;
+ if (color_spec & 0x01) { buffer->color_index_red = 0; buffer->colors++; } else { buffer->color_index_red = -1; }
+ if (color_spec & 0x02) { buffer->color_index_green = 1; buffer->colors++; } else { buffer->color_index_green = -1; }
+ if (color_spec & 0x04) { buffer->color_index_blue = 2; buffer->colors++; } else { buffer->color_index_blue = -1; }
+ if (color_spec & 0x08) { buffer->color_index_infrared = 3; buffer->colors++; } else { buffer->color_index_infrared = -1; }
+ if (buffer->colors == 0) {
+ DBG(DBG_error, "sanei_pieusb_buffer_create(): no colors specified\n");
+ return SANE_STATUS_INVAL;
+ }
+ buffer->depth = depth;
+ if (depth < 1 || depth > 16) {
+ DBG(DBG_error, "sanei_pieusb_buffer_create(): unsupported depth %d\n", depth);
+ return SANE_STATUS_INVAL;
+ }
+ buffer->packing_density = (depth == 1) ? 8 : 1; /* These are all the situations we have */
+
+ /* Derived*/
+ buffer->packet_size_bytes = (buffer->depth * buffer->packing_density + 7) / 8;
+ buffer->line_size_packets = (buffer->width + buffer->packing_density -1) / buffer->packing_density;
+ buffer->line_size_bytes = buffer->line_size_packets * buffer->packet_size_bytes;
+ buffer->image_size_bytes = buffer->colors * buffer->height * buffer->line_size_bytes;
+
+ /* Create empty file */
+ snprintf(buffer->buffer_name, L_tmpnam, "/tmp/sane.XXXXXX");
+ if (buffer->data_file != 0) /* might still be open from previous invocation */
+ close(buffer->data_file);
+ buffer->data_file = mkostemp(buffer->buffer_name, O_RDWR | O_CREAT | O_EXCL | O_TRUNC);
+ if (buffer->data_file == -1) {
+ buffer->data_file = 0;
+ buffer->data = NULL;
+ perror("sanei_pieusb_buffer_create(): error opening image buffer file");
+ return SANE_STATUS_IO_ERROR;
+ }
+ /* Stretch the file size */
+ buffer_size_bytes = buffer->width * buffer->height * buffer->colors * sizeof(SANE_Uint);
+ if (buffer_size_bytes == 0) {
+ close(buffer->data_file);
+ buffer->data_file = 0;
+ DBG(DBG_error, "sanei_pieusb_buffer_create(): buffer_size is zero: width %d, height %d, colors %d\n", buffer->width, buffer->height, buffer->colors);
+ return SANE_STATUS_INVAL;
+ }
+ result = lseek(buffer->data_file, buffer_size_bytes-1, SEEK_SET);
+ if (result == -1) {
+ close(buffer->data_file);
+ buffer->data_file = 0;
+ buffer->data = NULL;
+ DBG(DBG_error, "sanei_pieusb_buffer_create(): error calling lseek() to 'stretch' the file to %d bytes\n", buffer_size_bytes-1);
+ perror("sanei_pieusb_buffer_create(): error calling lseek()");
+ return SANE_STATUS_INVAL;
+ }
+ /* Write one byte at the end */
+ g = 0x00;
+ result = write(buffer->data_file, &g, 1);
+ if (result < 0) {
+ close(buffer->data_file);
+ buffer->data_file = 0;
+ buffer->data = NULL;
+ perror("sanei_pieusb_buffer_create(): error writing a byte at the end of the file");
+ return SANE_STATUS_IO_ERROR;
+ }
+#ifdef HAVE_MMAP
+ /* Create memory map */
+ buffer->data = mmap(NULL, buffer_size_bytes, PROT_WRITE | PROT_READ, MAP_SHARED, buffer->data_file, 0);
+ if (buffer->data == MAP_FAILED) {
+ close(buffer->data_file);
+ buffer->data = NULL;
+ perror("sanei_pieusb_buffer_create(): error mapping file");
+ return SANE_STATUS_INVAL;
+ }
+#else
+#error mmap(2) not available, aborting
+#endif
+ buffer->data_size = buffer_size_bytes;
+ /* Reading and writing */
+ buffer->p_read = calloc(buffer->colors, sizeof(SANE_Uint*));
+ if (buffer->p_read == NULL)
+ return SANE_STATUS_NO_MEM;
+ buffer->p_write = calloc(buffer->colors, sizeof(SANE_Uint*));
+ if (buffer->p_write == NULL)
+ return SANE_STATUS_NO_MEM;
+ for (k = 0; k < buffer->colors; k++) {
+ buffer->p_write[k] = buffer->data + k * buffer->height * buffer->width;
+ buffer->p_read[k] = buffer->p_write[k];
+ }
+ buffer->read_index[0] = 0;
+ buffer->read_index[1] = 0;
+ buffer->read_index[2] = 0;
+ buffer->read_index[3] = 0;
+
+ /* Statistics */
+ buffer->bytes_read = 0;
+ buffer->bytes_written = 0;
+ buffer->bytes_unread = 0;
+
+ DBG(DBG_info,"pieusb: Read buffer created: w=%d h=%d ncol=%d depth=%d in file %s\n",
+ buffer->width, buffer->height, buffer->colors, buffer->depth, buffer->buffer_name);
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Delete buffer and free its resources
+ *
+ * @param buffer
+ */
+void
+sanei_pieusb_buffer_delete(struct Pieusb_Read_Buffer* buffer)
+{
+#ifdef HAVE_MMAP
+ munmap(buffer->data, buffer->data_size);
+#else
+#error mmap(2) not available, aborting
+#endif
+ /* ftruncate(buffer->data_file,0); Can we delete given a file-descriptor? */
+ close(buffer->data_file);
+ /* remove fs entry */
+ unlink(buffer->buffer_name);
+ buffer->data_file = 0;
+ buffer->data_size = 0;
+ free(buffer->p_read);
+ free(buffer->p_write);
+ buffer->data = 0;
+ buffer->width = 0;
+ buffer->height = 0;
+ buffer->depth = 0;
+ buffer->colors = 0;
+ buffer->packing_density = 0;
+
+ DBG(DBG_info,"pieusb: Read buffer deleted\n");
+}
+
+/**
+ * Add a line to the reader buffer, for the given color.
+ * The buffer checks and decides how to interpret the data.
+ *
+ * @param buffer
+ * @param color Color code for line
+ * @param line
+ * @param size Number of bytes in line
+ * @return 1 if successful, 0 if not
+ */
+SANE_Int
+sanei_pieusb_buffer_put_single_color_line(struct Pieusb_Read_Buffer* buffer, SANE_Byte color, void* line, SANE_Int size)
+{
+
+ SANE_Int c, k, m, n;
+
+ /* Check index code */
+ c = -1;
+ switch (color) {
+ case 'R':
+ c = buffer->color_index_red;
+ break;
+ case 'G':
+ c = buffer->color_index_green;
+ break;
+ case 'B':
+ c = buffer->color_index_blue;
+ break;
+ case 'I':
+ c = buffer->color_index_infrared;
+ break;
+ }
+ if (c == -1) {
+ DBG(DBG_error, "sanei_pieusb_buffer_put_single_color_line(): color '%c' not specified when buffer was created\n", color);
+ return 0;
+ }
+ DBG(DBG_info_buffer, "sanei_pieusb_buffer_put_single_color_line() line color = %d (0=R, 1=G, 2=B, 3=I)\n",c);
+
+ /* Check line size (for a line with a single color) */
+ if (buffer->line_size_bytes != size) {
+ DBG(DBG_error, "sanei_pieusb_buffer_put_single_color_line(): incorrect line size, expecting %d, got %d\n", buffer->line_size_bytes, size);
+ return 0;
+ }
+
+ /* The general approach for all densities and packet sizes
+ * - process packet_size_bytes at a time
+ * - use packing_density to decode the full packet into separate values
+ * - now save these values as neighbouring pixels on the current line
+ * Use custom code for the 1-byte and 2-byte single sample cases,
+ * because the general approach is a bit overkill for them.
+ */
+
+ if (buffer->packet_size_bytes == 1 && buffer->packing_density == 1) {
+ uint8_t* p_packet = (uint8_t*)line;
+ n = 0;
+ while (n < size) {
+ /* Get next packet data & store in buffer */
+ *buffer->p_write[c]++ = *p_packet++;
+ n++;
+ }
+ } else if (buffer->packet_size_bytes == 2 && buffer->packing_density == 1) {
+ uint16_t* p_packet = (uint16_t*)line;
+ n = 0;
+ while (n < size) {
+ /* Get next packet data & store in buffer */
+ *buffer->p_write[c]++ = le16toh (*p_packet++);
+ n += 2;
+ }
+ } else {
+ uint8_t* p_packet = (uint8_t*)line;
+ uint8_t *packet = (uint8_t *)alloca(buffer->packet_size_bytes * sizeof(uint8_t));
+ SANE_Uint val;
+ uint8_t mask = ~(0xFF >> buffer->depth); /* byte with depth most significant bits set */
+ n = 0;
+ while (n < size) {
+ /* Get next packet data */
+ for (k = 0; k < buffer->packet_size_bytes; k++) packet[k] = *p_packet++;
+ /* Unpack packing_density samples from packet. Of course,
+ * buffer->depth * packing_density <= # bits in packet.
+ * That is checked at buffer creation. */
+ for (k = 0; k < buffer->packing_density; k++) {
+ /* Take 1st depth bits and store in val */
+ val = (packet[0] & mask) >> (8-buffer->depth);
+ /* Now shift packet bytes depth bits left */
+ for (m = 0; m < buffer->packet_size_bytes; m++) {
+ /* Shift left one sample */
+ packet[m] <<= buffer->depth;
+ if (m < buffer->packet_size_bytes-1) {
+ /* If there are more bytes, insert 1st depth bits of next byte */
+ packet[m] |= (packet[m+1] >> (8-buffer->depth));
+ }
+ }
+ /* Store in buffer */
+ *buffer->p_write[c]++ = val;
+ }
+ n += buffer->packet_size_bytes;
+ }
+ }
+
+ /* Update state & statistics */
+ buffer->bytes_written += size;
+ buffer->bytes_unread += size;
+
+ /* Output current buffer state */
+ /* buffer_output_state(buffer); */
+
+ return 1;
+}
+
+/**
+ * Write line of full color pixels to the buffer.
+ *
+ * @param buffer Read buffer
+ * @param pixel array of full color pixel data
+ * @param size Number of bytes in the line
+ * @return 1 if successful, 0 if not
+ */
+/**
+ *
+ */
+SANE_Int
+sanei_pieusb_buffer_put_full_color_line(struct Pieusb_Read_Buffer* buffer, void* line, int size)
+{
+ int k, c, m, n;
+
+ DBG(DBG_info_buffer, "sanei_pieusb_buffer_put_full_color_line() entered\n");
+
+ /* Check line size */
+ if (buffer->line_size_bytes * buffer->colors != size) {
+ DBG(DBG_error, "sanei_pieusb_buffer_put_full_color_line(): incorrect line size, expecting %d, got %d\n", buffer->line_size_bytes * buffer->colors, size);
+ return 0;
+ }
+
+ /* The general approach for all densities and packet sizes
+ * - process packet_size_bytes at a time
+ * - use packing_density to decode the full packet into separate values
+ * - now save these values as neighbouring pixels on the current line
+ * Use custom code for the 1-byte and 2-byte single sample cases,
+ * because the general approach is a bit overkill for them.
+ */
+
+ if (buffer->packet_size_bytes == 1 && buffer->packing_density == 1) {
+ uint8_t* p_packet = (uint8_t*)line;
+ n = 0;
+ while (n < size) {
+ /* Get next packet data & store in buffer */
+ for (c = 0; c < buffer->colors; c++) {
+ *buffer->p_write[c]++ = *p_packet++;
+ n++;
+ }
+ }
+ } else if (buffer->packet_size_bytes == 2 && buffer->packing_density == 1) {
+ uint16_t* p_packet = (uint16_t*)line;
+ n = 0;
+ while (n < size) {
+ /* Get next packet data & store in buffer */
+ for (c = 0; c < buffer->colors; c++) {
+ *buffer->p_write[c]++ = le16toh (*p_packet++);
+ n += 2;
+ }
+ }
+ } else {
+ uint8_t* p_packet = (uint8_t*)line;
+ uint8_t *packet = (uint8_t *)alloca(buffer->packet_size_bytes * sizeof(uint8_t));
+ SANE_Uint val;
+ uint8_t mask = ~(0xFF >> buffer->depth); /* byte with depth most significant bits set */
+ /* DBG(DBG_info,"buffer_put_full_color_line(): mask %02x\n",mask); */
+ n = 0;
+ while (n < size) {
+ /* Get next packet data */
+ for (c = 0; c < buffer->colors; c++) {
+ for (k = 0; k < buffer->packet_size_bytes; k++) {
+ packet[k] = *p_packet++;
+ /* DBG(DBG_info,"buffer_put_full_color_line(): packet[%d] = %02x\n",k,packet[k]); */
+ }
+ /* Unpack packing_density samples from packet. Of course,
+ * buffer->depth * packing_density <= # bits in packet.
+ * That is checked at buffer creation. */
+ for (k = 0; k < buffer->packing_density; k++) {
+ /* Take 1st depth bits and store in val */
+ val = (packet[0] & mask) >> (8-buffer->depth);
+ /* DBG(DBG_info,"buffer_put_full_color_line(): val[%d] = %02x\n",k,val); */
+ /* Now shift packet bytes depth bits left */
+ for (m = 0; m < buffer->packet_size_bytes; m++) {
+ /* Shift left one sample */
+ packet[m] <<= buffer->depth;
+ /* DBG(DBG_info,"buffer_put_full_color_line(): shift packet[%d] = %02x\n",m,packet[m]); */
+ if (m < buffer->packet_size_bytes-1) {
+ /* If there are more bytes, insert 1st depth bits of next byte */
+ packet[m] |= (packet[m+1] >> (8-buffer->depth));
+ /* DBG(DBG_info,"buffer_put_full_color_line(): shift packet[%d] = %02x\n",m,packet[m]); */
+ }
+ }
+ /* Store in buffer */
+ *buffer->p_write[c]++ = val;
+ }
+ n += buffer->packet_size_bytes;
+ }
+ }
+ }
+
+ /* Update state & statistics */
+ buffer->bytes_written += size;
+ buffer->bytes_unread += size;
+
+ /* Output current buffer state */
+ /* buffer_output_state(buffer); */
+
+ return 1;
+}
+
+/**
+ * Return bytes from the buffer. Do not mind pixel boundaries.
+ * Since the image data is organized in color planes, return bytes from the
+ * planes in the defined order. Take care to return multi-byte values after
+ * each other. Pack unpacked values.
+ *
+ * @param buffer Buffer to return bytes from.
+ * @param data Byte array to return bytes in
+ * @param max_len Maximum number of bytes returned
+ * @param len Actual number of bytes returned
+ */
+void
+sanei_pieusb_buffer_get(struct Pieusb_Read_Buffer* buffer, SANE_Byte* data, SANE_Int max_len, SANE_Int* len)
+{
+ SANE_Byte *pdata;
+ SANE_Int n, i, n_bits, N;
+
+ DBG(DBG_info_buffer, "sanei_pieusb_buffer_get() entered\n");
+
+ /* Read from the p_read locations */
+ pdata = data;
+ n = 0;
+ N = buffer->width * buffer->height;
+ /* Determine bytes to return */
+ if (buffer->packet_size_bytes == 1 && buffer->packing_density == 1) {
+ /* Single byte values in buffer */
+ while (n < max_len && buffer->bytes_read < buffer->image_size_bytes) {
+ /* Return byte*/
+ *pdata++ = *(buffer->data + N*buffer->read_index[0] + buffer->width*buffer->read_index[1] + buffer->read_index[2]) & 0xFF;
+ /* Update read indices */
+ buffer_update_read_index(buffer,1);
+ /* Update number of bytes read */
+ buffer->bytes_read++;
+ n++;
+ }
+ } else if (buffer->packet_size_bytes == 1 && buffer->packing_density == 8) {
+ /* Unpacked bits in buffer: repack */
+ while (n < max_len && buffer->bytes_read < buffer->image_size_bytes) {
+ uint8_t val = 0;
+ /* How many bits to pack? At the end of a line it may be less than 8 */
+ n_bits = 8;
+ if (buffer->width - buffer->read_index[2] < 8) {
+ n_bits = buffer->width - buffer->read_index[2];
+ }
+ /* Pack n_bits samples from same color plane */
+ for (i = 0; i < n_bits; i++) {
+ if (*(buffer->data + N*buffer->read_index[0] + buffer->width*buffer->read_index[1] + buffer->read_index[2] + i) > 0) {
+ val |= (0x80 >> i);
+ }
+ }
+ /* Return byte */
+ *pdata++ = val;
+ /* Update read indices */
+ buffer_update_read_index(buffer,n_bits);
+ /* Update number of bytes read */
+ buffer->bytes_read++;
+ n++;
+ }
+ } else if (buffer->packet_size_bytes == 2) {
+ /* Two-byte values in buffer */
+ while (n < max_len && buffer->bytes_read < buffer->image_size_bytes) {
+ /* Pointer to byte to return */
+ SANE_Uint val = *(buffer->data + N*buffer->read_index[0] + buffer->width*buffer->read_index[1] + buffer->read_index[2]);
+ /* Return byte */
+ if (buffer->read_index[3] == 0) {
+ *pdata++ = *((SANE_Byte*)(&val));
+ } else {
+ *pdata++ = *((SANE_Byte*)(&val)+1);
+ }
+ /* Update read indices */
+ buffer_update_read_index(buffer,1);
+ /* Update number of bytes read */
+ buffer->bytes_read++;
+ n++;
+ }
+ } else {
+ /* not implemented */
+ DBG(DBG_error, "buffer_put(): paccket size & density of %d/%d not implementd\n", buffer->packet_size_bytes, buffer->packing_density);
+ return;
+ }
+ *len = n;
+
+ /* Update statistics */
+ buffer->bytes_unread -= n;
+
+ /* Output current buffer state */
+ /* buffer_output_state(buffer); */
+}
+
+/**
+ * Update read index to point a given number of bytes past the current position.
+ *
+ * @param buffer the buffer to initialize
+ * @param increment the amount of bytes to move the index
+ */
+static void buffer_update_read_index(struct Pieusb_Read_Buffer* buffer, int increment)
+{
+ /* Update read indices
+ * [3] = byte-index in 2-byte value: increased first, if we have 2-byte data
+ * [2] = index of pixel on line: increased after color plane
+ * [1] = index of line: increased after line is complete
+ * [0] = color index: increased first since SANE requires full color pixels */
+ if (buffer->read_index[3] == 0 && buffer->packet_size_bytes == 2) {
+ buffer->read_index[3] = 1;
+ } else {
+ buffer->read_index[3] = 0;
+ buffer->read_index[0]++;
+ if (buffer->read_index[0] == buffer->colors) {
+ buffer->read_index[0] = 0;
+ buffer->read_index[2] += increment;
+ if (buffer->read_index[2] >= buffer->width) {
+ buffer->read_index[2] = 0;
+ buffer->read_index[1]++;
+ }
+ }
+ }
+}
+
+#if 0
+/**
+ * Display the buffer state.
+ *
+ * @param buffer the buffer to initialize
+ */
+
+static void buffer_output_state(struct Pieusb_Read_Buffer* buffer)
+{
+ SANE_Int line_size;
+ SANE_Int N, k, loc[4];
+
+ line_size = buffer->line_size_bytes * buffer->colors; /* Full line size in bytes */
+
+ DBG(DBG_info_buffer, "Buffer data\n");
+ DBG(DBG_info_buffer," width/height/colors/depth = %d %d %d %d (buffer size %d)\n",
+ buffer->width, buffer->height, buffer->colors, buffer->depth, buffer->image_size_bytes);
+
+ /* Summary */
+ N = buffer->width * buffer->height;
+ for (k = 0; k < buffer->colors; k++) {
+ loc[k] = buffer->p_read[k] - buffer->data - k*N;
+ }
+ for (k = buffer->colors; k < 4; k++) {
+ loc[k] = 0;
+ }
+ DBG(DBG_info_buffer, " reading at: lines = %d:%d:%d:%d\n", loc[0], loc[1], loc[2], loc[3]);
+ for (k = 0; k < buffer->colors; k++) {
+ loc[k] = buffer->p_write[k] - buffer->data - k*N;
+ }
+ for (k = buffer->colors; k < 4; k++) {
+ loc[k] = 0;
+ }
+ DBG(DBG_info_buffer, " writing at: lines = %d:%d:%d:%d\n", loc[0], loc[1], loc[2], loc[3]);
+
+ /* Progress */
+ double fdata = (double)buffer->bytes_unread/buffer->image_size_bytes*100;
+ double fread = (double)buffer->bytes_read/buffer->image_size_bytes*100;
+ double fwritten = (double)buffer->bytes_written/buffer->image_size_bytes*100;
+ DBG(DBG_info_buffer, " byte counts: image = %d, data = %d (%.0f%%), read = %d (%.0f%%), written = %d (%.0f%%)\n",
+ buffer->image_size_bytes, buffer->bytes_unread, fdata, buffer->bytes_read, fread, buffer->bytes_written, fwritten);
+ DBG(DBG_info_buffer, " line counts: image = %.1f, data = %.1f, read = %.1f, written = %.1f\n",
+ (double)buffer->image_size_bytes/line_size, (double)buffer->bytes_unread/line_size, (double)buffer->bytes_read/line_size, (double)buffer->bytes_written/line_size);
+
+}
+#endif
diff --git a/backend/pieusb_buffer.h b/backend/pieusb_buffer.h
new file mode 100644
index 0000000..3724a40
--- /dev/null
+++ b/backend/pieusb_buffer.h
@@ -0,0 +1,93 @@
+/* sane - Scanner Access Now Easy.
+
+ pieusb_buffer.h
+
+ Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+#ifndef PIEUSB_BUFFER_H
+#define PIEUSB_BUFFER_H
+
+#include "pieusb.h"
+#include "../include/sane/sanei_ir.h"
+
+struct Pieusb_Read_Buffer
+{
+ SANE_Uint* data; /* image data - always store as 16 bit values; mmap'ed */
+ unsigned int data_size; /* size of mmap region */
+ SANE_Int data_file; /* associated file if memory mapped */
+ char buffer_name[L_tmpnam];
+
+ /* Buffer parameters */
+ SANE_Int width; /* number of pixels on a line */
+ SANE_Int height; /* number of lines in buffer */
+ SANE_Int colors; /* number of colors in a pixel */
+ SANE_Int depth; /* number of bits of a color */
+ SANE_Int packing_density; /* number of single color samples packed together */
+
+ /* Derived quantities
+ * All derived quantities pertain to the image, not to the buffer */
+ SANE_Int packet_size_bytes; /* number of bytes of a packet of samples = round_up(depth*packing_density/8) */
+ SANE_Int line_size_packets; /* number of packets on a single color line = round-down((width+packing_density-1)/packing_density) */
+ SANE_Int line_size_bytes; /* number of bytes on a single color line = line_size_packets*packet_size_bytes */
+ SANE_Int image_size_bytes; /* total number of bytes in the buffer (= colors * height * line_size_packets* packet_size_bytes) */
+ SANE_Int color_index_red; /* color index of the red color plane (-1 if not used) */
+ SANE_Int color_index_green; /* color index of the green color plane (-1 if not used) */
+ SANE_Int color_index_blue; /* color index of the blue color plane (-1 if not used) */
+ SANE_Int color_index_infrared; /* color index of the infrared color plane (-1 if not used) */
+
+ /* Reading - byte oriented */
+ SANE_Uint** p_read; /* array of pointers to next sample to read for each color plane */
+ SANE_Int read_index[4]; /* location where to read next (color-index, height-index, width-index, byte-index) */
+ SANE_Int bytes_read; /* number of bytes read from the buffer */
+ SANE_Int bytes_unread; /* number of bytes not yet read from the buffer */
+ SANE_Int bytes_written; /* number of bytes written to the buffer */
+
+ /* Writing */
+ SANE_Uint** p_write; /* array of pointers to next byte to write for each color plane */
+};
+
+void sanei_pieusb_buffer_get(struct Pieusb_Read_Buffer* buffer, SANE_Byte* data, SANE_Int max_len, SANE_Int* len);
+SANE_Status sanei_pieusb_buffer_create(struct Pieusb_Read_Buffer* buffer, SANE_Int width, SANE_Int height, SANE_Byte colors, SANE_Byte depth);
+void sanei_pieusb_buffer_delete(struct Pieusb_Read_Buffer* buffer);
+SANE_Int sanei_pieusb_buffer_put_full_color_line(struct Pieusb_Read_Buffer* buffer, void* line, int size);
+SANE_Int sanei_pieusb_buffer_put_single_color_line(struct Pieusb_Read_Buffer* buffer, SANE_Byte color, void* line, SANE_Int size);
+
+#endif /* PIEUSB_BUFFER_H */
diff --git a/backend/pieusb_scancmd.c b/backend/pieusb_scancmd.c
new file mode 100644
index 0000000..a86f8fe
--- /dev/null
+++ b/backend/pieusb_scancmd.c
@@ -0,0 +1,1329 @@
+/* sane - Scanner Access Now Easy.
+
+ pieusb_scancmd.c
+
+ Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+/* =========================================================================
+ *
+ * Pieusb scanner commands
+ *
+ * Each scanner command has its own function.
+ * See the sort description preceeding each function.
+ *
+ * ========================================================================= */
+
+#define DEBUG_DECLARE_ONLY
+
+#include "pieusb.h"
+#include "pieusb_scancmd.h"
+#include "pieusb_usb.h"
+
+#ifdef HAVE_ALLOCA_H
+#include <alloca.h>
+#endif
+
+#include <time.h> /* for time() */
+
+static void _prep_scsi_cmd(SANE_Byte* command_bytes, SANE_Byte command, SANE_Word size);
+
+/* =========================================================================
+ *
+ * Pieusb utility functions
+ *
+ * ========================================================================= */
+
+/*
+ * Get the unsigned char value in the array at given offset
+ */
+static SANE_Byte
+_get_byte(SANE_Byte* array, SANE_Byte offset) {
+ return *(array+offset);
+}
+
+/*
+ * Set the array at given offset to the given unsigned char value
+ */
+static void
+_set_byte(SANE_Byte val, SANE_Byte* array, SANE_Byte offset) {
+ *(array+offset) = val;
+}
+
+
+/*
+ * Get the unsigned short value in the array at given offset.
+ * All data in structures is little-endian, so the LSB comes first
+ * SANE_Int is 4 bytes, but that is not a problem.
+ */
+static SANE_Int
+_get_short(SANE_Byte* array, SANE_Byte offset) {
+ SANE_Int i = *(array+offset+1);
+ i <<= 8;
+ i += *(array+offset);
+ return i;
+}
+
+
+/*
+ * Put the bytes of a short int value into an unsigned char array
+ * All data in structures is little-endian, so start with LSB
+ */
+static void
+_set_short(SANE_Word val, SANE_Byte* array, SANE_Byte offset) {
+ *(array+offset) = val & 0xFF;
+ *(array+offset+1) = (val>>8) & 0xFF;
+}
+
+
+/*
+ * Get the signed int value in the array at given offset.
+ * All data in structures is little-endian, so the LSB comes first
+ */
+static SANE_Int
+_get_int(SANE_Byte* array, SANE_Byte offset) {
+ SANE_Int i = *(array+offset+3);
+ i <<= 8;
+ i += *(array+offset+2);
+ i <<= 8;
+ i += *(array+offset+1);
+ i <<= 8;
+ i += *(array+offset);
+ return i;
+}
+
+#if 0 /* unused */
+/*
+ * Put the bytes of a signed int value into an unsigned char array
+ * All data in structures is little-endian, so start with LSB
+ */
+static void
+_set_int(SANE_Word val, SANE_Byte* array, SANE_Byte offset) {
+ *(array+offset) = val & 0xFF;
+ *(array+offset+1) = (val>>8) & 0xFF;
+ *(array+offset+2) = (val>>16) & 0xFF;
+ *(array+offset+3) = (val>>24) & 0xFF;
+}
+#endif
+
+/*
+ * Copy count unsigned char values from src to dst
+ */
+static void
+_copy_bytes(SANE_Byte* dst, SANE_Byte* src, SANE_Byte count) {
+ SANE_Byte k;
+ for (k=0; k<count; k++) {
+ *dst++ = *src++;
+ }
+}
+
+
+/*
+ * Get count unsigned short values in the array at given offset.
+ * All data in structures is little-endian, so the MSB comes first.
+ * SANE_Word is 4 bytes, but that is not a problem.
+ */
+static void
+_get_shorts(SANE_Word* dst, SANE_Byte* src, SANE_Byte count) {
+ SANE_Byte k;
+ for (k=0; k<count; k++) {
+ *dst = *(src+2*k+1);
+ *dst <<= 8;
+ *dst++ += *(src+2*k);
+ }
+}
+
+/*
+ * Copy an unsigned short array of given size
+ * All data in structures is little-endian, so start with MSB of each short.
+ * SANE_Word is 4 bytes, but that is not a problem. All MSB 2 bytes are ignored.
+ */
+static void
+_set_shorts(SANE_Word* src, SANE_Byte* dst, SANE_Byte count) {
+ SANE_Byte k;
+ for (k=0; k<count; k++) {
+ *(dst+2*k) = *src & 0xFF;
+ *(dst+2*k+1) = ((*src++)>>8) & 0xFF;
+ }
+}
+
+
+/**
+ * Perform a TEST UNIT READY (SCSI command code 0x00)
+ * Returns status->pieusb_status:
+ * - PIEUSB_STATUS_GOOD if device is ready
+ * - PIEUSB_STATUS_DEVICE_BUSY if device is still busy after timeout
+ * - other SANE status code if TEST UNIT READY failed or if it returned
+ * CHECK CONDITION and REQUEST SENSE failed
+ *
+ * @param device_number Device number
+ * @return Pieusb_Command_Status SANE_STATUS_GOOD if ready, SANE_STATUS_DEVICE_BUSY if not
+ */
+void
+sanei_pieusb_cmd_test_unit_ready(SANE_Int device_number, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_test_unit_ready()\n");
+
+ _prep_scsi_cmd (command, SCSI_TEST_UNIT_READY, 0);
+
+ status->pieusb_status = sanei_pieusb_command (device_number, command, NULL, 0);
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_test_unit_ready() return status = %s\n", sane_strstatus(status->pieusb_status));
+}
+
+/**
+ * slide action
+ * @param action SLIDE_NEXT, SLIDE_PREV, SLIDE_LAMP_ON, SLIDE_RELOAD
+ * @return Pieusb_Command_Status
+ */
+
+void
+sanei_pieusb_cmd_slide(SANE_Int device_number, slide_action action, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define SLIDE_DATA_SIZE 4
+ SANE_Byte data[SLIDE_DATA_SIZE];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_slide(0x%02x)\n", action);
+
+ _prep_scsi_cmd(command, SCSI_SLIDE, SLIDE_DATA_SIZE);
+ memset(data, '\0', SLIDE_DATA_SIZE);
+ data[0] = action;
+ data[1] = 0x01;
+
+ status->pieusb_status = sanei_pieusb_command(device_number, command, data, SLIDE_DATA_SIZE);
+#undef SLIDE_DATA_SIZE
+}
+
+/**
+ * Perform a REQUEST SENSE (SCSI command code 0x03)
+ * Returns status->pieusb_status:
+ * - PIEUSB_STATUS_GOOD is the command executes OK
+ * - other SANE status code if REQUEST SENSE fails
+ * The sense fields in status are always 0. A REQUEST SENSE is not repeated if
+ * the device returns PIEUSB_STATUS_DEVICE_BUSY.
+ *
+ * @param device_number Device number
+ * @param sense Sense data
+ * @param status Command result status
+ * @see struc Pieusb_Sense
+ */
+void
+sanei_pieusb_cmd_get_sense(SANE_Int device_number, struct Pieusb_Sense* sense, struct Pieusb_Command_Status *status, PIEUSB_Status *ret)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define DATA_SIZE 14
+ SANE_Int size = DATA_SIZE;
+ SANE_Byte data[DATA_SIZE];
+ PIEUSB_Status st;
+ SANE_Char* sd;
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_sense()\n");
+
+ _prep_scsi_cmd(command, SCSI_REQUEST_SENSE, size);
+
+ memset(data, '\0', size);
+ st = sanei_pieusb_command(device_number, command, data, size);
+ if (st != PIEUSB_STATUS_GOOD) {
+ status->pieusb_status = st;
+ /*FIXME*/
+ return;
+ }
+
+ /* Decode data recieved */
+ sense->errorCode = _get_byte (data, 0);
+ sense->segment = _get_byte (data, 1);
+ sense->senseKey = _get_byte (data, 2);
+ _copy_bytes (sense->info, data+3, 4);
+ sense->addLength = _get_byte (data, 7);
+ _copy_bytes (sense->cmdInfo, data+8, 4);
+ sense->senseCode = _get_byte (data, 12);
+ sense->senseQualifier = _get_byte (data, 13);
+ status->pieusb_status = PIEUSB_STATUS_GOOD;
+#undef DATA_SIZE
+ DBG (DBG_info_scan, "\tsense details:\n");
+ DBG (DBG_info_scan, "\t\terror......... : 0x%02x\n", sense->errorCode);
+ DBG (DBG_info_scan, "\t\tsegment....... : %d\n", sense->segment);
+ DBG (DBG_info_scan, "\t\tsenseKey...... : 0x%02x\n", sense->senseKey);
+ DBG (DBG_info_scan, "\t\tinfo.......... : %02x %02x %02x %02x\n", sense->info[0], sense->info[1], sense->info[2], sense->info[3]);
+ DBG (DBG_info_scan, "\t\taddLength..... : %d\n", sense->addLength);
+ DBG (DBG_info_scan, "\t\tcmdInfo....... : %02x %02x %02x %02x\n", sense->cmdInfo[0], sense->cmdInfo[1], sense->cmdInfo[2], sense->cmdInfo[3]);
+ DBG (DBG_info_scan, "\t\tsenseCode..... : 0x%02x\n", sense->senseCode);
+ DBG (DBG_info_scan, "\t\tsenseQualifier : 0x%02x\n", sense->senseQualifier);
+ sd = sanei_pieusb_decode_sense (sense, ret?ret:&st);
+ DBG (DBG_info_scan, "\tsense: %s\n", sd);
+ free(sd);
+}
+
+/**
+ * Read the halftone pattern with the specified index. This requires two
+ * commands, one to ask the device to prepare the pattern, and one to read it.
+ *
+ * @param device_number Device number
+ * @param index index of halftone pattern
+ * @param pattern Halftone pattern (not implemented)
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Halftone_Pattern
+ */
+void
+sanei_pieusb_cmd_get_halftone_pattern(SANE_Int device_number, SANE_Int index, struct Pieusb_Halftone_Pattern* pattern, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define PATTERN_SIZE 256 /* Assumed maximum pattern size */
+ SANE_Int size = PATTERN_SIZE;
+ SANE_Byte data[PATTERN_SIZE];
+ int psize;
+ SANE_Char* desc;
+ PIEUSB_Status st;
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_halftone_pattern()\n");
+
+ /* Ask scanner to prepare the pattern with the given index. Only SCSI_COMMAND_LEN bytes of data. */
+ _prep_scsi_cmd(command, SCSI_WRITE, SCSI_COMMAND_LEN);
+ memset(data, '\0', SCSI_COMMAND_LEN);
+ data[0] = SCSI_HALFTONE_PATTERN | 0x80; /* set bit 7 means prepare read */
+ data[4] = index;
+
+ st = sanei_pieusb_command(device_number, command, data, SCSI_COMMAND_LEN);
+ if (st != PIEUSB_STATUS_GOOD) {
+ status->pieusb_status = st;
+ /* FIXME */
+ return;
+ }
+
+ /* Read pattern */
+ _prep_scsi_cmd(command, SCSI_READ, size);
+
+ memset(data, '\0', size);
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, size);
+
+ /*FIXME: analyse */
+ fprintf(stderr, "Halftone pattern %d:\n", index);
+ psize = (data[3]<<8) + data[2];
+ desc = (SANE_Char*)(data + 4 + psize);
+ data[4 + psize + 16] = '\0';
+ fprintf(stderr,"Descr. offset from byte 4 = %d, %16s, index = %d, size = %dx%d\n", psize, desc, data[4]&0x7F, data[6], data[7]);
+#undef PATTERN_SIZE
+}
+
+/**
+ * Read the scan frame with the specified index. This requires two
+ * commands, one to ask the device to prepare the pattern, and one to read it.
+ *
+ * @param device_number Device number
+ * @param frame Scan frame
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Scan_Frame
+ */
+void
+sanei_pieusb_cmd_get_scan_frame(SANE_Int device_number, SANE_Int index, struct Pieusb_Scan_Frame* frame, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define FRAME_SIZE 256 /* Assumed maximum frame size */
+ SANE_Int size = FRAME_SIZE;
+ SANE_Byte data[FRAME_SIZE];
+ PIEUSB_Status st;
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_scan_frame()\n");
+
+ /* Ask scanner to prepare the scan frame with the given index. Only SCSI_COMMAND_LEN bytes of data. */
+ _prep_scsi_cmd (command, SCSI_WRITE, SCSI_COMMAND_LEN);
+ memset (data, '\0', SCSI_COMMAND_LEN);
+ data[0] = SCSI_SCAN_FRAME | 0x80; /* set bit 7 means prepare read */
+ data[4] = index;
+
+ st = sanei_pieusb_command (device_number, command, data, SCSI_COMMAND_LEN);
+ if (st != PIEUSB_STATUS_GOOD) {
+ status->pieusb_status = st;
+ /* FIXME */
+ return;
+ }
+
+ /* Read scan frame */
+ _prep_scsi_cmd (command, SCSI_READ, size);
+
+ memset(data, '\0', size);
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, size);
+
+ /* Decode data */
+ frame->index = _get_byte (data, 4);
+ frame->x0 = _get_short (data, 6);
+ frame->y0 = _get_short (data, 8);
+ frame->x1 = _get_short (data, 10);
+ frame->y1 = _get_short (data, 12);
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_scan_frame() set:\n");
+ DBG (DBG_info_scan, " x0,y0 = %d,%d\n", frame->x0, frame->y0);
+ DBG (DBG_info_scan, " x1,y1 = %d,%d\n", frame->x1, frame->y1);
+ DBG (DBG_info_scan, " index = %d\n", frame->index);
+#undef FRAME_SIZE
+}
+
+/**
+ * command 17 - unknown
+ */
+
+void
+sanei_pieusb_cmd_17(SANE_Int device_number, SANE_Int value, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define CMD_17_SIZE 6
+ SANE_Byte data[CMD_17_SIZE];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_17(%d)\n", value);
+
+ _prep_scsi_cmd (command, SCSI_WRITE, CMD_17_SIZE);
+ memset (data, '\0', CMD_17_SIZE);
+ _set_short (SCSI_CMD_17, data, 0);
+ _set_short (2, data, 2);
+ _set_short (value, data, 4);
+
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, CMD_17_SIZE);
+#undef CMD_17_SIZE
+ if (status->pieusb_status != PIEUSB_STATUS_GOOD) {
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_17 failed: 0x%02x\n", status->pieusb_status);
+ return;
+ }
+}
+
+/**
+ * Read the relative exposure time for the specified colorbits. This requires two
+ * commands, one to ask the device to prepare the value, and one to read it.
+ *
+ * @param device_number Device number
+ * @param time Relative exposure time(s)
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Exposure_Time
+ */
+void
+sanei_pieusb_cmd_get_exposure_time(SANE_Int device_number, SANE_Int colorbits, struct Pieusb_Exposure_Time* time, struct Pieusb_Command_Status *status)
+{
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_exposure_time(): not implemented\n");
+ status->pieusb_status = PIEUSB_STATUS_INVAL;
+}
+
+/**
+ * Read the highlight and shadow levels with the specified colorbits. This requires two
+ * commands, one to ask the device to prepare the value, and one to read it.
+ *
+ * @param device_number Device number
+ * @param hgltshdw Highlight and shadow level(s)
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Highlight_Shadow
+ */
+void
+sanei_pieusb_cmd_get_highlight_shadow(SANE_Int device_number, SANE_Int colorbits, struct Pieusb_Highlight_Shadow* hgltshdw, struct Pieusb_Command_Status *status)
+{
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_highlight_shadow(): not implemented\n");
+ status->pieusb_status = PIEUSB_STATUS_INVAL;
+}
+
+/**
+ * Read the shading data parameters. This requires two
+ * commands, one to ask the device to prepare the value, and one to read it.
+ *
+ * @param device_number Device number
+ * @param shading Shading data parameters
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Shading_Parameters
+ */
+void
+sanei_pieusb_cmd_get_shading_parms(SANE_Int device_number, struct Pieusb_Shading_Parameters_Info* shading, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define SHADING_SIZE 32
+#define PREP_READ_SIZE 6
+ SANE_Int size = SHADING_SIZE;
+ SANE_Byte data[SHADING_SIZE];
+ int k;
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_shading_parms()\n");
+
+ /* Ask scanner to prepare the scan frame with the given index. Only SCSI_COMMAND_LEN bytes of data. */
+ _prep_scsi_cmd (command, SCSI_WRITE, SCSI_COMMAND_LEN);
+ memset (data, '\0', PREP_READ_SIZE);
+ data[0] = SCSI_CALIBRATION_INFO | 0x80; /* set bit 7 means prepare read */
+
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, PREP_READ_SIZE);
+ if (status->pieusb_status != PIEUSB_STATUS_GOOD) {
+ return;
+ }
+
+ /* Read shading parameters */
+ _prep_scsi_cmd(command, SCSI_READ, size);
+
+ memset (data, '\0', size);
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, size);
+ if (status->pieusb_status != PIEUSB_STATUS_GOOD) {
+ return;
+ }
+
+ /* Decode data [32 bytes]
+ 0: 95 00 type
+ 2: 1c 00 payload len
+ 4: 04 entries
+ 5: 06 entry size
+ 6: 04 00 ?
+ 8: 00 10 10 14 1a 1d type send recv nlines pixPerLine(2bytes)
+ 14: 08 10 10 14 1a 1d
+ 20: 10 10 10 14 1a 1d
+ 26: 20 10 10 14 1a 1d
+ */
+ for (k = 0; k < data[4]; k++) {
+ shading[k].type = _get_byte (data, 8 + data[5]*k);
+ shading[k].sendBits = _get_byte (data, 9 + data[5]*k);
+ shading[k].recieveBits = _get_byte (data, 10 + data[5]*k);
+ shading[k].nLines = _get_byte (data, 11 + data[5]*k);
+ shading[k].pixelsPerLine = _get_short (data, 12 + data[5]*k);
+ }
+#undef PREP_READ_SIZE
+#undef SHADING_SIZE
+}
+
+/**
+ * Read scanned data from the scanner memory into a byte array. The lines
+ * argument specifies how many lines will be read, the size argument specifies
+ * the total amount of bytes in these lines. Use sanei_pieusb_cmd_get_parameters() to
+ * determine the current line size and the number of available lines.\n
+ * If there is scanned data available, it should be read. Waiting too long
+ * causes the scan to stop, probably because a buffer is filled to its limits
+ * (if so, it is approximately 2Mb in size). I haven't tried what happens if you
+ * start reading after a stop. Reading to fast causes the scanner to return
+ * a busy status, which is not a problem.
+ * This is a SCSI READ command (code 0x08). It is distinguished from the other
+ * READ commands by the context in which it is issued: see sanei_pieusb_cmd_start_scan().
+ *
+ * @param device_number
+ * @param data
+ * @param lines
+ * @param size
+ * @return Pieusb_Command_Status
+ */
+void
+sanei_pieusb_cmd_get_scanned_lines(SANE_Int device_number, SANE_Byte* data, SANE_Int lines, SANE_Int size, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_scanned_lines(): %d lines (%d bytes)\n", lines, size);
+
+ _prep_scsi_cmd (command, SCSI_READ, lines);
+ memset (data, '\0', size);
+
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, size);
+}
+
+/**
+ * Set the halftone pattern with the given index to the specified pattern. The
+ * command is a SCSI WRITE command (code 0x0A, write code 0x11).
+ *
+ * @param device_number Device number
+ * @param index Pattern index (0-7)
+ * @param pattern Halftone pattern (not implemented)
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Halftone_Pattern
+ */
+void
+sanei_pieusb_cmd_set_halftone_pattern(SANE_Int device_number, SANE_Int index, struct Pieusb_Halftone_Pattern* pattern, struct Pieusb_Command_Status *status)
+{
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_set_halftone_pattern(): not implemented\n");
+ status->pieusb_status = PIEUSB_STATUS_INVAL;
+}
+
+/**
+ * Set the scan frame with the given index to the frame. The command is a SCSI
+ * WRITE command (code SCSI_WRITE, write code SCSI_SCAN_FRAME).
+ *
+ * @param device_number Device number
+ * @param index Frame index (0-7)
+ * @param frame Scan frame
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Scan_Frame
+ */
+void
+sanei_pieusb_cmd_set_scan_frame(SANE_Int device_number, SANE_Int index, struct Pieusb_Scan_Frame* frame, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define FRAME_SIZE 14
+ SANE_Int size = FRAME_SIZE;
+ SANE_Byte data[FRAME_SIZE];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_set_scan_frame()\n");
+
+ _prep_scsi_cmd(command, SCSI_WRITE, size);
+
+ DBG (DBG_info_scan, " x0,y0 = %d,%d\n", frame->x0, frame->y0);
+ DBG (DBG_info_scan, " x1,y1 = %d,%d\n", frame->x1, frame->y1);
+ DBG (DBG_info_scan, " index = %d\n", index);
+
+ /* Code data */
+ memset (data, '\0', size);
+ _set_short (SCSI_SCAN_FRAME, data, 0);
+ _set_short (size-4, data, 2); /* size: one frame, 5 shorts */
+ _set_short (index, data, 4);
+ _set_short (frame->x0, data, 6);
+ _set_short (frame->y0, data, 8);
+ _set_short (frame->x1, data, 10);
+ _set_short (frame->y1, data, 12);
+
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, size);
+#undef FRAME_SIZE
+}
+
+/**
+ * Set the relative exposure time to the given values. Only the first
+ * Pieusb_Exposure_Time_Color is used. The command is a SCSI
+ * WRITE command (code SCSI_WRITE, write code SCSI_EXPOSURE).
+ *
+ * @param device_number Device number
+ * @param time Relative exposure time
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Exposure_Time
+ */
+void
+sanei_pieusb_cmd_set_exposure_time(SANE_Int device_number, struct Pieusb_Exposure_Time* time, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define EXPOSURE_DATA_SIZE 8
+ SANE_Byte data[EXPOSURE_DATA_SIZE];
+ struct Pieusb_Exposure_Time_Color *exptime;
+ int i;
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_set_exposure_time()\n");
+
+ for (i = 0; i < 3; ++i) { /* R, G, B */
+ _prep_scsi_cmd (command, SCSI_WRITE, EXPOSURE_DATA_SIZE);
+ memset (data, '\0', EXPOSURE_DATA_SIZE);
+ exptime = &(time->color[i]);
+ _set_short (SCSI_EXPOSURE, data, 0);
+ _set_short (EXPOSURE_DATA_SIZE-4, data, 2); /* short: RGB, short: value */
+ _set_short (exptime->filter, data, 4); /* 1: neutral, 2: R, 4: G, 8: B */
+ _set_short (exptime->value, data, 6);
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, EXPOSURE_DATA_SIZE);
+ if (status->pieusb_status != PIEUSB_STATUS_GOOD)
+ break;
+ }
+
+#undef EXPOSURE_DATA_SIZE
+}
+
+/**
+ * Set the highlight and shadow levels to the given values. Only the first
+ * Pieusb_Highlight_Shadow_Color is used. The command is a SCSI
+ * WRITE command (code SCSI_WRITE, write code SCSI_HIGHLIGHT_SHADOW).
+ *
+ * @param device_number Device number
+ * @param hgltshdw highlight and shadow level
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Highlight_Shadow
+ */
+void
+sanei_pieusb_cmd_set_highlight_shadow(SANE_Int device_number, struct Pieusb_Highlight_Shadow* hgltshdw, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define HIGHLIGHT_SHADOW_SIZE 8
+ SANE_Byte data[HIGHLIGHT_SHADOW_SIZE];
+ struct Pieusb_Highlight_Shadow_Color *color;
+ int i;
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_set_highlight_shadow()\n");
+
+ for (i = 0; i < 3; ++i) { /* R, G, B */
+ _prep_scsi_cmd (command, SCSI_WRITE, HIGHLIGHT_SHADOW_SIZE);
+ memset (data, '\0', HIGHLIGHT_SHADOW_SIZE);
+ color = &(hgltshdw->color[i]);
+ _set_short (SCSI_HIGHLIGHT_SHADOW, data, 0);
+ _set_short (HIGHLIGHT_SHADOW_SIZE-4, data, 2); /* short: RGB, short: value */
+ _set_short (color->filter, data, 4); /* 1: neutral, 2: R, 4: G, 8: B */
+ _set_short (color->value, data, 6);
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, HIGHLIGHT_SHADOW_SIZE);
+ if (status->pieusb_status != PIEUSB_STATUS_GOOD)
+ break;
+ }
+
+#undef HIGHLIGHT_SHADOW_SIZE
+}
+
+/**
+ * Set the CCD-mask for the colors set in the given color bit mask. The mask
+ * array must contain mask_size. The command is a SCSI WRITE command
+ * (code 0x0A, write code 0x16).
+ * (The command is able to handle more masks at once, but that is not implemented.)
+ *
+ * @param device_number Device number
+ * @param colorbits 0000RGB0 color bit mask; at least one color bit must be set
+ * @param mask CCD mask to use
+ * @return Pieusb_Command_Status
+ */
+void
+sanei_pieusb_cmd_set_ccd_mask(SANE_Int device_number, SANE_Byte colorbits, SANE_Byte* mask, SANE_Int mask_size, struct Pieusb_Command_Status *status)
+{
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_set_ccd_mask(): not implemented\n");
+ status->pieusb_status = PIEUSB_STATUS_INVAL;
+}
+
+/* SCSI PARAM, code 0x0F */
+/**
+ * Get the parameters of an executed scan, such as width, lines and bytes, which
+ * are needed to calculate the parameters of the READ-commands which read the
+ * actual scan data.
+ *
+ * @param device_number Device number
+ * @param parameters Scan parameters
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Scan_Parameters
+ */
+void
+sanei_pieusb_cmd_get_parameters(SANE_Int device_number, struct Pieusb_Scan_Parameters* parameters, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define PARAMETER_SIZE 18
+ SANE_Int size = PARAMETER_SIZE;
+ SANE_Byte data[PARAMETER_SIZE];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_parameters()\n");
+
+ _prep_scsi_cmd (command, SCSI_PARAM, size);
+ memset (data, '\0', size);
+
+ status->pieusb_status = sanei_pieusb_command(device_number, command, data, size);
+ if (status->pieusb_status != PIEUSB_STATUS_GOOD) {
+ return;
+ }
+
+ /* cyberview:
+ * 0: e6 02 width 0x2e6 - 742
+ * 2: e0 02 lines 0x2e0 - 736
+ * 4: e6 02 bytes 0x2e6 - 742
+ * 6: 08 filterOffeset1 8
+ * 7: 08 filterOffset2 8
+ * 8: c9 1c 00 00 period 7369
+ * c: 00 00 scsi transfer rate
+ * e: d7 00 available lines 215
+ * 10:00 00
+ */
+ /* Decode data recieved */
+ parameters->width = _get_short(data, 0);
+ parameters->lines = _get_short(data, 2);
+ parameters->bytes = _get_short(data, 4);
+ parameters->filterOffset1 = _get_byte(data, 6);
+ parameters->filterOffset2 = _get_byte(data, 7);
+ parameters->period = _get_int(data, 8); /* unused */
+ parameters->scsiTransferRate = _get_short(data, 12); /* unused */
+ parameters->availableLines = _get_short(data, 14);
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_parameters() read:\n");
+ DBG (DBG_info_scan, " width = %d\n", parameters->width);
+ DBG (DBG_info_scan, " lines = %d\n", parameters->lines);
+ DBG (DBG_info_scan, " bytes = %d\n", parameters->bytes);
+ DBG (DBG_info_scan, " offset1 = %d\n", parameters->filterOffset1);
+ DBG (DBG_info_scan, " offset2 = %d\n", parameters->filterOffset2);
+ DBG (DBG_info_scan, " available lines = %d\n", parameters->availableLines);
+#undef PARAMETER_SIZE
+}
+
+/**
+ * Read INQUIRY block from device (SCSI command code 0x12). This block contains
+ * information about the properties of the scanner.
+ * Returns status->pieusb_status:
+ * - PIEUSB_STATUS_GOOD if the INQUIRY command succeeded
+ * - PIEUSB_STATUS_DEVICE_BUSY if device is busy after repeat retries
+ * - other SANE status code if INQUIRY failed or if it returned CHECK CONDITION
+ * and REQUEST SENSE failed
+ *
+ * @param device_number Device number
+ * @param data Input or output data buffer
+ * @param size Size of the data buffer
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Scanner_Properties
+ */
+void
+sanei_pieusb_cmd_inquiry(SANE_Int device_number, struct Pieusb_Scanner_Properties* inq, SANE_Byte size, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define INQUIRY_SIZE 256
+ SANE_Byte data[INQUIRY_SIZE];
+ int k;
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_inquiry()\n");
+
+ _prep_scsi_cmd (command, SCSI_INQUIRY, size);
+ memset (data, '\0', INQUIRY_SIZE); /* size may be less than INQUIRY_SIZE, so prevent returning noise */
+
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, size);
+ if (status->pieusb_status != PIEUSB_STATUS_GOOD) {
+ return;
+ }
+
+ /* Decode data recieved */
+ inq->deviceType = _get_byte(data, 0);
+ inq->additionalLength = _get_byte(data, 4);
+ _copy_bytes((SANE_Byte*)(inq->vendor), data+8, 8); /* Note: not 0-terminated */
+ _copy_bytes((SANE_Byte*)(inq->product), data+16, 16); /* Note: not 0-terminated */
+ _copy_bytes((SANE_Byte*)(inq->productRevision), data+32, 4); /* Note: not 0-terminated */
+ /* 1st Vendor-specific block, 20 bytes, see pie_get_inquiry_values(), partially: */
+ inq->maxResolutionX = _get_short(data, 36);
+ inq->maxResolutionY = _get_short(data, 38);
+ inq->maxScanWidth = _get_short(data, 40);
+ inq->maxScanHeight = _get_short(data, 42);
+ inq->filters = _get_byte(data, 44);
+ inq->colorDepths = _get_byte(data, 45);
+ inq->colorFormat = _get_byte(data, 46);
+ inq->imageFormat = _get_byte(data, 48);
+ inq->scanCapability = _get_byte(data, 49);
+ inq->optionalDevices = _get_byte(data, 50);
+ inq->enhancements = _get_byte(data, 51);
+ inq->gammaBits = _get_byte(data, 52);
+ inq->lastFilter = _get_byte(data, 53);
+ inq->previewScanResolution = _get_short(data, 54);
+ /* 2nd vendor specific block (36 bytes at offset 96) */
+ _copy_bytes((SANE_Byte*)(inq->firmwareVersion), data+96, 4); inq->firmwareVersion[4]=0x00;
+ inq->halftones = _get_byte(data, 100);
+ inq->minumumHighlight = _get_byte(data, 101);
+ inq->maximumShadow = _get_byte(data, 102);
+ inq->calibrationEquation = _get_byte(data, 103);
+ inq->maximumExposure = _get_short(data ,104);
+ inq->minimumExposure = _get_short(data ,106);
+ inq->x0 = _get_short(data, 108);
+ inq->y0 = _get_short(data, 110);
+ inq->x1 = _get_short(data, 112);
+ inq->y1 = _get_short(data, 114);
+ inq->model = _get_short(data, 116);
+ _copy_bytes((SANE_Byte*)(inq->production), data+120, 4);
+ _copy_bytes((SANE_Byte*)(inq->timestamp), data+124, 20);
+ _copy_bytes((SANE_Byte*)(inq->signature), data+144, 40);
+ /* remove newline in signature */
+ for (k=0; k<40; k++) if (inq->signature[k]==0x0a || inq->signature[k]==0x0d) inq->signature[k]=' ';
+#undef INQUIRY_SIZE
+}
+
+/**
+ * Set scan mode parameters, such as resolution, colors to scan, color depth,
+ * color format, and a couple of scan quality settings (sharpen, skip
+ * calibration, fast infrared). It performs the SCSI-command MODE SELECT,
+ * code 0x15.
+ *
+ * @param device_number Device number
+ * @param mode Mode parameters
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Mode
+ */
+void
+sanei_pieusb_cmd_set_mode(SANE_Int device_number, struct Pieusb_Mode* mode, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define MODE_SIZE 16
+ SANE_Int size = MODE_SIZE;
+ SANE_Byte data[MODE_SIZE];
+ SANE_Byte quality;
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_set_mode()\n");
+
+ _prep_scsi_cmd(command, SCSI_MODE_SELECT, size);
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_set_mode() set:\n");
+ DBG (DBG_info_scan, " resolution = %d\n", mode->resolution);
+ DBG (DBG_info_scan, " passes = %02x\n", mode->passes);
+ DBG (DBG_info_scan, " depth = %02x\n", mode->colorDepth);
+ DBG (DBG_info_scan, " color format = %02x\n", mode->colorFormat);
+ DBG (DBG_info_scan, " sharpen = %d\n", mode->sharpen);
+ DBG (DBG_info_scan, " skip calibration = %d\n", mode->skipShadingAnalysis);
+ DBG (DBG_info_scan, " fast infrared = %d\n", mode->fastInfrared);
+ DBG (DBG_info_scan, " halftone pattern = %d\n", mode->halftonePattern);
+ DBG (DBG_info_scan, " line threshold = %d\n", mode->lineThreshold);
+
+ /* Code data */
+ /* cyberview
+ * 00 0f entries
+ * f4 01 resolution 500
+ * 80 RGB (90: RGBI)
+ * 04 color depth (4: 8 bit, 20: 16 bit)
+ * 04 color format
+ * 00
+ * 01 byte order
+ * 08 quality bitmask: 80=fast infrared, 08=skip shading analysis, 02=sharpen
+ * 00 00
+ * 00 halftone pattern
+ * 80 line threshold
+ * 10 00
+ *
+ * pieusb
+ * 0: 00 0f
+ * 2: e8 03 resolution 1000
+ * 4: 80 passes
+ * 5: 04 color depth
+ * 6: 04 color format
+ * 7: 00
+ * 8: 01 byte order
+ * 9: 02 quality bitmask: sharpen
+ * a: 00 00
+ * c: 00 halftone pattern
+ * d: 7f line threshold
+ * e: 00 00
+ */
+ memset (data, '\0', size);
+ _set_byte (size-1, data, 1);
+ _set_short (mode->resolution, data, 2);
+ _set_byte (mode->passes, data, 4);
+ _set_byte (mode->colorDepth, data, 5);
+ _set_byte (mode->colorFormat, data, 6);
+ _set_byte (mode->byteOrder, data, 8);
+ quality = 0x00;
+ if (mode->sharpen) quality |= 0x02;
+ if (mode->skipShadingAnalysis) quality |= 0x08;
+ if (mode->fastInfrared) quality |= 0x80;
+ _set_byte (quality, data, 9);
+ _set_byte (mode->halftonePattern, data, 12);
+ _set_byte (mode->lineThreshold, data, 13);
+ _set_byte (0x10, data, 14); /* ? */
+
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, size);
+#undef MODE_SIZE
+}
+
+/* SCSI COPY, code 0x18 */
+/**
+ * Get the currently used CCD-mask, which defines which pixels have been used in
+ * the scan, and which allows to relate scan data to shading data. A mask is a
+ * 5340 byte array which consists only contains the values 0x00 and 0x70. A
+ * value of 0x00 indicates the pixel is used, a value of 0x70 that it is not.\n
+ * The number of 0x00 bytes equals the number of pixels on a line.\n
+ * The mask begins with a number of 0x70 bytes equal to the scan frame x0-value
+ * divided by 2.\n
+ * The SCSI-command COPY (code 0x18) is used for function.
+ *
+ * @param device_number Device number
+ * @param mask
+ * @return Pieusb_Command_Status
+ */
+void
+sanei_pieusb_cmd_get_ccd_mask(SANE_Int device_number, SANE_Byte* mask, SANE_Int mask_size, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_ccd_mask()\n");
+
+ _prep_scsi_cmd (command, SCSI_COPY, mask_size);
+
+ memset (mask, '\0', mask_size);
+ status->pieusb_status = sanei_pieusb_command (device_number, command, mask, mask_size);
+}
+
+/**
+ * Get scan mode parameters, such as resolution, colors to scan, color depth,
+ * color format, and a couple of scan quality settings (sharpen, skip
+ * calibration, fast infrared). It performs the SCSI-command MODE SELECT,
+ * code 0x1A.
+ *
+ * @param device_number Device number
+ * @param mode Mode parameters
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Mode
+ */
+void
+sanei_pieusb_cmd_get_mode(SANE_Int device_number, struct Pieusb_Mode* mode, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define MODE_SIZE 16
+ SANE_Int size = MODE_SIZE;
+ SANE_Byte data[MODE_SIZE];
+ SANE_Byte quality;
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_mode()\n");
+
+ _prep_scsi_cmd (command, SCSI_MODE_SENSE, size);
+ memset (data, '\0', size);
+
+ status->pieusb_status = sanei_pieusb_command(device_number, command, data, size);
+ if (status->pieusb_status != PIEUSB_STATUS_GOOD) {
+ return;
+ }
+
+ /* Decode data recieved */
+ mode->resolution = _get_short (data, 2);
+ mode->passes = _get_byte (data, 4);
+ mode->colorDepth = _get_byte (data, 5);
+ mode->colorFormat = _get_byte (data, 6);
+ mode->byteOrder = _get_byte (data, 8);
+ quality = _get_byte (data, 9);
+ mode->sharpen = (quality |= 0x02) ? SANE_TRUE : SANE_FALSE;
+ mode->skipShadingAnalysis = (quality |= 0x08) ? SANE_TRUE : SANE_FALSE;
+ mode->fastInfrared = (quality |= 0x80) ? SANE_TRUE : SANE_FALSE;
+ mode->halftonePattern = _get_byte (data, 12);
+ mode->lineThreshold = _get_byte (data, 13);
+
+ DBG (DBG_info_scan, "cmdGetMode():\n");
+ DBG (DBG_info_scan, " resolution = %d\n", mode->resolution);
+ DBG (DBG_info_scan, " passes = %02x\n", mode->passes);
+ DBG (DBG_info_scan, " depth = %02x\n", mode->colorDepth);
+ DBG (DBG_info_scan, " color format = %02x\n", mode->colorFormat);
+ DBG (DBG_info_scan, " sharpen = %d\n", mode->sharpen);
+ DBG (DBG_info_scan, " skip calibration = %d\n", mode->skipShadingAnalysis);
+ DBG (DBG_info_scan, " fast infrared = %d\n", mode->fastInfrared);
+ DBG (DBG_info_scan, " halftone pattern = %d\n", mode->halftonePattern);
+ DBG (DBG_info_scan, " line threshold = %d\n", mode->lineThreshold);
+#undef MODE_SIZE
+}
+
+/**
+ * Start a scan (SCSI SCAN command, code 0x1B, size byte = 0x01).\n
+ * There are four phases in a scan process. During each phase a limited number of
+ * commands is available. The phases are:\n
+ * 1. Calibration phase: make previously collected shading correction data available\n
+ * 2. Line-by-line scan & read phase\n
+ * 3. Output CCD-mask phase\n
+ * 4. Scan and output scan data phase\n
+ *
+ * The calibration phase is skipped if Pieusb_Mode.skipCalibration is set. If
+ * the scanner determines a calibration is necessary, a CHECK CONDIDITION response
+ * is returned. Available command during this phase:\n
+ * 1. sanei_pieusb_cmd_test_unit_ready()\n
+ * 2. sanei_pieusb_cmd_get_scanned_lines(): read shading correction lines\n
+ * 3. sanei_pieusb_cmd_stop_scan: abort scanning process\n
+ * 4. sanei_pieusb_cmd_get_gain_offset() : the settings are generated during the initialisation of this phase, so they are current\n
+ * 5. cmdSetSettings(): settings take effect in the next scan phase\n\n
+ * The line-by-line phase is only entered if Pieusb_Mode.div_10[0] bit 5 is
+ * set. It is not implemented.\n\n
+ * In the CCD-mask output phase the CCD-mask is read. Available command during this phase:\n
+ * 1. sanei_pieusb_cmd_test_unit_ready()\n
+ * 2. sanei_pieusb_cmd_get_ccd_mask()\n
+ * 3. sanei_pieusb_cmd_stop_scan: abort scanning process\n\n
+ * In the 'scan and output scan data' phase, the slide is scanned while data is
+ * read in the mean time. Available command during this phase:\n
+ * 1. sanei_pieusb_cmd_test_unit_ready()\n
+ * 2. sanei_pieusb_cmd_get_scanned_lines()\n
+ * 2. sanei_pieusb_cmd_get_parameters()\n
+ * 4. sanei_pieusb_cmd_stop_scan: abort scanning process\n
+ *
+ * @param device_number Device number
+ * @return Pieusb_Command_Status
+ */
+void
+sanei_pieusb_cmd_start_scan(SANE_Int device_number, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_start_scan()\n");
+
+ _prep_scsi_cmd (command, SCSI_SCAN, 1);
+
+ status->pieusb_status = sanei_pieusb_command (device_number, command, NULL, 0);
+}
+
+/**
+ * Stop a scan started with sanei_pieusb_cmd_start_scan(). It issues a SCSI SCAN command,
+ * code 0x1B, with size byte = 0x00.
+ *
+ * @param device_number Device number
+ * @return Pieusb_Command_Status
+ */
+void
+sanei_pieusb_cmd_stop_scan(SANE_Int device_number, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_stop_scan()\n");
+
+ _prep_scsi_cmd (command, SCSI_SCAN, 0);
+
+ status->pieusb_status = sanei_pieusb_command (device_number, command, NULL, 0);
+}
+
+/**
+ * Set scan head to a specific position, depending on the value for mode:\n
+ * mode = 1: Returns the scan head to the resting position, after a short move
+ * forward. If this command is left out between two scans, the second scan is
+ * up-down-mirrored, and scanning starts where the proevious scan stopped.\n
+ * mode = 2: Resets the scan head an then moves it forward depending on 'size',
+ * but it is a bit unpredictable to what position. The scanner may attempt to
+ * move the head past its physical end position. The mode is not implemented.\n
+ * mode = 3: This command positions the scan head to the start of the slide.\n
+ * mode = 4 or 5: The command forwards (4) or retreats (5) the scan head the
+ * given amount of steps (in size).\n
+ * The SCSI code is 0xD2, there is no related command name.
+ *
+ * @param device_number Device number
+ * @param mode
+ * @param size
+ * @return Pieusb_Command_Status
+ */
+void
+sanei_pieusb_cmd_set_scan_head(SANE_Int device_number, SANE_Int mode, SANE_Int steps, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define SCAN_HEAD_SIZE 4
+ SANE_Int size = SCAN_HEAD_SIZE;
+ SANE_Byte data[SCAN_HEAD_SIZE];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_set_scan_head()\n");
+
+ _prep_scsi_cmd (command, SCSI_SET_SCAN_HEAD, size);
+
+ /* Code data */
+ memset (data, '\0', size);
+ switch (mode) {
+ case 1:
+ data[0] = 2;
+ break;
+ case 2:
+ DBG (DBG_error, "sanei_pieusb_cmd_set_scan_head() mode 2 unreliable, possibly dangerous\n");
+ status->pieusb_status = PIEUSB_STATUS_INVAL;
+ return;
+ case 3:
+ data[0] = 8;
+ break;
+ case 4:
+ data[0] = 0; /* forward */
+ data[2] = (steps>>8) & 0xFF;
+ data[3] = steps & 0xFF;
+ break;
+ case 5:
+ data[0] = 1; /* backward */
+ data[2] = (steps>>8) & 0xFF;
+ data[3] = steps & 0xFF;
+ break;
+ }
+
+ status->pieusb_status = sanei_pieusb_command(device_number, command, data, size);
+#undef SCAN_HEAD_SIZE
+}
+
+/**
+ * Get internal scanner settings which have resulted from an auto-calibration
+ * procedure. This procedure only runs when calibrating (Scan phase 1), so the
+ * data returned are relatively static.\n
+ * The SCSI code is 0xD7, there is no related command name.
+ *
+ * @param device_number Device number
+ * @param settings Settings for gain and offset for the four colors RGBI
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Settings
+ */
+void
+sanei_pieusb_cmd_get_gain_offset(SANE_Int device_number, struct Pieusb_Settings* settings, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define GAIN_OFFSET_SIZE 103
+ SANE_Int size = GAIN_OFFSET_SIZE;
+ SANE_Byte data[GAIN_OFFSET_SIZE];
+ int k;
+ SANE_Byte val[3];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_get_gain_offset()\n");
+
+ _prep_scsi_cmd (command, SCSI_READ_GAIN_OFFSET, size);
+
+ memset (data, '\0', size);
+ status->pieusb_status = sanei_pieusb_command(device_number, command, data, size);
+ if (status->pieusb_status != PIEUSB_STATUS_GOOD) {
+ return;
+ }
+
+ /* Decode data received */
+ _get_shorts (settings->saturationLevel, data+54, 3);
+ _get_shorts (settings->exposureTime, data+60, 3);
+ _copy_bytes (val, data+66, 3);
+ for (k = 0; k < 3; k++) settings->offset[k] = val[k];
+ _copy_bytes (val, data+72, 3);
+ for (k = 0; k < 3; k++) settings->gain[k] = val[k];
+ settings->light = _get_byte (data, 75);
+ settings->exposureTime[3] = _get_short (data, 98);
+ settings->offset[3] = _get_byte (data, 100);
+ settings->gain[3] = _get_byte (data, 102);
+
+ DBG (DBG_info, "sanei_pieusb_cmd_get_gain_offset() set:\n");
+ DBG (DBG_info, " saturationlevels = %d-%d-%d\n", settings->saturationLevel[0], settings->saturationLevel[1], settings->saturationLevel[2]);
+ DBG (DBG_info, " ---\n");
+ DBG (DBG_info, " exposure times = %d-%d-%d-%d\n", settings->exposureTime[0], settings->exposureTime[1], settings->exposureTime[2], settings->exposureTime[3]);
+ DBG (DBG_info, " gain = %d-%d-%d-%d\n", settings->gain[0], settings->gain[1], settings->gain[2], settings->gain[3]);
+ DBG (DBG_info, " offset = %d-%d-%d-%d\n", settings->offset[0], settings->offset[1], settings->offset[2], settings->offset[3]);
+ DBG (DBG_info, " light = %02x\n", settings->light);
+ DBG (DBG_info, " double times = %02x\n", settings->doubleTimes);
+ DBG (DBG_info, " extra entries = %02x\n", settings->extraEntries);
+#undef GAIN_OFFSET_SIZE
+}
+
+
+/**
+ * Set internal scanner settings such as gain and offset.\n
+ * There are two effective moments for this command:\n
+ * 1. For a scan without calibration phase: before the sanei_pieusb_cmd_start_scan() command;
+ * 2. For a sccan with calibration phase: before (or during) reading the shading reference data.
+ * The SCSI code is 0xDC, there is no related command name.
+ *
+ * @param device_number Device number
+ * @param settings Settings for gain and offset for the four colors RGBI
+ * @return Pieusb_Command_Status
+ * @see Pieusb_Settings
+ */
+void
+sanei_pieusb_cmd_set_gain_offset(SANE_Int device_number, struct Pieusb_Settings* settings, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define GAIN_OFFSET_SIZE 29
+ SANE_Int size = GAIN_OFFSET_SIZE;
+ SANE_Byte data[GAIN_OFFSET_SIZE];
+ int k;
+ SANE_Byte val[3];
+
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_set_gain_offset()\n");
+
+ _prep_scsi_cmd (command, SCSI_WRITE_GAIN_OFFSET, size);
+
+ DBG (DBG_info, "sanei_pieusb_cmd_set_gain_offset() set:\n");
+ DBG (DBG_info, " exposure times = %d-%d-%d-%d\n", settings->exposureTime[0], settings->exposureTime[1], settings->exposureTime[2], settings->exposureTime[3]);
+ DBG (DBG_info, " gain = %d-%d-%d-%d\n", settings->gain[0], settings->gain[1], settings->gain[2], settings->gain[3]);
+ DBG (DBG_info, " offset = %d-%d-%d-%d\n", settings->offset[0], settings->offset[1], settings->offset[2], settings->offset[3]);
+ DBG (DBG_info, " light = %02x\n", settings->light);
+ DBG (DBG_info, " double times = %02x\n", settings->doubleTimes);
+ DBG (DBG_info, " extra entries = %02x\n", settings->extraEntries);
+
+ /* Code data */
+ memset (data, '\0', size);
+ _set_shorts (settings->exposureTime, data, 3);
+ for (k = 0; k < 3; k++) {
+ val[k] = settings->offset[k];
+ }
+ _copy_bytes (data + 6, val, 3);
+ for (k = 0; k < 3; k++) {
+ val[k] = settings->gain[k];
+ }
+ _copy_bytes (data + 12, val, 3);
+ _set_byte (settings->light, data, 15);
+ _set_byte (settings->extraEntries, data, 16);
+ _set_byte (settings->doubleTimes, data, 17);
+ _set_short (settings->exposureTime[3], data, 18);
+ _set_byte (settings->offset[3], data, 20);
+ _set_byte (settings->gain[3], data, 22);
+ /*
+ * pieusb-get_gain_offset:
+ * 00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+ * 00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+ * 00000020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
+ * 00000030: a9 00 88 00 b1 00 00 00 00 00 00 00 04 10 04 10 )...1...........
+ * 00000040: 04 10 53 4f 6e 00 00 00 2e 21 21 05 04 10 df 2d ..SOn....!!..._-
+ * 00000050: a3 5c e7 f2 a1 2c b3 c4 42 df 32 42 eb 82 8e e0 #\gr!,3DB_2Bk..`
+ * 00000060: 87 be 04 10 4f 00 2c .>..O.,
+ *
+ * cyberview:
+ * 00000000: 65 22 57 18 19 19 - exposure time RGB
+ * 00000006: 51 4e 6a - offset RGB
+ * 00000009: 00 00 00
+ * 0000000c: 21 21 21 - gain RGB
+ * 0000000f: 05 - light
+ * 00000010: 01 - extra entries
+ * 00000011: 00 - double times
+ * 00000012: 04 10 - exposure time I
+ * 00000014: 4e 00 - offset I
+ * 00000016: 2a - gain I
+ * 00000017: 00 00 00 00 00 00
+ *
+ * pieusb:
+ * 00000000: 04 10 04 10 04 10 - exposure time RGB
+ * 00000006: 53 4f 6e - offset RGB
+ * 00000009: 00 00 00
+ * 0000000c: 2e 21 21 - gain RGB
+ * 0000000f: 05 - light
+ * 00000010: 00 - extra entries
+ * 00000011: 00 - double times
+ * 00000012: 04 10 - exposure time I
+ * 00000014: 4f 00 - offset I
+ * 00000016: 2c - gain I
+ * 00000017: 00 00 00 00 00 00
+ */
+
+ status->pieusb_status = sanei_pieusb_command(device_number, command, data, size);
+#undef GAIN_OFFSET_SIZE
+}
+
+/**
+ * Get scanner state information: button pushed,
+ * warming up, scanning.
+ *
+ * @param device_number Device number
+ * @param state State information
+ * @return Pieusb_Command_Status
+ */
+void
+sanei_pieusb_cmd_read_state(SANE_Int device_number, struct Pieusb_Scanner_State* state, struct Pieusb_Command_Status *status)
+{
+ SANE_Byte command[SCSI_COMMAND_LEN];
+#define GET_STATE_SIZE 12
+ SANE_Byte data[GET_STATE_SIZE];
+ SANE_Int size = GET_STATE_SIZE;
+
+ /* Execute READ STATUS command */
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_read_state()\n");
+
+ _prep_scsi_cmd (command, SCSI_READ_STATE, size);
+
+ memset (data, '\0', size);
+ status->pieusb_status = sanei_pieusb_command (device_number, command, data, size);
+
+ if (status->pieusb_status == PIEUSB_STATUS_WARMING_UP
+ || status->pieusb_status == PIEUSB_STATUS_DEVICE_BUSY) {
+ data[5] = 1;
+ status->pieusb_status = PIEUSB_STATUS_GOOD;
+ }
+ /* Decode data recieved */
+ state->buttonPushed = _get_byte(data, 0);
+ state->warmingUp = _get_byte(data, 5);
+ state->scanning = _get_byte(data, 6);
+/* state->busy = _get_byte(data, 8); */
+ DBG (DBG_info_scan, "sanei_pieusb_cmd_read_state(): button %d, warmingUp %d, scanning %d, busy? %d\n", state->buttonPushed, state->warmingUp, state->scanning, _get_byte(data, 8));
+#undef GET_STATE_SIZE
+}
+
+/**
+ * Prepare SCSI_COMMAND_LEN-byte command array with command code and size value
+ *
+ * @param command
+ * @param code
+ * @param size
+ */
+static void
+_prep_scsi_cmd(SANE_Byte* command, SANE_Byte code, SANE_Word size)
+{
+ memset(command, '\0', SCSI_COMMAND_LEN);
+ command[0] = code;
+ command[3] = (size>>8) & 0xFF; /* lsb first */
+ command[4] = size & 0xFF;
+}
diff --git a/backend/pieusb_scancmd.h b/backend/pieusb_scancmd.h
new file mode 100644
index 0000000..0dee646
--- /dev/null
+++ b/backend/pieusb_scancmd.h
@@ -0,0 +1,378 @@
+/* sane - Scanner Access Now Easy.
+
+ pieusb_scancmd.h
+
+ Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+#ifndef PIEUSB_SCANCMD_H
+#define PIEUSB_SCANCMD_H
+
+#include "../include/sane/sane.h"
+
+/* =========================================================================
+ *
+ * Data-structures used by scanner commands
+ *
+ * For SENSE descriptions, see SCSI-2 p158, table 67 (p469 ASC/Q alphabetically)
+ * For the INQUIRY command, see SCSI-2 p141 table 45, 46, 47
+ *
+ * 2-byte short ints are represented by 4-byte SANE_Int types
+ *
+ * ========================================================================= */
+
+struct Pieusb_Scanner_Properties {
+ SANE_Byte deviceType; /* 0x06 = scanner */
+ SANE_Byte additionalLength; /* including this byte: 0xb4 = 180, so total structure 184 bytes */
+ SANE_Char vendor[9]; /* actually 8 bytes, not null-terminated ...PIE ... */
+ SANE_Char product[17]; /* actually 16 bytes, null-terminated ...SF Scanner... */
+ SANE_Char productRevision[5]; /* actually 4 bytes, not null-terminated ...1.70... */
+ /* 1st Vendor-specific block, 20 bytes, see pie_get_inquiry_values(), partially: */
+ SANE_Int maxResolutionX; /* 7200 maximum scan resolution in x direction */
+ SANE_Int maxResolutionY; /* 7200 maximum scan resolution in y direction */
+ SANE_Int maxScanWidth; /* 10680 flatbed_max_scan_width (& calibration block size) */
+ SANE_Int maxScanHeight; /* 6888 flatbed_max_scan_height */
+ SANE_Byte filters; /* 0x9e = 10011110 ?-0-0-OnePassColor-B-G-R-N => additional infrared? */
+ SANE_Byte colorDepths; /* 0x35 = 00110101 0-0-16-12-10-8-4-1 */
+ SANE_Byte colorFormat; /* 0x07 = 00000111 0-0-0-0-0-Index-Line-Pixel */
+ SANE_Byte imageFormat; /* 0x09 = 00001001 0-0-0-0-OKLine-BlkOne-Motorola-Intel */
+ SANE_Byte scanCapability;
+ /* 0x4b = 01001011 PowerSave-ExtCal-0-FastPreview-DisableCal-[CalSpeeds=3]
+ * PowerSave: no
+ * ExtCal: yes =>
+ * FastPreview: no
+ * DisableCal: yes => can calibration be disabled?
+ * CalSpeeds: 3 => 1 line, 13 lines, 31 lines */
+ SANE_Byte optionalDevices;
+ /* 0x61 = 01100001 MultiPageLoad-?-?-0-0-TransModule1-TransModule-AutoDocFeeder => additional?
+ * MultiPageLoad: no
+ * ?: yes
+ * ?: yes
+ * TransModule1: no
+ * TransModule: no
+ * AutoDocFeeder: yes */
+ SANE_Byte enhancements; /* 0x02 = no info in pie.c */
+ SANE_Byte gammaBits; /* 0x0c = 00001100 = 12 ? used when downloading gamma table ... does not happen */
+ SANE_Byte lastFilter; /* 0x00 = ? no info in pie.c, not used */
+ SANE_Int previewScanResolution; /* 0x2c01 = 300 fast preview scan resolution */
+ /* Reserved (56-95) */
+ /* SANE_Byte div_56[40]; */
+ /* 2nd vendor specific block (36 bytes at offset 96) */
+ SANE_Char firmwareVersion[5]; /* actually 4 bytes, not null terminated "1.05" */
+ SANE_Byte halftones; /* 0x08 = halftones (4 LSbits) = 00001000 ? */
+ SANE_Byte minumumHighlight; /* 0x64 = 100 */
+ SANE_Byte maximumShadow; /* 0x64 = 100 */
+ SANE_Byte calibrationEquation; /* 0x01 ? see pie_perform_cal() */
+ SANE_Int maximumExposure; /* 0xc409 = 2500 (units?) */
+ SANE_Int minimumExposure; /* 0x6400 = 100 (units?) */
+ SANE_Int x0; /* 0xd002 = 720 transparency top left x */
+ SANE_Int y0; /* 0x8604 = 1158 transparency top left y */
+ SANE_Int x1; /* 0xbc10 = 4284 transparency bottom right x */
+ SANE_Int y1; /* 0xc015 = 5568 transparency bottom right y */
+ SANE_Int model; /* 0x3000 => model number */
+ /* SANE_Int div_118; 0x0000 meaning? */
+ SANE_Char production[4]; /* null terminated */
+ SANE_Char timestamp[20]; /* null terminated */
+ SANE_Byte signature[40]; /* null terminated */
+};
+
+struct Pieusb_Sense {
+ /* 14 bytes according to SCSI-2 p158, table 67 (p469 ASC/Q alphabetically) */
+ SANE_Byte errorCode; /* 0x70 or 0x71 */
+ SANE_Byte segment;
+ SANE_Byte senseKey; /* sense key is actually this value & 0x0F - table 69 */
+ SANE_Byte info[4];
+ SANE_Byte addLength; /* should be 0x07 (remaining struct length including this byte) */
+ SANE_Byte cmdInfo[4]; /* command specific information */
+ SANE_Byte senseCode; /* abbreviated ASC - table 71 */
+ SANE_Byte senseQualifier; /* abbreviated ASCQ - table 71 */
+};
+
+struct Pieusb_Scanner_State {
+ SANE_Byte buttonPushed; /* 0x01 if pushed */
+ SANE_Byte warmingUp; /* 0x01 if warming up, 0x00 if not */
+ SANE_Byte scanning; /* bit 6 set if SCAN active, bit 7 motor direction inverted (not analysed in detail) */
+};
+
+struct Pieusb_Scan_Parameters {
+ SANE_Int width; /* Number of pixels on a scan line */
+ SANE_Int lines; /* Number of lines in the scan. Value depends on color format, see Pieusb_Mode. */
+ SANE_Int bytes; /* Number of bytes on a scan line. Value depends on color format. */
+ SANE_Byte filterOffset1; /* 0x08 in the logs, but may also be set to 0x16, they seem to be used in “line”-format only. */
+ SANE_Byte filterOffset2; /* 0x08 in the logs, but may also be set to 0x16, they seem to be used in “line”-format only. */
+ SANE_Int period; /* Seems to be unused */
+ SANE_Int scsiTransferRate; /* Don't use, values cannot be trusted */
+ SANE_Int availableLines; /* The number of currently available scanned lines. Value depends on color format. Returns a value >0 if PARAM is called while scanning is in progress */
+ SANE_Byte motor; /* Motor direction in bit 0 */
+};
+
+struct Pieusb_Mode {
+ /* SANE_Byte size; of remaining data, not useful */
+ SANE_Int resolution; /* in dpi */
+ SANE_Byte passes;
+ /* 0x80 = One pass color; 0x90 = One pass RGBI;
+ * bit 7 : one-pass-color bit (equivalent to RGB all set?)
+ * bit 6 & 5: unused
+ * bit 4 : Infrared
+ * bit 3 : Blue
+ * bit 2 : Green
+ * bit 1 : Red
+ * bit 0: Neutral (not supported, ignored) */
+ SANE_Byte colorDepth;
+ /* 0x04 = 8, 0x20 = 16 bit
+ * bit 7 & 6 : 0 (unused)
+ * bit 5 : 16 bit
+ * bit 4 : 12 bit
+ * bit 3 : 10 bit
+ * bit 2 : 8 bit
+ * bit 1 : 4 bit
+ * bit 0 : 1 bit */
+ SANE_Byte colorFormat;
+ /* 0x04 = index, cf. INQUIRY
+ * bit 7-3 : 0 (unused)
+ * bit 2 : Index = scanned data are lines preceeded by a two-byte index, 'RR', 'GG', 'BB', or 'II'
+ * bit 1 : Line = scanned data are (probably) lines in RGBI order (needs testing)
+ * bit 0 : Pixel = scanned data are always RGB-pixels, i.e. 3x2 bytes at depth = 16 bits, 3 bytes
+ * at depth = 8 bits, and 3 packed bytes at depth = 1. This is also the case in
+ * a single color or gray scale scan; in these cases only the first pixel contains
+ * valid data. */
+ SANE_Byte byteOrder; /* 0x01 = Intel; only bit 0 used */
+ SANE_Bool sharpen; /* byte 9 bit 1 */
+ SANE_Bool skipShadingAnalysis; /* byte 9 bit 3 */
+ SANE_Bool fastInfrared; /* byte 9 bit 7 */
+ /* bit 7 : “fast infrared” flag
+ * bit 6,5,4 : 0 (unused)
+ * bit 3 : “skip calibration” flag (skip collecting shading information)
+ * bit 2 : 0 (unused)
+ * bit 1 : “sharpen” flag (only effective with fastInfrared off, one-pass-color and no extra BADF-entries)
+ * bit 0 : 0 (unused) */
+ SANE_Byte halftonePattern; /* 0x00 = no halftone pattern */
+ SANE_Byte lineThreshold; /* 0xFF = 100% */
+};
+
+struct Pieusb_Settings {
+ SANE_Int saturationLevel[3];
+ /* The average pixel values for the three colors Red, Green and Blue,
+ * which are the result of optimizing the Timer 1 counts so that Red and
+ * Blue values are least 90% of full scale (58981) and the Green value is
+ * at least 80% (52428). These levels are only determined during warming up. */
+ SANE_Int exposureTime[4];
+ /* Optimized exposure times for Red, Green and Blue. The exposure times are
+ * Timer 1 counts which define when Timer 1 interrupts. These values are
+ * only determined at startup.
+ * Exposure time for Infrared. The value is optimized and set at startup
+ * with the other exposure times. Quite often, it is subsequently reset to
+ * a default value (0x0B79). */
+ SANE_Word offset[4];
+ /* Optimized offsets for Red, Green and Blue. See above. These values are
+ * also updated before outputting the CCD-mask.
+ * Element 4 is offset for Infrared. */
+ SANE_Word gain[4];
+ /* Optimized gains for Red, Green and Blue. See the remark for
+ * exposureTime above. Element 4 is gain for Infrared. */
+ SANE_Byte light;
+ /* Current light level. The stability of the light source is tested during
+ * warming up. The check starts with a light value 7 or 6, and decrements
+ * it when the light warms up. At a light value of 4, the scanner produces
+ * stable scans (i.e. successive “white” scan values don't differ more
+ * than 0x200). */
+ SANE_Int minimumExposureTime;
+ /* Fixed value: 0x0b79 (2937) */
+ SANE_Byte extraEntries;
+ SANE_Byte doubleTimes;
+ /* Originally 20 unused bytes (uninitialized memory)
+ * To complete the mapping to the Pieusb_Settings_Condensed struct,
+ * the last two bytes are given an explicit meaning. */
+ /* SANE_Int exposureTimeIR; */
+ /* SANE_Byte offsetIR; */
+ /* SANE_Byte gainIR; */
+};
+
+/* Not used, Pieusb_Settings contains the same fields (after a bit of juggling) */
+struct Pieusb_Settings_Condensed {
+ SANE_Int exposureTime[4]; /* => Pieusb_Settings.exposureTime */
+ SANE_Byte offset[4]; /* => Pieusb_Settings.offset */
+ SANE_Byte gain[4]; /* => Pieusb_Settings.gain */
+ SANE_Byte light; /* => Pieusb_Settings.light */
+ SANE_Byte extraEntries; /* => Pieusb_Settings.extraEntries */
+ SANE_Byte doubleTimes; /* => Pieusb_Settings.doubleTimes */
+};
+
+struct Pieusb_Halftone_Pattern {
+ SANE_Int code; /* 0x91 */
+ /*TODO */
+};
+
+struct Pieusb_Scan_Frame {
+ SANE_Int index; /* scan frame index (0-7) */
+ SANE_Int x0; /* top left, is origin */
+ SANE_Int y0;
+ SANE_Int x1; /* bottom right */
+ SANE_Int y1;
+};
+
+struct Pieusb_Exposure_Time_Color {
+ SANE_Int filter; /* color mask 0x02, 0x04 or 0x08 for R, G, B */
+ SANE_Int value; /* relative exposure time 0 - 100 */
+};
+
+struct Pieusb_Exposure_Time {
+ SANE_Int code; /* 0x93 */
+ SANE_Int size; /* number of bytes in rest of structure */
+ struct Pieusb_Exposure_Time_Color color[3]; /* not all elements may actually be used */
+};
+
+struct Pieusb_Highlight_Shadow_Color {
+ SANE_Int filter; /* color mask 0x02, 0x04 or 0x08 for R, G, B */
+ SANE_Int value; /* 0-100 */
+};
+
+struct Pieusb_Highlight_Shadow {
+ SANE_Int code; /* 0x94 */
+ SANE_Int size; /* number of bytes in rest of structure */
+ struct Pieusb_Highlight_Shadow_Color color[3];
+};
+
+struct Pieusb_Shading_Parameters_Info {
+ SANE_Byte type; /* 0x00, 0x08, 0x10, 0x20; RGBI(?) */
+ SANE_Byte sendBits; /* 0x10 = 16 */
+ SANE_Byte recieveBits; /* 0x10 = 16 */
+ SANE_Byte nLines; /* 0x2D = 45 */
+ SANE_Int pixelsPerLine; /* 0x14dc = 5340 */
+};
+
+#define SHADING_PARAMETERS_INFO_COUNT 4
+struct Pieusb_Shading_Parameters {
+ SANE_Byte code; /* 0x95 */
+ SANE_Int size; /* number of bytes in rest of structure (0x1c=28) */
+ SANE_Byte calInfoCount; /* number of individual info structures (=0x04) */
+ SANE_Byte calInfoSize; /* size of individual info structure (=0x06) */
+ SANE_Int div_6; /* 0x0004, meaning not clear */
+ struct Pieusb_Shading_Parameters_Info cal[SHADING_PARAMETERS_INFO_COUNT];
+};
+
+typedef enum {
+ PIEUSB_STATUS_GOOD = 0, /* 0 everything A-OK */
+ PIEUSB_STATUS_UNSUPPORTED, /* 1 operation is not supported */
+ PIEUSB_STATUS_CANCELLED, /* 2 operation was cancelled */
+ PIEUSB_STATUS_DEVICE_BUSY, /* 3 device is busy; try again later */
+ PIEUSB_STATUS_INVAL, /* 4 data is invalid (includes no dev at open) */
+ PIEUSB_STATUS_EOF, /* 5 no more data available (end-of-file) */
+ PIEUSB_STATUS_JAMMED, /* 6 document feeder jammed */
+ PIEUSB_STATUS_NO_DOCS, /* 7 document feeder out of documents */
+ PIEUSB_STATUS_COVER_OPEN, /* 8 scanner cover is open */
+ PIEUSB_STATUS_IO_ERROR, /* 9 error during device I/O */
+ PIEUSB_STATUS_NO_MEM, /* 10 out of memory */
+ PIEUSB_STATUS_ACCESS_DENIED, /* 11 access to resource has been denied */
+ PIEUSB_STATUS_WARMING_UP, /* 12 lamp not ready, please retry */
+ PIEUSB_STATUS_HW_LOCKED, /* 13 scanner mechanism locked for transport */
+ PIEUSB_STATUS_MUST_CALIBRATE /* 14 */
+} PIEUSB_Status;
+
+/* Structures used by the USB functions */
+
+struct Pieusb_Command_Status {
+ PIEUSB_Status pieusb_status;
+ SANE_Byte senseKey; /* sense key: see Pieusb_Sense */
+ SANE_Byte senseCode; /* sense code */
+ SANE_Byte senseQualifier; /* sense code qualifier */
+};
+
+typedef struct Pieusb_Scanner_Properties Pieusb_Scanner_Properties;
+
+typedef enum {
+ SLIDE_NEXT = 0x04, SLIDE_PREV = 0x05, SLIDE_LAMP_ON = 0x10, SLIDE_RELOAD = 0x40
+} slide_action;
+
+void sanei_pieusb_cmd_slide(SANE_Int device_number, slide_action action, struct Pieusb_Command_Status *status);
+
+/* Scanner commands */
+
+void sanei_pieusb_cmd_test_unit_ready(SANE_Int device_number, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_get_sense(SANE_Int device_number, struct Pieusb_Sense* sense, struct Pieusb_Command_Status *status, PIEUSB_Status *ret);
+
+void sanei_pieusb_cmd_get_halftone_pattern(SANE_Int device_number, SANE_Int index, struct Pieusb_Halftone_Pattern* pattern, struct Pieusb_Command_Status *status);
+void sanei_pieusb_cmd_set_halftone_pattern(SANE_Int device_number, SANE_Int index, struct Pieusb_Halftone_Pattern* pattern, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_get_scan_frame(SANE_Int device_number, SANE_Int index, struct Pieusb_Scan_Frame* frame, struct Pieusb_Command_Status *status);
+void sanei_pieusb_cmd_set_scan_frame(SANE_Int device_number, SANE_Int index, struct Pieusb_Scan_Frame* frame, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_17(SANE_Int device_number, SANE_Int value, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_get_exposure_time(SANE_Int device_number, SANE_Int colorbits, struct Pieusb_Exposure_Time* time, struct Pieusb_Command_Status *status);
+void sanei_pieusb_cmd_set_exposure_time(SANE_Int device_number, struct Pieusb_Exposure_Time* time, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_get_highlight_shadow(SANE_Int device_number, SANE_Int colorbits, struct Pieusb_Highlight_Shadow* hgltshdw, struct Pieusb_Command_Status *status);
+void sanei_pieusb_cmd_set_highlight_shadow(SANE_Int device_number, struct Pieusb_Highlight_Shadow* hgltshdw, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_get_shading_parms(SANE_Int device_number, struct Pieusb_Shading_Parameters_Info* shading, struct Pieusb_Command_Status *status);
+void sanei_pieusb_cmd_get_scanned_lines(SANE_Int device_number, SANE_Byte* data, SANE_Int lines, SANE_Int size, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_get_ccd_mask(SANE_Int device_number, SANE_Byte* mask, SANE_Int mask_size, struct Pieusb_Command_Status *status);
+void sanei_pieusb_cmd_set_ccd_mask(SANE_Int device_number, SANE_Byte colorbits, SANE_Byte* mask, SANE_Int mask_size, struct Pieusb_Command_Status *status);
+
+/*
+void cmdPrepareHalftonePattern(SANE_Int device_number, SANE_Int index, struct Pieusb_Command_Status *status);
+void cmdPrepareScanFrame(SANE_Int device_number, SANE_Int index, struct Pieusb_Command_Status *status);
+void cmdPrepareRelativeExposureTime(SANE_Int device_number, SANE_Int colorbits, struct Pieusb_Command_Status *status);
+void cmdPrepareHighlightShadow(SANE_Int device_number, SANE_Int colorbits, struct Pieusb_Command_Status *status);
+void cmdPrepareShadingParameters(SANE_Int device_number, struct Pieusb_Command_Status *status);
+*/
+
+void sanei_pieusb_cmd_get_parameters(SANE_Int device_number, struct Pieusb_Scan_Parameters* parameters, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_inquiry(SANE_Int device_number, struct Pieusb_Scanner_Properties* inq, SANE_Byte size, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_get_mode(SANE_Int device_number, struct Pieusb_Mode* mode, struct Pieusb_Command_Status *status);
+void sanei_pieusb_cmd_set_mode(SANE_Int device_number, struct Pieusb_Mode* mode, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_start_scan(SANE_Int device_number, struct Pieusb_Command_Status *status);
+void sanei_pieusb_cmd_stop_scan(SANE_Int device_number, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_set_scan_head(SANE_Int device_number, SANE_Int mode, SANE_Int steps, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_get_gain_offset(SANE_Int device_number, struct Pieusb_Settings* settings, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_set_gain_offset(SANE_Int device_number, struct Pieusb_Settings* settings, struct Pieusb_Command_Status *status);
+
+void sanei_pieusb_cmd_read_state(SANE_Int device_number, struct Pieusb_Scanner_State* state, struct Pieusb_Command_Status *status);
+
+#endif /* PIEUSB_SCANCMD_H */
diff --git a/backend/pieusb_specific.c b/backend/pieusb_specific.c
new file mode 100644
index 0000000..8231075
--- /dev/null
+++ b/backend/pieusb_specific.c
@@ -0,0 +1,2509 @@
+/* sane - Scanner Access Now Easy.
+
+ pieusb_specific.c
+
+ Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+/* =========================================================================
+ *
+ * Various Pieusb backend specific functions
+ *
+ * Option handling, configuration file handling, post-processing
+ *
+ * ========================================================================= */
+
+#define DEBUG_DECLARE_ONLY
+#include "pieusb.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include "../include/sane/sane.h"
+#include "../include/sane/saneopts.h"
+#include "../include/sane/sanei_config.h"
+
+#include <errno.h>
+#include <math.h>
+#include <time.h>
+
+#include "pieusb_usb.h"
+#include "pieusb_scancmd.h"
+#include "pieusb_buffer.h"
+#include "pieusb_specific.h"
+
+/* Pieusb specific */
+
+/* sub to sanei_pieusb_find_device_callback() */
+static SANE_Status pieusb_initialize_device_definition (Pieusb_Device_Definition* dev, Pieusb_Scanner_Properties* inq, const char* devicename, SANE_Word vendor_id, SANE_Word product_id);
+static void pieusb_print_inquiry (Pieusb_Device_Definition * dev);
+
+/* sub to sane_start() */
+static void pieusb_calculate_shading(struct Pieusb_Scanner *scanner, SANE_Byte* buffer);
+
+/* MR */
+/* sub to sanei_pieusb_post() */
+static SANE_Status pieusb_write_pnm_file (char *filename, uint16_t *data, int depth, int channels, int pixels_per_line, int lines);
+
+/* Auxilary */
+static size_t max_string_size (SANE_String_Const const strings[]);
+static double getGain(int gain);
+static int getGainSetting(double gain);
+/*
+static void updateGain(Pieusb_Scanner *scanner, int color_index);
+*/
+static void updateGain2(Pieusb_Scanner *scanner, int color_index, double gain_increase);
+
+/* --------------------------------------------------------------------------
+ *
+ * SPECIFIC PIEUSB
+ *
+ * --------------------------------------------------------------------------*/
+
+/* Settings for byte order */
+#define SCAN_IMG_FMT_OKLINE 0x08
+#define SCAN_IMG_FMT_BLK_ONE 0x04
+#define SCAN_IMG_FMT_MOTOROLA 0x02
+#define SCAN_IMG_FMT_INTEL 0x01
+
+/* Settings for scanner capabilities */
+#define SCAN_CAP_PWRSAV 0x80
+#define SCAN_CAP_EXT_CAL 0x40
+#define SCAN_CAP_FAST_PREVIEW 0x10
+#define SCAN_CAP_DISABLE_CAL 0x08
+#define SCAN_CAP_SPEEDS 0x07
+
+/* Available scanner options */
+#define SCAN_OPT_DEV_MPCL 0x80
+#define SCAN_OPT_DEV_TP1 0x04
+#define SCAN_OPT_DEV_TP 0x02
+#define SCAN_OPT_DEV_ADF 0x01
+
+/* Options */
+#define SANE_NAME_EXPOSURE_R "exposure-time-r"
+#define SANE_TITLE_EXPOSURE_R "Exposure time red"
+#define SANE_DESC_EXPOSURE_R "The time the red color filter of the CCD is exposed"
+#define SANE_NAME_EXPOSURE_G "exposure-time-g"
+#define SANE_TITLE_EXPOSURE_G "Exposure time green"
+#define SANE_DESC_EXPOSURE_G "The time the green color filter of the CCD is exposed"
+#define SANE_NAME_EXPOSURE_B "exposure-time-b"
+#define SANE_TITLE_EXPOSURE_B "Exposure time blue"
+#define SANE_DESC_EXPOSURE_B "The time the blue color filter of the CCD is exposed"
+#define SANE_NAME_EXPOSURE_I "exposure-time-i"
+#define SANE_TITLE_EXPOSURE_I "Exposure time infrared"
+#define SANE_DESC_EXPOSURE_I "The time the infrared color filter of the CCD is exposed"
+#define SANE_EXPOSURE_DEFAULT DEFAULT_EXPOSURE
+#if 1
+#define SANE_NAME_GAIN_R "gain-r"
+#define SANE_TITLE_GAIN_R "Gain red"
+#define SANE_DESC_GAIN_R "The gain of the signal processor for red"
+#define SANE_NAME_GAIN_G "gain-g"
+#define SANE_TITLE_GAIN_G "Gain green"
+#define SANE_DESC_GAIN_G "The gain of the signal processor for green"
+#define SANE_NAME_GAIN_B "gain-b"
+#define SANE_TITLE_GAIN_B "Gain blue"
+#define SANE_DESC_GAIN_B "The gain of the signal processor for blue"
+#define SANE_NAME_GAIN_I "gain-i"
+#define SANE_TITLE_GAIN_I "Gain infrared"
+#define SANE_DESC_GAIN_I "The gain of the signal processor for infrared"
+#define SANE_GAIN_DEFAULT DEFAULT_GAIN
+
+#define SANE_NAME_OFFSET_R "offset-r"
+#define SANE_TITLE_OFFSET_R "Offset red"
+#define SANE_DESC_OFFSET_R "The offset of the signal processor for red"
+#define SANE_NAME_OFFSET_G "offset-g"
+#define SANE_TITLE_OFFSET_G "Offset greed"
+#define SANE_DESC_OFFSET_G "The offset of the signal processor for green"
+#define SANE_NAME_OFFSET_B "offset-b"
+#define SANE_TITLE_OFFSET_B "Offset blue"
+#define SANE_DESC_OFFSET_B "The offset of the signal processor for blue"
+#define SANE_NAME_OFFSET_I "offset-i"
+#define SANE_TITLE_OFFSET_I "Offset infrared"
+#define SANE_DESC_OFFSET_I "The offset of the signal processor for infrared"
+#define SANE_OFFSET_DEFAULT DEFAULT_OFFSET
+#else
+#define SANE_NAME_GAIN "gain"
+#define SANE_TITLE_GAIN "Gain"
+#define SANE_DESC_GAIN "The gain of the signal processor for the 4 CCD color filters (R,G,B,I)"
+#define SANE_GAIN_DEFAULT 0x13
+
+#define SANE_NAME_OFFSET "offset"
+#define SANE_TITLE_OFFSET "Offset"
+#define SANE_DESC_OFFSET "The offset of the signal processor for the 4 CCD color filters (R,G,B,I)"
+#define SANE_OFFSET_DEFAULT 0
+#endif
+#define min(a,b) (((a)<(b))?(a):(b))
+#define max(a,b) (((a)>(b))?(a):(b))
+
+static const SANE_Range percentage_range_100 = {
+ 0 << SANE_FIXED_SCALE_SHIFT, /* minimum */
+ 100 << SANE_FIXED_SCALE_SHIFT, /* maximum */
+ 0 << SANE_FIXED_SCALE_SHIFT /* quantization */
+};
+
+/* From the firmware disassembly */
+static const SANE_Range gain_range = {
+ 0, /* minimum */
+ 63, /* maximum */
+ 0 /* quantization */
+};
+
+/* From the firmware disassembly */
+static const SANE_Range offset_range = {
+ 0, /* minimum */
+ 255, /* maximum */
+ 0 /* quantization */
+};
+
+static const double gains[] = {
+1.000, 1.075, 1.154, 1.251, 1.362, 1.491, 1.653, /* 0, 5, 10, 15, 20, 25, 30 */
+1.858, 2.115, 2.458, 2.935, 3.638, 4.627 /* 35, 40, 45, 50, 55, 60 */
+};
+
+/**
+ * Callback called whenever a connected USB device reports a supported vendor
+ * and product id combination.
+ * Used by sane_init() and by sane_open().
+ *
+ * @param name Device name which has required vendor and product id
+ * @return SANE_STATUS_GOOD
+ */
+SANE_Status
+sanei_pieusb_find_device_callback (const char *devicename)
+{
+ struct Pieusb_Command_Status status;
+ SANE_Status r;
+ Pieusb_Device_Definition *dev;
+ int device_number; /* index in usb devices list maintained by sani_usb */
+ Pieusb_Scanner_Properties inq;
+ int retry;
+
+ DBG (DBG_info_proc, "sanei_pieusb_find_device_callback: %s\n", devicename);
+
+ /* Check if device is present in the Pieusb device list */
+ for (dev = pieusb_definition_list_head; dev; dev = dev->next) {
+ if (strcmp (dev->sane.name, devicename) == 0) {
+ return SANE_STATUS_GOOD;
+ }
+ }
+
+ /* If not, create a new device struct */
+ dev = malloc (sizeof (*dev));
+ if (!dev) {
+ return SANE_STATUS_NO_MEM;
+ }
+
+ /* Get device number: index of the device in the sanei_usb devices list */
+ r = sanei_usb_open (devicename, &device_number);
+ if (r != SANE_STATUS_GOOD) {
+ free (dev);
+ DBG (DBG_error, "sanei_pieusb_find_device_callback: sanei_usb_open failed for device %s: %s\n",devicename,sane_strstatus(r));
+ return r;
+ }
+
+ /* Get device properties */
+
+ retry = 2;
+ while (retry > 0) {
+ retry--;
+ /* get inquiry data length */
+ sanei_pieusb_cmd_inquiry (device_number, &inq, 5, &status);
+ if (status.pieusb_status == PIEUSB_STATUS_GOOD) {
+ break;
+ }
+ else if (status.pieusb_status == PIEUSB_STATUS_IO_ERROR) {
+ if (retry > 0) {
+ DBG (DBG_info_proc, "inquiry failed, resetting usb\n");
+ if (sanei_pieusb_usb_reset(device_number) == SANE_STATUS_GOOD) {
+ continue; /* retry after IEEE1284 reset */
+ }
+ if (sanei_usb_reset(device_number) == SANE_STATUS_GOOD) {
+ continue; /* retry after USB reset */
+ }
+ }
+ }
+ free (dev);
+ DBG (DBG_error, "sanei_pieusb_find_device_callback: get scanner properties (5 bytes) failed with %d\n", status.pieusb_status);
+ sanei_usb_close (device_number);
+ return status.pieusb_status;
+ }
+ /* get full inquiry data */
+ sanei_pieusb_cmd_inquiry(device_number, &inq, inq.additionalLength+4, &status);
+ if (status.pieusb_status != PIEUSB_STATUS_GOOD) {
+ free (dev);
+ DBG (DBG_error, "sanei_pieusb_find_device_callback: get scanner properties failed\n");
+ sanei_usb_close (device_number);
+ return status.pieusb_status;
+ }
+
+ /* Close the device again */
+ sanei_usb_close(device_number);
+
+ /* Initialize device definition */
+ r = pieusb_initialize_device_definition(dev, &inq, devicename, pieusb_supported_usb_device.vendor, pieusb_supported_usb_device.product);
+ if (r != SANE_STATUS_GOOD) {
+ return r;
+ }
+
+ /* Output */
+ pieusb_print_inquiry (dev);
+
+ /* Check model number */
+ if (inq.model != pieusb_supported_usb_device.model) {
+ free (dev);
+ DBG (DBG_error, "sanei_pieusb_find_device_callback: wrong model number %d\n", inq.model);
+ return SANE_STATUS_INVAL;
+ }
+
+ /* Found a supported scanner, put it in the definitions list*/
+ DBG (DBG_info_proc, "sanei_pieusb_find_device_callback: success\n");
+ dev->next = pieusb_definition_list_head;
+ pieusb_definition_list_head = dev;
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Full initialization of a Pieusb_Device structure from INQUIRY data.
+ * The function is used in find_device_callback(), so when sane_init() or
+ * sane_open() is called.
+ *
+ * @param dev
+ */
+static SANE_Status
+pieusb_initialize_device_definition (Pieusb_Device_Definition* dev, Pieusb_Scanner_Properties* inq, const char* devicename,
+ SANE_Word vendor_id, SANE_Word product_id)
+{
+ char *pp, *buf;
+
+ /* Initialize device definition */
+ dev->next = NULL;
+ dev->sane.name = strdup(devicename);
+
+ /* Create 0-terminated string without trailing spaces for vendor */
+ buf = malloc(9);
+ if (buf == NULL)
+ return SANE_STATUS_NO_MEM;
+ strncpy(buf, inq->vendor, 8);
+ pp = buf + 8;
+ *pp-- = '\0';
+ while (*pp == ' ') *pp-- = '\0';
+ dev->sane.vendor = buf;
+
+ /* Create 0-terminated string without trailing spaces for model */
+ buf = malloc(17);
+ if (buf == NULL)
+ return SANE_STATUS_NO_MEM;
+ strncpy(buf, inq->product, 16);
+ pp = buf + 16;
+ *pp-- = '\0';
+ while (*pp == ' ') *pp-- = '\0';
+ dev->sane.model = buf;
+
+ dev->sane.type = "film scanner";
+ dev->vendorId = vendor_id;
+ dev->productId = product_id;
+
+ /* Create 0-terminated strings without trailing spaces for revision */
+ buf = malloc(5);
+ if (buf == NULL)
+ return SANE_STATUS_NO_MEM;
+ strncpy(buf, inq->productRevision, 4);
+ pp = buf + 4;
+ *pp-- = '\0';
+ while (*pp == ' ') *pp-- = '\0';
+ dev->version = buf;
+
+ dev->model = inq->model;
+
+ /* Maximum resolution values */
+ dev->maximum_resolution_x = inq->maxResolutionX;
+ dev->maximum_resolution_y = inq->maxResolutionY;
+ if (dev->maximum_resolution_y < 256) {
+ /* y res is a multiplier */
+ dev->maximum_resolution = dev->maximum_resolution_x;
+ dev->maximum_resolution_x *= dev->maximum_resolution_y;
+ dev->maximum_resolution_y = dev->maximum_resolution_x;
+ } else {
+ /* y res really is resolution */
+ dev->maximum_resolution = min (dev->maximum_resolution_x, dev->maximum_resolution_y);
+ }
+
+ /* Geometry */
+ dev->scan_bed_width = (double) inq->maxScanWidth / dev->maximum_resolution;
+ dev->scan_bed_height = (double) inq->maxScanHeight / dev->maximum_resolution;
+ dev->slide_top_left_x = inq->x0;
+ dev->slide_top_left_y = inq->y0;
+ dev->slide_width = (double) (inq->x1 - inq->x0) / dev->maximum_resolution;
+ dev->slide_height = (double) (inq->y1 - inq->y0) / dev->maximum_resolution;
+
+ /* Integer and bit-encoded properties */
+ dev->halftone_patterns = inq->halftones & 0x0f;
+ dev->color_filters = inq->filters;
+ dev->color_depths = inq->colorDepths;
+ dev->color_formats = inq->colorFormat;
+ dev->image_formats = inq->imageFormat;
+ dev->scan_capabilities = inq->scanCapability;
+ dev->optional_devices = inq->optionalDevices;
+ dev->enhancements = inq->enhancements;
+ dev->gamma_bits = inq->gammaBits;
+ dev->fast_preview_resolution = inq->previewScanResolution;
+ dev->minimum_highlight = inq->minumumHighlight;
+ dev->maximum_shadow = inq->maximumShadow;
+ dev->calibration_equation = inq->calibrationEquation;
+ dev->minimum_exposure = inq->minimumExposure;
+ dev->maximum_exposure = inq->maximumExposure*4; /* *4 to solve the strange situation that the default value is out of range */
+
+ dev->x0 = inq->x0;
+ dev->y0 = inq->y0;
+ dev->x1 = inq->x1;
+ dev->y1 = inq->y1;
+ dev->production = strndup(inq->production, 4);
+ dev->timestamp = strndup(inq->timestamp, 20);
+ dev->signature = (char *)strndup((char *)inq->signature, 40);
+
+ /* Ranges for various quantities */
+ dev->x_range.min = SANE_FIX (0);
+ dev->x_range.quant = SANE_FIX (0);
+ dev->x_range.max = SANE_FIX (dev->scan_bed_width * MM_PER_INCH);
+
+ dev->y_range.min = SANE_FIX (0);
+ dev->y_range.quant = SANE_FIX (0);
+ dev->y_range.max = SANE_FIX (dev->scan_bed_height * MM_PER_INCH);
+
+ dev->dpi_range.min = SANE_FIX (25);
+ dev->dpi_range.quant = SANE_FIX (1);
+ dev->dpi_range.max = SANE_FIX (max (dev->maximum_resolution_x, dev->maximum_resolution_y));
+
+ dev->shadow_range.min = SANE_FIX (0);
+ dev->shadow_range.quant = SANE_FIX (1);
+ dev->shadow_range.max = SANE_FIX (dev->maximum_shadow);
+
+ dev->highlight_range.min = SANE_FIX (dev->minimum_highlight);
+ dev->highlight_range.quant = SANE_FIX (1);
+ dev->highlight_range.max = SANE_FIX (100);
+
+ dev->exposure_range.min = dev->minimum_exposure;
+ dev->exposure_range.quant = 1;
+ dev->exposure_range.max = dev->maximum_exposure;
+
+ dev->dust_range.min = 0;
+ dev->dust_range.quant = 1;
+ dev->dust_range.max = 100;
+
+ /* Enumerated ranges vor various quantities */
+ /*TODO: create from inq->filters */
+ dev->scan_mode_list[0] = SANE_VALUE_SCAN_MODE_LINEART;
+ dev->scan_mode_list[1] = SANE_VALUE_SCAN_MODE_HALFTONE;
+ dev->scan_mode_list[2] = SANE_VALUE_SCAN_MODE_GRAY;
+ dev->scan_mode_list[3] = SANE_VALUE_SCAN_MODE_COLOR;
+ dev->scan_mode_list[4] = SANE_VALUE_SCAN_MODE_RGBI;
+ dev->scan_mode_list[5] = 0;
+
+ dev->calibration_mode_list[0] = SCAN_CALIBRATION_DEFAULT;
+ dev->calibration_mode_list[1] = SCAN_CALIBRATION_AUTO;
+ dev->calibration_mode_list[2] = SCAN_CALIBRATION_PREVIEW;
+ dev->calibration_mode_list[3] = SCAN_CALIBRATION_OPTIONS;
+ dev->calibration_mode_list[4] = 0;
+
+ dev->gain_adjust_list[0] = SCAN_GAIN_ADJUST_03;
+ dev->gain_adjust_list[1] = SCAN_GAIN_ADJUST_05;
+ dev->gain_adjust_list[2] = SCAN_GAIN_ADJUST_08;
+ dev->gain_adjust_list[3] = SCAN_GAIN_ADJUST_10;
+ dev->gain_adjust_list[4] = SCAN_GAIN_ADJUST_12;
+ dev->gain_adjust_list[5] = SCAN_GAIN_ADJUST_16;
+ dev->gain_adjust_list[6] = SCAN_GAIN_ADJUST_19;
+ dev->gain_adjust_list[7] = SCAN_GAIN_ADJUST_24;
+ dev->gain_adjust_list[8] = SCAN_GAIN_ADJUST_30;
+ dev->gain_adjust_list[9] = 0;
+
+ /*TODO: create from inq->colorDepths? Maybe not: didn't experiment with
+ * 4 and 12 bit depths. Don;t know how they behave. */
+ dev->bpp_list[0] = 3; /* count */
+ dev->bpp_list[1] = 1;
+ dev->bpp_list[2] = 8;
+ dev->bpp_list[3] = 16;
+
+ /* Infrared */
+ dev->ir_sw_list[0] = "None";
+ dev->ir_sw_list[1] = "Reduce red overlap";
+ dev->ir_sw_list[2] = "Remove dirt";
+ dev->ir_sw_list[3] = 0;
+
+ dev->grain_sw_list[0] = 4;
+ dev->grain_sw_list[1] = 0;
+ dev->grain_sw_list[2] = 1;
+ dev->grain_sw_list[3] = 2;
+ dev->grain_sw_list[4] = 3;
+ dev->grain_sw_list[5] = 0;
+
+ dev->crop_sw_list[0] = "None";
+ dev->crop_sw_list[1] = "Outside";
+ dev->crop_sw_list[2] = "Inside";
+ dev->crop_sw_list[3] = 0;
+
+ /* halftone_list */
+ dev->halftone_list[0] = "53lpi 45d ROUND"; /* 8x8 pattern */
+ dev->halftone_list[1] = "70lpi 45d ROUND"; /* 6x6 pattern */
+ dev->halftone_list[2] = "75lpi Hori. Line"; /* 4x4 pattern */
+ dev->halftone_list[3] = "4X4 BAYER"; /* 4x4 pattern */
+ dev->halftone_list[4] = "4X4 SCROLL"; /* 4x4 pattern */
+ dev->halftone_list[5] = "5x5 26 Levels"; /* 5x5 pattern */
+ dev->halftone_list[6] = "4x4 SQUARE"; /* 4x4 pattern */
+ dev->halftone_list[7] = "5x5 TILE"; /* 5x5 pattern */
+ dev->halftone_list[8] = 0;
+
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Output device definition.
+ * The function is used in find_device_callback(), so when sane_init() or
+ * sane_open() is called.
+ *
+ * @param dev Device to output
+ */
+static void
+pieusb_print_inquiry (Pieusb_Device_Definition * dev)
+{
+ DBG (DBG_inquiry, "INQUIRY:\n");
+ DBG (DBG_inquiry, "========\n");
+ DBG (DBG_inquiry, "\n");
+ DBG (DBG_inquiry, "vendor........................: '%s'\n", dev->sane.vendor);
+ DBG (DBG_inquiry, "product.......................: '%s'\n", dev->sane.model);
+ DBG (DBG_inquiry, "model .......................: 0x%04x\n", dev->model);
+ DBG (DBG_inquiry, "version.......................: '%s'\n", dev->version);
+
+ DBG (DBG_inquiry, "X resolution..................: %d dpi\n",
+ dev->maximum_resolution_x);
+ DBG (DBG_inquiry, "Y resolution..................: %d dpi\n",
+ dev->maximum_resolution_y);
+ DBG (DBG_inquiry, "pixel resolution..............: %d dpi\n",
+ dev->maximum_resolution);
+ DBG (DBG_inquiry, "fb width......................: %f in\n",
+ dev->scan_bed_width);
+ DBG (DBG_inquiry, "fb length.....................: %f in\n",
+ dev->scan_bed_height);
+
+ DBG (DBG_inquiry, "transparency width............: %f in\n",
+ dev->slide_width);
+ DBG (DBG_inquiry, "transparency length...........: %f in\n",
+ dev->slide_height);
+ DBG (DBG_inquiry, "transparency offset...........: %d,%d\n",
+ dev->slide_top_left_x, dev->slide_top_left_y);
+
+ DBG (DBG_inquiry, "# of halftones................: %d\n",
+ dev->halftone_patterns);
+
+ DBG (DBG_inquiry, "One pass color................: %s\n",
+ dev->color_filters & SCAN_ONE_PASS_COLOR ? "yes" : "no");
+
+ DBG (DBG_inquiry, "Filters.......................: %s%s%s%s%s (%02x)\n",
+ dev->color_filters & SCAN_FILTER_INFRARED ? "Infrared " : "",
+ dev->color_filters & SCAN_FILTER_RED ? "Red " : "",
+ dev->color_filters & SCAN_FILTER_GREEN ? "Green " : "",
+ dev->color_filters & SCAN_FILTER_BLUE ? "Blue " : "",
+ dev->color_filters & SCAN_FILTER_NEUTRAL ? "Neutral " : "",
+ dev->color_filters);
+
+ DBG (DBG_inquiry, "Color depths..................: %s%s%s%s%s%s (%02x)\n",
+ dev->color_depths & SCAN_COLOR_DEPTH_16 ? "16 bit " : "",
+ dev->color_depths & SCAN_COLOR_DEPTH_12 ? "12 bit " : "",
+ dev->color_depths & SCAN_COLOR_DEPTH_10 ? "10 bit " : "",
+ dev->color_depths & SCAN_COLOR_DEPTH_8 ? "8 bit " : "",
+ dev->color_depths & SCAN_COLOR_DEPTH_4 ? "4 bit " : "",
+ dev->color_depths & SCAN_COLOR_DEPTH_1 ? "1 bit " : "",
+ dev->color_depths);
+
+ DBG (DBG_inquiry, "Color Format..................: %s%s%s (%02x)\n",
+ dev->color_formats & SCAN_COLOR_FORMAT_INDEX ? "Indexed " : "",
+ dev->color_formats & SCAN_COLOR_FORMAT_LINE ? "Line " : "",
+ dev->color_formats & SCAN_COLOR_FORMAT_PIXEL ? "Pixel " : "",
+ dev->color_formats);
+
+ DBG (DBG_inquiry, "Image Format..................: %s%s%s%s (%02x)\n",
+ dev->image_formats & SCAN_IMG_FMT_OKLINE ? "OKLine " : "",
+ dev->image_formats & SCAN_IMG_FMT_BLK_ONE ? "BlackOne " : "",
+ dev->image_formats & SCAN_IMG_FMT_MOTOROLA ? "Motorola " : "",
+ dev->image_formats & SCAN_IMG_FMT_INTEL ? "Intel" : "",
+ dev->image_formats);
+
+ DBG (DBG_inquiry,
+ "Scan Capability...............: %s%s%s%s%d speeds (%02x)\n",
+ dev->scan_capabilities & SCAN_CAP_PWRSAV ? "PowerSave " : "",
+ dev->scan_capabilities & SCAN_CAP_EXT_CAL ? "ExtCal " : "",
+ dev->scan_capabilities & SCAN_CAP_FAST_PREVIEW ? "FastPreview" :
+ "",
+ dev->scan_capabilities & SCAN_CAP_DISABLE_CAL ? "DisCal " : "",
+ dev->scan_capabilities & SCAN_CAP_SPEEDS,
+ dev->scan_capabilities);
+
+ DBG (DBG_inquiry, "Optional Devices..............: %s%s%s%s (%02x)\n",
+ dev->optional_devices & SCAN_OPT_DEV_MPCL ? "MultiPageLoad " :
+ "",
+ dev->optional_devices & SCAN_OPT_DEV_TP1 ? "TransModule1 " : "",
+ dev->optional_devices & SCAN_OPT_DEV_TP ? "TransModule " : "",
+ dev->optional_devices & SCAN_OPT_DEV_ADF ? "ADF " : "",
+ dev->optional_devices);
+
+ DBG (DBG_inquiry, "Enhancement...................: %02x\n",
+ dev->enhancements);
+ DBG (DBG_inquiry, "Gamma bits....................: %d\n",
+ dev->gamma_bits);
+
+ DBG (DBG_inquiry, "Fast Preview Resolution.......: %d\n",
+ dev->fast_preview_resolution);
+ DBG (DBG_inquiry, "Min Highlight.................: %d\n",
+ dev->minimum_highlight);
+ DBG (DBG_inquiry, "Max Shadow....................: %d\n",
+ dev->maximum_shadow);
+ DBG (DBG_inquiry, "Cal Eqn.......................: %d\n",
+ dev->calibration_equation);
+ DBG (DBG_inquiry, "Min Exposure..................: %d\n",
+ dev->minimum_exposure);
+ DBG (DBG_inquiry, "Max Exposure..................: %d\n",
+ dev->maximum_exposure);
+
+ DBG (DBG_inquiry, "x0,y0 x1,y1...................: %d,%d %d,%d\n",
+ dev->x0, dev->y0, dev->x1, dev->y1);
+ DBG (DBG_inquiry, "production....................: '%s'\n",
+ dev->production);
+ DBG (DBG_inquiry, "timestamp.....................: '%s'\n",
+ dev->timestamp);
+ DBG (DBG_inquiry, "signature.....................: '%s'\n",
+ dev->signature);
+
+}
+
+/**
+ * Initiaize scanner options from the device definition and from exposure,
+ * gain and offset defaults. The function is called by sane_open(), when no
+ * optimized settings are available yet. The scanner object is fully
+ * initialized in sane_start().
+ *
+ * @param scanner Scanner to initialize
+ * @return SANE_STATUS_GOOD
+ */
+SANE_Status
+sanei_pieusb_init_options (Pieusb_Scanner* scanner)
+{
+ int i;
+
+ DBG (DBG_info_proc, "sanei_pieusb_init_options\n");
+
+ memset (scanner->opt, 0, sizeof (scanner->opt));
+ memset (scanner->val, 0, sizeof (scanner->val));
+
+ for (i = 0; i < NUM_OPTIONS; ++i) {
+ scanner->opt[i].size = sizeof (SANE_Word);
+ scanner->opt[i].cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
+ }
+
+ /* Number of options (a pseudo-option) */
+ scanner->opt[OPT_NUM_OPTS].name = SANE_NAME_NUM_OPTIONS;
+ scanner->opt[OPT_NUM_OPTS].title = SANE_TITLE_NUM_OPTIONS;
+ scanner->opt[OPT_NUM_OPTS].desc = SANE_DESC_NUM_OPTIONS;
+ scanner->opt[OPT_NUM_OPTS].type = SANE_TYPE_INT;
+ scanner->opt[OPT_NUM_OPTS].cap = SANE_CAP_SOFT_DETECT;
+ scanner->val[OPT_NUM_OPTS].w = NUM_OPTIONS;
+
+ /* "Mode" group: */
+ scanner->opt[OPT_MODE_GROUP].title = "Scan Mode";
+ scanner->opt[OPT_MODE_GROUP].desc = "";
+ scanner->opt[OPT_MODE_GROUP].type = SANE_TYPE_GROUP;
+ scanner->opt[OPT_MODE_GROUP].cap = 0;
+ scanner->opt[OPT_MODE_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
+
+ /* scan mode */
+ scanner->opt[OPT_MODE].name = SANE_NAME_SCAN_MODE;
+ scanner->opt[OPT_MODE].title = SANE_TITLE_SCAN_MODE;
+ scanner->opt[OPT_MODE].desc = SANE_DESC_SCAN_MODE;
+ scanner->opt[OPT_MODE].type = SANE_TYPE_STRING;
+ scanner->opt[OPT_MODE].size = max_string_size ((SANE_String_Const const *) scanner->device->scan_mode_list);
+ scanner->opt[OPT_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ scanner->opt[OPT_MODE].constraint.string_list = (SANE_String_Const const *) scanner->device->scan_mode_list;
+ scanner->val[OPT_MODE].s = (SANE_Char *) strdup (scanner->device->scan_mode_list[3]); /* default RGB */
+
+ /* bit depth */
+ scanner->opt[OPT_BIT_DEPTH].name = SANE_NAME_BIT_DEPTH;
+ scanner->opt[OPT_BIT_DEPTH].title = SANE_TITLE_BIT_DEPTH;
+ scanner->opt[OPT_BIT_DEPTH].desc = SANE_DESC_BIT_DEPTH;
+ scanner->opt[OPT_BIT_DEPTH].type = SANE_TYPE_INT;
+ scanner->opt[OPT_BIT_DEPTH].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+ scanner->opt[OPT_BIT_DEPTH].size = sizeof (SANE_Word);
+ scanner->opt[OPT_BIT_DEPTH].constraint.word_list = scanner->device->bpp_list;
+ scanner->val[OPT_BIT_DEPTH].w = scanner->device->bpp_list[2];
+
+ /* resolution */
+ scanner->opt[OPT_RESOLUTION].name = SANE_NAME_SCAN_RESOLUTION;
+ scanner->opt[OPT_RESOLUTION].title = SANE_TITLE_SCAN_RESOLUTION;
+ scanner->opt[OPT_RESOLUTION].desc = SANE_DESC_SCAN_RESOLUTION;
+ scanner->opt[OPT_RESOLUTION].type = SANE_TYPE_FIXED;
+ scanner->opt[OPT_RESOLUTION].unit = SANE_UNIT_DPI;
+ scanner->opt[OPT_RESOLUTION].constraint_type = SANE_CONSTRAINT_RANGE;
+ scanner->opt[OPT_RESOLUTION].constraint.range = &scanner->device->dpi_range;
+ scanner->val[OPT_RESOLUTION].w = scanner->device->fast_preview_resolution << SANE_FIXED_SCALE_SHIFT;
+
+ /* halftone pattern */
+ scanner->opt[OPT_HALFTONE_PATTERN].name = SANE_NAME_HALFTONE_PATTERN;
+ scanner->opt[OPT_HALFTONE_PATTERN].title = SANE_TITLE_HALFTONE_PATTERN;
+ scanner->opt[OPT_HALFTONE_PATTERN].desc = SANE_DESC_HALFTONE_PATTERN;
+ scanner->opt[OPT_HALFTONE_PATTERN].type = SANE_TYPE_STRING;
+ scanner->opt[OPT_HALFTONE_PATTERN].size = max_string_size ((SANE_String_Const const *) scanner->device->halftone_list);
+ scanner->opt[OPT_HALFTONE_PATTERN].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ scanner->opt[OPT_HALFTONE_PATTERN].constraint.string_list = (SANE_String_Const const *) scanner->device->halftone_list;
+ scanner->val[OPT_HALFTONE_PATTERN].s = (SANE_Char *) strdup (scanner->device->halftone_list[6]);
+ scanner->opt[OPT_HALFTONE_PATTERN].cap |= SANE_CAP_INACTIVE; /* Not implemented, and only meaningful at depth 1 */
+
+ /* lineart threshold */
+ scanner->opt[OPT_THRESHOLD].name = SANE_NAME_THRESHOLD;
+ scanner->opt[OPT_THRESHOLD].title = SANE_TITLE_THRESHOLD;
+ scanner->opt[OPT_THRESHOLD].desc = SANE_DESC_THRESHOLD;
+ scanner->opt[OPT_THRESHOLD].type = SANE_TYPE_FIXED;
+ scanner->opt[OPT_THRESHOLD].unit = SANE_UNIT_PERCENT;
+ scanner->opt[OPT_THRESHOLD].constraint_type = SANE_CONSTRAINT_RANGE;
+ scanner->opt[OPT_THRESHOLD].constraint.range = &percentage_range_100;
+ scanner->val[OPT_THRESHOLD].w = SANE_FIX (50);
+ /* scanner->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE; Not implemented, and only meaningful at depth 1 */
+
+ /* create a sharper scan at the cost of scan time */
+ scanner->opt[OPT_SHARPEN].name = "sharpen";
+ scanner->opt[OPT_SHARPEN].title = "Sharpen scan";
+ scanner->opt[OPT_SHARPEN].desc = "Sharpen scan by taking more time to discharge the CCD.";
+ scanner->opt[OPT_SHARPEN].type = SANE_TYPE_BOOL;
+ scanner->opt[OPT_SHARPEN].unit = SANE_UNIT_NONE;
+ scanner->opt[OPT_SHARPEN].constraint_type = SANE_CONSTRAINT_NONE;
+ scanner->val[OPT_SHARPEN].b = SANE_FALSE;
+ scanner->opt[OPT_SHARPEN].cap |= SANE_CAP_SOFT_SELECT;
+
+ /* skip the auto-calibration phase before the scan */
+ scanner->opt[OPT_SHADING_ANALYSIS].name = "shading-analysis";
+ scanner->opt[OPT_SHADING_ANALYSIS].title = "Perform shading analysis";
+ scanner->opt[OPT_SHADING_ANALYSIS].desc = "Collect shading reference data before scanning the image. If set to 'no', this option may be overridden by the scanner.";
+ scanner->opt[OPT_SHADING_ANALYSIS].type = SANE_TYPE_BOOL;
+ scanner->opt[OPT_SHADING_ANALYSIS].unit = SANE_UNIT_NONE;
+ scanner->opt[OPT_SHADING_ANALYSIS].constraint_type = SANE_CONSTRAINT_NONE;
+ scanner->val[OPT_SHADING_ANALYSIS].b = SANE_FALSE;
+ scanner->opt[OPT_SHADING_ANALYSIS].cap |= SANE_CAP_SOFT_SELECT;
+
+ /* use auto-calibration settings for scan */
+ scanner->opt[OPT_CALIBRATION_MODE].name = "calibration";
+ scanner->opt[OPT_CALIBRATION_MODE].title = "Calibration mode";
+ scanner->opt[OPT_CALIBRATION_MODE].desc = "How to calibrate the scanner.";
+ scanner->opt[OPT_CALIBRATION_MODE].type = SANE_TYPE_STRING;
+ scanner->opt[OPT_CALIBRATION_MODE].size = max_string_size ((SANE_String_Const const *) scanner->device->calibration_mode_list);
+ scanner->opt[OPT_CALIBRATION_MODE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ scanner->opt[OPT_CALIBRATION_MODE].constraint.string_list = (SANE_String_Const const *) scanner->device->calibration_mode_list;
+ scanner->val[OPT_CALIBRATION_MODE].s = (SANE_Char *) strdup (scanner->device->calibration_mode_list[1]); /* default auto */
+
+ /* OPT_GAIN_ADJUST */
+ scanner->opt[OPT_GAIN_ADJUST].name = "gain-adjust";
+ scanner->opt[OPT_GAIN_ADJUST].title = "Adjust gain";
+ scanner->opt[OPT_GAIN_ADJUST].desc = "Adjust gain determined by calibration procedure.";
+ scanner->opt[OPT_GAIN_ADJUST].type = SANE_TYPE_STRING;
+ scanner->opt[OPT_GAIN_ADJUST].size = max_string_size ((SANE_String_Const const *) scanner->device->gain_adjust_list);
+ scanner->opt[OPT_GAIN_ADJUST].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ scanner->opt[OPT_GAIN_ADJUST].constraint.string_list = (SANE_String_Const const *) scanner->device->gain_adjust_list;
+ scanner->val[OPT_GAIN_ADJUST].s = (SANE_Char *) strdup (scanner->device->gain_adjust_list[2]); /* x 1.0 (no change) */
+
+ /* scan infrared channel faster but less accurate */
+ scanner->opt[OPT_FAST_INFRARED].name = "fast-infrared";
+ scanner->opt[OPT_FAST_INFRARED].title = "Fast infrared scan";
+ scanner->opt[OPT_FAST_INFRARED].desc = "Do not reposition scan head before scanning infrared line. Results in an infrared offset which may deteriorate IR dust and scratch removal.";
+ scanner->opt[OPT_FAST_INFRARED].type = SANE_TYPE_BOOL;
+ scanner->opt[OPT_FAST_INFRARED].unit = SANE_UNIT_NONE;
+ scanner->opt[OPT_FAST_INFRARED].constraint_type = SANE_CONSTRAINT_NONE;
+ scanner->val[OPT_FAST_INFRARED].b = SANE_FALSE;
+ scanner->opt[OPT_FAST_INFRARED].cap |= SANE_CAP_SOFT_SELECT;
+
+ /* automatically advance to next slide after scan */
+ scanner->opt[OPT_ADVANCE_SLIDE].name = "advcane";
+ scanner->opt[OPT_ADVANCE_SLIDE].title = "Advance slide";
+ scanner->opt[OPT_ADVANCE_SLIDE].desc = "Automatically advance to next slide after scan";
+ scanner->opt[OPT_ADVANCE_SLIDE].type = SANE_TYPE_BOOL;
+ scanner->opt[OPT_ADVANCE_SLIDE].unit = SANE_UNIT_NONE;
+ scanner->opt[OPT_ADVANCE_SLIDE].constraint_type = SANE_CONSTRAINT_NONE;
+ scanner->val[OPT_ADVANCE_SLIDE].w = SANE_TRUE;
+ scanner->opt[OPT_ADVANCE_SLIDE].cap |= SANE_CAP_SOFT_SELECT;
+
+ /* "Geometry" group: */
+ scanner->opt[OPT_GEOMETRY_GROUP].title = "Geometry";
+ scanner->opt[OPT_GEOMETRY_GROUP].desc = "";
+ scanner->opt[OPT_GEOMETRY_GROUP].type = SANE_TYPE_GROUP;
+ scanner->opt[OPT_GEOMETRY_GROUP].cap = SANE_CAP_ADVANCED;
+ scanner->opt[OPT_GEOMETRY_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
+
+ /* top-left x */
+ scanner->opt[OPT_TL_X].name = SANE_NAME_SCAN_TL_X;
+ scanner->opt[OPT_TL_X].title = SANE_TITLE_SCAN_TL_X;
+ scanner->opt[OPT_TL_X].desc = SANE_DESC_SCAN_TL_X;
+ scanner->opt[OPT_TL_X].type = SANE_TYPE_FIXED;
+ scanner->opt[OPT_TL_X].unit = SANE_UNIT_MM;
+ scanner->opt[OPT_TL_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ scanner->opt[OPT_TL_X].constraint.range = &(scanner->device->x_range);
+ scanner->val[OPT_TL_X].w = 0;
+
+ /* top-left y */
+ scanner->opt[OPT_TL_Y].name = SANE_NAME_SCAN_TL_Y;
+ scanner->opt[OPT_TL_Y].title = SANE_TITLE_SCAN_TL_Y;
+ scanner->opt[OPT_TL_Y].desc = SANE_DESC_SCAN_TL_Y;
+ scanner->opt[OPT_TL_Y].type = SANE_TYPE_FIXED;
+ scanner->opt[OPT_TL_Y].unit = SANE_UNIT_MM;
+ scanner->opt[OPT_TL_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ scanner->opt[OPT_TL_Y].constraint.range = &(scanner->device->y_range);
+ scanner->val[OPT_TL_Y].w = 0;
+
+ /* bottom-right x */
+ scanner->opt[OPT_BR_X].name = SANE_NAME_SCAN_BR_X;
+ scanner->opt[OPT_BR_X].title = SANE_TITLE_SCAN_BR_X;
+ scanner->opt[OPT_BR_X].desc = SANE_DESC_SCAN_BR_X;
+ scanner->opt[OPT_BR_X].type = SANE_TYPE_FIXED;
+ scanner->opt[OPT_BR_X].unit = SANE_UNIT_MM;
+ scanner->opt[OPT_BR_X].constraint_type = SANE_CONSTRAINT_RANGE;
+ scanner->opt[OPT_BR_X].constraint.range = &(scanner->device->x_range);
+ scanner->val[OPT_BR_X].w = scanner->device->x_range.max;
+
+ /* bottom-right y */
+ scanner->opt[OPT_BR_Y].name = SANE_NAME_SCAN_BR_Y;
+ scanner->opt[OPT_BR_Y].title = SANE_TITLE_SCAN_BR_Y;
+ scanner->opt[OPT_BR_Y].desc = SANE_DESC_SCAN_BR_Y;
+ scanner->opt[OPT_BR_Y].type = SANE_TYPE_FIXED;
+ scanner->opt[OPT_BR_Y].unit = SANE_UNIT_MM;
+ scanner->opt[OPT_BR_Y].constraint_type = SANE_CONSTRAINT_RANGE;
+ scanner->opt[OPT_BR_Y].constraint.range = &(scanner->device->y_range);
+ scanner->val[OPT_BR_Y].w = scanner->device->y_range.max;
+
+ /* "Enhancement" group: */
+ scanner->opt[OPT_ENHANCEMENT_GROUP].title = "Enhancement";
+ scanner->opt[OPT_ENHANCEMENT_GROUP].desc = "";
+ scanner->opt[OPT_ENHANCEMENT_GROUP].type = SANE_TYPE_GROUP;
+ scanner->opt[OPT_ENHANCEMENT_GROUP].cap = 0;
+ scanner->opt[OPT_ENHANCEMENT_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
+
+ /* correct data for lamp variations (shading) */
+ scanner->opt[OPT_CORRECT_SHADING].name = "correct-shading";
+ scanner->opt[OPT_CORRECT_SHADING].title = "Correct shading";
+ scanner->opt[OPT_CORRECT_SHADING].desc = "Correct data for lamp variations (shading)";
+ scanner->opt[OPT_CORRECT_SHADING].type = SANE_TYPE_BOOL;
+ scanner->opt[OPT_CORRECT_SHADING].unit = SANE_UNIT_NONE;
+ scanner->val[OPT_CORRECT_SHADING].w = SANE_TRUE;
+
+ /* correct infrared for red crosstalk */
+ scanner->opt[OPT_CORRECT_INFRARED].name = "correct-infrared";
+ scanner->opt[OPT_CORRECT_INFRARED].title = "Correct infrared";
+ scanner->opt[OPT_CORRECT_INFRARED].desc = "Correct infrared for red crosstalk";
+ scanner->opt[OPT_CORRECT_INFRARED].type = SANE_TYPE_BOOL;
+ scanner->opt[OPT_CORRECT_INFRARED].unit = SANE_UNIT_NONE;
+ scanner->val[OPT_CORRECT_INFRARED].w = SANE_FALSE;
+
+ /* detect and remove dust and scratch artifacts */
+ scanner->opt[OPT_CLEAN_IMAGE].name = "clean-image";
+ scanner->opt[OPT_CLEAN_IMAGE].title = "Clean image";
+ scanner->opt[OPT_CLEAN_IMAGE].desc = "Detect and remove dust and scratch artifacts";
+ scanner->opt[OPT_CLEAN_IMAGE].type = SANE_TYPE_BOOL;
+ scanner->opt[OPT_CLEAN_IMAGE].unit = SANE_UNIT_NONE;
+ scanner->val[OPT_CLEAN_IMAGE].w = SANE_FALSE;
+
+ /* strength of grain filtering */
+ scanner->opt[OPT_SMOOTH_IMAGE].name = "smooth";
+ scanner->opt[OPT_SMOOTH_IMAGE].title = "Attenuate film grain";
+ scanner->opt[OPT_SMOOTH_IMAGE].desc = "Amount of smoothening";
+ scanner->opt[OPT_SMOOTH_IMAGE].type = SANE_TYPE_INT;
+ scanner->opt[OPT_SMOOTH_IMAGE].constraint_type = SANE_CONSTRAINT_WORD_LIST;
+ scanner->opt[OPT_SMOOTH_IMAGE].size = sizeof (SANE_Word);
+ scanner->opt[OPT_SMOOTH_IMAGE].constraint.word_list = scanner->device->grain_sw_list;
+ scanner->val[OPT_SMOOTH_IMAGE].w = scanner->device->grain_sw_list[1];
+ if (scanner->opt[OPT_SMOOTH_IMAGE].constraint.word_list[0] < 2) {
+ scanner->opt[OPT_SMOOTH_IMAGE].cap |= SANE_CAP_INACTIVE;
+ }
+
+ /* gamma correction, to make image sRGB like */
+ scanner->opt[OPT_TRANSFORM_TO_SRGB].name = "srgb";
+ scanner->opt[OPT_TRANSFORM_TO_SRGB].title = "sRGB colors";
+ scanner->opt[OPT_TRANSFORM_TO_SRGB].desc = "Transform image to approximate sRGB color space";
+ scanner->opt[OPT_TRANSFORM_TO_SRGB].type = SANE_TYPE_BOOL;
+ scanner->opt[OPT_TRANSFORM_TO_SRGB].unit = SANE_UNIT_NONE;
+ scanner->val[OPT_TRANSFORM_TO_SRGB].w = SANE_FALSE;
+ scanner->opt[OPT_TRANSFORM_TO_SRGB].cap |= SANE_CAP_INACTIVE;
+
+ /* color correction for generic negative film */
+ scanner->opt[OPT_INVERT_IMAGE].name = "invert";
+ scanner->opt[OPT_INVERT_IMAGE].title = "Invert colors";
+ scanner->opt[OPT_INVERT_IMAGE].desc = "Correct for generic negative film";
+ scanner->opt[OPT_INVERT_IMAGE].type = SANE_TYPE_BOOL;
+ scanner->opt[OPT_INVERT_IMAGE].unit = SANE_UNIT_NONE;
+ scanner->val[OPT_INVERT_IMAGE].w = SANE_FALSE;
+ scanner->opt[OPT_INVERT_IMAGE].cap |= SANE_CAP_INACTIVE;
+
+ /* crop image */
+ scanner->opt[OPT_CROP_IMAGE].name = "crop";
+ scanner->opt[OPT_CROP_IMAGE].title = "Cropping";
+ scanner->opt[OPT_CROP_IMAGE].desc = "How to crop the image";
+ scanner->opt[OPT_CROP_IMAGE].type = SANE_TYPE_STRING;
+ scanner->opt[OPT_CROP_IMAGE].size = max_string_size ((SANE_String_Const const *)(void*) scanner->device->crop_sw_list);
+ scanner->opt[OPT_CROP_IMAGE].constraint_type = SANE_CONSTRAINT_STRING_LIST;
+ scanner->opt[OPT_CROP_IMAGE].constraint.string_list = (SANE_String_Const const *)(void*) scanner->device->crop_sw_list;
+ scanner->val[OPT_CROP_IMAGE].s = (SANE_Char *) strdup (scanner->device->crop_sw_list[2]);
+
+ /* "Advanced" group: */
+ scanner->opt[OPT_ADVANCED_GROUP].title = "Advanced";
+ scanner->opt[OPT_ADVANCED_GROUP].desc = "";
+ scanner->opt[OPT_ADVANCED_GROUP].type = SANE_TYPE_GROUP;
+ scanner->opt[OPT_ADVANCED_GROUP].cap = SANE_CAP_ADVANCED;
+ scanner->opt[OPT_ADVANCED_GROUP].constraint_type = SANE_CONSTRAINT_NONE;
+
+ /* preview */
+ scanner->opt[OPT_PREVIEW].name = SANE_NAME_PREVIEW;
+ scanner->opt[OPT_PREVIEW].title = SANE_TITLE_PREVIEW;
+ scanner->opt[OPT_PREVIEW].desc = SANE_DESC_PREVIEW;
+ scanner->opt[OPT_PREVIEW].type = SANE_TYPE_BOOL;
+ scanner->val[OPT_PREVIEW].w = SANE_FALSE;
+
+ /* save shading data */
+ scanner->opt[OPT_SAVE_SHADINGDATA].name = "save-shading-data";
+ scanner->opt[OPT_SAVE_SHADINGDATA].title = "Save shading data";
+ scanner->opt[OPT_SAVE_SHADINGDATA].desc = "Save shading data in 'pieusb.shading'";
+ scanner->opt[OPT_SAVE_SHADINGDATA].type = SANE_TYPE_BOOL;
+ scanner->val[OPT_SAVE_SHADINGDATA].w = SANE_FALSE;
+
+ /* save CCD mask */
+ scanner->opt[OPT_SAVE_CCDMASK].name = "save-ccdmask";
+ scanner->opt[OPT_SAVE_CCDMASK].title = "Save CCD mask";
+ scanner->opt[OPT_SAVE_CCDMASK].desc = "Save CCD mask 'pieusb.ccd'";
+ scanner->opt[OPT_SAVE_CCDMASK].type = SANE_TYPE_BOOL;
+ scanner->val[OPT_SAVE_CCDMASK].w = SANE_FALSE;
+
+ scanner->opt[OPT_LIGHT].name = "light";
+ scanner->opt[OPT_LIGHT].title = "Light";
+ scanner->opt[OPT_LIGHT].desc = "Light";
+ scanner->opt[OPT_LIGHT].type = SANE_TYPE_INT;
+ scanner->opt[OPT_LIGHT].unit = SANE_UNIT_MICROSECOND;
+ scanner->opt[OPT_LIGHT].cap |= SANE_CAP_SOFT_SELECT;
+ scanner->opt[OPT_LIGHT].size = sizeof(SANE_Word);
+ scanner->val[OPT_LIGHT].w = DEFAULT_LIGHT;
+
+ scanner->opt[OPT_DOUBLE_TIMES].name = "double-times";
+ scanner->opt[OPT_DOUBLE_TIMES].title = "Double times";
+ scanner->opt[OPT_DOUBLE_TIMES].desc = "Double times";
+ scanner->opt[OPT_DOUBLE_TIMES].type = SANE_TYPE_INT;
+ scanner->opt[OPT_DOUBLE_TIMES].unit = SANE_UNIT_MICROSECOND;
+ scanner->opt[OPT_DOUBLE_TIMES].cap |= SANE_CAP_SOFT_SELECT;
+ scanner->opt[OPT_DOUBLE_TIMES].size = sizeof(SANE_Word);
+ scanner->val[OPT_DOUBLE_TIMES].w = DEFAULT_DOUBLE_TIMES;
+
+ /* exposure times for R, G, B and I */
+ scanner->opt[OPT_SET_EXPOSURE_R].name = SANE_NAME_EXPOSURE_R;
+ scanner->opt[OPT_SET_EXPOSURE_R].title = SANE_TITLE_EXPOSURE_R;
+ scanner->opt[OPT_SET_EXPOSURE_R].desc = SANE_DESC_EXPOSURE_R;
+ scanner->opt[OPT_SET_EXPOSURE_G].name = SANE_NAME_EXPOSURE_G;
+ scanner->opt[OPT_SET_EXPOSURE_G].title = SANE_TITLE_EXPOSURE_G;
+ scanner->opt[OPT_SET_EXPOSURE_G].desc = SANE_DESC_EXPOSURE_G;
+ scanner->opt[OPT_SET_EXPOSURE_B].name = SANE_NAME_EXPOSURE_B;
+ scanner->opt[OPT_SET_EXPOSURE_B].title = SANE_TITLE_EXPOSURE_B;
+ scanner->opt[OPT_SET_EXPOSURE_B].desc = SANE_DESC_EXPOSURE_B;
+ scanner->opt[OPT_SET_EXPOSURE_I].name = SANE_NAME_EXPOSURE_I;
+ scanner->opt[OPT_SET_EXPOSURE_I].title = SANE_TITLE_EXPOSURE_I;
+ scanner->opt[OPT_SET_EXPOSURE_I].desc = SANE_DESC_EXPOSURE_I;
+ for (i = OPT_SET_EXPOSURE_R; i <= OPT_SET_EXPOSURE_I; ++i) {
+ scanner->opt[i].type = SANE_TYPE_INT;
+ scanner->opt[i].unit = SANE_UNIT_MICROSECOND;
+ scanner->opt[i].cap |= SANE_CAP_SOFT_SELECT;
+ scanner->opt[i].constraint_type = SANE_CONSTRAINT_RANGE;
+ scanner->opt[i].constraint.range = &(scanner->device->exposure_range);
+ scanner->opt[i].size = sizeof(SANE_Word);
+ scanner->val[i].w = SANE_EXPOSURE_DEFAULT;
+ }
+
+ /* gain for R, G, B and I */
+ scanner->opt[OPT_SET_GAIN_R].name = SANE_NAME_GAIN_R;
+ scanner->opt[OPT_SET_GAIN_R].title = SANE_TITLE_GAIN_R;
+ scanner->opt[OPT_SET_GAIN_R].desc = SANE_DESC_GAIN_R;
+ scanner->opt[OPT_SET_GAIN_G].name = SANE_NAME_GAIN_G;
+ scanner->opt[OPT_SET_GAIN_G].title = SANE_TITLE_GAIN_G;
+ scanner->opt[OPT_SET_GAIN_G].desc = SANE_DESC_GAIN_G;
+ scanner->opt[OPT_SET_GAIN_B].name = SANE_NAME_GAIN_B;
+ scanner->opt[OPT_SET_GAIN_B].title = SANE_TITLE_GAIN_B;
+ scanner->opt[OPT_SET_GAIN_B].desc = SANE_DESC_GAIN_B;
+ scanner->opt[OPT_SET_GAIN_I].name = SANE_NAME_GAIN_I;
+ scanner->opt[OPT_SET_GAIN_I].title = SANE_TITLE_GAIN_I;
+ scanner->opt[OPT_SET_GAIN_I].desc = SANE_DESC_GAIN_I;
+ for (i = OPT_SET_GAIN_R; i <= OPT_SET_GAIN_I; ++i) {
+ scanner->opt[i].type = SANE_TYPE_INT;
+ scanner->opt[i].unit = SANE_UNIT_NONE;
+ scanner->opt[i].constraint_type = SANE_CONSTRAINT_RANGE;
+ scanner->opt[i].constraint.range = &gain_range;
+ scanner->opt[i].size = sizeof(SANE_Word);
+ scanner->val[i].w = SANE_GAIN_DEFAULT;
+ }
+ /* offsets for R, G, B and I */
+ scanner->opt[OPT_SET_OFFSET_R].name = SANE_NAME_OFFSET_R;
+ scanner->opt[OPT_SET_OFFSET_R].title = SANE_TITLE_OFFSET_R;
+ scanner->opt[OPT_SET_OFFSET_R].desc = SANE_DESC_OFFSET_R;
+ scanner->opt[OPT_SET_OFFSET_G].name = SANE_NAME_OFFSET_G;
+ scanner->opt[OPT_SET_OFFSET_G].title = SANE_TITLE_OFFSET_G;
+ scanner->opt[OPT_SET_OFFSET_G].desc = SANE_DESC_OFFSET_G;
+ scanner->opt[OPT_SET_OFFSET_B].name = SANE_NAME_OFFSET_B;
+ scanner->opt[OPT_SET_OFFSET_B].title = SANE_TITLE_OFFSET_B;
+ scanner->opt[OPT_SET_OFFSET_B].desc = SANE_DESC_OFFSET_B;
+ scanner->opt[OPT_SET_OFFSET_I].name = SANE_NAME_OFFSET_I;
+ scanner->opt[OPT_SET_OFFSET_I].title = SANE_TITLE_OFFSET_I;
+ scanner->opt[OPT_SET_OFFSET_I].desc = SANE_DESC_OFFSET_I;
+ for (i = OPT_SET_OFFSET_R; i <= OPT_SET_OFFSET_I; ++i) {
+ scanner->opt[i].type = SANE_TYPE_INT;
+ scanner->opt[i].unit = SANE_UNIT_NONE;
+ scanner->opt[i].constraint_type = SANE_CONSTRAINT_RANGE;
+ scanner->opt[i].constraint.range = &offset_range;
+ scanner->opt[i].size = sizeof(SANE_Word);
+ scanner->val[i].w = SANE_OFFSET_DEFAULT;
+ }
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Parse line from config file into a vendor id, product id and a model number
+ *
+ * @param config_line Text to parse
+ * @param vendor_id
+ * @param product_id
+ * @param model_number
+ * @return SANE_STATUS_GOOD, or SANE_STATUS_INVAL in case of a parse error
+ */
+SANE_Status
+sanei_pieusb_parse_config_line(const char* config_line, SANE_Word* vendor_id, SANE_Word* product_id, SANE_Word* model_number)
+{
+ char *vendor_id_string, *product_id_string, *model_number_string;
+
+ if (strncmp (config_line, "usb ", 4) != 0) {
+ return SANE_STATUS_INVAL;
+ }
+ /* Detect vendor-id */
+ config_line += 4;
+ config_line = sanei_config_skip_whitespace (config_line);
+ if (*config_line) {
+ config_line = sanei_config_get_string (config_line, &vendor_id_string);
+ if (vendor_id_string) {
+ *vendor_id = strtol (vendor_id_string, 0, 0);
+ free (vendor_id_string);
+ } else {
+ return SANE_STATUS_INVAL;
+ }
+ config_line = sanei_config_skip_whitespace (config_line);
+ } else {
+ return SANE_STATUS_INVAL;
+ }
+ /* Detect product-id */
+ config_line = sanei_config_skip_whitespace (config_line);
+ if (*config_line) {
+ config_line = sanei_config_get_string (config_line, &product_id_string);
+ if (product_id_string) {
+ *product_id = strtol (product_id_string, 0, 0);
+ free (product_id_string);
+ } else {
+ return SANE_STATUS_INVAL;
+ }
+ config_line = sanei_config_skip_whitespace (config_line);
+ } else {
+ return SANE_STATUS_INVAL;
+ }
+ /* Detect product-id */
+ config_line = sanei_config_skip_whitespace (config_line);
+ if (*config_line) {
+ config_line = sanei_config_get_string (config_line, &model_number_string);
+ if (model_number_string) {
+ *model_number = strtol (model_number_string, 0, 0);
+ free (model_number_string);
+ } else {
+ return SANE_STATUS_INVAL;
+ }
+ config_line = sanei_config_skip_whitespace (config_line);
+ } else {
+ return SANE_STATUS_INVAL;
+ }
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Check if current list of supported devices contains the given specifications.
+ *
+ * @param vendor_id
+ * @param product_id
+ * @param model_number
+ * @return
+ */
+SANE_Bool
+sanei_pieusb_supported_device_list_contains(SANE_Word vendor_id, SANE_Word product_id, SANE_Word model_number)
+{
+ int i = 0;
+ while (pieusb_supported_usb_device_list[i].vendor != 0) {
+ if (pieusb_supported_usb_device_list[i].vendor == vendor_id
+ && pieusb_supported_usb_device_list[i].product == product_id
+ && pieusb_supported_usb_device_list[i].model == model_number) {
+ return SANE_TRUE;
+ }
+ i++;
+ }
+ return SANE_FALSE;
+}
+
+/**
+ * Add the given specifications to the current list of supported devices
+ * @param vendor_id
+ * @param product_id
+ * @param model_number
+ * @return
+ */
+SANE_Status
+sanei_pieusb_supported_device_list_add(SANE_Word vendor_id, SANE_Word product_id, SANE_Word model_number)
+{
+ int i = 0, k;
+ struct Pieusb_USB_Device_Entry* dl;
+
+ while (pieusb_supported_usb_device_list[i].vendor != 0) {
+ i++;
+ }
+ /* i is index of last entry */
+ for (k=0; k<=i; k++) {
+ DBG(DBG_info_proc,"sanei_pieusb_supported_device_list_add(): current %03d: %04x %04x %02x\n", i,
+ pieusb_supported_usb_device_list[k].vendor,
+ pieusb_supported_usb_device_list[k].product,
+ pieusb_supported_usb_device_list[k].model);
+ }
+
+ dl = realloc(pieusb_supported_usb_device_list,(i+2)*sizeof(struct Pieusb_USB_Device_Entry)); /* Add one entry to list */
+ if (dl == NULL) {
+ return SANE_STATUS_INVAL;
+ }
+ /* Copy values */
+ pieusb_supported_usb_device_list = dl;
+ pieusb_supported_usb_device_list[i].vendor = vendor_id;
+ pieusb_supported_usb_device_list[i].product = product_id;
+ pieusb_supported_usb_device_list[i].model = model_number;
+ pieusb_supported_usb_device_list[i+1].vendor = 0;
+ pieusb_supported_usb_device_list[i+1].product = 0;
+ pieusb_supported_usb_device_list[i+1].model = 0;
+ for (k=0; k<=i+1; k++) {
+ DBG(DBG_info_proc,"sanei_pieusb_supported_device_list_add() add: %03d: %04x %04x %02x\n", i,
+ pieusb_supported_usb_device_list[k].vendor,
+ pieusb_supported_usb_device_list[k].product,
+ pieusb_supported_usb_device_list[k].model);
+ }
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Actions to perform when a cancel request has been received.
+ *
+ * @param scanner scanner to stop scanning
+ * @return SANE_STATUS_CANCELLED
+ */
+SANE_Status
+sanei_pieusb_on_cancel (Pieusb_Scanner * scanner)
+{
+ struct Pieusb_Command_Status status;
+
+ DBG (DBG_info_proc, "sanei_pieusb_on_cancel()\n");
+
+ sanei_pieusb_cmd_stop_scan (scanner->device_number, &status);
+ sanei_pieusb_cmd_set_scan_head (scanner->device_number, 1, 0, &status);
+ sanei_pieusb_buffer_delete (&scanner->buffer);
+ scanner->scanning = SANE_FALSE;
+ return SANE_STATUS_CANCELLED;
+}
+
+/**
+ * Determine maximum lengt of a set of strings.
+ *
+ * @param strings Set of strings
+ * @return maximum length
+ */
+static size_t
+max_string_size (SANE_String_Const const strings[])
+{
+ size_t size, max_size = 0;
+ int i;
+
+ for (i = 0; strings[i]; ++i) {
+ size = strlen (strings[i]) + 1;
+ if (size > max_size) {
+ max_size = size;
+ }
+ }
+
+ return max_size;
+}
+
+/* From MR's pie.c */
+
+/* ------------------------- PIEUSB_CORRECT_SHADING -------------------------- */
+
+/**
+ * Correct the given buffer for shading using shading data in scanner.
+ * If the loop order is width->color->height, a 7200 dpi scan correction takes
+ * 45 minutes. If the loop order is color->height->width, this is less than 3
+ * minutes. So it is worthwhile to find the used pixels first (array width_to_loc).
+ *
+ * @param scanner Scanner
+ * @param buffer Buffer to correct
+ */
+void
+sanei_pieusb_correct_shading(struct Pieusb_Scanner *scanner, struct Pieusb_Read_Buffer *buffer)
+{
+
+ int i, j, c, k;
+ SANE_Uint val, val_org, *p;
+ int *width_to_loc;
+
+ DBG (DBG_info_proc, "sanei_pieusb_correct_shading()\n");
+
+ /* Loop through CCD-mask to find used pixels */
+ width_to_loc = calloc(buffer->width,sizeof(int));
+ j = 0;
+ for (i = 0; i < scanner->ccd_mask_size; i++) {
+ if (scanner->ccd_mask[i] == 0) {
+ width_to_loc[j++] = i;
+ }
+ }
+ /* Correct complete image */
+ for (c = 0; c < buffer->colors; c++) {
+ DBG(DBG_info,"sanei_pieusb_correct_shading() correct color %d\n",c);
+ for (k = 0; k < buffer->height; k++) {
+ /* DBG(DBG_info,"Correct line %d\n",k); */
+ p = buffer->data + c * buffer->width * buffer->height + k * buffer->width;
+ for (j = 0; j < buffer->width; j++) {
+ val_org = *p;
+ val = lround((double)scanner->shading_mean[c] / scanner->shading_ref[c][width_to_loc[j]] * val_org);
+ /* DBG(DBG_info,"Correct [%d,%d,%d] %d -> %d\n",k,j,c,val_org,val); */
+ *p++ = val;
+ }
+ }
+ }
+ /* Free memory */
+ free(width_to_loc);
+}
+
+/* === functions copied from MR's code === */
+
+/**
+ *
+ * @param scanner
+ * @param in_img
+ * @param planes
+ * @param out_planes
+ * @return
+ */
+SANE_Status
+sanei_pieusb_post (Pieusb_Scanner *scanner, uint16_t **in_img, int planes)
+{
+ uint16_t *cplane[PLANES]; /* R, G, B, I gray scale planes */
+ SANE_Parameters parameters; /* describes the image */
+ int winsize_smooth; /* for adapting replaced pixels */
+ char filename[64];
+ SANE_Status status;
+ int smooth, i;
+
+ memcpy (&parameters, &scanner->scan_parameters, sizeof (SANE_Parameters));
+ parameters.format = SANE_FRAME_GRAY;
+ parameters.bytes_per_line = parameters.pixels_per_line;
+ if (parameters.depth > 8)
+ parameters.bytes_per_line *= 2;
+ parameters.last_frame = 0;
+
+ DBG (DBG_info, "pie_usb_post: %d ppl, %d lines, %d bits, %d planes, %d dpi\n",
+ parameters.pixels_per_line, parameters.lines,
+ parameters.depth, planes, scanner->mode.resolution);
+
+ if (planes > PLANES) {
+ DBG (DBG_error, "pie_usb_post: too many planes: %d (max %d)\n", planes, PLANES);
+ return SANE_STATUS_INVAL;
+ }
+
+ for (i = 0; i < planes; i++)
+ cplane[i] = in_img[i];
+
+ /* dirt is rather resolution invariant, so
+ * setup resolution dependent parameters
+ */
+ /* film grain reduction */
+ smooth = scanner->val[OPT_SMOOTH_IMAGE].w;
+ winsize_smooth = (scanner->mode.resolution / 540) | 1;
+ /* smoothen whole image or only replaced pixels */
+ if (smooth)
+ {
+ winsize_smooth += 2 * (smooth - 3); /* even */
+ if (winsize_smooth < 3)
+ smooth = 0;
+ }
+ if (winsize_smooth < 3)
+ winsize_smooth = 3;
+ DBG (DBG_info, "pie_usb_sw_post: winsize_smooth %d\n", winsize_smooth);
+
+ /* RGBI post-processing if selected:
+ * 1) remove spectral overlay from ired plane,
+ * 2) remove dirt, smoothen if, crop if */
+ if (scanner->val[OPT_CORRECT_INFRARED].b) /* (scanner->processing & POST_SW_IRED_MASK) */
+ {
+ /* remove spectral overlay from ired plane */
+ status = sanei_ir_spectral_clean (&parameters, scanner->ln_lut, cplane[0], cplane[3]);
+ if (status != SANE_STATUS_GOOD)
+ return status;
+ if (DBG_LEVEL >= 15)
+ {
+ snprintf (filename, 63, "/tmp/ir-spectral.pnm");
+ pieusb_write_pnm_file (filename, cplane[3],
+ parameters.depth, 1,
+ parameters.pixels_per_line, parameters.lines);
+ }
+ if (scanner->cancel_request) /* asynchronous cancel ? */
+ return SANE_STATUS_CANCELLED;
+ } /* scanner-> processing & POST_SW_IRED_MASK */
+
+ /* remove dirt, smoothen if, crop if */
+ if (scanner->val[OPT_CLEAN_IMAGE].b) /* (scanner->processing & POST_SW_DIRT) */
+ {
+ double *norm_histo;
+ uint16_t *thresh_data;
+ int static_thresh, too_thresh; /* static thresholds */
+ int winsize_filter; /* primary size of filtering window */
+ int size_dilate; /* the dirt mask */
+
+ /* size of filter detecting dirt */
+ winsize_filter = (int) (5.0 * (double) scanner->mode.resolution / 300.0) | 1;
+ if (winsize_filter < 3)
+ winsize_filter = 3;
+ /* dirt usually has smooth edges which also need correction */
+ size_dilate = scanner->mode.resolution / 1000 + 1;
+
+ /* first detect large dirt by a static threshold */
+ status = sanei_ir_create_norm_histogram (&parameters, cplane[3], &norm_histo);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_error, "pie_usb_sw_post: no buffer\n");
+ return SANE_STATUS_NO_MEM;
+ }
+ /* generate a "bimodal" static threshold */
+ status = sanei_ir_threshold_yen (&parameters, norm_histo, &static_thresh);
+ if (status != SANE_STATUS_GOOD)
+ return status;
+ /* generate traditional static threshold */
+ status = sanei_ir_threshold_otsu (&parameters, norm_histo, &too_thresh);
+ if (status != SANE_STATUS_GOOD)
+ return status;
+ /* choose lower one */
+ if (too_thresh < static_thresh)
+ static_thresh = too_thresh;
+ free (norm_histo);
+
+ /* then generate dirt mask with adaptive thresholding filter
+ * and add the dirt from the static threshold */
+ /* last two parameters: 10, 50 detects more, 20, 75 less */
+ status = sanei_ir_filter_madmean (&parameters, cplane[3], &thresh_data, winsize_filter, 20, 100);
+ if (status != SANE_STATUS_GOOD) {
+ free (thresh_data);
+ return status;
+ }
+ sanei_ir_add_threshold (&parameters, cplane[3], thresh_data, static_thresh);
+ if (DBG_LEVEL >= 15)
+ {
+ snprintf (filename, 63, "/tmp/ir-threshold.pnm");
+ pieusb_write_pnm_file (filename, thresh_data,
+ 8, 1, parameters.pixels_per_line,
+ parameters.lines);
+ }
+ if (scanner->cancel_request) { /* asynchronous cancel ? */
+ free (thresh_data);
+ return SANE_STATUS_CANCELLED;
+ }
+ /* replace the dirt and smoothen film grain and crop if possible */
+ status = sanei_ir_dilate_mean (&parameters, cplane, thresh_data,
+ 500, size_dilate, winsize_smooth, smooth,
+ 0, NULL);
+ if (status != SANE_STATUS_GOOD) {
+ free (thresh_data);
+ return status;
+ }
+ smooth = 0;
+ free (thresh_data);
+ }
+
+ if (DBG_LEVEL >= 15)
+ {
+ pieusb_write_pnm_file ("/tmp/RGBi-img.pnm", scanner->buffer.data,
+ scanner->scan_parameters.depth, 3, scanner->scan_parameters.pixels_per_line,
+ scanner->scan_parameters.lines);
+ }
+
+ return status;
+}
+
+/* ------------------------------ PIE_USB_WRITE_PNM_FILE ------------------------------- */
+static SANE_Status
+pieusb_write_pnm_file (char *filename, SANE_Uint *data, int depth,
+ int channels, int pixels_per_line, int lines)
+{
+ FILE *out;
+ int r, c, ch;
+ SANE_Uint val;
+ uint8_t b = 0;
+
+ DBG (DBG_info_proc,
+ "pie_usb_write_pnm_file: depth=%d, channels=%d, ppl=%d, lines=%d\n",
+ depth, channels, pixels_per_line, lines);
+
+ out = fopen (filename, "w");
+ if (!out)
+ {
+ DBG (DBG_error,
+ "pie_usb_write_pnm_file: could not open %s for writing: %s\n",
+ filename, strerror (errno));
+ return SANE_STATUS_INVAL;
+ }
+
+ switch (depth) {
+ case 1:
+ fprintf (out, "P4\n%d\n%d\n", pixels_per_line, lines);
+ for (r = 0; r < lines; r++) {
+ int i;
+ i = 0;
+ b = 0;
+ for (c = 0; c < pixels_per_line; c++) {
+ val = *(data + r * pixels_per_line + c);
+ if (val > 0) b |= (0x80 >> i);
+ i++;
+ if (i == 7) {
+ fputc(b, out);
+ i = 0;
+ b = 0;
+ }
+ }
+ if (i != 0) {
+ fputc(b, out);
+ }
+ }
+ break;
+ case 8:
+ fprintf (out, "P%c\n%d\n%d\n%d\n", channels == 1 ? '5' : '6', pixels_per_line, lines, 255);
+ for (r = 0; r < lines; r++) {
+ for (c = 0; c < pixels_per_line; c++) {
+ for (ch = 0; ch < channels; ch++) {
+ val = *(data + ch * lines * pixels_per_line + r * pixels_per_line + c);
+ b = val & 0xFF;
+ fputc(b, out);
+ }
+ }
+ }
+ break;
+ case 16:
+ fprintf (out, "P%c\n%d\n%d\n%d\n", channels == 1 ? '5' : '6', pixels_per_line, lines, 65535);
+ for (r = 0; r < lines; r++) {
+ for (c = 0; c < pixels_per_line; c++) {
+ for (ch = 0; ch < channels; ch++) {
+ val = *(data + ch * lines * pixels_per_line + r * pixels_per_line + c);
+ b = (val >> 8) & 0xFF;
+ fputc(b, out);
+ b = val & 0xFF;
+ fputc(b, out);
+ }
+ }
+ }
+ break;
+ default:
+ DBG (DBG_error, "pie_usb_write_pnm_file: depth %d not implemented\n", depth);
+ }
+ fclose (out);
+
+ DBG (DBG_info, "pie_usb_write_pnm_file: finished\n");
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Check option inconsistencies.
+ * In most cases an inconsistency can be solved by ignoring an option setting.
+ * Message these situations and return 1 to indicate we can work with the
+ * current set op options. If the settings are really inconsistent, return 0.
+ */
+int
+sanei_pieusb_analyse_options(struct Pieusb_Scanner *scanner)
+{
+ /* Checks*/
+ if (scanner->val[OPT_TL_X].w > scanner->val[OPT_BR_X].w) {
+ DBG (DBG_error, "sane_start: %s (%.1f mm) is bigger than %s (%.1f mm) -- aborting\n",
+ scanner->opt[OPT_TL_X].title,
+ SANE_UNFIX (scanner->val[OPT_TL_X].w),
+ scanner->opt[OPT_BR_X].title,
+ SANE_UNFIX (scanner->val[OPT_BR_X].w));
+ return 0;
+ }
+ if (scanner->val[OPT_TL_Y].w > scanner->val[OPT_BR_Y].w) {
+ DBG (DBG_error, "sane_start: %s (%.1f mm) is bigger than %s (%.1f mm) -- aborting\n",
+ scanner->opt[OPT_TL_Y].title,
+ SANE_UNFIX (scanner->val[OPT_TL_Y].w),
+ scanner->opt[OPT_BR_Y].title,
+ SANE_UNFIX (scanner->val[OPT_BR_Y].w));
+ return 0;
+ }
+ /* Modes sometimes limit other choices */
+ if (scanner->val[OPT_PREVIEW].b) {
+ /* Preview uses its own specific settings */
+ if (scanner->val[OPT_RESOLUTION].w != (scanner->device->fast_preview_resolution << SANE_FIXED_SCALE_SHIFT)) {
+ DBG (DBG_info_sane, "Option %s = %f ignored during preview\n", scanner->opt[OPT_RESOLUTION].name, SANE_UNFIX(scanner->val[OPT_RESOLUTION].w));
+ }
+ if (scanner->val[OPT_SHARPEN].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored during preview\n", scanner->opt[OPT_SHARPEN].name, scanner->val[OPT_SHARPEN].b);
+ }
+ if (!scanner->val[OPT_FAST_INFRARED].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored during preview\n", scanner->opt[OPT_FAST_INFRARED].name, scanner->val[OPT_FAST_INFRARED].b);
+ }
+ if (scanner->val[OPT_CORRECT_INFRARED].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored during preview\n", scanner->opt[OPT_CORRECT_INFRARED].name, scanner->val[OPT_CORRECT_INFRARED].b);
+ }
+ if (scanner->val[OPT_CLEAN_IMAGE].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored during preview\n", scanner->opt[OPT_CLEAN_IMAGE].name, scanner->val[OPT_CLEAN_IMAGE].b);
+ }
+ if (scanner->val[OPT_SMOOTH_IMAGE].w != 0) {
+ DBG (DBG_info_sane, "Option %s = %d ignored during preview\n", scanner->opt[OPT_SMOOTH_IMAGE].name, scanner->val[OPT_SMOOTH_IMAGE].w);
+ }
+ if (strcmp(scanner->val[OPT_CROP_IMAGE].s, scanner->device->crop_sw_list[0]) != 0) {
+ DBG (DBG_info_sane, "Option %s = %s ignored during preview\n", scanner->opt[OPT_CROP_IMAGE].name, scanner->val[OPT_CROP_IMAGE].s);
+ }
+ if (scanner->val[OPT_TRANSFORM_TO_SRGB].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored during preview\n", scanner->opt[OPT_TRANSFORM_TO_SRGB].name, scanner->val[OPT_TRANSFORM_TO_SRGB].w);
+ }
+ if (scanner->val[OPT_INVERT_IMAGE].w) {
+ DBG (DBG_info_sane, "Option %s = %d ignored during preview\n", scanner->opt[OPT_INVERT_IMAGE].name, scanner->val[OPT_INVERT_IMAGE].w);
+ }
+ } else if (strcmp(scanner->val[OPT_MODE].s,SANE_VALUE_SCAN_MODE_LINEART)==0) {
+ /* Can we do any post processing in lineart? Needs testing to see what's possible */
+ if (scanner->val[OPT_BIT_DEPTH].w != 1) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in lineart mode (will use 1)\n", scanner->opt[OPT_BIT_DEPTH].name, scanner->val[OPT_BIT_DEPTH].w);
+ }
+ if (!scanner->val[OPT_FAST_INFRARED].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in lineart mode (irrelevant)\n", scanner->opt[OPT_FAST_INFRARED].name, scanner->val[OPT_FAST_INFRARED].b);
+ }
+ if (!scanner->val[OPT_CORRECT_SHADING].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in lineart mode (irrelevant)\n", scanner->opt[OPT_CORRECT_SHADING].name, scanner->val[OPT_CORRECT_SHADING].b);
+ }
+ if (!scanner->val[OPT_CORRECT_INFRARED].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in lineart mode (irrelevant)\n", scanner->opt[OPT_CORRECT_INFRARED].name, scanner->val[OPT_CORRECT_INFRARED].b);
+ }
+ if (scanner->val[OPT_CLEAN_IMAGE].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in lineart mode (irrelevant)\n", scanner->opt[OPT_CLEAN_IMAGE].name, scanner->val[OPT_CLEAN_IMAGE].b);
+ }
+ if (scanner->val[OPT_SMOOTH_IMAGE].w != 0) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in lineart mode (irrelevant)\n", scanner->opt[OPT_SMOOTH_IMAGE].name, scanner->val[OPT_SMOOTH_IMAGE].w);
+ }
+ if (strcmp(scanner->val[OPT_CROP_IMAGE].s, scanner->device->crop_sw_list[0]) != 0) {
+ DBG (DBG_info_sane, "Option %s = %s ignored in lineart mode (irrelevant)\n", scanner->opt[OPT_CROP_IMAGE].name, scanner->val[OPT_CROP_IMAGE].s);
+ }
+ if (scanner->val[OPT_TRANSFORM_TO_SRGB].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in lineart mode (irrelevant)\n", scanner->opt[OPT_TRANSFORM_TO_SRGB].name, scanner->val[OPT_TRANSFORM_TO_SRGB].w);
+ }
+ } else if (strcmp(scanner->val[OPT_MODE].s,SANE_VALUE_SCAN_MODE_HALFTONE)==0) {
+ /* Can we do any post processing in halftone? Needs testing to see what's possible */
+ if (scanner->val[OPT_BIT_DEPTH].w != 1) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in halftone mode (will use 1)\n", scanner->opt[OPT_BIT_DEPTH].name, scanner->val[OPT_BIT_DEPTH].w);
+ }
+ if (!scanner->val[OPT_FAST_INFRARED].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in halftone mode (irrelevant)\n", scanner->opt[OPT_FAST_INFRARED].name, scanner->val[OPT_FAST_INFRARED].b);
+ }
+ if (!scanner->val[OPT_CORRECT_SHADING].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in halftone mode (irrelevant)\n", scanner->opt[OPT_CORRECT_SHADING].name, scanner->val[OPT_CORRECT_SHADING].b);
+ }
+ if (!scanner->val[OPT_CORRECT_INFRARED].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in halftone mode (irrelevant)\n", scanner->opt[OPT_CORRECT_INFRARED].name, scanner->val[OPT_CORRECT_INFRARED].b);
+ }
+ if (scanner->val[OPT_CLEAN_IMAGE].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in halftone mode (irrelevant)\n", scanner->opt[OPT_CLEAN_IMAGE].name, scanner->val[OPT_CLEAN_IMAGE].b);
+ }
+ if (scanner->val[OPT_SMOOTH_IMAGE].w != 0) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in halftone mode (irrelevant)\n", scanner->opt[OPT_SMOOTH_IMAGE].name, scanner->val[OPT_SMOOTH_IMAGE].w);
+ }
+ if (strcmp(scanner->val[OPT_CROP_IMAGE].s, scanner->device->crop_sw_list[0]) != 0) {
+ DBG (DBG_info_sane, "Option %s = %s ignored in halftone mode (irrelevant)\n", scanner->opt[OPT_CROP_IMAGE].name, scanner->val[OPT_CROP_IMAGE].s);
+ }
+ if (scanner->val[OPT_TRANSFORM_TO_SRGB].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in halftone mode (irrelevant)\n", scanner->opt[OPT_TRANSFORM_TO_SRGB].name, scanner->val[OPT_TRANSFORM_TO_SRGB].w);
+ }
+ } else if (strcmp(scanner->val[OPT_MODE].s,SANE_VALUE_SCAN_MODE_GRAY)==0) {
+ /* Can we do any post processing in gray mode? */
+ /* Can we obtain a single color channel in this mode? How? */
+ /* Is this just RGB with luminance trasformation? */
+ /* Needs testing to see what's possible */
+ /* Only do 8 or 16 bit scans */
+ if (scanner->val[OPT_BIT_DEPTH].w == 1) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in gray mode (will use 8)\n", scanner->opt[OPT_BIT_DEPTH].name, scanner->val[OPT_BIT_DEPTH].w);
+ }
+ if (!scanner->val[OPT_FAST_INFRARED].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in gray mode (irrelevant)\n", scanner->opt[OPT_FAST_INFRARED].name, scanner->val[OPT_FAST_INFRARED].b);
+ }
+ if (!scanner->val[OPT_CORRECT_INFRARED].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in gray mode (irrelevant)\n", scanner->opt[OPT_CORRECT_INFRARED].name, scanner->val[OPT_CORRECT_INFRARED].b);
+ }
+ if (scanner->val[OPT_CLEAN_IMAGE].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in gray mode (irrelevant)\n", scanner->opt[OPT_CLEAN_IMAGE].name, scanner->val[OPT_CLEAN_IMAGE].b);
+ }
+ if (scanner->val[OPT_TRANSFORM_TO_SRGB].b) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in gray mode (irrelevant)\n", scanner->opt[OPT_TRANSFORM_TO_SRGB].name, scanner->val[OPT_TRANSFORM_TO_SRGB].w);
+ }
+ } else if (strcmp(scanner->val[OPT_MODE].s,SANE_VALUE_SCAN_MODE_COLOR)==0) {
+ /* Some options require infrared data to be obtained, so all infrared options are relevant */
+ /* Only do 8 or 16 bit scans */
+ if (scanner->val[OPT_BIT_DEPTH].w == 1) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in color mode (will use 8)\n", scanner->opt[OPT_BIT_DEPTH].name, scanner->val[OPT_BIT_DEPTH].w);
+ }
+ } else if (strcmp(scanner->val[OPT_MODE].s,SANE_VALUE_SCAN_MODE_RGBI)==0) {
+ /* Only do 8 or 16 bit scans */
+ if (scanner->val[OPT_BIT_DEPTH].w == 1) {
+ DBG (DBG_info_sane, "Option %s = %d ignored in color mode (will use 8)\n", scanner->opt[OPT_BIT_DEPTH].name, scanner->val[OPT_BIT_DEPTH].w);
+ }
+ }
+
+ return 1;
+}
+
+/**
+ * Print options
+ *
+ * @param scanner
+ */
+void
+sanei_pieusb_print_options(struct Pieusb_Scanner *scanner)
+{
+ int k;
+ /* List current options and values */
+ DBG (DBG_info, "Num options = %d\n", scanner->val[OPT_NUM_OPTS].w);
+ for (k = 1; k < scanner->val[OPT_NUM_OPTS].w; k++) {
+ switch (scanner->opt[k].type) {
+ case SANE_TYPE_BOOL:
+ DBG(DBG_info," Option %d: %s = %d\n", k, scanner->opt[k].name, scanner->val[k].b);
+ break;
+ case SANE_TYPE_INT:
+ DBG(DBG_info," Option %d: %s = %d\n", k, scanner->opt[k].name, scanner->val[k].w);
+ break;
+ case SANE_TYPE_FIXED:
+ DBG(DBG_info," Option %d: %s = %f\n", k, scanner->opt[k].name, SANE_UNFIX (scanner->val[k].w));
+ break;
+ case SANE_TYPE_STRING:
+ DBG(DBG_info," Option %d: %s = %s\n", k, scanner->opt[k].name, scanner->val[k].s);
+ break;
+ case SANE_TYPE_GROUP:
+ DBG(DBG_info," Option %d: %s = %s\n", k, scanner->opt[k].title, scanner->val[k].s);
+ break;
+ default:
+ DBG(DBG_info," Option %d: %s unknown type %d\n", k, scanner->opt[k].name, scanner->opt[k].type);
+ break;
+ }
+ }
+}
+
+/**
+ * Calculate reference values for each pixel, line means and line maxima.
+ * We have got 45 lines for all four colors and for each CCD pixel.
+ * The reference value for each pixel is the 45-line average for that
+ * pixel, for each color separately.
+ *
+ * @param scanner
+ * @param buffer
+ */
+static void pieusb_calculate_shading(struct Pieusb_Scanner *scanner, SANE_Byte* buffer)
+{
+ int k, m;
+ SANE_Byte* p;
+ SANE_Int ci, val;
+ SANE_Int shading_width = scanner->device->shading_parameters[0].pixelsPerLine;
+ SANE_Int shading_height = scanner->device->shading_parameters[0].nLines;
+
+ /* Initialze all to 0 */
+ for (k = 0; k < SHADING_PARAMETERS_INFO_COUNT; k++) {
+ scanner->shading_max[k] = 0;
+ scanner->shading_mean[k] = 0;
+ memset(scanner->shading_ref[k], 0, shading_width * sizeof (SANE_Int));
+ }
+ /* Process data from buffer */
+ p = buffer;
+ switch (scanner->mode.colorFormat) {
+ case 0x01: /* Pixel */
+ /* Process pixel by pixel */
+ for (k = 0; k < shading_height; k++) {
+ for (m = 0; m < shading_width; m++) {
+ for (ci = 0; ci < SHADING_PARAMETERS_INFO_COUNT; ci++) {
+ val = *(p) + *(p+1) * 256;
+ scanner->shading_ref[ci][m] += val;
+ scanner->shading_max[ci] = scanner->shading_max[ci] < val ? val : scanner->shading_max[ci];
+ p += 2;
+ }
+ }
+ }
+ break;
+ case 0x04: /* Indexed */
+ /* Process each line in the sequence found in the buffer */
+ for (k = 0; k < shading_height*4; k++) {
+ /* Save at right color */
+ switch (*p) {
+ case 'R': ci = 0; break;
+ case 'G': ci = 1; break;
+ case 'B': ci = 2; break;
+ case 'I': ci = 3; break;
+ default: ci = -1; break; /* ignore line */
+ }
+ /* Add scanned data to reference line and keep track of maximum */
+ if (ci != -1) {
+ for (m = 0; m < shading_width; m++) {
+ val = *(p+2+2*m) + *(p+2+2*m+1) * 256;
+ scanner->shading_ref[ci][m] += val;
+ scanner->shading_max[ci] = scanner->shading_max[ci] < val ? val : scanner->shading_max[ci];
+ /* DBG(DBG_error,"%02d Shading_ref[%d][%d] = %d\n",k,ci,m,scanner->shading_ref[ci][m]); */
+ }
+ }
+ /* Next line */
+ p += 2*shading_width+2;
+ }
+ break;
+ default:
+ DBG (DBG_error,"sane_start(): color format %d not implemented\n",scanner->mode.colorFormat);
+ return;
+ }
+ /* Mean reference value needs division */
+ for (k = 0; k < SHADING_PARAMETERS_INFO_COUNT; k++) {
+ for (m = 0; m < shading_width; m++) {
+ scanner->shading_ref[k][m] = lround((double)scanner->shading_ref[k][m]/shading_height);
+ /* DBG(DBG_error,"Shading_ref[%d][%d] = %d\n",k,m,scanner->shading_ref[k][m]); */
+ }
+ }
+ /* Overall means */
+ for (k = 0; k < SHADING_PARAMETERS_INFO_COUNT; k++) {
+ for (m=0; m<shading_width; m++) {
+ scanner->shading_mean[k] += scanner->shading_ref[k][m];
+ }
+ scanner->shading_mean[k] = lround((double)scanner->shading_mean[k]/shading_width);
+ DBG (DBG_error,"Shading_mean[%d] = %d\n",k,scanner->shading_mean[k]);
+ }
+
+ /* Set shading data present */
+ scanner->shading_data_present = SANE_TRUE;
+
+ /* Export shading data as TIFF */
+#ifdef CAN_DO_4_CHANNEL_TIFF
+ if (scanner->val[OPT_SAVE_SHADINGDATA].b) {
+ struct Pieusb_Read_Buffer shading;
+ SANE_Byte* lboff = buffer;
+ SANE_Int bpl = shading_width*2;
+ SANE_Int n;
+ buffer_create(&shading, shading_width, shading_height, 0x0F, 16);
+ for (n=0; n<4*shading_height; n++) {
+ if (buffer_put_single_color_line(&shading, *lboff, lboff+2, bpl) == 0) {
+ break;
+ }
+ lboff += (bpl + 2);
+ }
+ FILE* fs = fopen("pieusb.shading", "w");
+ /* write_tiff_rgbi_header (fs, shading_width, shading_height, 16, 3600, NULL); */
+ fwrite(shading.data, 1, shading.image_size_bytes, fs);
+ fclose(fs);
+ buffer_delete(&shading);
+ }
+#endif
+
+}
+
+/*
+ * Set frame (from scanner options)
+ */
+
+SANE_Status
+sanei_pieusb_set_frame_from_options(Pieusb_Scanner * scanner)
+{
+ double dpmm;
+ struct Pieusb_Command_Status status;
+
+ dpmm = (double) scanner->device->maximum_resolution / MM_PER_INCH;
+ scanner->frame.x0 = SANE_UNFIX(scanner->val[OPT_TL_X].w) * dpmm;
+ scanner->frame.y0 = SANE_UNFIX(scanner->val[OPT_TL_Y].w) * dpmm;
+ scanner->frame.x1 = SANE_UNFIX(scanner->val[OPT_BR_X].w) * dpmm;
+ scanner->frame.y1 = SANE_UNFIX(scanner->val[OPT_BR_Y].w) * dpmm;
+ scanner->frame.index = 0x80; /* 0x80: value from cyberview */
+ sanei_pieusb_cmd_set_scan_frame (scanner->device_number, scanner->frame.index, &(scanner->frame), &status);
+ DBG (DBG_info_sane, "sanei_pieusb_set_frame_from_options(): sanei_pieusb_cmd_set_scan_frame status %s\n", sane_strstatus (sanei_pieusb_convert_status (status.pieusb_status)));
+ return status.pieusb_status;
+}
+
+/*
+ * Set mode (from scanner options)
+ */
+
+SANE_Status
+sanei_pieusb_set_mode_from_options(Pieusb_Scanner * scanner)
+{
+ struct Pieusb_Command_Status status;
+ const char *mode;
+ SANE_Status res;
+
+ mode = scanner->val[OPT_MODE].s;
+ if (strcmp (mode, SANE_VALUE_SCAN_MODE_LINEART) == 0) {
+ scanner->mode.passes = SCAN_FILTER_GREEN; /* G */
+ scanner->mode.colorFormat = SCAN_COLOR_FORMAT_PIXEL;
+ } else if(strcmp (mode, SANE_VALUE_SCAN_MODE_HALFTONE) == 0) {
+ scanner->mode.passes = SCAN_FILTER_GREEN; /* G */
+ scanner->mode.colorFormat = SCAN_COLOR_FORMAT_PIXEL;
+ } else if(strcmp (mode, SANE_VALUE_SCAN_MODE_GRAY) == 0) {
+ scanner->mode.passes = SCAN_FILTER_GREEN; /* G=gray; unable to get R & B & I to work */
+ scanner->mode.colorFormat = SCAN_COLOR_FORMAT_PIXEL;
+ } else if(scanner->val[OPT_PREVIEW].b) {
+ /* Catch preview here, otherwise next ifs get complicated */
+ scanner->mode.passes = SCAN_ONE_PASS_COLOR;
+ scanner->mode.colorFormat = SCAN_COLOR_FORMAT_INDEX; /* pixel format might be an alternative */
+ } else if(strcmp (mode, SANE_VALUE_SCAN_MODE_RGBI) == 0) {
+ scanner->mode.passes = SCAN_ONE_PASS_RGBI;
+ scanner->mode.colorFormat = SCAN_COLOR_FORMAT_INDEX;
+ } else if(strcmp (mode, SANE_VALUE_SCAN_MODE_COLOR) == 0 && scanner->val[OPT_CLEAN_IMAGE].b) {
+ scanner->mode.passes = SCAN_ONE_PASS_RGBI; /* Need infrared for cleaning */
+ scanner->mode.colorFormat = SCAN_COLOR_FORMAT_INDEX;
+ } else { /* SANE_VALUE_SCAN_MODE_COLOR */
+ scanner->mode.passes = SCAN_ONE_PASS_COLOR;
+ scanner->mode.colorFormat = SCAN_COLOR_FORMAT_INDEX; /* pixel format might be an alternative */
+ }
+ /* Resolution */
+ if (scanner->val[OPT_PREVIEW].b) {
+ scanner->mode.resolution = scanner->device->fast_preview_resolution;
+ DBG (DBG_info_sane, "sanei_pieusb_set_mode_from_options(): resolution fast preview (%d)\n", scanner->mode.resolution);
+ } else {
+ scanner->mode.resolution = SANE_UNFIX (scanner->val[OPT_RESOLUTION].w);
+ DBG (DBG_info_sane, "sanei_pieusb_set_mode_from_options(): resolution from option setting (%d)\n", scanner->mode.resolution);
+ }
+ /* Bit depth: exit on untested values */
+ switch (scanner->val[OPT_BIT_DEPTH].w) {
+ case 1: scanner->mode.colorDepth = SCAN_COLOR_DEPTH_1; break;
+ case 8: scanner->mode.colorDepth = SCAN_COLOR_DEPTH_8; break;
+ case 16: scanner->mode.colorDepth = SCAN_COLOR_DEPTH_16; break;
+ default: /* 4, 10 & 12 */
+ DBG (DBG_error, "sanei_pieusb_set_mode_from_options(): sanei_pieusb_cmd_set_scan_frame untested bit depth %d\n", scanner->val[OPT_BIT_DEPTH].w);
+ return SANE_STATUS_INVAL;
+ }
+ scanner->mode.byteOrder = 0x01; /* 0x01 = Intel; only bit 0 used */
+ scanner->mode.sharpen = scanner->val[OPT_SHARPEN].b && !scanner->val[OPT_PREVIEW].b;
+ scanner->mode.skipShadingAnalysis = !scanner->val[OPT_SHADING_ANALYSIS].b;
+ scanner->mode.fastInfrared = scanner->val[OPT_FAST_INFRARED].b && !scanner->val[OPT_PREVIEW].b;
+ if (strcmp (scanner->val[OPT_HALFTONE_PATTERN].s, "53lpi 45d ROUND") == 0) {
+ scanner->mode.halftonePattern = 0;
+ } else { /*TODO: the others */
+ scanner->mode.halftonePattern = 0;
+ }
+ scanner->mode.lineThreshold = SANE_UNFIX (scanner->val[OPT_THRESHOLD].w) / 100 * 0xFF; /* 0xFF = 100% */
+ sanei_pieusb_cmd_set_mode (scanner->device_number, &(scanner->mode), &status);
+ res = sanei_pieusb_convert_status(status.pieusb_status);
+ if (res == SANE_STATUS_GOOD) {
+ res = sanei_pieusb_wait_ready (scanner, 0);
+ }
+ DBG (DBG_info_sane, "sanei_pieusb_set_mode_from_options(): sanei_pieusb_cmd_set_mode status %s\n", sane_strstatus(res));
+ return res;
+}
+
+/**
+ * Set gains, exposure and offset, to:
+ * - values default (pieusb_set_default_gain_offset)
+ * - values set by options
+ * - values set by auto-calibration procedure
+ * - values determined from preceeding preview
+ *
+ * @param scanner
+ * @return
+ */
+SANE_Status
+sanei_pieusb_set_gain_offset(Pieusb_Scanner * scanner, const char *calibration_mode)
+{
+ struct Pieusb_Command_Status status;
+ SANE_Status ret;
+ double gain;
+
+ DBG (DBG_info,"sanei_pieusb_set_gain_offset(): mode = %s\n", calibration_mode);
+
+ if (strcmp (calibration_mode, SCAN_CALIBRATION_DEFAULT) == 0) {
+ /* Default values */
+ DBG(DBG_info_sane,"sanei_pieusb_set_gain_offset(): get calibration data from defaults\n");
+ scanner->settings.exposureTime[0] = DEFAULT_EXPOSURE;
+ scanner->settings.exposureTime[1] = DEFAULT_EXPOSURE;
+ scanner->settings.exposureTime[2] = DEFAULT_EXPOSURE;
+ scanner->settings.exposureTime[3] = DEFAULT_EXPOSURE;
+ scanner->settings.offset[0] = DEFAULT_OFFSET;
+ scanner->settings.offset[1] = DEFAULT_OFFSET;
+ scanner->settings.offset[2] = DEFAULT_OFFSET;
+ scanner->settings.offset[3] = DEFAULT_OFFSET;
+ scanner->settings.gain[0] = DEFAULT_GAIN;
+ scanner->settings.gain[1] = DEFAULT_GAIN;
+ scanner->settings.gain[2] = DEFAULT_GAIN;
+ scanner->settings.gain[3] = DEFAULT_GAIN;
+ scanner->settings.light = DEFAULT_LIGHT;
+ scanner->settings.extraEntries = DEFAULT_ADDITIONAL_ENTRIES;
+ scanner->settings.doubleTimes = DEFAULT_DOUBLE_TIMES;
+ status.pieusb_status = PIEUSB_STATUS_GOOD;
+ } else if ((strcmp(calibration_mode, SCAN_CALIBRATION_PREVIEW) == 0)
+ && scanner->preview_done) {
+ /* If no preview data availble, do the auto-calibration. */
+ double dg, dgi;
+ DBG (DBG_info, "sanei_pieusb_set_gain_offset(): get calibration data from preview. scanner->mode.passes %d\n", scanner->mode.passes);
+ switch (scanner->mode.passes) {
+ case SCAN_ONE_PASS_RGBI:
+ dg = 3.00;
+ dgi = ((double)scanner->settings.saturationLevel[0] / 65536) / ((double)scanner->preview_upper_bound[0] / HISTOGRAM_SIZE);
+ if (dgi < dg) dg = dgi;
+ dgi = ((double)scanner->settings.saturationLevel[1] / 65536) / ((double)scanner->preview_upper_bound[1] / HISTOGRAM_SIZE);
+ if (dgi < dg) dg = dgi;
+ dgi = ((double)scanner->settings.saturationLevel[2] / 65536) / ((double)scanner->preview_upper_bound[2] / HISTOGRAM_SIZE);
+ if (dgi < dg) dg = dgi;
+ updateGain2(scanner, 0, dg);
+ updateGain2(scanner, 1, dg);
+ updateGain2(scanner, 2, dg);
+ break;
+ case SCAN_ONE_PASS_COLOR:
+ dg = 3.00;
+ dgi = ((double)scanner->settings.saturationLevel[0] / 65536) / ((double)scanner->preview_upper_bound[0] / HISTOGRAM_SIZE);
+ if (dgi < dg) dg = dgi;
+ dgi = ((double)scanner->settings.saturationLevel[1] / 65536) / ((double)scanner->preview_upper_bound[1] / HISTOGRAM_SIZE);
+ if (dgi < dg) dg = dgi;
+ dgi = ((double)scanner->settings.saturationLevel[2] / 65536) / ((double)scanner->preview_upper_bound[2] / HISTOGRAM_SIZE);
+ if (dgi < dg) dg = dgi;
+ updateGain2(scanner, 0, dg);
+ updateGain2(scanner, 1, dg);
+ updateGain2(scanner, 2, dg);
+ break;
+ case SCAN_FILTER_BLUE:
+ dg = 3.00;
+ dgi = ((double)scanner->settings.saturationLevel[2] / 65536) / ((double)scanner->preview_upper_bound[2] / HISTOGRAM_SIZE);
+ if (dgi < dg) dg = dgi;
+ updateGain2(scanner, 2, dg);
+ break;
+ case SCAN_FILTER_GREEN:
+ dg = 3.00;
+ dgi = ((double)scanner->settings.saturationLevel[1] / 65536) / ((double)scanner->preview_upper_bound[1] / HISTOGRAM_SIZE);
+ if (dgi < dg) dg = dgi;
+ updateGain2(scanner, 1, dg);
+ break;
+ case SCAN_FILTER_RED:
+ dg = 3.00;
+ dgi = ((double)scanner->settings.saturationLevel[0] / 65536) / ((double)scanner->preview_upper_bound[0] / HISTOGRAM_SIZE);
+ if (dgi < dg) dg = dgi;
+ updateGain2(scanner, 0, dg);
+ break;
+ case SCAN_FILTER_NEUTRAL:
+ break;
+ }
+ status.pieusb_status = PIEUSB_STATUS_GOOD;
+ } else if (strcmp (calibration_mode, SCAN_CALIBRATION_OPTIONS) == 0) {
+ DBG (DBG_info_sane, "sanei_pieusb_set_gain_offset(): get calibration data from options\n");
+ /* Exposure times */
+ scanner->settings.exposureTime[0] = scanner->val[OPT_SET_EXPOSURE_R].w;
+ scanner->settings.exposureTime[1] = scanner->val[OPT_SET_EXPOSURE_G].w;
+ scanner->settings.exposureTime[2] = scanner->val[OPT_SET_EXPOSURE_B].w;
+ scanner->settings.exposureTime[3] = scanner->val[OPT_SET_EXPOSURE_I].w; /* Infrared */
+ /* Offsets */
+ scanner->settings.offset[0] = scanner->val[OPT_SET_OFFSET_R].w;
+ scanner->settings.offset[1] = scanner->val[OPT_SET_OFFSET_G].w;
+ scanner->settings.offset[2] = scanner->val[OPT_SET_OFFSET_B].w;
+ scanner->settings.offset[3] = scanner->val[OPT_SET_OFFSET_I].w; /* Infrared */
+ /* Gains */
+ scanner->settings.gain[0] = scanner->val[OPT_SET_GAIN_R].w;
+ scanner->settings.gain[1] = scanner->val[OPT_SET_GAIN_G].w;
+ scanner->settings.gain[2] = scanner->val[OPT_SET_GAIN_B].w;
+ scanner->settings.gain[3] = scanner->val[OPT_SET_GAIN_I].w; /* Infrared */
+ /* Light, extra entries and doubling */
+ scanner->settings.light = scanner->val[OPT_LIGHT].w;
+ scanner->settings.extraEntries = DEFAULT_ADDITIONAL_ENTRIES;
+ scanner->settings.doubleTimes = scanner->val[OPT_DOUBLE_TIMES].w;
+ status.pieusb_status = PIEUSB_STATUS_GOOD;
+ } else { /* SCAN_CALIBRATION_AUTO */
+ DBG (DBG_info_sane, "sanei_pieusb_set_gain_offset(): get calibration data from scanner\n");
+ sanei_pieusb_cmd_get_gain_offset (scanner->device_number, &scanner->settings, &status);
+ }
+ /* Check status */
+ if (status.pieusb_status == PIEUSB_STATUS_DEVICE_BUSY) {
+ ret = sanei_pieusb_wait_ready (scanner, 0);
+ if (ret != SANE_STATUS_GOOD) {
+ DBG (DBG_error,"sanei_pieusb_set_gain_offset(): not ready after sanei_pieusb_cmd_get_gain_offset(): %d\n", ret);
+ return ret;
+ }
+ }
+ else if (status.pieusb_status != PIEUSB_STATUS_GOOD) {
+ return SANE_STATUS_INVAL;
+ }
+ /* Adjust gain */
+ gain = 1.0;
+ if (strcmp (scanner->val[OPT_GAIN_ADJUST].s, SCAN_GAIN_ADJUST_03) == 0) {
+ gain = 0.3;
+ } else if (strcmp (scanner->val[OPT_GAIN_ADJUST].s, SCAN_GAIN_ADJUST_05) == 0) {
+ gain = 0.5;
+ } else if (strcmp (scanner->val[OPT_GAIN_ADJUST].s, SCAN_GAIN_ADJUST_08) == 0) {
+ gain = 0.8;
+ } else if (strcmp (scanner->val[OPT_GAIN_ADJUST].s, SCAN_GAIN_ADJUST_10) == 0) {
+ gain = 1.0;
+ } else if (strcmp (scanner->val[OPT_GAIN_ADJUST].s, SCAN_GAIN_ADJUST_12) == 0) {
+ gain = 1.2;
+ } else if (strcmp (scanner->val[OPT_GAIN_ADJUST].s, SCAN_GAIN_ADJUST_16) == 0) {
+ gain = 1.6;
+ } else if (strcmp (scanner->val[OPT_GAIN_ADJUST].s, SCAN_GAIN_ADJUST_19) == 0) {
+ gain = 1.9;
+ } else if (strcmp (scanner->val[OPT_GAIN_ADJUST].s, SCAN_GAIN_ADJUST_24) == 0) {
+ gain = 2.4;
+ } else if (strcmp (scanner->val[OPT_GAIN_ADJUST].s, SCAN_GAIN_ADJUST_30) == 0) {
+ gain = 3.0;
+ }
+ switch (scanner->mode.passes) {
+ case SCAN_ONE_PASS_RGBI:
+ case SCAN_ONE_PASS_COLOR:
+ updateGain2 (scanner, 0, gain);
+ updateGain2 (scanner, 1, gain);
+ updateGain2 (scanner, 2, gain);
+ /* Don't correct IR, hampers cleaning process... */
+ break;
+ case SCAN_FILTER_INFRARED:
+ updateGain2 (scanner, 3, gain);
+ break;
+ case SCAN_FILTER_BLUE:
+ updateGain2 (scanner, 2, gain);
+ break;
+ case SCAN_FILTER_GREEN:
+ updateGain2 (scanner, 1, gain);
+ break;
+ case SCAN_FILTER_RED:
+ updateGain2 (scanner, 0, gain);
+ break;
+ case SCAN_FILTER_NEUTRAL:
+ break;
+ }
+ /* Now set values for gain, offset and exposure */
+ sanei_pieusb_cmd_set_gain_offset (scanner->device_number, &(scanner->settings), &status);
+ ret = sanei_pieusb_convert_status (status.pieusb_status);
+ DBG (DBG_info_sane, "sanei_pieusb_set_gain_offset(): status %s\n", sane_strstatus (ret));
+ return ret;
+}
+
+/*
+ * get shading data
+ * must be called immediately after sanei_pieusb_set_gain_offset
+ */
+
+SANE_Status
+sanei_pieusb_get_shading_data(Pieusb_Scanner * scanner)
+{
+ struct Pieusb_Command_Status status;
+ SANE_Int shading_width;
+ SANE_Int shading_height;
+ SANE_Byte* buffer;
+ SANE_Int lines;
+ SANE_Int cols;
+ SANE_Int size;
+ SANE_Status res = SANE_STATUS_GOOD;
+
+ DBG (DBG_info_sane, "sanei_pieusb_get_shading_data()\n");
+ shading_width = scanner->device->shading_parameters[0].pixelsPerLine;
+ shading_height = scanner->device->shading_parameters[0].nLines;
+ if (shading_height < 1) {
+ DBG (DBG_error, "shading_height < 1\n");
+ return SANE_STATUS_INVAL;
+ }
+ switch (scanner->mode.colorFormat) {
+ case SCAN_COLOR_FORMAT_PIXEL: /* Pixel */
+ lines = shading_height * 4;
+ cols = 2 * shading_width;
+ break;
+ case SCAN_COLOR_FORMAT_INDEX: /* Indexed */
+ lines = shading_height * 4;
+ cols = (2 * shading_width + 2);
+ break;
+ default:
+ DBG (DBG_error, "sanei_pieusb_get_shading_data(): color format %d not implemented\n", scanner->mode.colorFormat);
+ return SANE_STATUS_INVAL;
+ }
+
+ size = cols * lines;
+ buffer = malloc (size);
+ if (buffer == NULL) {
+ return SANE_STATUS_NO_MEM;
+ }
+ sanei_pieusb_cmd_get_scanned_lines (scanner->device_number, buffer, 4, cols * 4, &status);
+ if (status.pieusb_status == PIEUSB_STATUS_GOOD) {
+ res = sanei_pieusb_wait_ready (scanner, 0);
+ if (res == SANE_STATUS_GOOD) {
+ sanei_pieusb_cmd_get_scanned_lines (scanner->device_number, buffer + cols*4, lines - 4, (lines - 4) * cols, &status);
+ if (status.pieusb_status == PIEUSB_STATUS_GOOD) {
+ pieusb_calculate_shading (scanner, buffer);
+ }
+ res = sanei_pieusb_convert_status (status.pieusb_status);
+ }
+ }
+ else {
+ res = sanei_pieusb_convert_status (status.pieusb_status);
+ }
+ free (buffer);
+ return res;
+}
+
+/*
+ *
+ */
+
+SANE_Status
+sanei_pieusb_get_ccd_mask(Pieusb_Scanner * scanner)
+{
+ struct Pieusb_Command_Status status;
+
+ DBG(DBG_info_proc, "sanei_pieusb_get_ccd_mask()\n");
+
+ sanei_pieusb_cmd_get_ccd_mask(scanner->device_number, scanner->ccd_mask, scanner->ccd_mask_size, &status);
+ if (status.pieusb_status == PIEUSB_STATUS_GOOD) {
+ /* Save CCD mask */
+ if (scanner->val[OPT_SAVE_CCDMASK].b) {
+ FILE* fs = fopen ("pieusb.ccd", "w");
+ fwrite (scanner->ccd_mask, 1, scanner->ccd_mask_size, fs);
+ fclose (fs);
+ }
+ }
+ return sanei_pieusb_convert_status(status.pieusb_status);
+
+}
+
+/**
+ * Read parameters from scanner
+ * and initialize SANE parameters
+ *
+ * @param scanner
+ * @return parameter_bytes for use in get_scan_data()
+ */
+SANE_Status
+sanei_pieusb_get_parameters(Pieusb_Scanner * scanner, SANE_Int *parameter_bytes)
+{
+ struct Pieusb_Command_Status status;
+ struct Pieusb_Scan_Parameters parameters;
+ const char *mode;
+
+ DBG (DBG_info_proc, "sanei_pieusb_get_parameters()\n");
+
+ sanei_pieusb_cmd_get_parameters (scanner->device_number, &parameters, &status);
+ if (status.pieusb_status != PIEUSB_STATUS_GOOD) {
+ return sanei_pieusb_convert_status (status.pieusb_status);
+ }
+ *parameter_bytes = parameters.bytes;
+ /* Use response from sanei_pieusb_cmd_get_parameters() for initialization of SANE parameters.
+ * Note the weird values of the bytes-field: this is because of the colorFormat
+ * setting in sanei_pieusb_cmd_set_mode(). The single-color modes all use the pixel format,
+ * which makes sanei_pieusb_cmd_get_parameters() return a full color line although just
+ * one color actually contains data. For the index format, the bytes field
+ * gives the size of a single color line. */
+ mode = scanner->val[OPT_MODE].s;
+ if (strcmp (mode, SANE_VALUE_SCAN_MODE_LINEART) == 0) {
+ scanner->scan_parameters.format = SANE_FRAME_GRAY;
+ scanner->scan_parameters.depth = 1;
+ scanner->scan_parameters.bytes_per_line = parameters.bytes/3;
+ } else if (strcmp (mode, SANE_VALUE_SCAN_MODE_HALFTONE) == 0) {
+ scanner->scan_parameters.format = SANE_FRAME_GRAY;
+ scanner->scan_parameters.depth = 1;
+ scanner->scan_parameters.bytes_per_line = parameters.bytes/3;
+ } else if (strcmp (mode, SANE_VALUE_SCAN_MODE_GRAY) == 0) {
+ scanner->scan_parameters.format = SANE_FRAME_GRAY;
+ scanner->scan_parameters.depth = scanner->val[OPT_BIT_DEPTH].w;
+ scanner->scan_parameters.bytes_per_line = parameters.bytes/3;
+ } else if (strcmp (mode, SANE_VALUE_SCAN_MODE_RGBI) == 0) {
+ scanner->scan_parameters.format = SANE_FRAME_RGB; /* was: SANE_FRAME_RGBI */
+ scanner->scan_parameters.depth = scanner->val[OPT_BIT_DEPTH].w;
+ scanner->scan_parameters.bytes_per_line = 4*parameters.bytes;
+ } else { /* SANE_VALUE_SCAN_MODE_COLOR, with and without option clean image set */
+ scanner->scan_parameters.format = SANE_FRAME_RGB;
+ scanner->scan_parameters.depth = scanner->val[OPT_BIT_DEPTH].w;
+ scanner->scan_parameters.bytes_per_line = 3*parameters.bytes;
+ }
+ scanner->scan_parameters.lines = parameters.lines;
+ scanner->scan_parameters.pixels_per_line = parameters.width;
+ scanner->scan_parameters.last_frame = SANE_TRUE;
+
+ DBG (DBG_info_sane,"sanei_pieusb_get_parameters(): mode '%s'\n", mode);
+ DBG (DBG_info_sane," format = %d\n", scanner->scan_parameters.format);
+ DBG (DBG_info_sane," depth = %d\n", scanner->scan_parameters.depth);
+ DBG (DBG_info_sane," bytes_per_line = %d\n", scanner->scan_parameters.bytes_per_line);
+ DBG (DBG_info_sane," lines = %d\n", scanner->scan_parameters.lines);
+ DBG (DBG_info_sane," pixels_per_line = %d\n", scanner->scan_parameters.pixels_per_line);
+ DBG (DBG_info_sane," last_frame = %d\n", scanner->scan_parameters.last_frame);
+
+ return SANE_STATUS_GOOD;
+}
+
+SANE_Status
+sanei_pieusb_get_scan_data(Pieusb_Scanner * scanner, SANE_Int parameter_bytes)
+{
+ struct Pieusb_Command_Status status;
+ SANE_Parameters *parameters = &scanner->scan_parameters;
+ SANE_Int lines_to_read, lines_remaining;
+ SANE_Int ppl, bpl;
+ SANE_Byte *linebuf, *lboff;
+ SANE_Bool compress;
+ int n, k, i;
+
+ switch (scanner->mode.colorFormat) {
+ case SCAN_COLOR_FORMAT_PIXEL: /* Pixel */
+ lines_to_read = scanner->buffer.height;
+ break;
+ case SCAN_COLOR_FORMAT_INDEX: /* Indexed */
+ lines_to_read = scanner->buffer.colors * scanner->buffer.height;
+ break;
+ default:
+ DBG(DBG_error, "sanei_pieusb_get_scan_data(): color format %d not implemented\n",scanner->mode.colorFormat);
+ return SANE_STATUS_INVAL;
+ }
+ lines_remaining = lines_to_read;
+ DBG (DBG_info_proc, "sanei_pieusb_get_scan_data(colorFormat %d), lines_to_read %d, bytes %d\n", scanner->mode.colorFormat, lines_to_read, parameter_bytes);
+
+ /*
+ fdraw = open("/tmp/pieusb.raw", O_WRONLY | O_CREAT | O_TRUNC, (mode_t)0600);
+ if (fdraw == -1) {
+ perror("error opening raw image buffer file");
+ }
+*/
+ while (lines_remaining > 0) {
+ SANE_Int lines;
+ /* Read lines */
+ /* The amount of bytes_per_line varies with color format setting; only 'pixel' and 'index' implemented */
+ ppl = parameters->pixels_per_line;
+ switch (scanner->mode.colorFormat) {
+ case SCAN_COLOR_FORMAT_PIXEL: /* Pixel */
+ bpl = parameter_bytes;
+ break;
+ case SCAN_COLOR_FORMAT_INDEX: /* Indexed */
+ bpl = parameter_bytes + 2; /* Index bytes! */
+ break;
+ default:
+ DBG(DBG_error, "sanei_pieusb_get_scan_data(): color format %d not implemented\n", scanner->mode.colorFormat);
+ return SANE_STATUS_INVAL;
+ }
+ lines = (lines_remaining < 256) ? lines_remaining : 255;
+ DBG(DBG_info_sane, "sanei_pieusb_get_scan_data(): reading lines: now %d, bytes per line = %d\n", lines, bpl);
+ linebuf = malloc(lines * bpl);
+ sanei_pieusb_cmd_get_scanned_lines(scanner->device_number, linebuf, lines, lines * bpl, &status);
+ if (status.pieusb_status != PIEUSB_STATUS_GOOD ) {
+ /* Error, return */
+ free(linebuf);
+ return SANE_STATUS_INVAL;
+ }
+ /* Save raw data */
+/*
+ if (fdraw != -1) {
+ wcnt = write(fdraw,linebuf,parameters.lines*bpl);
+ DBG(DBG_info_sane,"Raw written %d\n",wcnt);
+ }
+*/
+ /* Copy into official buffer
+ * Sometimes the scanner returns too many lines. Take care not to
+ * overflow the buffer. */
+ lboff = linebuf;
+ switch (scanner->mode.colorFormat) {
+ case SCAN_COLOR_FORMAT_PIXEL:
+ /* The scanner may return lines with 3 colors even though only
+ * one color is actually scanned. Detect this situation and
+ * eliminate the excess samples from the line buffer before
+ * handing it to buffer_put_full_color_line(). */
+ compress = SANE_FALSE;
+ if (scanner->buffer.colors == 1
+ && (bpl * scanner->buffer.packing_density / ppl) == (3 * scanner->buffer.packet_size_bytes)) {
+ compress = SANE_TRUE;
+ }
+ for (n = 0; n < lines; n++) {
+ if (compress) {
+ /* Move samples to fill up all unused locations */
+ int ps = scanner->buffer.packet_size_bytes;
+ for (k = 0; k < scanner->buffer.line_size_packets; k++) {
+ for (i = 0; i < ps; i++) {
+ lboff[ps*k+i] = lboff[3*ps*k+i];
+ }
+ }
+ }
+ if (sanei_pieusb_buffer_put_full_color_line(&scanner->buffer, lboff, bpl/3) == 0) {
+ /* Error, return */
+ return SANE_STATUS_INVAL;
+ }
+ lboff += bpl;
+ }
+ break;
+ case SCAN_COLOR_FORMAT_INDEX:
+ /* Indexed data */
+ for (n = 0; n < lines; n++) {
+ if (sanei_pieusb_buffer_put_single_color_line(&scanner->buffer, *lboff, lboff+2, bpl-2) == 0) {
+ /* Error, return */
+ return SANE_STATUS_INVAL;
+ }
+ lboff += bpl;
+ }
+ break;
+ default:
+ DBG(DBG_error, "sanei_pieusb_get_scan_data(): store color format %d not implemented\n", scanner->mode.colorFormat);
+ free(linebuf);
+ return SANE_STATUS_INVAL;
+ }
+ free(linebuf);
+ lines_remaining -= lines; /* Note: excess discarded */
+ DBG(DBG_info_sane, "sanei_pieusb_get_scan_data(): reading lines: remaining %d\n", lines_remaining);
+ }
+/*
+ if (fdraw != -1) close(fdraw);
+*/
+ return SANE_STATUS_GOOD;
+}
+
+/**
+ * Wait for scanner to get ready
+ *
+ * loop of test_ready/read_state
+ *
+ * @param scanner
+ * @param device_number, used if scanner == NULL
+ * @return SANE_Status
+ */
+
+SANE_Status
+sanei_pieusb_wait_ready(Pieusb_Scanner * scanner, SANE_Int device_number)
+{
+ struct Pieusb_Command_Status status;
+ struct Pieusb_Scanner_State state;
+ time_t start, elapsed;
+
+ DBG (DBG_info_proc, "sanei_pieusb_wait_ready()\n");
+ start = time(NULL);
+ if (scanner)
+ device_number = scanner->device_number;
+
+ for(;;) {
+ sanei_pieusb_cmd_test_unit_ready(device_number, &status);
+ DBG (DBG_info_proc, "-> sanei_pieusb_cmd_test_unit_ready: %d\n", status.pieusb_status);
+ if (status.pieusb_status == PIEUSB_STATUS_GOOD)
+ break;
+ if (status.pieusb_status == PIEUSB_STATUS_IO_ERROR)
+ break;
+ sanei_pieusb_cmd_read_state(device_number, &state, &status);
+ DBG (DBG_info_proc, "-> sanei_pieusb_cmd_read_state: %d\n", status.pieusb_status);
+ if (status.pieusb_status != PIEUSB_STATUS_DEVICE_BUSY)
+ break;
+ sleep(2);
+ elapsed = time(NULL) - start;
+ if (elapsed > 120) { /* 2 minute overall timeout */
+ DBG (DBG_error, "scanner not ready after 2 minutes\n");
+ break;
+ }
+ if (elapsed % 2) {
+ DBG (DBG_info, "still waiting for scanner to get ready\n");
+ }
+ }
+ return sanei_pieusb_convert_status(status.pieusb_status);
+}
+
+
+SANE_Status sanei_pieusb_analyze_preview(Pieusb_Scanner * scanner)
+{
+ int k, n;
+ SANE_Parameters params;
+ SANE_Int N;
+ double *norm_histo;
+ double level;
+
+ DBG(DBG_info, "sanei_pieusb_analyze_preview(): saving preview data\n");
+
+ /* Settings */
+ scanner->preview_done = SANE_TRUE;
+ for (k = 0; k < 4; k++) {
+ scanner->preview_exposure[k] = scanner->settings.exposureTime[k];
+ scanner->preview_gain[k] = scanner->settings.gain[k];
+ scanner->preview_offset[k] = scanner->settings.offset[k];
+ }
+ /* Analyze color planes */
+ N = scanner->buffer.width * scanner->buffer.height;
+ params.format = SANE_FRAME_GRAY;
+ params.depth = scanner->buffer.depth;
+ params.pixels_per_line = scanner->buffer.width;
+ params.lines = scanner->buffer.height;
+ for (k = 0; k < scanner->buffer.colors; k++) {
+ /* Create histogram for color k */
+ sanei_ir_create_norm_histogram (&params, scanner->buffer.data + k * N, &norm_histo);
+ /* Find 1% and 99% limits */
+ level = 0;
+ for (n =0; n < HISTOGRAM_SIZE; n++) {
+
+ level += norm_histo[n];
+ if (level < 0.01) {
+ scanner->preview_lower_bound[k] = n;
+ }
+ if (level < 0.99) {
+ scanner->preview_upper_bound[k] = n;
+ }
+ }
+ DBG(DBG_info,"sanei_pieusb_analyze_preview(): 1%%-99%% levels for color %d: %d - %d\n", k, scanner->preview_lower_bound[k], scanner->preview_upper_bound[k]);
+ }
+ /* Disable remaining color planes */
+ for (k = scanner->buffer.colors; k < 4; k++) {
+ scanner->preview_lower_bound[k] = 0;
+ scanner->preview_upper_bound[k] = 0;
+ }
+ return SANE_STATUS_GOOD;
+}
+
+
+/**
+ * Return actual gain at given gain setting
+ *
+ * @param gain Gain setting (0 - 63)
+ * @return
+ */
+static double getGain(int gain)
+{
+ int k;
+
+ /* Actually an error, but don't be picky */
+ if (gain <= 0) {
+ return gains[0];
+ }
+ /* A gain > 63 is also an error, but don't be picky */
+ if (gain >= 60) {
+ return (gain-55)*(gains[12]-gains[11])/5 + gains[11];
+ }
+ /* Interpolate other values */
+ k = gain/5; /* index of array value just below given gain */
+ return (gain-5*k)*(gains[k+1]-gains[k])/5 + gains[k];
+}
+
+static int getGainSetting(double gain)
+{
+ int k, m;
+
+ /* Out of bounds */
+ if (gain < 1.0) {
+ return 0;
+ }
+ if (gain >= gains[12]) {
+ m = 60 + lround((gain-gains[11])/(gains[12]-gains[11])*5);
+ if (m > 63) m = 63;
+ return m;
+ }
+ /* Interpolate the rest */
+ m = 0;
+ for (k = 0; k <= 11; k++) {
+ if (gains[k] <= gain && gain < gains[k+1]) {
+ m = 5*k + lround((gain-gains[k])/(gains[k+1]-gains[k])*5);
+ }
+ }
+ return m;
+}
+
+/**
+ * Modify gain and exposure times in order to make maximal use of the scan depth.
+ * Each color treated separately, infrared excluded.
+ *
+ * This may be too aggressive => leads to a noisy whitish border instead of the orange.
+ * In a couuple of tries, gain was set to values of 60 and above, which introduces
+ * the noise?
+ * The whitish border is logical since the brightest parts of the negative, the
+ * unexposed borders, are amplified to values near CCD saturation, which is white.
+ * Maybe a uniform gain increase for each color is more appropriate? Somewhere
+ * between 2.5 and 3 seems worthwhile trying, see updateGain2().
+ *
+ switch (scanner->mode.passes) {
+ case SCAN_ONE_PASS_RGBI:
+ updateGain(scanner,0);
+ updateGain(scanner,1);
+ updateGain(scanner,2);
+ updateGain(scanner,3);
+ break;
+ case SCAN_ONE_PASS_COLOR:
+ updateGain(scanner,0);
+ updateGain(scanner,1);
+ updateGain(scanner,2);
+ break;
+ case SCAN_FILTER_INFRARED:
+ updateGain(scanner,3);
+ break;
+ case SCAN_FILTER_BLUE:
+ updateGain(scanner,2);
+ break;
+ case SCAN_FILTER_GREEN:
+ updateGain(scanner,1);
+ break;
+ case SCAN_FILTER_RED:
+ updateGain(scanner,0);
+ break;
+ case SCAN_FILTER_NEUTRAL:
+ break;
+ }
+ * @param scanner
+ */
+/*
+static void updateGain(Pieusb_Scanner *scanner, int color_index)
+{
+ double g, dg;
+
+ DBG(DBG_info_sane,"updateGain(): color %d preview used G=%d Exp=%d\n", color_index, scanner->preview_gain[color_index], scanner->preview_exposure[color_index]);
+ // Additional gain to obtain
+ dg = ((double)scanner->settings.saturationLevel[color_index] / 65536) / ((double)scanner->preview_upper_bound[color_index] / HISTOGRAM_SIZE);
+ DBG(DBG_info_sane,"updateGain(): additional gain %f\n", dg);
+ // Achieve this by modifying gain and exposure
+ // Gain used for preview
+ g = getGain(scanner->preview_gain[color_index]);
+ DBG(DBG_info_sane,"updateGain(): preview had gain %d => %f\n",scanner->preview_gain[color_index],g);
+ // Look up new gain setting g*sqrt(dg)
+ DBG(DBG_info_sane,"updateGain(): optimized gain * %f = %f\n",sqrt(dg),sqrt(dg)*g);
+ scanner->settings.gain[color_index] = getGainSetting(g*sqrt(dg));
+ DBG(DBG_info_sane,"updateGain(): optimized gain setting %d => %f\n",scanner->settings.gain[color_index],getGain(scanner->settings.gain[color_index]));
+ // Exposure change is straightforward
+ DBG(DBG_info_sane,"updateGain(): remains for exposure %f\n",dg/(getGain(scanner->settings.gain[color_index])/g));
+ scanner->settings.exposureTime[color_index] = lround( g / getGain(scanner->settings.gain[color_index]) * dg * scanner->preview_exposure[color_index] );
+ DBG(DBG_info_sane,"updateGain(): new setting G=%d Exp=%d\n", scanner->settings.gain[color_index], scanner->settings.exposureTime[color_index]);
+}
+*/
+
+static void updateGain2(Pieusb_Scanner *scanner, int color_index, double gain_increase)
+{
+ double g;
+
+ DBG(DBG_info,"updateGain2(): color %d preview used G=%d Exp=%d\n", color_index, scanner->settings.gain[color_index], scanner->settings.exposureTime[color_index]);
+ /* Additional gain to obtain */
+ DBG(DBG_info,"updateGain2(): additional gain %f\n", gain_increase);
+ /* Achieve this by modifying gain and exposure */
+ /* Gain used for preview */
+ g = getGain(scanner->settings.gain[color_index]);
+ DBG(DBG_info,"updateGain2(): preview had gain %d => %f\n", scanner->settings.gain[color_index], g);
+ /* Look up new gain setting g*sqrt(dg) */
+ DBG(DBG_info,"updateGain2(): optimized gain * %f = %f\n", sqrt(gain_increase), sqrt(gain_increase) * g);
+ scanner->settings.gain[color_index] = getGainSetting(g * sqrt(gain_increase));
+ DBG(DBG_info,"updateGain2(): optimized gain setting %d => %f\n", scanner->settings.gain[color_index], getGain(scanner->settings.gain[color_index]));
+ /* Exposure change is straightforward */
+ DBG(DBG_info,"updateGain2(): remains for exposure %f\n", gain_increase / (getGain(scanner->settings.gain[color_index]) / g));
+ scanner->settings.exposureTime[color_index] = lround( g / getGain(scanner->settings.gain[color_index]) * gain_increase * scanner->settings.exposureTime[color_index] );
+ DBG(DBG_info,"updateGain2(): new setting G=%d Exp=%d\n", scanner->settings.gain[color_index], scanner->settings.exposureTime[color_index]);
+}
diff --git a/backend/pieusb_specific.h b/backend/pieusb_specific.h
new file mode 100644
index 0000000..3928adf
--- /dev/null
+++ b/backend/pieusb_specific.h
@@ -0,0 +1,346 @@
+/* sane - Scanner Access Now Easy.
+
+ pieusb_specific.h
+
+ Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+#ifndef PIEUSB_SPECIFIC_H
+#define PIEUSB_SPECIFIC_H
+
+#include "../include/sane/sanei_ir.h"
+#include "../include/sane/sanei_backend.h"
+#include "pieusb_scancmd.h"
+#include "pieusb_buffer.h"
+
+/* Settings for scan modes available to SANE */
+/* In addition to those defined in sane.h */
+#define SANE_VALUE_SCAN_MODE_RGBI "RGBI"
+
+/* Scanner settings for colors to scan */
+#define SCAN_ONE_PASS_RGBI 0x90
+#define SCAN_ONE_PASS_COLOR 0x80
+#define SCAN_FILTER_INFRARED 0x10
+#define SCAN_FILTER_BLUE 0x08
+#define SCAN_FILTER_GREEN 0x04
+#define SCAN_FILTER_RED 0x02
+#define SCAN_FILTER_NEUTRAL 0x01
+
+/* Settings for color depth of scan */
+#define SCAN_COLOR_DEPTH_16 0x20
+#define SCAN_COLOR_DEPTH_12 0x10
+#define SCAN_COLOR_DEPTH_10 0x08
+#define SCAN_COLOR_DEPTH_8 0x04
+#define SCAN_COLOR_DEPTH_4 0x02
+#define SCAN_COLOR_DEPTH_1 0x01
+
+/* Settings for format of the scanned data */
+#define SCAN_COLOR_FORMAT_INDEX 0x04
+#define SCAN_COLOR_FORMAT_LINE 0x02
+#define SCAN_COLOR_FORMAT_PIXEL 0x01
+
+/* Settings for calibration mode */
+#define SCAN_CALIBRATION_DEFAULT "default values"
+#define SCAN_CALIBRATION_AUTO "from internal test"
+#define SCAN_CALIBRATION_PREVIEW "from preview"
+#define SCAN_CALIBRATION_OPTIONS "from options"
+
+/* Settings for additional gain */
+#define SCAN_GAIN_ADJUST_03 "* 0.3"
+#define SCAN_GAIN_ADJUST_05 "* 0.5"
+#define SCAN_GAIN_ADJUST_08 "* 0.8"
+#define SCAN_GAIN_ADJUST_10 "* 1.0"
+#define SCAN_GAIN_ADJUST_12 "* 1.2"
+#define SCAN_GAIN_ADJUST_16 "* 1.6"
+#define SCAN_GAIN_ADJUST_19 "* 1.9"
+#define SCAN_GAIN_ADJUST_24 "* 2.4"
+#define SCAN_GAIN_ADJUST_30 "* 3.0"
+
+/* Post-processing */
+#define POST_SW_COLORS (1 << 0) /* gain, negatives, ..., can be done at any time */
+#define POST_SW_IRED (1 << 1) /* remove spectral overlap, needs complete scan */
+#define POST_SW_DIRT (1 << 2) /* our digital lavabo, needs complete scan */
+#define POST_SW_GRAIN (1 << 3) /* smoothen a bit */
+#define POST_SW_CROP (1 << 4) /* trim whole image in sane_start
+ before sane_get_parameters() is answered */
+#define POST_SW_IRED_MASK (POST_SW_IRED | POST_SW_DIRT)
+#define POST_SW_ACCUM_MASK (POST_SW_IRED_MASK | POST_SW_GRAIN | POST_SW_CROP)
+
+#define DEFAULT_GAIN 19 /* 0x13 */
+#define DEFAULT_EXPOSURE 2937 /* 0xb79 minimum value, see Pieusb_Settings */
+#define DEFAULT_OFFSET 0
+#define DEFAULT_LIGHT 4
+#define DEFAULT_ADDITIONAL_ENTRIES 1
+#define DEFAULT_DOUBLE_TIMES 0
+
+/* --------------------------------------------------------------------------
+ *
+ * DEVICE DEFINITION STRUCTURES
+ *
+ * --------------------------------------------------------------------------*/
+
+/* Options supported by the scanner */
+
+enum Pieusb_Option
+{
+ OPT_NUM_OPTS = 0,
+ /* ------------------------------------------- */
+ OPT_MODE_GROUP,
+ OPT_MODE, /* scan mode */
+ OPT_BIT_DEPTH, /* number of bits to encode a color */
+ OPT_RESOLUTION, /* number of pixels per inch */
+ OPT_HALFTONE_PATTERN, /* halftone pattern to use (see halftone_list) */
+ OPT_THRESHOLD, /* halftone threshold */
+ OPT_SHARPEN, /* create a sharper scan at the cost of scan time */
+ OPT_SHADING_ANALYSIS, /* do shading analysis before the scan */
+ OPT_FAST_INFRARED, /* scan infrared channel faster but less accurate */
+ OPT_ADVANCE_SLIDE, /* auto-advance slide after scan */
+ OPT_CALIBRATION_MODE, /* use auto-calibarion settings for scan */
+ /* ------------------------------------------- */
+ OPT_GEOMETRY_GROUP,
+ OPT_TL_X, /* top-left x */
+ OPT_TL_Y, /* top-left y */
+ OPT_BR_X, /* bottom-right x */
+ OPT_BR_Y, /* bottom-right y */
+ /* ------------------------------------------- */
+ OPT_ENHANCEMENT_GROUP,
+ OPT_CORRECT_SHADING, /* correct scanned data for lamp variations (shading) */
+ OPT_CORRECT_INFRARED, /* correct infrared for red crosstalk */
+ OPT_CLEAN_IMAGE, /* detect and remove dust and scratch artifacts */
+ OPT_GAIN_ADJUST, /* adjust gain (a simpler option than setting gain, exposure and offset directly) */
+ OPT_CROP_IMAGE, /* automatically crop image */
+ OPT_SMOOTH_IMAGE, /* smoothen image */
+ OPT_TRANSFORM_TO_SRGB, /* transform to approximate sRGB data */
+ OPT_INVERT_IMAGE, /* transform negative to positive */
+ /* ------------------------------------------- */
+ OPT_ADVANCED_GROUP,
+ OPT_PREVIEW, /* scan a preview before the actual scan */
+ OPT_SAVE_SHADINGDATA, /* output shading data */
+ OPT_SAVE_CCDMASK, /* output CCD mask */
+ OPT_LIGHT,
+ OPT_DOUBLE_TIMES,
+ OPT_SET_EXPOSURE_R, /* exposure times for R */
+ OPT_SET_EXPOSURE_G, /* exposure times for G */
+ OPT_SET_EXPOSURE_B, /* exposure times for B */
+ OPT_SET_EXPOSURE_I, /* exposure times for I */
+ OPT_SET_GAIN_R, /* gain for R */
+ OPT_SET_GAIN_G, /* gain for G */
+ OPT_SET_GAIN_B, /* gain for B */
+ OPT_SET_GAIN_I, /* gain for I */
+ OPT_SET_OFFSET_R, /* offset for R */
+ OPT_SET_OFFSET_G, /* offset for G */
+ OPT_SET_OFFSET_B, /* offset for B */
+ OPT_SET_OFFSET_I, /* offset for I */
+ /* must come last: */
+ NUM_OPTIONS
+};
+
+/* Forward declaration (see pieusb_scancmd.h) */
+struct Pieusb_Shading_Parameters;
+
+/* Device characteristics of a Pieusb USB scanner */
+struct Pieusb_Device_Definition
+{
+ struct Pieusb_Device_Definition *next;
+
+ SANE_Device sane;
+ /* name = string like "libusb:001:006" == NO! this should be "CrystalScan 7200" or "ProScan 7200"...
+ * vendor = "PIE/Pieusb"
+ * model = "CrystalScan 7200" or "ProScan 7200"
+ * type = "film scanner" */
+ /* char *devicename; => sane->name */
+ /* char *vendor; => sane->vendor */
+ /* char *product; => sane->model */
+ SANE_Word vendorId;
+ SANE_Word productId;
+ /* USB id's like 0x05e3 0x0145, see pieusb.conf */
+ SANE_String version; /* INQUIRY productRevision */
+ SANE_Byte model; /* INQUIRY model */
+
+ /* Ranges for various quantities */
+ SANE_Range dpi_range;
+ SANE_Range x_range;
+ SANE_Range y_range;
+ SANE_Range exposure_range; /* Unit is a 8051 machine cycle, which is approximately 1 us. (Exactly: 12 cycles at 11.059 Mhz = 1.085 us.) */
+ SANE_Range dust_range;
+
+ SANE_Range shadow_range;
+ SANE_Range highlight_range;
+
+ /* Enumerated ranges vor various quantities */
+ SANE_String scan_mode_list[7]; /* names of scan modes (see saneopts.h) */
+ SANE_String calibration_mode_list[6]; /* names of calibration modes */
+ SANE_String gain_adjust_list[10]; /* gain adjustment values */
+ SANE_Word bpp_list[5]; /* bit depths */
+ SANE_String halftone_list[17]; /* names of the halftone patterns from the scanner */
+ SANE_String speed_list[9]; /* names of available speeds */
+ SANE_String ir_sw_list[4];
+ SANE_String crop_sw_list[4];
+ SANE_Word grain_sw_list[6];
+
+ /* Maximum resolution values */
+ int maximum_resolution_x; /* maximum x-resolution */
+ int maximum_resolution_y; /* maximum y-resolution */
+ int maximum_resolution;
+
+ /* Geometry */
+ double scan_bed_width; /* flatbed width in inches (horizontal) */
+ double scan_bed_height; /* flatbed height in inches (vertical) */
+ int slide_top_left_x; /* top-left location of slide w.r.t. scan bed */
+ int slide_top_left_y; /* top-left location of slide w.r.t. scan bed */
+ double slide_width; /* transparency width in inches */
+ double slide_height; /* transparency length in inches */
+
+ /* Integer and bit-encoded properties */
+ int halftone_patterns; /* number of halftones supported */
+ int color_filters; /* available colour filters: Infrared-0-0-OnePassColor-B-G-R-N */
+ int color_depths; /* available colour depths: 0-0-16-12-10-8-4-1 */
+ int color_formats; /* colour data format: 0-0-0-0-0-Index-Line-Pixel */
+ int image_formats; /* image data format: 0-0-0-0-OKLine-BlkOne-Motorola-Intel */
+ int scan_capabilities; /* additional scanner features, number of speeds: PowerSave-ExtCal-0-FastPreview-DisableCal-[CalSpeeds=3] */
+ int optional_devices; /* optional devices: MultiPageLoad-?-?-0-0-TransModule1-TransModule-AutoDocFeeder */
+ int enhancements; /* enhancements: unknown coding */
+ int gamma_bits; /* no of bits used for gamma table */
+ int fast_preview_resolution; /* fast preview resolution */
+ int minimum_highlight; /* min highlight % that can be used */
+ int maximum_shadow; /* max shadow % that can be used */
+ int calibration_equation; /* which calibration equation to use */
+ int minimum_exposure; /* min exposure */
+ int maximum_exposure; /* max exposure */
+
+ struct Pieusb_Shading_Parameters_Info shading_parameters[4]; /* array with shading data parameters */
+
+ int x0, y0, x1, y1;
+ SANE_String production;
+ SANE_String timestamp;
+ SANE_String signature;
+};
+
+typedef struct Pieusb_Device_Definition Pieusb_Device_Definition;
+
+/* --------------------------------------------------------------------------
+ *
+ * CURRENTLY ACTIVE DEVICES
+ *
+ * --------------------------------------------------------------------------*/
+
+/* This structure holds information about an instance of an active scanner */
+
+struct Pieusb_Scanner
+{
+ struct Pieusb_Scanner *next;
+ struct Pieusb_Device_Definition *device; /* pointer to device definition */
+
+ int device_number; /* scanner device number (as determined by USB) */
+
+ /* SANE option descriptions and settings for this scanner instance */
+ SANE_Option_Descriptor opt[NUM_OPTIONS];
+ Option_Value val[NUM_OPTIONS];
+
+ /* Scan state */
+ struct Pieusb_Scanner_State state;
+ SANE_Int scanning; /* true if busy scanning */
+ SANE_Int cancel_request; /* if true, scanner should terminate a scan */
+
+ /* Scan settings */
+ struct Pieusb_Mode mode;
+ struct Pieusb_Settings settings;
+ struct Pieusb_Scan_Frame frame;
+ SANE_Parameters scan_parameters;
+
+ /* Shading data and CCD-mask */
+#define PIEUSB_CCD_MASK_SIZE 0x1a1d /* pieusb 5340; */ /* cyberview: 6685 0x1a1d */
+ SANE_Byte *ccd_mask; /* malloc'ed in sane_open */
+ SANE_Int ccd_mask_size;
+ SANE_Bool shading_data_present; /* don't correct shading if not present */
+ SANE_Int shading_mean[SHADING_PARAMETERS_INFO_COUNT]; /* mean shading value for each color (average all 45 lines) */
+ SANE_Int shading_max[SHADING_PARAMETERS_INFO_COUNT]; /* maximum shading value for each color (for all 45 lines) */
+ SANE_Int* shading_ref[SHADING_PARAMETERS_INFO_COUNT]; /* 4 arrays of shading references for each pixel on a line and for each color */
+
+ /* Calibration using preview */
+
+ SANE_Bool preview_done;
+ SANE_Int preview_exposure[4]; /* exposure values used in preview */
+ SANE_Int preview_gain[4]; /* gain values used in preview */
+ SANE_Int preview_offset[4]; /* offset values used in preview */
+ SANE_Int preview_lower_bound[4]; /* lowest RGBI values in preview */
+ SANE_Int preview_upper_bound[4]; /* highest RGBI values in preview */
+
+ /* Post processing options */
+/*
+ SANE_Int processing;
+*/
+ double *ln_lut; /* logarithmic lookup table */
+
+ /* Reading buffer */
+ struct Pieusb_Read_Buffer buffer;
+};
+
+typedef struct Pieusb_Scanner Pieusb_Scanner;
+
+SANE_Status sanei_pieusb_parse_config_line(const char* config_line, SANE_Word* vendor_id, SANE_Word* product_id, SANE_Word* model_number);
+/* sub to sane_start() */
+SANE_Status sanei_pieusb_post (Pieusb_Scanner *scanner, uint16_t **in_img, int planes);
+void sanei_pieusb_correct_shading(struct Pieusb_Scanner *scanner, struct Pieusb_Read_Buffer *buffer);
+SANE_Status sanei_pieusb_get_scan_data(Pieusb_Scanner * scanner, SANE_Int parameter_bytes);
+SANE_Status sanei_pieusb_get_parameters(Pieusb_Scanner * scanner, SANE_Int *parameter_bytes);
+SANE_Status sanei_pieusb_get_ccd_mask(Pieusb_Scanner * scanner);
+SANE_Status sanei_pieusb_get_shading_data(Pieusb_Scanner * scanner);
+SANE_Status sanei_pieusb_set_mode_from_options(Pieusb_Scanner * scanner);
+SANE_Status sanei_pieusb_set_gain_offset(Pieusb_Scanner * scanner, const char* calibration_mode);
+SANE_Status sanei_pieusb_set_frame_from_options(Pieusb_Scanner * scanner);
+void sanei_pieusb_print_options(struct Pieusb_Scanner *scanner);
+/* sub to sane_control_option() and sane_start() */
+int sanei_pieusb_analyse_options(struct Pieusb_Scanner *scanner);
+SANE_Bool sanei_pieusb_supported_device_list_contains(SANE_Word vendor_id, SANE_Word product_id, SANE_Word model_number);
+SANE_Status sanei_pieusb_supported_device_list_add(SANE_Word vendor_id, SANE_Word product_id, SANE_Word model_number);
+/* sub to sane_init() and sane_open() */
+SANE_Status sanei_pieusb_find_device_callback (const char *devicename);
+/* sub to sane_open() */
+SANE_Status sanei_pieusb_init_options (Pieusb_Scanner * scanner);
+/* sub to sane_start(), sane_read() and sane_close() */
+SANE_Status sanei_pieusb_on_cancel (Pieusb_Scanner * scanner);
+
+SANE_Status sanei_pieusb_wait_ready(Pieusb_Scanner *scanner, SANE_Int device_number);
+SANE_Status sanei_pieusb_analyze_preview(Pieusb_Scanner * scanner);
+
+
+
+#endif /* PIEUSB_SPECIFIC_H */
diff --git a/backend/pieusb_usb.c b/backend/pieusb_usb.c
new file mode 100644
index 0000000..71b6bcf
--- /dev/null
+++ b/backend/pieusb_usb.c
@@ -0,0 +1,679 @@
+/* sane - Scanner Access Now Easy.
+
+ pieusb_usb.c
+
+ Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+#define DEBUG_DECLARE_ONLY
+#include "pieusb.h"
+#include "pieusb_scancmd.h"
+#include "pieusb_usb.h"
+
+#include "../include/sane/sanei_usb.h"
+#include <unistd.h> /* usleep */
+#include <time.h> /* time */
+
+/* USB functions */
+
+static SANE_Status _ctrl_out_byte(SANE_Int device_number, SANE_Int port, SANE_Byte b);
+static SANE_Status _bulk_size(SANE_Int device_number, unsigned int size);
+static SANE_Status _ctrl_in_byte(SANE_Int device_number, SANE_Byte* b);
+static SANE_Status _bulk_in(SANE_Int device_number, SANE_Byte* data, size_t *size);
+static SANE_Status _ieee_command(SANE_Int device_number, SANE_Byte command);
+
+/* Defines for use in USB functions */
+
+#define REQUEST_TYPE_IN (USB_TYPE_VENDOR | USB_DIR_IN)
+#define REQUEST_TYPE_OUT (USB_TYPE_VENDOR | USB_DIR_OUT)
+#define REQUEST_REGISTER 0x0c
+#define REQUEST_BUFFER 0x04
+#define ANYINDEX 0x00 /* wIndex value for USB control transfer - value is irrelevant */
+
+/* from libieee1284 */
+#define C1284_NSTROBE 0x01
+#define C1284_NINIT 0x04
+
+/* usb via ieee1284 */
+#define IEEE1284_ADDR 0x00
+#define IEEE1284_RESET 0x30
+#define IEEE1284_SCSI 0xe0
+
+#define PORT_SCSI_SIZE 0x0082
+#define PORT_SCSI_STATUS 0x0084
+#define PORT_SCSI_CMD 0x0085
+#define PORT_PAR_CTRL 0x0087 /* IEEE1284 parallel control */
+#define PORT_PAR_DATA 0x0088 /* IEEE1284 parallel data */
+
+/* see also: SCSI Status Codes http://www.t10.org/lists/2status.htm */
+typedef enum {
+ USB_STATUS_OK = 0x00, /* ok */
+ USB_STATUS_READ = 0x01, /* read: send expected length, then read data */
+ USB_STATUS_CHECK = 0x02, /* check condition */
+ USB_STATUS_BUSY = 0x03, /* wait on usb */
+ USB_STATUS_AGAIN = 0x08, /* re-send scsi cmd */
+ USB_STATUS_FAIL = 0x88, /* ??? */
+ USB_STATUS_ERROR = 0xff /* usb i/o error */
+} PIEUSB_USB_Status;
+
+static PIEUSB_USB_Status _pieusb_scsi_command(SANE_Int device_number, SANE_Byte command[], SANE_Byte data[], SANE_Int size);
+
+#define SENSE_CODE_WARMING_UP 4
+
+/* Standard SCSI Sense codes*/
+#define SCSI_NO_ADDITIONAL_SENSE_INFORMATION 0x00
+
+struct code_text_t { int code; char *text; };
+static struct code_text_t usb_code_text[] = {
+ { 0x00, "Ok" },
+ { 0x01, "Read" },
+ { 0x02, "Check" },
+ { 0x03, "Busy" },
+ { 0x08, "Again" },
+ { 0xff, "Error" },
+ { -1, NULL }
+};
+
+static struct code_text_t scsi_code_text[] = {
+ { 0x00, "Test Unit Ready" }
+ ,{ 0x01, "Calibrate" }
+ ,{ 0x03, "Request Sense" }
+ ,{ 0x04, "Format" }
+ ,{ 0x08, "Read" }
+ ,{ 0x0a, "Write" }
+ ,{ 0x0f, "Get Param" }
+ ,{ 0x10, "Mark" }
+ ,{ 0x11, "Space" }
+ ,{ 0x12, "Inquiry" }
+ ,{ 0x15, "Mode Select" }
+ ,{ 0x16, "Reserve Unit" }
+ ,{ 0x18, "Copy" }
+ ,{ 0x1a, "Mode Sense" }
+ ,{ 0x1b, "Scan" }
+ ,{ 0x1d, "Diagnose" }
+ ,{ 0xa8, "Read Extended" }
+ ,{ 0xd1, "Slide" }
+ ,{ 0xd2, "Set Scan Head" }
+ ,{ 0xd7, "Read Gain Offset" }
+ ,{ 0xdc, "Write Gain Offset" }
+ ,{ 0xdd, "Read State" }
+ ,{ -1, NULL }
+};
+
+static char *
+code_to_text(struct code_text_t *list, int code)
+{
+ while (list && list->text) {
+ if (list->code == code)
+ return list->text;
+ list++;
+ }
+ return "**unknown**";
+}
+
+/**
+ * Convert PIEUSB_Status to SANE_Status
+ */
+SANE_Status
+sanei_pieusb_convert_status(PIEUSB_Status status)
+{
+ return (SANE_Status)status;
+}
+
+
+/**
+ * hex dump 'size' bytes starting at 'ptr'
+ */
+static void
+_hexdump(char *msg, unsigned char *ptr, int size)
+{
+ unsigned char *lptr = ptr;
+ int count = 0;
+ long start = 0;
+ long clipped = 0;
+
+ if (DBG_info_proc > DBG_LEVEL)
+ return;
+
+ if (size > 127) {
+ clipped = size;
+ size = 128;
+ }
+ while (size-- > 0)
+ {
+ if ((count % 16) == 0)
+ fprintf (stderr, "%s\t%08lx:", msg?msg:"", start);
+ msg = NULL;
+ fprintf (stderr, " %02x", *ptr++);
+ count++;
+ start++;
+ if (size == 0)
+ {
+ while ((count % 16) != 0)
+ {
+ fprintf (stderr, " ");
+ count++;
+ }
+ }
+ if ((count % 16) == 0)
+ {
+ fprintf (stderr, " ");
+ while (lptr < ptr)
+ {
+ unsigned char c = *lptr & 0x7f;
+ fprintf (stderr, "%c", ((c < 0x20)||(c == 0x7f)) ? '.' : c);
+ lptr++;
+ }
+ fprintf (stderr, "\n");
+ }
+ }
+ if ((count % 16) != 0)
+ fprintf (stderr, "\n");
+ if (clipped > 0)
+ fprintf (stderr, "\t%08lx bytes clipped\n", clipped);
+
+ fflush(stderr);
+ return;
+}
+
+
+/* =========================================================================
+ *
+ * USB functions
+ *
+ * ========================================================================= */
+
+/**
+ * Send a command to the device, retry 10 times if device is busy
+ * and return SENSE data in the sense fields of status if there is a CHECK
+ * CONDITION response from the command.
+ * If the REQUEST SENSE command fails, the SANE status code is unequal to
+ * PIEUSB_STATUS_GOOD and the sense fields are empty.
+ *
+ * @param device_number Device number
+ * @param command Command array
+ * @param data Input or output data buffer
+ * @param size Size of the data buffer
+ * @param status Pieusb_Command_Status
+ */
+
+PIEUSB_Status
+sanei_pieusb_command(SANE_Int device_number, SANE_Byte command[], SANE_Byte data[], SANE_Int size)
+{
+#define MAXTIME 60 /* max 60 seconds */
+ time_t start;
+ SANE_Status sane_status;
+ PIEUSB_Status ret = PIEUSB_STATUS_DEVICE_BUSY;
+ SANE_Byte usbstat;
+ PIEUSB_USB_Status usb_status = USB_STATUS_AGAIN;
+
+ DBG (DBG_info_usb, "*** sanei_pieusb_command(%02x:%s): size 0x%02x\n", command[0], code_to_text (scsi_code_text, command[0]), size);
+
+ start = time(NULL);
+ while ((time(NULL)-start) < MAXTIME) {
+ DBG (DBG_info_usb, "\tsanei_pieusb_command loop, status %d:%s\n", usb_status, code_to_text (usb_code_text, usb_status));
+ if (usb_status == USB_STATUS_AGAIN) {
+ usb_status = _pieusb_scsi_command (device_number, command, data, size);
+ DBG (DBG_info_usb, "\t_pieusb_scsi_command returned %d:%s\n", usb_status, code_to_text (usb_code_text, usb_status));
+ continue;
+ }
+ if (usb_status == USB_STATUS_OK) {
+ ret = PIEUSB_STATUS_GOOD;
+ break;
+ }
+ if (usb_status == USB_STATUS_READ) {
+ DBG (DBG_error, "\tsanei_pieusb_command() 2nd STATUS_READ ?!\n");
+ ret = PIEUSB_STATUS_IO_ERROR;
+ break;
+ }
+ if (usb_status == USB_STATUS_CHECK) {
+ /* check condition */
+ struct Pieusb_Sense sense;
+ struct Pieusb_Command_Status senseStatus;
+
+#define SCSI_REQUEST_SENSE 0x03
+
+ if (command[0] == SCSI_REQUEST_SENSE) {
+ DBG (DBG_error, "\tsanei_pieusb_command() recursive SCSI_REQUEST_SENSE\n");
+ ret = PIEUSB_STATUS_INVAL;
+ break;
+ }
+
+ /* A check sense may be a busy state in disguise
+ * It is also practical to execute a request sense command by
+ * default. The calling function should interpret
+ * PIEUSB_STATUS_CHECK_SENSE as 'sense data available'. */
+
+ sanei_pieusb_cmd_get_sense (device_number, &sense, &senseStatus, &ret);
+ if (senseStatus.pieusb_status != PIEUSB_STATUS_GOOD) {
+ DBG (DBG_error, "\tsanei_pieusb_command(): CHECK CONDITION, but REQUEST SENSE fails\n");
+ ret = senseStatus.pieusb_status;
+ }
+ break;
+ }
+ if (usb_status == USB_STATUS_BUSY) {
+ /* wait on usb */
+ sane_status = _ctrl_in_byte (device_number, &usbstat);
+ if (sane_status != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\tpieusb_scsi_command() fails status in: %d\n", sane_status);
+ ret = PIEUSB_STATUS_IO_ERROR;
+ break;
+ }
+ usb_status = usbstat;
+ if (usb_status == USB_STATUS_AGAIN) {
+ sleep(1);
+ }
+ continue;
+ }
+ if (usb_status == USB_STATUS_AGAIN) {
+ /* re-send scsi cmd */
+ continue;
+ }
+ if (usb_status == USB_STATUS_FAIL) {
+ DBG (DBG_error, "\tsanei_pieusb_command() usb status again2\n");
+ usb_status = USB_STATUS_ERROR;
+ sanei_pieusb_usb_reset(device_number);
+ ret = PIEUSB_STATUS_IO_ERROR;
+ break;
+ }
+ if (usb_status == USB_STATUS_ERROR) {
+ sanei_pieusb_usb_reset(device_number);
+ ret = PIEUSB_STATUS_IO_ERROR;
+ break;
+ }
+
+ DBG (DBG_error, "\tsanei_pieusb_command() unhandled usb status 0x%02x\n", usb_status);
+ ret = PIEUSB_STATUS_IO_ERROR;
+ break;
+ }
+ if ((time(NULL)-start) > MAXTIME) {
+ DBG (DBG_info_usb, "\tsanei_pieusb_command() timeout !\n");
+ }
+
+ DBG (DBG_info_usb, "\tsanei_pieusb_command() finished with state %d\n", ret);
+ return ret;
+}
+
+/**
+ * Reset IEEE1284 interface
+ *
+ * @param device_number Device number
+ * @returns SANE_Status
+ */
+
+SANE_Status
+sanei_pieusb_usb_reset(SANE_Int device_number)
+{
+ DBG (DBG_info_sane, "\tsanei_pieusb_usb_reset()\n");
+ return _ieee_command (device_number, IEEE1284_RESET);
+}
+
+/* http://www.t10.org/lists/2sensekey.htm */
+static struct code_text_t sense_code_text[] = {
+ { SCSI_SENSE_NO_SENSE, "No Sense" },
+ { SCSI_SENSE_RECOVERED_ERROR, "Recovered Error" },
+ { SCSI_SENSE_NOT_READY, "Not Ready" },
+ { SCSI_SENSE_MEDIUM_ERROR, "Medium Error" },
+ { SCSI_SENSE_HARDWARE_ERROR, "Hardware Error" },
+ { SCSI_SENSE_ILLEGAL_REQUEST, "Illegal Request" },
+ { SCSI_SENSE_UNIT_ATTENTION, "Unit Attention" },
+ { SCSI_SENSE_DATA_PROTECT, "Data Protect" },
+ { SCSI_SENSE_BLANK_CHECK, "Blank Check" },
+ { SCSI_SENSE_VENDOR_SPECIFIC, "Vendor Specific" },
+ { SCSI_SENSE_COPY_ABORTED, "Copy Aborted" },
+ { SCSI_SENSE_ABORTED_COMMAND, "Aborted Command" },
+ { SCSI_SENSE_EQUAL, "Equal" },
+ { SCSI_SENSE_VOLUME_OVERFLOW, "Volume Overflow" },
+ { SCSI_SENSE_MISCOMPARE, "Miscompare" },
+ { SCSI_SENSE_COMPLETED, "Completed" },
+ { -1, NULL }
+};
+
+
+/**
+ * Return a textual description of the given sense code.
+ *
+ * See http://www.t10.org/lists/asc-num.txt
+ *
+ * @param sense
+ * @return description
+ */
+
+SANE_String
+sanei_pieusb_decode_sense(struct Pieusb_Sense* sense, PIEUSB_Status *status)
+{
+ SANE_Char* desc = malloc(200);
+ SANE_Char* ptr;
+ strcpy (desc, code_to_text (sense_code_text, sense->senseKey));
+ ptr = desc + strlen(desc);
+
+ switch (sense->senseKey) {
+ case SCSI_SENSE_NOT_READY:
+ if (sense->senseCode == SENSE_CODE_WARMING_UP && sense->senseQualifier == 1) {
+ strcpy (ptr, ": Logical unit is in the process of becoming ready");
+ *status = PIEUSB_STATUS_WARMING_UP;
+ }
+ else {
+ sprintf (ptr, ": senseCode 0x%02x, senseQualifier 0x%02x", sense->senseCode, sense->senseQualifier);
+ *status = PIEUSB_STATUS_INVAL;
+ }
+ break;
+ case SCSI_SENSE_UNIT_ATTENTION:
+ if (sense->senseCode == 0x1a && sense->senseQualifier == 0) {
+ strcpy (ptr, ": Invalid field in parameter list");
+ *status = PIEUSB_STATUS_INVAL;
+ break;
+ } else if (sense->senseCode == 0x20 && sense->senseQualifier == 0) {
+ strcpy (ptr, ": Invalid command operation code");
+ *status = PIEUSB_STATUS_INVAL;
+ break;
+ } else if (sense->senseCode == 0x82 && sense->senseQualifier == 0) {
+ strcpy (ptr, ": Calibration disable not granted");
+ *status = PIEUSB_STATUS_MUST_CALIBRATE;
+ break;
+ } else if (sense->senseCode == 0x00 && sense->senseQualifier == 6) {
+ strcpy (ptr, ": I/O process terminated");
+ *status = PIEUSB_STATUS_IO_ERROR;
+ break;
+ } else if (sense->senseCode == 0x26 && sense->senseQualifier == 0x82) {
+ strcpy (ptr, ": MODE SELECT value invalid: resolution too high (vs)");
+ *status = PIEUSB_STATUS_INVAL;
+ break;
+ } else if (sense->senseCode == 0x26 && sense->senseQualifier == 0x83) {
+ strcpy (ptr, ": MODE SELECT value invalid: select only one color (vs)");
+ *status = PIEUSB_STATUS_INVAL;
+ break;
+ } else if (sense->senseCode == 0x26 && sense->senseQualifier == 0x83) {
+ strcpy (ptr, ": MODE SELECT value invalid: unsupported bit depth (vs)");
+ *status = PIEUSB_STATUS_INVAL;
+ break;
+ }
+ /*fallthru*/
+ case SCSI_SENSE_NO_SENSE:
+ case SCSI_SENSE_RECOVERED_ERROR:
+ case SCSI_SENSE_MEDIUM_ERROR:
+ case SCSI_SENSE_HARDWARE_ERROR:
+ case SCSI_SENSE_ILLEGAL_REQUEST:
+ case SCSI_SENSE_DATA_PROTECT:
+ case SCSI_SENSE_BLANK_CHECK:
+ case SCSI_SENSE_VENDOR_SPECIFIC:
+ case SCSI_SENSE_COPY_ABORTED:
+ case SCSI_SENSE_ABORTED_COMMAND:
+ case SCSI_SENSE_EQUAL:
+ case SCSI_SENSE_VOLUME_OVERFLOW:
+ case SCSI_SENSE_MISCOMPARE:
+ case SCSI_SENSE_COMPLETED:
+ default:
+ sprintf (ptr, ": senseCode 0x%02x, senseQualifier 0x%02x", sense->senseCode, sense->senseQualifier);
+ *status = PIEUSB_STATUS_INVAL;
+ }
+ return desc;
+}
+
+/**
+ * Prepare IEEE1284 interface
+ * Issue one of IEEE1284_ADDR, IEEE1284_RESET, or IEEE1284_SCSI
+ *
+ * @param device_number Device number
+ * @param command - IEEE1284 command
+ * @returns SANE_Status
+ */
+
+static SANE_Status
+_ieee_command(SANE_Int device_number, SANE_Byte command)
+{
+ SANE_Status st;
+ static int sequence[] = { 0xff, 0xaa, 0x55, 0x00, 0xff, 0x87, 0x78 };
+#define SEQUENCE_LEN 7
+ unsigned int i;
+ /* 2 x 4 + 3 bytes preceding command, then SCSI_COMMAND_LEN bytes command */
+ /* IEEE1284 command, see hpsj5s.c:cpp_daisy() */
+ for (i = 0; i < SEQUENCE_LEN; ++i) {
+ st = _ctrl_out_byte (device_number, PORT_PAR_DATA, sequence[i]);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\t\t_ieee_command fails after %d bytes\n", i);
+ return st;
+ }
+ }
+ st = _ctrl_out_byte (device_number, PORT_PAR_DATA, command);
+ if (st == SANE_STATUS_GOOD) {
+ usleep(3000); /* 3.000 usec -> 3 msec */
+ st = _ctrl_out_byte (device_number, PORT_PAR_CTRL, C1284_NINIT|C1284_NSTROBE); /* CTRL_VAL_FINAL */
+ if (st == SANE_STATUS_GOOD) {
+ st = _ctrl_out_byte (device_number, PORT_PAR_CTRL, C1284_NINIT);
+ if (st == SANE_STATUS_GOOD) {
+ st = _ctrl_out_byte (device_number, PORT_PAR_DATA, 0xff);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\t\t_ieee_command fails to write final data\n");
+ }
+ }
+ else {
+ DBG (DBG_error, "\t\t_ieee_command fails to reset strobe\n");
+ }
+ }
+ else {
+ DBG (DBG_error, "\t\t_ieee_command fails to set strobe\n");
+ }
+ }
+
+ return st;
+#undef SEQUENCE_LEN
+}
+
+/**
+ * Send a command to the device.
+ * The command is a SCSI_COMMAND_LEN-byte array. The data-array is used for input and output.
+ * The sense-fields of Pieusb_Command_Status are cleared.
+ *
+ * @param device_number Device number
+ * @param command Command array
+ * @param data Input or output data buffer
+ * @param size Size of the data buffer
+ * @returns PIEUSB_SCSI_Status
+ */
+static PIEUSB_USB_Status
+_pieusb_scsi_command(SANE_Int device_number, SANE_Byte command[], SANE_Byte data[], SANE_Int size)
+{
+ SANE_Status st;
+ SANE_Byte usbstat;
+ int i;
+
+ DBG (DBG_info_usb, "\t\t_pieusb_scsi_command(): %02x:%s\n", command[0], code_to_text (scsi_code_text, command[0]));
+
+ st = _ieee_command (device_number, IEEE1284_SCSI);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\t\t_pieusb_scsi_command can't prep scsi cmd: %d\n", st);
+ return USB_STATUS_ERROR;
+ }
+
+ /* output command */
+ for (i = 0; i < SCSI_COMMAND_LEN; ++i) {
+ SANE_Status st;
+ st = _ctrl_out_byte (device_number, PORT_SCSI_CMD, command[i]);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\t\t_pieusb_scsi_command fails command out, after %d bytes: %d\n", i, st);
+ return USB_STATUS_ERROR;
+ }
+ }
+ _hexdump ("Cmd", command, SCSI_COMMAND_LEN);
+
+ /* Verify this sequence */
+ st = _ctrl_in_byte (device_number, &usbstat);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\t\t_pieusb_scsi_command fails status after command out: %d\n", st);
+ return USB_STATUS_ERROR;
+ }
+ /* Process rest of the data, if present; either input or output, possibly bulk */
+ DBG (DBG_info_usb, "\t\t_pieusb_scsi_command usbstat 0x%02x\n", usbstat);
+ if (usbstat == USB_STATUS_OK && size > 0) {
+ /*
+ * send additional data to usb
+ */
+ _hexdump ("Out", data, size);
+ for (i = 0; i < size; ++i) {
+ st = _ctrl_out_byte (device_number, PORT_SCSI_CMD, data[i]);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\t\t_pieusb_scsi_command fails data out after %d bytes: %d\n", i, st);
+ return USB_STATUS_ERROR;
+ }
+ }
+ /* Verify data out */
+ st = _ctrl_in_byte (device_number, &usbstat);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\t\t_pieusb_scsi_command fails status after data out: %d\n", st);
+ return USB_STATUS_ERROR;
+ }
+ }
+ else if (usbstat == USB_STATUS_READ) {
+ /* Intermediate status OK, device has made data available for reading */
+ /* Read data */
+ size_t remsize;
+ size_t partsize;
+
+ remsize = (size_t)size;
+
+ DBG (DBG_info_usb, "\t\t_pieusb_scsi_command data in\n");
+ while (remsize > 0) {
+ partsize = remsize > 0x1000000 ? 0x1000000 : remsize; /* 0xc000 must be multiples of 0x4000, see _bulk_in() */
+ /* send expected length */
+ st = _bulk_size (device_number, partsize);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\t\t_pieusb_scsi_command prepare read data failed for size %u: %d\n", (unsigned int)partsize, st);
+ return USB_STATUS_ERROR;
+ }
+ /* read expected length bytes */
+ st = _bulk_in (device_number, data + size - remsize, &partsize);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\t\t_pieusb_scsi_command read data failed for size %u: %d\n", (unsigned int)partsize, st);
+ return USB_STATUS_ERROR;
+ }
+ remsize -= partsize;
+/* DBG (DBG_info, "\t\t_pieusb_scsi_command partsize %08x, remsize %08x\n", (unsigned int)partsize, (unsigned int)remsize); */
+ }
+ /* Verify data in */
+ st = _ctrl_in_byte (device_number, &usbstat);
+ if (st != SANE_STATUS_GOOD) {
+ DBG (DBG_error, "\t\t_pieusb_scsi_command fails status after data in: %d\n", st);
+ return USB_STATUS_ERROR;
+ }
+ _hexdump ("In", data, size);
+ }
+
+ return usbstat;
+}
+
+
+/**
+ * Simplified control transfer: one byte to given port
+ *
+ * @param device_number device number
+ * @param b byte to send to device
+ * @return SANE status
+ */
+static SANE_Status _ctrl_out_byte(SANE_Int device_number, SANE_Int port, SANE_Byte b) {
+ /* int r = libusb_control_transfer(scannerHandle, CTRL_OUT, 0x0C, 0x0088, ANYINDEX, &b, 1, TIMEOUT); */
+ return sanei_usb_control_msg(device_number, REQUEST_TYPE_OUT, REQUEST_REGISTER, port, ANYINDEX, 1, &b);
+}
+
+
+/**
+ * Simplified control transfer for port/wValue = 0x82 - prepare bulk
+ *
+ * @param device_number device number
+ * @param size Size of bulk transfer which follows (number of bytes)
+ * @return SANE status
+ */
+static SANE_Status _bulk_size(SANE_Int device_number, unsigned int size) {
+ SANE_Byte bulksize[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
+ bulksize[4] = size & 0xff;
+ bulksize[5] = (size >> 8) & 0xff;
+ bulksize[6] = (size >> 16) & 0xff;
+ bulksize[7] = (size >> 24) & 0xff;
+ return sanei_usb_control_msg(device_number, REQUEST_TYPE_OUT, REQUEST_BUFFER, PORT_SCSI_SIZE, ANYINDEX, 8, bulksize);
+}
+
+
+/*
+ * Ctrl inbound, single byte
+ */
+/**
+ * Inbound control transfer
+ *
+ * @param device_number device number
+ * @param b byte received from device
+ * @return SANE status
+ */
+static SANE_Status _ctrl_in_byte(SANE_Int device_number, SANE_Byte* b) {
+ /* int r = libusb_control_transfer(scannerHandle, CTRL_IN, 0x0C, 0x0084, ANYINDEX, &b, 1, TIMEOUT); */
+ /* int r = libusb_control_transfer(scannerHandle, CTRL_IN, 0x0C, 0x0084, ANYINDEX, &b, 1, TIMEOUT); */
+ return sanei_usb_control_msg(device_number, REQUEST_TYPE_IN, REQUEST_REGISTER, PORT_SCSI_STATUS, ANYINDEX, 1, b);
+}
+
+
+/**
+ * Bulk in transfer for data, in parts of 0x4000 bytes max
+ *
+ * @param device_number device number
+ * @param data array holding or receiving data (must be preallocated)
+ * @param size ptr to size of the data array / actual size on output
+ * @return SANE status
+ */
+static SANE_Status
+_bulk_in(SANE_Int device_number, SANE_Byte *data, size_t *size) {
+ size_t remaining = 0;
+ SANE_Status r = SANE_STATUS_GOOD;
+ size_t part;
+
+ remaining = *size;
+ while (remaining > 0) {
+ /* Determine bulk size */
+ part = (remaining >= 0x4000) ? 0x4000 : remaining; /* max 16k per chunk */
+/* DBG (DBG_info, "\t\t_bulk_in: %08x @ %p, %08x rem\n", (unsigned int)part, data, (unsigned int)remaining); */
+ r = sanei_usb_read_bulk(device_number, data, &part);
+ if (r != SANE_STATUS_GOOD) {
+ break;
+ }
+/* DBG (DBG_info, "\t\t_bulk_in: -> %d : %08x\n", r, (unsigned int)part);*/
+ remaining -= part;
+ data += part;
+ }
+ *size -= remaining;
+ return r;
+}
diff --git a/backend/pieusb_usb.h b/backend/pieusb_usb.h
new file mode 100644
index 0000000..dee3212
--- /dev/null
+++ b/backend/pieusb_usb.h
@@ -0,0 +1,114 @@
+/* sane - Scanner Access Now Easy.
+
+ pieusb_usb.h
+
+ Copyright (C) 2012-2015 Jan Vleeshouwers, Michael Rickmann, Klaus Kaempf
+
+ This file is part of the SANE package.
+
+ This program is free software; you can redistribute it and/or
+ modify it under the terms of the GNU General Public License as
+ published by the Free Software Foundation; either version 2 of the
+ License, or (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ MA 02111-1307, USA.
+
+ As a special exception, the authors of SANE give permission for
+ additional uses of the libraries contained in this release of SANE.
+
+ The exception is that, if you link a SANE library with other files
+ to produce an executable, this does not by itself cause the
+ resulting executable to be covered by the GNU General Public
+ License. Your use of that executable is in no way restricted on
+ account of linking the SANE library code into it.
+
+ This exception does not, however, invalidate any other reasons why
+ the executable file might be covered by the GNU General Public
+ License.
+
+ If you submit changes to SANE to the maintainers to be included in
+ a subsequent release, you agree by submitting the changes that
+ those changes may be distributed with this exception intact.
+
+ If you write modifications of your own for SANE, it is your choice
+ whether to permit this exception to apply to your modifications.
+ If you do not wish that, delete this exception notice. */
+
+#ifndef PIEUSB_USB_H
+#define PIEUSB_USB_H
+
+#define PIEUSB_WAIT_BUSY 1 /* seconds to wait on busy condition */
+
+#define SCSI_COMMAND_LEN 6
+
+SANE_Status sanei_pieusb_usb_reset(SANE_Int device_number);
+
+SANE_Status sanei_pieusb_convert_status(PIEUSB_Status status);
+
+SANE_String sanei_pieusb_decode_sense(struct Pieusb_Sense* sense, PIEUSB_Status *status);
+
+PIEUSB_Status sanei_pieusb_command(SANE_Int device_number, SANE_Byte command[], SANE_Byte data[], SANE_Int size);
+
+/* =========================================================================
+ *
+ * Pieusb scanner commands
+ *
+ * ========================================================================= */
+
+/* Standard SCSI command codes */
+#define SCSI_TEST_UNIT_READY 0x00
+#define SCSI_REQUEST_SENSE 0x03
+#define SCSI_READ 0x08
+#define SCSI_WRITE 0x0A
+#define SCSI_PARAM 0x0F
+#define SCSI_INQUIRY 0x12
+#define SCSI_MODE_SELECT 0x15
+#define SCSI_COPY 0x18
+#define SCSI_MODE_SENSE 0x1A
+#define SCSI_SCAN 0x1B
+
+/* Non-standard SCSI command codes */
+#define SCSI_SLIDE 0xD1
+#define SCSI_SET_SCAN_HEAD 0xD2
+#define SCSI_READ_GAIN_OFFSET 0xD7
+#define SCSI_WRITE_GAIN_OFFSET 0xDC
+#define SCSI_READ_STATE 0xDD
+
+/* Additional SCSI READ/WRITE codes, |0x80 for Read */
+#define SCSI_POWER_SAVE_CONTROL 0x01
+#define SCSI_GAMMA_TABLE 0x10
+#define SCSI_HALFTONE_PATTERN 0x11
+#define SCSI_SCAN_FRAME 0x12
+#define SCSI_EXPOSURE 0x13
+#define SCSI_HIGHLIGHT_SHADOW 0x14
+#define SCSI_CALIBRATION_INFO 0x15
+#define SCSI_CAL_DATA 0x16
+#define SCSI_CMD_17 0x17 /* used by CyberView */
+
+/* Standard SCSI Sense keys, see http://www.t10.org/lists/2sensekey.htm */
+#define SCSI_SENSE_NO_SENSE 0x00
+#define SCSI_SENSE_RECOVERED_ERROR 0x01
+#define SCSI_SENSE_NOT_READY 0x02
+#define SCSI_SENSE_MEDIUM_ERROR 0x03
+#define SCSI_SENSE_HARDWARE_ERROR 0x04
+#define SCSI_SENSE_ILLEGAL_REQUEST 0x05
+#define SCSI_SENSE_UNIT_ATTENTION 0x06
+#define SCSI_SENSE_DATA_PROTECT 0x07
+#define SCSI_SENSE_BLANK_CHECK 0x08
+#define SCSI_SENSE_VENDOR_SPECIFIC 0x09
+#define SCSI_SENSE_COPY_ABORTED 0x0A
+#define SCSI_SENSE_ABORTED_COMMAND 0x0B
+#define SCSI_SENSE_EQUAL 0x0C
+#define SCSI_SENSE_VOLUME_OVERFLOW 0x0D
+#define SCSI_SENSE_MISCOMPARE 0x0E
+#define SCSI_SENSE_COMPLETED 0x0F
+
+#endif /* PIEUSB_USB_H */
diff --git a/backend/pixma.c b/backend/pixma.c
index 6a2492e..3396155 100644
--- a/backend/pixma.c
+++ b/backend/pixma.c
@@ -1,8 +1,8 @@
/* SANE - Scanner Access Now Easy.
+ Copyright (C) 2011-2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 2007-2008 Nicolas Martin, <nicols-guest at alioth dot debian dot org>
Copyright (C) 2006-2007 Wittawat Yamwong <wittawat@web.de>
- Copyright (C) 2011-2013 Rolf Bensch <rolf at bensch hyphen online dot de>
This file is part of the SANE package.
diff --git a/backend/pixma.h b/backend/pixma.h
index 56bd14d..620f038 100644
--- a/backend/pixma.h
+++ b/backend/pixma.h
@@ -1,8 +1,8 @@
/* SANE - Scanner Access Now Easy.
+ Copyright (C) 2011-2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 2007-2008 Nicolas Martin, <nicols-guest at alioth dot debian dot org>
Copyright (C) 2006-2007 Wittawat Yamwong <wittawat@web.de>
- Copyright (C) 2011-2013 Rolf Bensch <rolf at bensch hyphen online dot de>
This file is part of the SANE package.
@@ -114,7 +114,7 @@ typedef uint32_t uint32_t;
/**@{*/
#define PIXMA_VERSION_MAJOR 0
#define PIXMA_VERSION_MINOR 17
-#define PIXMA_VERSION_BUILD 4
+#define PIXMA_VERSION_BUILD 23
/**@}*/
/** \name Error codes */
diff --git a/backend/pixma_bjnp.c b/backend/pixma_bjnp.c
index 3046e9d..7d2d541 100644
--- a/backend/pixma_bjnp.c
+++ b/backend/pixma_bjnp.c
@@ -65,6 +65,9 @@
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
+#ifdef HAVE_LIMITS_H
+#include <limits.h>
+#endif
/*
* networking stuff
@@ -99,6 +102,9 @@
#include "pixma.h"
#include "pixma_common.h"
+#ifndef SSIZE_MAX
+# define SSIZE_MAX LONG_MAX
+#endif
/* static data */
static bjnp_device_t device[BJNP_NO_DEVICES];
@@ -130,11 +136,11 @@ static void
u32tohex (uint32_t x, char *str)
{
uint8_t uint8[4];
- uint8[0]= (uint8_t) x >> 24;
- uint8[1] = (uint8_t)x >> 16;
- uint8[2] = (uint8_t)x >> 8;
- uint8[3] = (uint8_t)x ;
- u8tohex(str, uint8, 4);
+ uint8[0] = (uint8_t)(x >> 24);
+ uint8[1] = (uint8_t)(x >> 16);
+ uint8[2] = (uint8_t)(x >> 8);
+ uint8[3] = (uint8_t)x ;
+ u8tohex(str, uint8, 4);
}
static void
@@ -284,7 +290,8 @@ parse_IEEE1284_to_model (char *scanner_id, char *model)
char s[BJNP_IEEE1284_MAX];
char *tok;
- strcpy (s, scanner_id);
+ strncpy (s, scanner_id, BJNP_IEEE1284_MAX);
+ s[BJNP_IEEE1284_MAX - 1] = '\0';
model[0] = '\0';
tok = strtok (s, ";");
@@ -294,7 +301,8 @@ parse_IEEE1284_to_model (char *scanner_id, char *model)
if (strncmp (tok, "MDL:", 4) == 0)
{
- strcpy (model, tok + 4);
+ strncpy (model, tok + 4, BJNP_IEEE1284_MAX);
+ model[BJNP_IEEE1284_MAX -1] = '\0';
return 1;
}
tok = strtok (NULL, ";");
@@ -334,6 +342,34 @@ charTo2byte (char *d, const char *s, int len)
return copied;
}
+static bjnp_protocol_defs_t *get_protocol_by_method( char *method)
+{
+ int i = 0;
+ while ( bjnp_protocol_defs[i].method_string != NULL)
+ {
+ if (strcmp(method, bjnp_protocol_defs[i].method_string) == 0)
+ {
+ return &bjnp_protocol_defs[i];
+ }
+ i++;
+ }
+ return NULL;
+}
+
+static bjnp_protocol_defs_t *get_protocol_by_proto_string( char *proto_string)
+{
+ int i = 0;
+ while ( bjnp_protocol_defs[i].proto_string != NULL)
+ {
+ if (strncmp(proto_string, bjnp_protocol_defs[i].proto_string, 4) == 0)
+ {
+ return &bjnp_protocol_defs[i];
+ }
+ i++;
+ }
+ return NULL;
+}
+
static char *
getusername (void)
{
@@ -364,11 +400,13 @@ determine_scanner_serial (const char *hostname, const char * mac_address, char *
/* if this is a FQDN, not an ip-address, remove domain part of the name */
if ((dot = strchr (copy, '.')) != NULL)
{
- *dot = '\0';
+ *dot = '\0';
}
else
- strcpy(copy, mac_address);
- break;
+ {
+ strcpy(copy, mac_address);
+ break;
+ }
}
strcpy( serial, copy );
return serial;
@@ -389,7 +427,7 @@ bjnp_open_tcp (int devno)
if ((sock = socket (get_protocol_family( addr ) , SOCK_STREAM, 0)) < 0)
{
- PDBG (bjnp_dbg (LOG_CRIT, "bjnp_open_tcp: Can not create socket: %s\n",
+ PDBG (bjnp_dbg (LOG_CRIT, "bjnp_open_tcp: ERROR - Can not create socket: %s\n",
strerror (errno)));
return -1;
}
@@ -422,7 +460,7 @@ bjnp_open_tcp (int devno)
(sock, &(addr->addr), sa_size(device[devno].addr) )!= 0)
{
PDBG (bjnp_dbg
- (LOG_CRIT, "bjnp_open_tcp: Can not connect to scanner: %s\n",
+ (LOG_CRIT, "bjnp_open_tcp: ERROR - Can not connect to scanner: %s\n",
strerror (errno)));
return -1;
}
@@ -439,7 +477,8 @@ split_uri (const char *devname, char *method, char *host, char *port,
char next;
int i;
- strcpy (copy, devname);
+ strncpy (copy, devname, 1024);
+ copy[1023] = '\0';
start = copy;
/*
@@ -453,7 +492,7 @@ split_uri (const char *devname, char *method, char *host, char *port,
if (((strncmp (start + i, "://", 3) != 0)) || (i > BJNP_METHOD_MAX -1 ))
{
- PDBG (bjnp_dbg (LOG_NOTICE, "Can not find method in %s (offset %d)\n",
+ PDBG (bjnp_dbg (LOG_NOTICE, "split_uri: ERROR - Can not find method in %s (offset %d)\n",
devname, i));
return -1;
}
@@ -476,7 +515,7 @@ split_uri (const char *devname, char *method, char *host, char *port,
( (end_of_address[1] != ':') && (end_of_address[1] != '/' ) && (end_of_address[1] != '\0' )) ||
( (end_of_address - start) >= BJNP_HOST_MAX ) )
{
- PDBG (bjnp_dbg (LOG_NOTICE, "Can not find hostname or address in %s\n", devname));
+ PDBG (bjnp_dbg (LOG_NOTICE, "split_uri: ERROR - Can not find hostname or address in %s\n", devname));
return -1;
}
next = end_of_address[1];
@@ -495,7 +534,7 @@ split_uri (const char *devname, char *method, char *host, char *port,
start[i] = '\0';
if ((i == 0) || (i >= BJNP_HOST_MAX ) )
{
- PDBG (bjnp_dbg (LOG_NOTICE, "Can not find hostname or address in %s\n", devname));
+ PDBG (bjnp_dbg (LOG_NOTICE, "split_uri: ERROR - Can not find hostname or address in %s\n", devname));
return -1;
}
strcpy (host, start);
@@ -523,7 +562,7 @@ split_uri (const char *devname, char *method, char *host, char *port,
}
if ((strlen(start) == 0) || (strlen(start) >= BJNP_PORT_MAX ) )
{
- PDBG (bjnp_dbg (LOG_NOTICE, "Can not find port in %s (have \"%s\")\n", devname, start));
+ PDBG (bjnp_dbg (LOG_NOTICE, "split_uri: ERROR - Can not find port in %s (have \"%s\")\n", devname, start));
return -1;
}
strcpy(port, start);
@@ -538,7 +577,7 @@ split_uri (const char *devname, char *method, char *host, char *port,
i = strlen(start);
if ( i >= BJNP_ARGS_MAX)
{
- PDBG (bjnp_dbg (LOG_NOTICE, "Argument string too long in %s\n", devname));
+ PDBG (bjnp_dbg (LOG_NOTICE, "split_uri: ERROR - Argument string too long in %s\n", devname));
}
strcpy (args, start);
}
@@ -550,28 +589,40 @@ split_uri (const char *devname, char *method, char *host, char *port,
static void
-set_cmd (int devno, struct BJNP_command *cmd, char cmd_code, int payload_len)
+set_cmd_from_string (char* protocol_string, struct BJNP_command *cmd, char cmd_code, int payload_len)
{
/*
- * Set command buffer with command code, session_id and lenght of payload
+ * Set command buffer with command code, session_id and length of payload
* Returns: sequence number of command
*/
- strncpy (cmd->BJNP_id, BJNP_STRING, sizeof (cmd->BJNP_id));
+
+ strncpy (cmd->BJNP_id, protocol_string, sizeof (cmd->BJNP_id));
cmd->dev_type = BJNP_CMD_SCAN;
cmd->cmd_code = cmd_code;
cmd->unknown1 = htons (0);
- if (devno == -1)
- {
- /* device not yet opened, use 0 for serial and session) */
- cmd->seq_no = htons (0);
- cmd->session_id = htons (0);
- }
- else
- {
- cmd->seq_no = htons (++(device[devno].serial));
- cmd->session_id = (cmd_code == CMD_UDP_POLL ) ? 0 : htons (device[devno].session_id);
- device[devno].last_cmd = cmd_code;
- }
+
+ /* device not yet opened, use 0 for serial and session) */
+ cmd->seq_no = htons (0);
+ cmd->session_id = htons (0);
+ cmd->payload_len = htonl (payload_len);
+}
+
+static void
+set_cmd_for_dev (int devno, struct BJNP_command *cmd, char cmd_code, int payload_len)
+{
+ /*
+ * Set command buffer with command code, session_id and length of payload
+ * Returns: sequence number of command
+ * If devno < 0, then use devno as negativ index into bjnp_protocol_defs
+ */
+
+ strncpy (cmd->BJNP_id, device[devno].protocol_string, sizeof (cmd->BJNP_id));
+ cmd->dev_type = BJNP_CMD_SCAN;
+ cmd->cmd_code = cmd_code;
+ cmd->unknown1 = htons (0);
+ cmd->seq_no = htons (++(device[devno].serial));
+ cmd->session_id = (cmd_code == CMD_UDP_POLL ) ? 0 : htons (device[devno].session_id);
+ device[devno].last_cmd = cmd_code;
cmd->payload_len = htonl (payload_len);
}
@@ -596,7 +647,7 @@ bjnp_setup_udp_socket ( const int dev_no )
if ((sockfd = socket (get_protocol_family( addr ), SOCK_DGRAM, IPPROTO_UDP)) == -1)
{
PDBG (bjnp_dbg
- (LOG_CRIT, "setup_udp_socket: can not open socket - %s\n",
+ (LOG_CRIT, "setup_udp_socket: ERROR - can not open socket - %s\n",
strerror (errno)));
return -1;
}
@@ -605,7 +656,7 @@ bjnp_setup_udp_socket ( const int dev_no )
(sockfd, &(device[dev_no].addr->addr), sa_size(device[dev_no].addr) )!= 0)
{
PDBG (bjnp_dbg
- (LOG_CRIT, "setup_udp_socket: connect failed- %s\n",
+ (LOG_CRIT, "setup_udp_socket: ERROR - connect failed- %s\n",
strerror (errno)));
close(sockfd);
return -1;
@@ -632,7 +683,7 @@ udp_command (const int dev_no, char *command, int cmd_len, char *response,
if ( (sockfd = bjnp_setup_udp_socket(dev_no) ) == -1 )
{
- PDBG (bjnp_dbg( LOG_CRIT, "udp_command: Can not setup socket\n") );
+ PDBG (bjnp_dbg( LOG_CRIT, "udp_command: ERROR - Can not setup socket\n") );
return -1;
}
@@ -641,7 +692,7 @@ udp_command (const int dev_no, char *command, int cmd_len, char *response,
if ((numbytes = send (sockfd, command, cmd_len, 0)) != cmd_len)
{
PDBG (bjnp_dbg
- (LOG_NOTICE, "udp_command: Sent %d bytes, expected %d\n",
+ (LOG_NOTICE, "udp_command: ERROR - Sent %d bytes, expected %d\n",
numbytes, cmd_len));
continue;
}
@@ -666,7 +717,7 @@ udp_command (const int dev_no, char *command, int cmd_len, char *response,
if (result <= 0)
{
PDBG (bjnp_dbg
- (LOG_NOTICE, "udp_command: select failed: %s\n",
+ (LOG_NOTICE, "udp_command: ERROR - select failed: %s\n",
result == 0 ? "timed out" : strerror (errno)));
continue;
}
@@ -674,7 +725,7 @@ udp_command (const int dev_no, char *command, int cmd_len, char *response,
if ((numbytes = recv (sockfd, response, resp_len, 0)) == -1)
{
PDBG (bjnp_dbg
- (LOG_NOTICE, "udp_command: recv failed: %s",
+ (LOG_NOTICE, "udp_command: ERROR - recv failed: %s",
strerror (errno)));
continue;
}
@@ -686,7 +737,7 @@ udp_command (const int dev_no, char *command, int cmd_len, char *response,
close(sockfd);
PDBG (bjnp_dbg
- (LOG_CRIT, "udp_command: no data received\n" ) );
+ (LOG_CRIT, "udp_command: ERROR - no data received\n" ) );
return -1;
}
@@ -710,36 +761,43 @@ get_scanner_id (const int dev_no, char *model)
strcpy (model, "Unidentified scanner");
- set_cmd (dev_no, &cmd, CMD_UDP_GET_ID, 0);
+ set_cmd_for_dev (dev_no, &cmd, CMD_UDP_GET_ID, 0);
- PDBG (bjnp_dbg (LOG_DEBUG2, "Get scanner identity\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG2, "get_scanner_id: Get scanner identity\n"));
PDBG (bjnp_hexdump (LOG_DEBUG2, (char *) &cmd,
sizeof (struct BJNP_command)));
if ( ( resp_len = udp_command (dev_no, (char *) &cmd, sizeof (struct BJNP_command),
resp_buf, BJNP_RESP_MAX) ) < (int)sizeof(struct BJNP_command) )
{
- PDBG (bjnp_dbg (LOG_DEBUG, "Failed to retrieve scanner identity:\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG, "get_scanner_id: ERROR - Failed to retrieve scanner identity:\n"));
return -1;
}
- PDBG (bjnp_dbg (LOG_DEBUG2, "scanner identity:\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG2, "get_scanner_id: scanner identity:\n"));
PDBG (bjnp_hexdump (LOG_DEBUG2, resp_buf, resp_len));
id = (struct IDENTITY *) resp_buf;
- /* truncate string to be safe */
- id_len = htons( id-> id_len ) - sizeof(id->id_len);
- id->id[id_len] = '\0';
- strcpy (scanner_id, id->id);
-
- PDBG (bjnp_dbg (LOG_INFO, "Scanner identity string = %s - lenght = %d\n", scanner_id, id_len));
+ if (device[dev_no].protocol == PROTOCOL_BJNP)
+ {
+ id_len = MIN(ntohl( id-> cmd.payload_len ) - sizeof(id-> payload.bjnp.id_len), BJNP_IEEE1284_MAX);
+ strncpy(scanner_id, id->payload.bjnp.id, id_len);
+ scanner_id[id_len] = '\0';
+ }
+ else
+ {
+ id_len = MIN(ntohl( id-> cmd.payload_len ), BJNP_IEEE1284_MAX);
+ strncpy(scanner_id, id->payload.mfnp.id, id_len);
+ scanner_id[id_len] = '\0';
+ }
+ PDBG (bjnp_dbg (LOG_INFO, "get_scanner_id: Scanner identity string = %s - length = %d\n", scanner_id, id_len));
/* get make&model from IEEE1284 id */
if (model != NULL)
{
parse_IEEE1284_to_model (scanner_id, model);
- PDBG (bjnp_dbg (LOG_INFO, "Scanner model = %s\n", model));
+ PDBG (bjnp_dbg (LOG_INFO, "get_scanner_id: Scanner model = %s\n", model));
}
return 0;
}
@@ -776,7 +834,7 @@ get_scanner_name(const bjnp_sockaddr_t *scanner_sa, char *host)
if( (error = getnameinfo( &(scanner_sa -> addr) , sa_size( scanner_sa),
host, BJNP_HOST_MAX , NULL, 0, NI_NAMEREQD) ) != 0 )
{
- PDBG (bjnp_dbg(LOG_INFO, "Name for %s not found : %s\n",
+ PDBG (bjnp_dbg(LOG_INFO, "get_scanner_name: Name for %s not found : %s\n",
ip_address, gai_strerror(error) ) );
strcpy(host, ip_address);
return level;
@@ -797,7 +855,7 @@ get_scanner_name(const bjnp_sockaddr_t *scanner_sa, char *host)
{
/* found match, good */
PDBG (bjnp_dbg (LOG_INFO,
- "Forward lookup for %s succeeded, using as hostname\n", host));
+ "get_scanner_name: Forward lookup for %s succeeded, using as hostname\n", host));
match = 1;
level = BJNP_ADDRESS_HAS_FQDN;
break;
@@ -809,7 +867,7 @@ get_scanner_name(const bjnp_sockaddr_t *scanner_sa, char *host)
if (match != 1)
{
PDBG (bjnp_dbg (LOG_INFO,
- "Forward lookup for %s succeeded, IP-address does not match, using IP-address %s instead\n",
+ "get_scanner_name: Forward lookup for %s succeeded, IP-address does not match, using IP-address %s instead\n",
host, ip_address));
strcpy (host, ip_address);
}
@@ -817,13 +875,30 @@ get_scanner_name(const bjnp_sockaddr_t *scanner_sa, char *host)
else
{
/* forward lookup failed, use ip-address */
- PDBG ( bjnp_dbg (LOG_INFO, "Forward lookup of %s failed, using IP-address", ip_address));
+ PDBG ( bjnp_dbg (LOG_INFO, "get_scanner_name: Forward lookup of %s failed, using IP-address", ip_address));
strcpy (host, ip_address);
}
}
return level;
}
+static int
+get_port_from_sa(const bjnp_sockaddr_t scanner_sa)
+{
+#ifdef ENABLE_IPV6
+ if ( scanner_sa.addr.sa_family == AF_INET6 )
+ {
+ return ntohs(scanner_sa.ipv6.sin6_port);
+ }
+ else
+#endif
+ if ( scanner_sa.addr.sa_family == AF_INET )
+ {
+ return ntohs(scanner_sa.ipv4.sin_port);
+ }
+ return -1;
+}
+
static int create_broadcast_socket( const bjnp_sockaddr_t * local_addr )
{
int sockfd = -1;
@@ -834,7 +909,7 @@ static int create_broadcast_socket( const bjnp_sockaddr_t * local_addr )
if ((sockfd = socket (local_addr-> addr.sa_family, SOCK_DGRAM, 0)) == -1)
{
PDBG (bjnp_dbg
- (LOG_CRIT, "create_broadcast_socket: can not open socket - %s",
+ (LOG_CRIT, "create_broadcast_socket: ERROR - can not open socket - %s",
strerror (errno)));
return -1;
}
@@ -847,7 +922,7 @@ static int create_broadcast_socket( const bjnp_sockaddr_t * local_addr )
{
PDBG (bjnp_dbg
(LOG_CRIT,
- "create_broadcast_socket: setting socket option SO_BROADCAST failed - %s",
+ "create_broadcast_socket: ERROR - setting socket option SO_BROADCAST failed - %s",
strerror (errno)));
close (sockfd);
return -1;
@@ -860,7 +935,7 @@ static int create_broadcast_socket( const bjnp_sockaddr_t * local_addr )
{
PDBG (bjnp_dbg
(LOG_CRIT,
- "create_broadcast_socket: setting socket option IPV6_V6ONLY failed - %s",
+ "create_broadcast_socket: ERROR - setting socket option IPV6_V6ONLY failed - %s",
strerror (errno)));
close (sockfd);
return -1;
@@ -872,7 +947,7 @@ static int create_broadcast_socket( const bjnp_sockaddr_t * local_addr )
{
PDBG (bjnp_dbg
(LOG_CRIT,
- "create_broadcast_socket: bind socket to local address failed - %s\n",
+ "create_broadcast_socket: ERROR - bind socket to local address failed - %s\n",
strerror (errno)));
close (sockfd);
return -1;
@@ -900,7 +975,7 @@ prepare_socket(const char *if_name, const bjnp_sockaddr_t *local_sa,
if ( local_sa == NULL )
{
PDBG (bjnp_dbg (LOG_DEBUG,
- "%s is not a valid IPv4 interface, skipping...\n",
+ "prepare_socket: %s is not a valid IPv4 interface, skipping...\n",
if_name));
return -1;
}
@@ -919,7 +994,7 @@ prepare_socket(const char *if_name, const bjnp_sockaddr_t *local_sa,
/* not a valid interface */
PDBG (bjnp_dbg (LOG_DEBUG,
- "%s is not a valid IPv4 interface, skipping...\n",
+ "prepare_socket: %s is not a valid IPv4 interface, skipping...\n",
if_name));
return -1;
}
@@ -928,15 +1003,18 @@ prepare_socket(const char *if_name, const bjnp_sockaddr_t *local_sa,
/* send broadcasts to the broadcast address of the interface */
memcpy(dest_sa, broadcast_sa, sa_size(dest_sa) );
- dest_sa -> ipv4.sin_port = htons(BJNP_PORT_SCAN);
+
+ /* we fill port when we send the broadcast */
+ dest_sa -> ipv4.sin_port = htons(0);
+
if ( (socket = create_broadcast_socket( &local_sa_copy) ) != -1)
{
- PDBG (bjnp_dbg (LOG_INFO, "%s is IPv4 capable, sending broadcast, socket = %d\n",
+ PDBG (bjnp_dbg (LOG_INFO, "prepare_socket: %s is IPv4 capable, sending broadcast, socket = %d\n",
if_name, socket));
}
else
{
- PDBG (bjnp_dbg (LOG_INFO, "%s is IPv4 capable, but failed to create a socket.\n",
+ PDBG (bjnp_dbg (LOG_INFO, "prepare_socket: ERROR - %s is IPv4 capable, but failed to create a socket.\n",
if_name));
return -1;
}
@@ -952,23 +1030,26 @@ prepare_socket(const char *if_name, const bjnp_sockaddr_t *local_sa,
/* not a valid interface */
PDBG (bjnp_dbg (LOG_DEBUG,
- "%s is not a valid IPv6 interface, skipping...\n",
+ "prepare_socket: %s is not a valid IPv6 interface, skipping...\n",
if_name));
return -1;
}
else
{
dest_sa -> ipv6.sin6_family = AF_INET6;
- dest_sa -> ipv6.sin6_port = htons(BJNP_PORT_SCAN);
+
+ /* We fill port when we send the broadcast */
+ dest_sa -> ipv6.sin6_port = htons(0);
+
inet_pton(AF_INET6, "ff02::1", dest_sa -> ipv6.sin6_addr.s6_addr);
if ( (socket = create_broadcast_socket( &local_sa_copy ) ) != -1)
{
- PDBG (bjnp_dbg (LOG_INFO, "%s is IPv6 capable, sending broadcast, socket = %d\n",
+ PDBG (bjnp_dbg (LOG_INFO, "prepare_socket: %s is IPv6 capable, sending broadcast, socket = %d\n",
if_name, socket));
}
else
{
- PDBG (bjnp_dbg (LOG_INFO, "%s is IPv6 capable, but failed to create a socket.\n",
+ PDBG (bjnp_dbg (LOG_INFO, "prepare_socket: ERROR - %s is IPv6 capable, but failed to create a socket.\n",
if_name));
return -1;
}
@@ -984,20 +1065,33 @@ prepare_socket(const char *if_name, const bjnp_sockaddr_t *local_sa,
}
static int
-bjnp_send_broadcast (int sockfd, const bjnp_sockaddr_t * broadcast_addr,
+bjnp_send_broadcast (int sockfd, const bjnp_sockaddr_t * broadcast_addr, int port,
struct BJNP_command cmd, int size)
{
int num_bytes;
+ bjnp_sockaddr_t dest_addr;
- /* set address to send packet to */
- /* usebroadcast address of interface */
+ /* set address to send packet to broadcast address of interface, */
+ /* with port set to the destination port */
+
+ memcpy(&dest_addr, broadcast_addr, sizeof(dest_addr));
+ if( dest_addr.addr.sa_family == AF_INET)
+ {
+ dest_addr.ipv4.sin_port = htons(port);
+ }
+#ifdef ENABLE_IPV6
+ if( dest_addr.addr.sa_family == AF_INET6)
+ {
+ dest_addr.ipv6.sin6_port = htons(port);
+ }
+#endif
if ((num_bytes = sendto (sockfd, &cmd, size, 0,
- &(broadcast_addr->addr),
+ &(dest_addr.addr),
sa_size( broadcast_addr)) ) != size)
{
PDBG (bjnp_dbg (LOG_INFO,
- "bjnp_send_broadcast: Socket: %d: sent only %x = %d bytes of packet, error = %s\n",
+ "bjnp_send_broadcast: Socket: %d: ERROR - sent only %x = %d bytes of packet, error = %s\n",
sockfd, num_bytes, num_bytes, strerror (errno)));
/* not allowed, skip this interface */
@@ -1017,9 +1111,9 @@ bjnp_finish_job (int devno)
int resp_len;
struct BJNP_command cmd;
- set_cmd (devno, &cmd, CMD_UDP_CLOSE, 0);
+ set_cmd_for_dev (devno, &cmd, CMD_UDP_CLOSE, 0);
- PDBG (bjnp_dbg (LOG_DEBUG2, "Finish scanjob\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG2, "bjnp_finish_job: Finish scanjob\n"));
PDBG (bjnp_hexdump
(LOG_DEBUG2, (char *) &cmd, sizeof (struct BJNP_command)));
resp_len =
@@ -1030,11 +1124,11 @@ bjnp_finish_job (int devno)
{
PDBG (bjnp_dbg
(LOG_INFO,
- "Received %d characters on close scanjob command, expected %d\n",
+ "bjnp_finish_job: ERROR - Received %d characters on close scanjob command, expected %d\n",
resp_len, (int) sizeof (struct BJNP_command)));
return;
}
- PDBG (bjnp_dbg (LOG_DEBUG2, "Finish scanjob response\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG2, "bjnp_finish_job: Finish scanjob response\n"));
PDBG (bjnp_hexdump (LOG_DEBUG2, resp_buf, resp_len));
}
@@ -1101,11 +1195,11 @@ bjnp_poll_scanner (int devno, char type,char *hostname, char *user, SANE_Byte *s
return -1;
};
/* we can only now set the header as we now know the length of the payload */
- set_cmd (devno, (struct BJNP_command *) cmd_buf, CMD_UDP_POLL,
+ set_cmd_for_dev (devno, (struct BJNP_command *) cmd_buf, CMD_UDP_POLL,
len);
buf_len = len + sizeof(struct BJNP_command);
- PDBG (bjnp_dbg (LOG_DEBUG2, "Poll details (type %d)\n", type));
+ PDBG (bjnp_dbg (LOG_DEBUG2, "bjnp_poll_scanner: Poll details (type %d)\n", type));
PDBG (bjnp_hexdump (LOG_DEBUG2, cmd_buf,
buf_len));
@@ -1113,7 +1207,7 @@ bjnp_poll_scanner (int devno, char type,char *hostname, char *user, SANE_Byte *s
if (resp_len > 0)
{
- PDBG (bjnp_dbg (LOG_DEBUG2, "Poll details response:\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG2, "bjnp_poll_scanner: Poll details response:\n"));
PDBG (bjnp_hexdump (LOG_DEBUG2, resp_buf, resp_len));
response = (struct POLL_RESPONSE *) resp_buf;
@@ -1126,7 +1220,7 @@ bjnp_poll_scanner (int devno, char type,char *hostname, char *user, SANE_Byte *s
if ( (response -> result[2] & 0x80) != 0)
{
memcpy( status, response->status, size);
- PDBG( bjnp_dbg(LOG_INFO, "received button status!\n"));
+ PDBG( bjnp_dbg(LOG_INFO, "bjnp_poll_scanner: received button status!\n"));
PDBG (bjnp_hexdump( LOG_DEBUG2, status, size ));
device[devno].status_key = ntohl( response -> key );
return size;
@@ -1151,7 +1245,7 @@ bjnp_send_job_details (int devno, char *hostname, char *user, char *title)
/* send job details command */
- set_cmd (devno, (struct BJNP_command *) cmd_buf, CMD_UDP_JOB_DETAILS,
+ set_cmd_for_dev (devno, (struct BJNP_command *) cmd_buf, CMD_UDP_JOB_DETAILS,
sizeof (*job) - sizeof (struct BJNP_command));
/* create payload */
@@ -1162,7 +1256,7 @@ bjnp_send_job_details (int devno, char *hostname, char *user, char *title)
charTo2byte (job->username, user, sizeof (job->username));
charTo2byte (job->jobtitle, title, sizeof (job->jobtitle));
- PDBG (bjnp_dbg (LOG_DEBUG2, "Job details\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG2, "bjnp_send_job_details: Job details\n"));
PDBG (bjnp_hexdump (LOG_DEBUG2, cmd_buf,
(sizeof (struct BJNP_command) + sizeof (*job))));
@@ -1172,7 +1266,7 @@ bjnp_send_job_details (int devno, char *hostname, char *user, char *title)
if (resp_len > 0)
{
- PDBG (bjnp_dbg (LOG_DEBUG2, "Job details response:\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG2, "bjnp_send_job_details: Job details response:\n"));
PDBG (bjnp_hexdump (LOG_DEBUG2, resp_buf, resp_len));
resp = (struct BJNP_command *) resp_buf;
device[devno].session_id = ntohs (resp->session_id);
@@ -1193,14 +1287,14 @@ bjnp_get_scanner_mac_address ( int devno, char *mac_address )
/* send job details command */
- set_cmd (devno, (struct BJNP_command *) cmd_buf, CMD_UDP_DISCOVER, 0);
+ set_cmd_for_dev (devno, (struct BJNP_command *) cmd_buf, CMD_UDP_DISCOVER, 0);
resp_len = udp_command (devno, cmd_buf,
sizeof (struct BJNP_command), resp_buf,
BJNP_RESP_MAX);
if (resp_len > 0)
{
- PDBG (bjnp_dbg (LOG_DEBUG2, "Discover response:\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG2, "bjnp_get_scanner_mac_address: Discover response:\n"));
PDBG (bjnp_hexdump (LOG_DEBUG2, resp_buf, resp_len));
u8tohex( mac_address, resp -> mac_addr, sizeof( resp -> mac_addr ) );
return 0;
@@ -1212,7 +1306,7 @@ static int
bjnp_write (int devno, const SANE_Byte * buf, size_t count)
{
/*
- * This function writes scandata to the scanner.
+ * This function writes TCP data to the scanner.
* Returns: number of bytes written to the scanner
*/
int sent_bytes;
@@ -1220,14 +1314,15 @@ bjnp_write (int devno, const SANE_Byte * buf, size_t count)
struct SCAN_BUF bjnp_buf;
if (device[devno].scanner_data_left)
- PDBG (bjnp_dbg
- (LOG_CRIT, "bjnp_write: ERROR: scanner data left = 0x%lx = %ld\n",
- (unsigned long) device[devno].scanner_data_left,
- (unsigned long) device[devno].scanner_data_left));
-
+ {
+ PDBG (bjnp_dbg
+ (LOG_CRIT, "bjnp_write: ERROR - scanner data left = 0x%lx = %ld\n",
+ (unsigned long) device[devno].scanner_data_left,
+ (unsigned long) device[devno].scanner_data_left));
+ }
/* set BJNP command header */
- set_cmd (devno, (struct BJNP_command *) &bjnp_buf, CMD_TCP_SEND, count);
+ set_cmd_for_dev (devno, (struct BJNP_command *) &bjnp_buf, CMD_TCP_SEND, count);
memcpy (bjnp_buf.scan_data, buf, count);
PDBG (bjnp_dbg (LOG_DEBUG, "bjnp_write: sending 0x%lx = %ld bytes\n",
(unsigned long) count, (unsigned long) count);
@@ -1241,7 +1336,7 @@ bjnp_write (int devno, const SANE_Byte * buf, size_t count)
{
/* return result from write */
terrno = errno;
- PDBG (bjnp_dbg (LOG_CRIT, "bjnp_write: Could not send data!\n"));
+ PDBG (bjnp_dbg (LOG_CRIT, "bjnp_write: ERROR - Could not send data!\n"));
errno = terrno;
return sent_bytes;
}
@@ -1270,13 +1365,13 @@ bjnp_send_read_request (int devno)
if (device[devno].scanner_data_left)
PDBG (bjnp_dbg
(LOG_CRIT,
- "bjnp_send_read_request: ERROR scanner data left = 0x%lx = %ld\n",
+ "bjnp_send_read_request: ERROR - scanner data left = 0x%lx = %ld\n",
(unsigned long) device[devno].scanner_data_left,
(unsigned long) device[devno].scanner_data_left));
/* set BJNP command header */
- set_cmd (devno, (struct BJNP_command *) &bjnp_buf, CMD_TCP_REQ, 0);
+ set_cmd_for_dev (devno, (struct BJNP_command *) &bjnp_buf, CMD_TCP_REQ, 0);
PDBG (bjnp_dbg (LOG_DEBUG, "bjnp_send_read_req sending command\n"));
PDBG (bjnp_hexdump (LOG_DEBUG2, (char *) &bjnp_buf,
@@ -1289,7 +1384,7 @@ bjnp_send_read_request (int devno)
/* return result from write */
terrno = errno;
PDBG (bjnp_dbg
- (LOG_CRIT, "bjnp_send_read_request: Could not send data!\n"));
+ (LOG_CRIT, "bjnp_send_read_request: ERROR - Could not send data!\n"));
errno = terrno;
return -1;
}
@@ -1338,7 +1433,7 @@ bjnp_recv_header (int devno, size_t *payload_size )
{
terrno = errno;
PDBG (bjnp_dbg (LOG_CRIT,
- "bjnp_recv_header: could not read response header (select): %s!\n",
+ "bjnp_recv_header: ERROR - could not read response header (select): %s!\n",
strerror (terrno)));
errno = terrno;
return SANE_STATUS_IO_ERROR;
@@ -1347,7 +1442,7 @@ bjnp_recv_header (int devno, size_t *payload_size )
{
terrno = errno;
PDBG (bjnp_dbg (LOG_CRIT,
- "bjnp_recv_header: could not read response header (select timed out)!\n" ) );
+ "bjnp_recv_header: ERROR - could not read response header (select timed out)!\n" ) );
errno = terrno;
return SANE_STATUS_IO_ERROR;
}
@@ -1360,12 +1455,18 @@ bjnp_recv_header (int devno, size_t *payload_size )
0)) != sizeof (struct BJNP_command))
{
terrno = errno;
- PDBG (bjnp_dbg (LOG_CRIT,
- "bjnp_recv_header: (recv) could not read response header, received %d bytes!\n",
+ if (recv_bytes == 0)
+ {
+ PDBG (bjnp_dbg (LOG_CRIT,
+ "bjnp_recv_header: ERROR - (recv) Scanner closed the TCP-connection!\n"));
+ } else {
+ PDBG (bjnp_dbg (LOG_CRIT,
+ "bjnp_recv_header: ERROR - (recv) could not read response header, received %d bytes!\n",
recv_bytes));
- PDBG (bjnp_dbg
- (LOG_CRIT, "bjnp_recv_header: (recv) error: %s!\n",
- strerror (terrno)));
+ PDBG (bjnp_dbg
+ (LOG_CRIT, "bjnp_recv_header: ERROR - (recv) error: %s!\n",
+ strerror (terrno)));
+ }
errno = terrno;
return SANE_STATUS_IO_ERROR;
}
@@ -1374,7 +1475,7 @@ bjnp_recv_header (int devno, size_t *payload_size )
{
PDBG (bjnp_dbg
(LOG_CRIT,
- "bjnp_recv_header:ERROR, Received response has cmd code %d, expected %d\n",
+ "bjnp_recv_header: ERROR - Received response has cmd code %d, expected %d\n",
resp_buf.cmd_code, device[devno].last_cmd));
return SANE_STATUS_IO_ERROR;
}
@@ -1383,17 +1484,17 @@ bjnp_recv_header (int devno, size_t *payload_size )
{
PDBG (bjnp_dbg
(LOG_CRIT,
- "bjnp_recv_header:ERROR, Received response has serial %d, expected %d\n",
+ "bjnp_recv_header: ERROR - Received response has serial %d, expected %d\n",
(int) ntohs (resp_buf.seq_no), (int) device[devno].serial));
return SANE_STATUS_IO_ERROR;
}
- /* got response header back, retrieve length of scanner data */
+ /* got response header back, retrieve length of payload */
*payload_size = ntohl (resp_buf.payload_len);
PDBG (bjnp_dbg
- (LOG_DEBUG, "TCP response header(scanner data = %ld bytes):\n",
+ (LOG_DEBUG, "bjnp_recv_header: TCP response header(payload data = %ld bytes):\n",
*payload_size) );
PDBG (bjnp_hexdump
(LOG_DEBUG2, (char *) &resp_buf, sizeof (struct BJNP_command)));
@@ -1401,7 +1502,7 @@ bjnp_recv_header (int devno, size_t *payload_size )
}
static int
-bjnp_init_device_structure(int dn, bjnp_sockaddr_t *sa )
+bjnp_init_device_structure(int dn, bjnp_sockaddr_t *sa, bjnp_protocol_defs_t *protocol_defs)
{
/* initialize device structure */
@@ -1413,6 +1514,8 @@ bjnp_init_device_structure(int dn, bjnp_sockaddr_t *sa )
device[dn].dialog = 0;
device[dn].status_key = 0;
#endif
+ device[dn].protocol = protocol_defs->protocol_version;
+ device[dn].protocol_string = protocol_defs->proto_string;
device[dn].tcp_socket = -1;
device[dn].addr = (bjnp_sockaddr_t *) malloc(sizeof ( bjnp_sockaddr_t) );
@@ -1424,14 +1527,14 @@ bjnp_init_device_structure(int dn, bjnp_sockaddr_t *sa )
device[dn].bjnp_timeout = 0;
device[dn].scanner_data_left = 0;
device[dn].last_cmd = 0;
- device[dn].blocksize = 2048; /* safe assumption, we start low */
+ device[dn].blocksize = BJNP_BLOCKSIZE_START;
device[dn].last_block = 0;
/* fill mac_address */
if (bjnp_get_scanner_mac_address(dn, device[dn].mac_address) != 0 )
{
PDBG (bjnp_dbg
- (LOG_CRIT, "Cannot read mac address, skipping this scanner\n" ) );
+ (LOG_CRIT, "bjnp_init_device_structure: Cannot read mac address, skipping this scanner\n" ) );
return -1;
}
return 0;
@@ -1449,11 +1552,12 @@ bjnp_free_device_structure( int dn)
}
static SANE_Status
-bjnp_recv_data (int devno, SANE_Byte * buffer, size_t * len)
+bjnp_recv_data (int devno, SANE_Byte * buffer, size_t start_pos, size_t * len)
{
/*
- * This function receives the responses to the write commands.
+ * This function receives the payload data.
* NOTE: len may not exceed SSIZE_MAX (as that is max for recv)
+ * len will be restricted to SSIZE_MAX to be sure
* Returns: number of bytes of payload received from device
*/
@@ -1465,13 +1569,28 @@ bjnp_recv_data (int devno, SANE_Byte * buffer, size_t * len)
int fd;
int attempt;
- PDBG (bjnp_dbg (LOG_DEBUG, "bjnp_recv_data: receiving response data\n"));
- fd = device[devno].tcp_socket;
-
PDBG (bjnp_dbg
- (LOG_DEBUG, "bjnp_recv_data: read response payload (%ld bytes max)\n",
- (unsigned long) *len));
+ (LOG_DEBUG, "bjnp_recv_data: read response payload (0x%lx bytes max), buffer: 0x%lx, start_pos: 0x%lx\n",
+ (long) *len, (long) buffer, (long) start_pos));
+
+ if (*len == 0)
+ {
+ /* nothing to do */
+ PDBG (bjnp_dbg
+ (LOG_DEBUG, "bjnp_recv_data: Nothing to do (%ld bytes requested)\n",
+ (long) *len));
+ return SANE_STATUS_GOOD;
+ }
+ else if ( *len > SSIZE_MAX )
+ {
+ PDBG (bjnp_dbg
+ (LOG_DEBUG, "bjnp_recv_data: WARNING - requested block size (%ld) exceeds maximum, setting to maximum %ld\n",
+ (long)*len, SSIZE_MAX));
+ *len = SSIZE_MAX;
+ }
+
+ fd = device[devno].tcp_socket;
attempt = 0;
do
{
@@ -1488,7 +1607,7 @@ bjnp_recv_data (int devno, SANE_Byte * buffer, size_t * len)
{
terrno = errno;
PDBG (bjnp_dbg (LOG_CRIT,
- "bjnp_recv_data: could not read response payload (select): %s!\n",
+ "bjnp_recv_data: ERROR - could not read response payload (select failed): %s!\n",
strerror (errno)));
errno = terrno;
*len = 0;
@@ -1498,24 +1617,23 @@ bjnp_recv_data (int devno, SANE_Byte * buffer, size_t * len)
{
terrno = errno;
PDBG (bjnp_dbg (LOG_CRIT,
- "bjnp_recv_data: could not read response payload (select timed out): %s!\n",
- strerror (terrno)));
+ "bjnp_recv_data: ERROR - could not read response payload (select timed out)!\n") );
errno = terrno;
*len = 0;
return SANE_STATUS_IO_ERROR;
}
- if ((recv_bytes = recv (fd, buffer, *len, 0)) < 0)
+ if ((recv_bytes = recv (fd, buffer + start_pos, *len, 0)) < 0)
{
terrno = errno;
PDBG (bjnp_dbg (LOG_CRIT,
- "bjnp_recv_data: could not read response payload (recv): %s!\n",
- strerror (errno)));
+ "bjnp_recv_data: ERROR - could not read response payload (%ld + %ld = %ld) (recv): %s!\n",
+ (long) buffer, (long) start_pos, (long) buffer + start_pos, strerror (errno)));
errno = terrno;
*len = 0;
return SANE_STATUS_IO_ERROR;
}
- PDBG (bjnp_dbg (LOG_DEBUG2, "Received TCP response payload (%ld bytes):\n",
+ PDBG (bjnp_dbg (LOG_DEBUG2, "bjnp_recv_data: Received TCP response payload (%ld bytes):\n",
(unsigned long) recv_bytes));
PDBG (bjnp_hexdump (LOG_DEBUG2, buffer, recv_bytes));
@@ -1531,6 +1649,7 @@ bjnp_allocate_device (SANE_String_Const devname,
char host[BJNP_HOST_MAX];
char port[BJNP_PORT_MAX] = "";
char args[BJNP_ARGS_MAX];
+ bjnp_protocol_defs_t *protocol_defs;
struct addrinfo *res, *cur;
struct addrinfo hints;
int result;
@@ -1547,22 +1666,22 @@ bjnp_allocate_device (SANE_String_Const devname,
{
PDBG (bjnp_dbg
(LOG_CRIT,
- "URI may not contain userid, password or aguments: %s\n",
+ "bjnp_allocate_device: ERROR - URI may not contain userid, password or aguments: %s\n",
devname));
return BJNP_STATUS_INVAL;
}
- if (strcmp (method, BJNP_METHOD) != 0)
+ if ( (protocol_defs = get_protocol_by_method(method)) == NULL)
{
PDBG (bjnp_dbg
- (LOG_CRIT, "URI %s contains invalid method: %s\n", devname,
+ (LOG_CRIT, "bjnp_allocate_device: ERROR - URI %s contains invalid method: %s\n", devname,
method));
return BJNP_STATUS_INVAL;
}
if (strlen(port) == 0)
{
- sprintf( port, "%d", BJNP_PORT_SCAN );
+ sprintf( port, "%d", protocol_defs->default_port );
}
hints.ai_flags = 0;
@@ -1581,7 +1700,7 @@ bjnp_allocate_device (SANE_String_Const devname,
result = getaddrinfo (host, port, &hints, &res );
if (result != 0 )
{
- PDBG (bjnp_dbg (LOG_CRIT, "Cannot resolve host: %s port %s\n", host, port));
+ PDBG (bjnp_dbg (LOG_CRIT, "bjnp_allocate_device: ERROR - Cannot resolve host: %s port %s\n", host, port));
return SANE_STATUS_INVAL;
}
@@ -1596,12 +1715,13 @@ bjnp_allocate_device (SANE_String_Const devname,
{
PDBG (bjnp_dbg
(LOG_CRIT,
- "Too many devices, ran out of device structures, can not add %s\n",
+ "bjnp_allocate_device: WARNING - Too many devices, ran out of device structures, can not add %s\n",
devname));
freeaddrinfo(res);
return BJNP_STATUS_INVAL;
}
- if (bjnp_init_device_structure( bjnp_no_devices, (bjnp_sockaddr_t *)cur -> ai_addr) != 0)
+ if (bjnp_init_device_structure( bjnp_no_devices, (bjnp_sockaddr_t *)cur -> ai_addr,
+ protocol_defs) != 0)
{
/* giving up on this address, try next one if any */
break;
@@ -1632,7 +1752,7 @@ bjnp_allocate_device (SANE_String_Const devname,
}
freeaddrinfo(res);
- PDBG (bjnp_dbg (LOG_INFO, "Scanner not yet in our list, added it: %s:%s\n", host, port));
+ PDBG (bjnp_dbg (LOG_INFO, "bjnp_allocate_device: Scanner not yet in our list, added it: %s:%s\n", host, port));
/* return hostname if required */
@@ -1670,7 +1790,7 @@ static void add_scanner(SANE_Int *dev_no,
case BJNP_STATUS_GOOD:
if (get_scanner_id (*dev_no, makemodel) != 0)
{
- PDBG (bjnp_dbg (LOG_CRIT, "Cannot read scanner make & model: %s\n",
+ PDBG (bjnp_dbg (LOG_CRIT, "add_scanner: ERROR - Cannot read scanner make & model: %s\n",
uri));
}
else
@@ -1682,15 +1802,17 @@ static void add_scanner(SANE_Int *dev_no,
determine_scanner_serial (scanner_host, device[*dev_no].mac_address, serial);
attach_bjnp (uri, makemodel,
serial, pixma_devices);
+ PDBG (bjnp_dbg (LOG_NOTICE, "add_scanner: New scanner at %s added!\n",
+ uri));
}
break;
case BJNP_STATUS_ALREADY_ALLOCATED:
- PDBG (bjnp_dbg (LOG_NOTICE, "Scanner at %s was added before, good!\n",
+ PDBG (bjnp_dbg (LOG_NOTICE, "add_scanner: Scanner at %s was added before, good!\n",
uri));
break;
case BJNP_STATUS_INVAL:
- PDBG (bjnp_dbg (LOG_NOTICE, "Scanner at %s can not be added\n",
+ PDBG (bjnp_dbg (LOG_NOTICE, "add_scanner: Scanner at %s can not be added\n",
uri));
break;
}
@@ -1738,6 +1860,7 @@ sanei_bjnp_find_devices (const char **conf_devices,
int socket_fd[BJNP_SOCK_MAX];
int no_sockets;
int i;
+ int j;
int attempt;
int last_socketfd = 0;
fd_set fdset;
@@ -1746,13 +1869,16 @@ sanei_bjnp_find_devices (const char **conf_devices,
char scanner_host[256];
char uri[256];
int dev_no;
+ int port;
bjnp_sockaddr_t broadcast_addr[BJNP_SOCK_MAX];
bjnp_sockaddr_t scanner_sa;
socklen_t socklen;
+ bjnp_protocol_defs_t *protocol_defs;
memset( broadcast_addr, 0, sizeof( broadcast_addr) );
memset( &scanner_sa, 0 ,sizeof( scanner_sa ) );
- PDBG (bjnp_dbg (LOG_INFO, "sanei_bjnp_find_devices:\n"));
+ PDBG (bjnp_dbg (LOG_INFO, "sanei_bjnp_find_devices, pixma backend version: %d.%d.%d\n",
+ PIXMA_VERSION_MAJOR, PIXMA_VERSION_MINOR, PIXMA_VERSION_BUILD));
bjnp_no_devices = 0;
for (i=0; i < BJNP_SOCK_MAX; i++)
@@ -1762,24 +1888,23 @@ sanei_bjnp_find_devices (const char **conf_devices,
/* First add devices from config file */
if (conf_devices[0] == NULL)
- PDBG (bjnp_dbg( LOG_DEBUG, "No devices specified in configuration file.\n" ) );
+ PDBG (bjnp_dbg( LOG_DEBUG, "sanei_bjnp_find_devices: No devices specified in configuration file.\n" ) );
for (i = 0; conf_devices[i] != NULL; i++)
{
PDBG (bjnp_dbg
- (LOG_DEBUG, "Adding scanner from pixma.conf: %s\n", conf_devices[i]));
+ (LOG_DEBUG, "sanei_bjnp_find_devices: Adding scanner from pixma.conf: %s\n", conf_devices[i]));
add_scanner(&dev_no, conf_devices[i], attach_bjnp, pixma_devices);
}
PDBG (bjnp_dbg
(LOG_DEBUG,
- "Added all configured scanners, now do auto detection...\n"));
+ "sanei_bjnp_find_devices: Added all configured scanners, now do auto detection...\n"));
/*
* Send UDP DISCOVER to discover scanners and return the list of scanners found
*/
FD_ZERO (&fdset);
- set_cmd (-1, &cmd, CMD_UDP_DISCOVER, 0);
no_sockets = 0;
#ifdef HAVE_IFADDRS_H
@@ -1824,7 +1949,7 @@ sanei_bjnp_find_devices (const char **conf_devices,
local.ipv4.sin_addr.s_addr = htonl (INADDR_ANY);
bc_addr.ipv4.sin_family = AF_INET;
- bc_addr.ipv4.sin_port = htons(BJNP_PORT_SCAN);
+ bc_addr.ipv4.sin_port = htons(0);
bc_addr.ipv4.sin_addr.s_addr = htonl (INADDR_BROADCAST);
socket_fd[no_sockets] = prepare_socket( "any_interface",
@@ -1866,7 +1991,14 @@ sanei_bjnp_find_devices (const char **conf_devices,
{
for ( i=0; i < no_sockets; i++)
{
- bjnp_send_broadcast ( socket_fd[i], &broadcast_addr[i], cmd, sizeof (cmd));
+ j = 0;
+ while(bjnp_protocol_defs[j].protocol_version != PROTOCOL_NONE)
+ {
+ set_cmd_from_string (bjnp_protocol_defs[j].proto_string, &cmd, CMD_UDP_DISCOVER, 0);
+ bjnp_send_broadcast ( socket_fd[i], &broadcast_addr[i],
+ bjnp_protocol_defs[j].default_port, cmd, sizeof (cmd));
+ j++;
+ }
}
/* wait for some time between broadcast packets */
usleep (BJNP_BROADCAST_INTERVAL * BJNP_USLEEP_MS);
@@ -1882,7 +2014,7 @@ sanei_bjnp_find_devices (const char **conf_devices,
while (select (last_socketfd + 1, &active_fdset, NULL, NULL, &timeout) > 0)
{
- PDBG (bjnp_dbg (LOG_DEBUG, "Select returned, time left %d.%d....\n",
+ PDBG (bjnp_dbg (LOG_DEBUG, "sanei_bjnp_find_devices: Select returned, time left %d.%d....\n",
(int) timeout.tv_sec, (int) timeout.tv_usec));
for (i = 0; i < no_sockets; i++)
{
@@ -1894,17 +2026,18 @@ sanei_bjnp_find_devices (const char **conf_devices,
&(scanner_sa.addr), &socklen ) ) == -1)
{
PDBG (bjnp_dbg
- (LOG_INFO, "find_devices: no data received"));
+ (LOG_INFO, "sanei_find_devices: no data received"));
break;
}
else
{
- PDBG (bjnp_dbg (LOG_DEBUG2, "Discover response:\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG2, "sanei_find_devices: Discover response:\n"));
PDBG (bjnp_hexdump (LOG_DEBUG2, &resp_buf, numbytes));
/* check if something sensible is returned */
+ protocol_defs = get_protocol_by_proto_string(disc_resp-> response.BJNP_id);
if ( (numbytes < (int)sizeof (struct BJNP_command)) ||
- (strncmp ("BJNP", disc_resp-> response.BJNP_id, 4) != 0))
+ (protocol_defs == NULL))
{
/* not a valid response, assume not a scanner */
@@ -1912,11 +2045,11 @@ sanei_bjnp_find_devices (const char **conf_devices,
strncpy(bjnp_id, disc_resp-> response.BJNP_id, 4);
bjnp_id[4] = '\0';
PDBG (bjnp_dbg (LOG_INFO,
- "Invalid discover response! Length = %d, Id = %s\n",
+ "sanei_find_devices: Invalid discover response! Length = %d, Id = %s\n",
numbytes, bjnp_id ) );
break;
}
- if ( ! ((disc_resp -> response.dev_type) & 0x80) )
+ if ( !(disc_resp -> response.dev_type & 0x80) )
{
/* not a response, a command from somebody else or */
/* a discover command that we generated */
@@ -1924,12 +2057,13 @@ sanei_bjnp_find_devices (const char **conf_devices,
}
};
+ port = get_port_from_sa(scanner_sa);
/* scanner found, get IP-address or hostname */
get_scanner_name( &scanner_sa, scanner_host);
/* construct URI */
- sprintf (uri, "%s://%s:%d", BJNP_METHOD, scanner_host,
- BJNP_PORT_SCAN);
+ sprintf (uri, "%s://%s:%d", protocol_defs->method_string, scanner_host,
+ port);
add_scanner( &dev_no, uri, attach_bjnp, pixma_devices);
@@ -1939,7 +2073,7 @@ sanei_bjnp_find_devices (const char **conf_devices,
timeout.tv_sec = 0;
timeout.tv_usec = BJNP_BC_RESPONSE_TIMEOUT * BJNP_USLEEP_MS;
}
- PDBG (bjnp_dbg (LOG_DEBUG, "scanner discovery finished...\n"));
+ PDBG (bjnp_dbg (LOG_DEBUG, "sanei_find_devices: scanner discovery finished...\n"));
for (i = 0; i < no_sockets; i++)
close (socket_fd[i]);
@@ -1977,10 +2111,10 @@ sanei_bjnp_open (SANE_String_Const devname, SANE_Int * dn)
PDBG (bjnp_dbg (LOG_INFO, "sanei_bjnp_open(%s, %d):\n", devname, *dn));
result = bjnp_allocate_device (devname, dn, NULL);
- if ( (result != BJNP_STATUS_GOOD) && (result != BJNP_STATUS_ALREADY_ALLOCATED ) )
+ if ( (result != BJNP_STATUS_GOOD) && (result != BJNP_STATUS_ALREADY_ALLOCATED ) ) {
return SANE_STATUS_INVAL;
-
- return sanei_bjnp_activate( *dn);;
+ }
+ return SANE_STATUS_GOOD;
}
/** Close a BJNP device.
@@ -1992,8 +2126,9 @@ void
sanei_bjnp_close (SANE_Int dn)
{
PDBG (bjnp_dbg (LOG_INFO, "sanei_bjnp_close(%d):\n", dn));
- sanei_bjnp_deactivate(dn);
+
device[dn].open = 0;
+ sanei_bjnp_deactivate(dn);
}
/** Activate BJNP device connection
@@ -2008,7 +2143,6 @@ sanei_bjnp_activate (SANE_Int dn)
char pid_str[64];
PDBG (bjnp_dbg (LOG_INFO, "sanei_bjnp_activate (%d)\n", dn));
-
gethostname (hostname, 256);
hostname[255] = '\0';
sprintf (pid_str, "Process ID = %d", getpid ());
@@ -2032,11 +2166,9 @@ SANE_Status
sanei_bjnp_deactivate (SANE_Int dn)
{
PDBG (bjnp_dbg (LOG_INFO, "sanei_bjnp_deactivate (%d)\n", dn));
-
- bjnp_finish_job (dn);
-
if ( device[dn].tcp_socket != -1)
{
+ bjnp_finish_job (dn);
close (device[dn].tcp_socket);
device[dn].tcp_socket = -1;
}
@@ -2079,12 +2211,13 @@ sanei_bjnp_read_bulk (SANE_Int dn, SANE_Byte * buffer, size_t * size)
SANE_Status result;
SANE_Status error;
size_t recvd;
- size_t more;
+ size_t read_size;
+ size_t read_size_max;
size_t requested;
PDBG (bjnp_dbg
- (LOG_INFO, "bjnp_read_bulk(%d, bufferptr, 0x%lx = %ld)\n", dn,
- (unsigned long) *size, (unsigned long) *size));
+ (LOG_INFO, "bjnp_read_bulk(dn=%d, bufferptr=%lx, 0x%lx = %ld)\n", dn,
+ (long) buffer, (unsigned long) *size, (unsigned long) *size));
recvd = 0;
requested = *size;
@@ -2095,20 +2228,21 @@ sanei_bjnp_read_bulk (SANE_Int dn, SANE_Byte * buffer, size_t * size)
(unsigned long) device[dn].scanner_data_left ) );
while ( (recvd < requested) && !( device[dn].last_block && (device[dn].scanner_data_left == 0)) )
-
{
PDBG (bjnp_dbg
(LOG_DEBUG,
- "Received 0x%lx = %ld bytes, backend requested 0x%lx = %ld bytes\n",
+ "bjnp_read_bulk: Already received 0x%lx = %ld bytes, backend requested 0x%lx = %ld bytes\n",
(unsigned long) recvd, (unsigned long) recvd,
(unsigned long) requested, (unsigned long)requested ));
+ /* Check first if there is data in flight from the scanner */
+
if (device[dn].scanner_data_left == 0)
{
- /* send new read request */
+ /* There is no data in flight from the scanner, send new read request */
PDBG (bjnp_dbg (LOG_DEBUG,
- "No (more) scanner data available, requesting more( blocksize = %ld =%lx\n",
+ "bjnp_read_bulk: No (more) scanner data available, requesting more( blocksize = %ld = %lx\n",
(long int) device[dn].blocksize, (long int) device[dn].blocksize ));
if ((error = bjnp_send_read_request (dn)) != SANE_STATUS_GOOD)
@@ -2133,43 +2267,40 @@ sanei_bjnp_read_bulk (SANE_Int dn, SANE_Byte * buffer, size_t * size)
device[dn].last_block = 1;
}
- if ( device[dn].scanner_data_left == 0 )
- {
- break;
- }
}
- PDBG (bjnp_dbg (LOG_DEBUG, "Scanner reports 0x%lx = %ld bytes available\n",
+ PDBG (bjnp_dbg (LOG_DEBUG, "bjnp_read_bulk: In flight: 0x%lx = %ld bytes available\n",
(unsigned long) device[dn].scanner_data_left,
(unsigned long) device[dn].scanner_data_left));
- /* read as many bytes as needed and available */
+ /* read as many bytes as needed and available */
- more = MIN( device[dn].scanner_data_left, (requested - recvd) );
+ read_size_max = MIN( device[dn].scanner_data_left, (requested - recvd) );
+ read_size = read_size_max;
PDBG (bjnp_dbg
(LOG_DEBUG,
- "reading 0x%lx = %ld (of max 0x%lx = %ld) bytes\n",
- (unsigned long) more,
- (unsigned long) more,
+ "bjnp_read_bulk: Try to read 0x%lx = %ld (of max 0x%lx = %ld) bytes\n",
+ (unsigned long) read_size_max,
+ (unsigned long) read_size_max,
(unsigned long) device[dn].scanner_data_left,
(unsigned long) device[dn].scanner_data_left) );
- result = bjnp_recv_data (dn, buffer + recvd, &more);
+ result = bjnp_recv_data (dn, buffer , recvd, &read_size);
if (result != SANE_STATUS_GOOD)
{
*size = recvd;
return SANE_STATUS_IO_ERROR;
}
- PDBG (bjnp_dbg (LOG_DEBUG, "Requested %ld bytes, received: %ld\n",
- MIN( device[dn].scanner_data_left, (requested - recvd) ), more) );
+ PDBG (bjnp_dbg (LOG_DEBUG, "bjnp_read_bulk: Expected at most %ld bytes, received this time: %ld\n",
+ read_size_max, read_size) );
- device[dn].scanner_data_left = device[dn].scanner_data_left - more;
- recvd = recvd + more;
+ device[dn].scanner_data_left = device[dn].scanner_data_left - read_size;
+ recvd = recvd + read_size;
}
- PDBG (bjnp_dbg (LOG_DEBUG, "returning %ld bytes, backend expexts %ld\n",
- recvd, *size ) );
+ PDBG (bjnp_dbg (LOG_DEBUG, "bjnp_read_bulk: %s: Returning %ld bytes, backend expexts %ld\n",
+ (recvd == *size)? "OK": "NOTICE",recvd, *size ) );
*size = recvd;
if ( *size == 0 )
return SANE_STATUS_EOF;
@@ -2199,51 +2330,50 @@ sanei_bjnp_write_bulk (SANE_Int dn, const SANE_Byte * buffer, size_t * size)
uint32_t buf;
size_t payload_size;
- PDBG (bjnp_dbg
- (LOG_INFO, "bjnp_write_bulk(%d, bufferptr, 0x%lx = %ld)\n", dn,
- (unsigned long) *size, (unsigned long) *size));
+ /* Write received data to scanner */
+
sent = bjnp_write (dn, buffer, *size);
if (sent < 0)
return SANE_STATUS_IO_ERROR;
if (sent != (int) *size)
{
PDBG (bjnp_dbg
- (LOG_CRIT, "Sent only %ld bytes to scanner, expected %ld!!\n",
+ (LOG_CRIT, "sanei_bjnp_write_bulk: ERROR - Sent only %ld bytes to scanner, expected %ld!!\n",
(unsigned long) sent, (unsigned long) *size));
return SANE_STATUS_IO_ERROR;
}
if (bjnp_recv_header (dn, &payload_size) != SANE_STATUS_GOOD)
{
- PDBG (bjnp_dbg (LOG_CRIT, "Could not read response to command!\n"));
+ PDBG (bjnp_dbg (LOG_CRIT, "sanei_bjnp_write_bulk: ERROR - Could not read response to command!\n"));
return SANE_STATUS_IO_ERROR;
}
if (payload_size != 4)
{
PDBG (bjnp_dbg (LOG_CRIT,
- "Scanner length of write confirmation = 0x%lx bytes = %ld, expected %d!!\n",
+ "sanei_bjnp_write_bulk: ERROR - Scanner length of write confirmation = 0x%lx bytes = %ld, expected %d!!\n",
(unsigned long) payload_size,
(unsigned long) payload_size, 4));
return SANE_STATUS_IO_ERROR;
}
recvd = payload_size;
- if ((bjnp_recv_data (dn, (unsigned char *) &buf, &recvd) !=
+ if ((bjnp_recv_data (dn, (unsigned char *) &buf, 0, &recvd) !=
SANE_STATUS_GOOD) || (recvd != payload_size))
{
PDBG (bjnp_dbg (LOG_CRIT,
- "Could not read length of data confirmed by device\n"));
+ "sanei_bjnp_write_bulk: ERROR - Could not read length of data confirmed by device\n"));
return SANE_STATUS_IO_ERROR;
}
recvd = ntohl (buf);
if (recvd != *size)
{
PDBG (bjnp_dbg
- (LOG_CRIT, "Scanner confirmed %ld bytes, expected %ld!!\n",
+ (LOG_CRIT, "sanei_bjnp_write_bulk: ERROR - Scanner confirmed %ld bytes, expected %ld!!\n",
(unsigned long) recvd, (unsigned long) *size));
return SANE_STATUS_IO_ERROR;
}
- /* we can expect data from the scanner again */
+ /* we can expect data from the scanner */
device[dn].last_block = 0;
@@ -2304,13 +2434,15 @@ sanei_bjnp_read_int (SANE_Int dn, SANE_Byte * buffer, size_t * size)
if ( (bjnp_poll_scanner (dn, 0, hostname, getusername (), buffer, *size ) != 0) ||
(bjnp_poll_scanner (dn, 1, hostname, getusername (), buffer, *size ) != 0) )
{
- PDBG (bjnp_dbg (LOG_NOTICE, "Failed to setup read_intr dialog with device!\n"));
+ PDBG (bjnp_dbg (LOG_NOTICE, "bjnp_read_int: WARNING - Failed to setup read_intr dialog with device!\n"));
device[dn].dialog = 0;
device[dn].status_key = 0;
return SANE_STATUS_IO_ERROR;
}
device[dn].polling_status = BJNP_POLL_STARTED;
+ /* fall through to BJNP_POLL_STARTED */
+
case BJNP_POLL_STARTED:
/* we use only seonds accuracy between poll attempts */
timeout = device[dn].bjnp_timeout /1000;
@@ -2319,7 +2451,7 @@ sanei_bjnp_read_int (SANE_Int dn, SANE_Byte * buffer, size_t * size)
{
if ( (resp_len = bjnp_poll_scanner (dn, 2, hostname, getusername (), buffer, *size ) ) < 0 )
{
- PDBG (bjnp_dbg (LOG_NOTICE, "Restarting polling dialog!\n"));
+ PDBG (bjnp_dbg (LOG_NOTICE, "bjnp_read_int: Restarting polling dialog!\n"));
device[dn].polling_status = BJNP_POLL_STOPPED;
*size = 0;
return SANE_STATUS_EOF;
@@ -2332,8 +2464,11 @@ sanei_bjnp_read_int (SANE_Int dn, SANE_Byte * buffer, size_t * size)
/* this is a bit of a hack, but the scanner does not like */
/* us to continue using the existing tcp socket */
+ /* No longer required? Does not work anymore now we moved code from sanei_bjnp_activate/sanei_bjnp_deactivate
+ to the isanei_bjnp_open and sanei_bjnp_close
sanei_bjnp_deactivate(dn);
sanei_bjnp_activate(dn);
+ */
return SANE_STATUS_GOOD;
}
@@ -2345,7 +2480,7 @@ sanei_bjnp_read_int (SANE_Int dn, SANE_Byte * buffer, size_t * size)
case BJNP_POLL_STATUS_RECEIVED:
if ( (resp_len = bjnp_poll_scanner (dn, 5, hostname, getusername (), buffer, *size ) ) < 0 )
{
- PDBG (bjnp_dbg (LOG_NOTICE, "Restarting polling dialog!\n"));
+ PDBG (bjnp_dbg (LOG_NOTICE, "bjnp_read_int: Restarting polling dialog!\n"));
device[dn].polling_status = BJNP_POLL_STOPPED;
*size = 0;
break;
diff --git a/backend/pixma_bjnp.h b/backend/pixma_bjnp.h
index e2939d7..3770bfd 100644
--- a/backend/pixma_bjnp.h
+++ b/backend/pixma_bjnp.h
@@ -96,7 +96,7 @@ sanei_bjnp_find_devices (const char **conf_devices,
* Where:
* method = bjnp
* hostname = resolvable name or IP-address
- * port = 8612 for a scanner
+ * port = 8612 for a bjnp scanner, 8610 for a mfnp device
* An example could look like this: bjnp://host.domain:8612
*
* @param devname name of the device to open
diff --git a/backend/pixma_bjnp_private.h b/backend/pixma_bjnp_private.h
index 859baa5..1902c7a 100644
--- a/backend/pixma_bjnp_private.h
+++ b/backend/pixma_bjnp_private.h
@@ -75,6 +75,7 @@
#define BJNP_SERIAL_MAX 16 /* maximum length of serial number */
#define BJNP_NO_DEVICES 16 /* max number of open devices */
#define BJNP_SCAN_BUF_MAX 65536 /* size of scanner data intermediate buffer */
+#define BJNP_BLOCKSIZE_START 512 /* startsize for last block detection */
/* timers */
#define BJNP_BROADCAST_INTERVAL 10 /* ms between broadcasts */
@@ -109,15 +110,34 @@
/* port numbers */
typedef enum bjnp_port_e
{
- BJNP_PORT_BROADCAST_BASE = 8610,
+ MFNP_PORT_SCAN = 8610,
BJNP_PORT_PRINT = 8611,
BJNP_PORT_SCAN = 8612,
BJNP_PORT_3 = 8613,
BJNP_PORT_4 = 8614
} bjnp_port_t;
-#define BJNP_METHOD "bjnp"
-#define BJNP_STRING "BJNP"
+typedef enum
+{
+ PROTOCOL_BJNP = 0,
+ PROTOCOL_MFNP = 1,
+ PROTOCOL_NONE =2
+} bjnp_protocol_t;
+
+typedef struct
+{
+ bjnp_protocol_t protocol_version;
+ int default_port;
+ char * proto_string;
+ char * method_string;
+} bjnp_protocol_defs_t;
+
+bjnp_protocol_defs_t bjnp_protocol_defs[] =
+{
+ {PROTOCOL_BJNP, BJNP_PORT_SCAN,"BJNP", "bjnp"},
+ {PROTOCOL_MFNP, MFNP_PORT_SCAN,"MFNP", "mfnp"},
+ {PROTOCOL_NONE, -1, NULL, NULL}
+};
/* commands */
typedef enum bjnp_cmd_e
@@ -168,7 +188,7 @@ struct __attribute__ ((__packed__)) DISCOVER_RESPONSE
struct BJNP_command response; /* reponse header */
char unknown1[4]; /* 00 01 08 00 */
char mac_len; /* length of mac address */
- char addr_len; /* length od address field */
+ char addr_len; /* length of address field */
unsigned char mac_addr[6]; /* printers mac address */
union {
struct __attribute__ ((__packed__)) {
@@ -251,8 +271,18 @@ struct __attribute__ ((__packed__)) POLL_RESPONSE
struct __attribute__ ((__packed__)) IDENTITY
{
struct BJNP_command cmd;
- uint16_t id_len; /* length of identity */
- char id[BJNP_IEEE1284_MAX]; /* identity */
+ union __attribute__ ((__packed__))
+ {
+ struct __attribute__ ((__packed__)) payload_s
+ {
+ uint16_t id_len; /* length of identity */
+ char id[BJNP_IEEE1284_MAX]; /* identity */
+ } bjnp;
+ struct __attribute__ ((__packed__)) mfnp
+ {
+ char id[BJNP_IEEE1284_MAX];
+ } mfnp;
+ } payload;
};
@@ -314,6 +344,10 @@ typedef enum
typedef struct device_s
{
int open; /* connection to scanner is opened */
+
+ /* protocol version */
+ int protocol;
+ char *protocol_string;
/* sockets */
diff --git a/backend/pixma_common.c b/backend/pixma_common.c
index b417d07..9d41f7a 100644
--- a/backend/pixma_common.c
+++ b/backend/pixma_common.c
@@ -1,8 +1,8 @@
/* SANE - Scanner Access Now Easy.
+ Copyright (C) 2011-2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 2007-2008 Nicolas Martin, <nicols-guest at alioth dot debian dot org>
Copyright (C) 2006-2007 Wittawat Yamwong <wittawat@web.de>
- Copyright (C) 2011-2013 Rolf Bensch <rolf at bensch hyphen online dot de>
This file is part of the SANE package.
@@ -318,7 +318,7 @@ pixma_get_time (time_t * sec, uint32_t * usec)
uint8_t *
pixma_r_to_ir (uint8_t * gptr, uint8_t * sptr, unsigned w, unsigned c)
{
- unsigned i, j, g;
+ unsigned i;
/* PDBG (pixma_dbg (4, "*pixma_rgb_to_ir*****\n")); */
@@ -383,7 +383,7 @@ pixma_binarize_line(pixma_scan_param_t * sp, uint8_t * dst, uint8_t * src, unsig
unsigned char mask;
uint8_t min, max;
- /* PDBG (pixma_dbg (4, "*pixma_binarize_line***** src = %u, dst = %u, width = %u, c = %u, threshold = %u, thershold_curve = %u *****\n",
+ /* PDBG (pixma_dbg (4, "*pixma_binarize_line***** src = %u, dst = %u, width = %u, c = %u, threshold = %u, threshold_curve = %u *****\n",
src, dst, width, c, sp->threshold, sp->threshold_curve)); */
/* 16 bit grayscale not supported */
@@ -655,7 +655,10 @@ pixma_cmd_transaction (pixma_t * s, const void *cmd, unsigned cmdlen,
{
error = pixma_read (s->io, data, expected_len);
if (error == PIXMA_ETIMEDOUT)
+ {
PDBG (pixma_dbg (2, "No response yet. Timed out in %d sec.\n", tmo));
+ pixma_sleep (1000000); /* 1s timeout */
+ }
}
while (error == PIXMA_ETIMEDOUT && --tmo != 0);
if (error < 0)
@@ -1048,9 +1051,11 @@ pixma_check_scan_param (pixma_t * s, pixma_scan_param_t * sp)
if (s->ops->check_param (s, sp) < 0)
return PIXMA_EINVAL;
- /* FIXME: I assume the same minimum width and height for every model. */
- CLAMP2 (sp->x, sp->w, 13, s->cfg->width, sp->xdpi);
- CLAMP2 (sp->y, sp->h, 8, s->cfg->height, sp->ydpi);
+ /* FIXME: I assume the same minimum width and height for every model.
+ * new scanners need minimum 16 px height
+ * minimum image size: 16 px x 16 px */
+ CLAMP2 (sp->x, sp->w, 16, s->cfg->width, sp->xdpi);
+ CLAMP2 (sp->y, sp->h, 16, s->cfg->height, sp->ydpi);
switch (sp->source)
{
diff --git a/backend/pixma_common.h b/backend/pixma_common.h
index 86d459f..dbaa23f 100644
--- a/backend/pixma_common.h
+++ b/backend/pixma_common.h
@@ -1,7 +1,7 @@
/* SANE - Scanner Access Now Easy.
+ Copyright (C) 2011-2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 2006-2007 Wittawat Yamwong <wittawat@web.de>
- Copyright (C) 2011-2013 Rolf Bensch <rolf at bensch hyphen online dot de>
This file is part of the SANE package.
@@ -147,7 +147,7 @@ struct pixma_scan_ops_t
* -# Fill the buffer pointed by ib->wptr directly and leave
* ib->rptr and ib->rend untouched. The length of the buffer is
* ib->wend - ib->wptr. It must update ib->wptr accordingly.
- * -# Update ib->rptr and ib->rend to point to the the beginning and
+ * -# Update ib->rptr and ib->rend to point to the beginning and
* the end of the internal buffer resp. The length of the buffer
* is ib->rend - ib->rptr. This function is called again if
* and only if pixma_read_image() has copied the whole buffer.
diff --git a/backend/pixma_imageclass.c b/backend/pixma_imageclass.c
index c0287a3..b2d45ee 100644
--- a/backend/pixma_imageclass.c
+++ b/backend/pixma_imageclass.c
@@ -1,8 +1,8 @@
/* SANE - Scanner Access Now Easy.
+ Copyright (C) 2011-2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 2007-2009 Nicolas Martin, <nicols-guest at alioth dot debian dot org>
Copyright (C) 2008 Dennis Lou, dlou 99 at yahoo dot com
- Copyright (C) 2011-2013 Rolf Bensch <rolf at bensch hyphen online dot de>
This file is part of the SANE package.
@@ -64,24 +64,30 @@
# define UNUSED(v)
#endif
-#define IMAGE_BLOCK_SIZE (0xffff)
+#define IMAGE_BLOCK_SIZE (0x80000)
#define MAX_CHUNK_SIZE (0x1000)
#define MIN_CHUNK_SIZE (0x0200)
#define CMDBUF_SIZE 512
-#define MF4200_PID 0x26b5
#define MF4100_PID 0x26a3
#define MF4600_PID 0x26b0
#define MF4010_PID 0x26b4
+#define MF4200_PID 0x26b5
#define MF4360_PID 0x26ec
#define D480_PID 0x26ed
#define MF4320_PID 0x26ee
#define D420_PID 0x26ef
#define MF3200_PID 0x2684
#define MF6500_PID 0x2686
+/* generation 2 scanners (>=0x2707) */
+#define MF8300_PID 0x2708
+#define MF4500_PID 0x2736
#define MF4410_PID 0x2737
#define MF3010_PID 0x2759
-#define MF4770_PID 0x2774
+#define MF4570_PID 0x275a
+#define MF4800_PID 0x2773
+#define MF4700_PID 0x2774
+#define MF8200_PID 0x2779
/* the following are all untested */
#define MF5630_PID 0x264e
#define MF5650_PID 0x264f
@@ -89,9 +95,14 @@
#define MF5880_PID 0x26f9
#define MF6680_PID 0x26fa
#define MF8030_PID 0x2707
-#define MF4550_PID 0x2736
-#define MF4570_PID 0x275a
#define IR1133_PID 0x2742
+#define MF5900_PID 0x2743
+#define D530_PID 0x2775
+#define MF8500_PID 0x277a
+#define MF6100_PID 0x278e
+#define MF820_PID 0x27a6
+#define MF220_PID 0x27a8
+#define MF210_PID 0x27a9
enum iclass_state_t
@@ -198,6 +209,7 @@ activate (pixma_t * s, uint8_t x)
case D420_PID:
case MF4360_PID:
case MF4100_PID:
+ case MF8300_PID:
return iclass_exec (s, &mf->cb, 1);
break;
default:
@@ -229,6 +241,7 @@ select_source (pixma_t * s)
case D420_PID:
case MF4360_PID:
case MF4100_PID:
+ case MF8300_PID:
return iclass_exec (s, &mf->cb, 0);
break;
default:
@@ -263,6 +276,7 @@ send_scan_param (pixma_t * s)
case D420_PID:
case MF4360_PID:
case MF4100_PID:
+ case MF8300_PID:
return iclass_exec (s, &mf->cb, 0);
break;
default:
@@ -280,16 +294,10 @@ request_image_block (pixma_t * s, unsigned flag, uint8_t * info,
const int hlen = 2 + 6;
memset (mf->cb.buf, 0, 11);
- pixma_set_be16 (((s->cfg->pid == MF3010_PID ||
- s->cfg->pid == MF4410_PID ||
- s->cfg->pid == MF4770_PID ||
- s->cfg->pid == MF4550_PID) ? cmd_read_image2 : cmd_read_image), mf->cb.buf);
+ pixma_set_be16 (((mf->generation >= 2) ? cmd_read_image2 : cmd_read_image), mf->cb.buf);
mf->cb.buf[8] = flag;
mf->cb.buf[10] = 0x06;
- expected_len = (s->cfg->pid == MF3010_PID ||
- s->cfg->pid == MF4410_PID ||
- s->cfg->pid == MF4770_PID ||
- s->cfg->pid == MF4550_PID ||
+ expected_len = (mf->generation >= 2 ||
s->cfg->pid == MF4600_PID ||
s->cfg->pid == MF6500_PID ||
s->cfg->pid == MF8030_PID) ? 512 : hlen;
@@ -300,10 +308,7 @@ request_image_block (pixma_t * s, unsigned flag, uint8_t * info,
*size = pixma_get_be16 (mf->cb.buf + 6); /* 16bit size */
error = 0;
- if (s->cfg->pid == MF3010_PID ||
- s->cfg->pid == MF4410_PID ||
- s->cfg->pid == MF4770_PID ||
- s->cfg->pid == MF4550_PID ||
+ if (mf->generation >= 2 ||
s->cfg->pid == MF4600_PID ||
s->cfg->pid == MF6500_PID ||
s->cfg->pid == MF8030_PID)
@@ -312,6 +317,7 @@ request_image_block (pixma_t * s, unsigned flag, uint8_t * info,
*size = (*datalen + hlen == 512) ? pixma_get_be32 (mf->cb.buf + 4) - *datalen : 0;
memcpy (data, mf->cb.buf + hlen, *datalen);
}
+ PDBG (pixma_dbg (11, "*request_image_block***** size = %u *****\n", *size));
}
else
{
@@ -323,13 +329,11 @@ request_image_block (pixma_t * s, unsigned flag, uint8_t * info,
static int
read_image_block (pixma_t * s, uint8_t * data, unsigned size)
{
+ iclass_t *mf = (iclass_t *) s->subdriver;
int error;
unsigned maxchunksize, chunksize, count = 0;
- maxchunksize = MAX_CHUNK_SIZE * ((s->cfg->pid == MF3010_PID ||
- s->cfg->pid == MF4410_PID ||
- s->cfg->pid == MF4770_PID ||
- s->cfg->pid == MF4550_PID ||
+ maxchunksize = MAX_CHUNK_SIZE * ((mf->generation >= 2 ||
s->cfg->pid == MF4600_PID ||
s->cfg->pid == MF6500_PID ||
s->cfg->pid == MF8030_PID) ? 4 : 1);
@@ -369,6 +373,7 @@ read_error_info (pixma_t * s, void *buf, unsigned size)
case D420_PID:
case MF4360_PID:
case MF4100_PID:
+ case MF8300_PID:
error = iclass_exec (s, &mf->cb, 0);
break;
default:
@@ -513,8 +518,8 @@ iclass_check_param (pixma_t * s, pixma_scan_param_t * sp)
/* Some exceptions here for particular devices */
/* Those devices can scan up to Legal 14" with ADF, but A4 11.7" in flatbed */
- if (sp->source == PIXMA_SOURCE_FLATBED
- && ( s->cfg->pid == MF4770_PID ))
+ /* PIXMA_CAP_ADF also works for PIXMA_CAP_ADFDUP */
+ if ((s->cfg->cap & PIXMA_CAP_ADF) && sp->source == PIXMA_SOURCE_FLATBED)
sp->h = MIN (sp->h, 877 * sp->xdpi / 75);
return 0;
@@ -651,10 +656,7 @@ iclass_fill_buffer (pixma_t * s, pixma_imagebuf_t * ib)
if (n != 0)
{
if (s->param->channels != 1 &&
- s->cfg->pid != MF3010_PID &&
- s->cfg->pid != MF4410_PID &&
- s->cfg->pid != MF4770_PID &&
- s->cfg->pid != MF4550_PID &&
+ mf->generation == 1 &&
s->cfg->pid != MF4600_PID &&
s->cfg->pid != MF6500_PID &&
s->cfg->pid != MF8030_PID)
@@ -706,10 +708,15 @@ iclass_finish_scan (pixma_t * s)
activate (s, 0);
query_status (s);
}
- /* 0x38 = last block and ADF empty
- * 0x28 = last block and Paper in ADF */
- if (mf->last_block==0x38 /* ADF empty */
- || (mf->generation == 1 && mf->last_block == 0x28)) /* generation 1 scanner or Paper in ADF */
+ /* generation = 1:
+ * 0x28 = last block (no multi page scan)
+ * generation >= 2:
+ * 0x38 = last block and ADF empty (generation >= 2)
+ * 0x28 = last block and Paper in ADF (multi page scan)
+ * some generation 2 scanners don't use 0x38 for ADF empty => check status */
+ if (mf->last_block==0x38 /* generation 2 scanner ADF empty */
+ || (mf->generation == 1 && mf->last_block == 0x28) /* generation 1 scanner last block */
+ || (mf->generation >= 2 && !has_paper(s))) /* check status: no paper in ADF */
{
PDBG (pixma_dbg (3, "*iclass_finish_scan***** abort session *****\n"));
abort_session (s);
@@ -759,41 +766,52 @@ static const pixma_scan_ops_t pixma_iclass_ops = {
iclass_get_status
};
-#define DEV(name, model, pid, dpi, w, h, cap) { \
+#define DEV(name, model, pid, dpi, adftpu_max_dpi, w, h, cap) { \
name, /* name */ \
model, /* model */ \
0x04a9, pid, /* vid pid */ \
1, /* iface */ \
&pixma_iclass_ops, /* ops */ \
dpi, dpi, /* xdpi, ydpi */ \
- 0, 0, /* adftpu_min_dpi & adftpu_max_dpi not used in this subdriver */ \
+ 0, /* adftpu_min_dpi not used in this subdriver */ \
+ adftpu_max_dpi, /* adftpu_max_dpi */ \
0, 0, /* tpuir_min_dpi & tpuir_max_dpi not used in this subdriver */ \
w, h, /* width, height */ \
PIXMA_CAP_GRAY|PIXMA_CAP_EVENTS|cap \
}
const pixma_config_t pixma_iclass_devices[] = {
- DEV ("Canon imageCLASS MF4270", "MF4270", MF4200_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon imageCLASS MF4150", "MF4100", MF4100_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon imageCLASS MF4690", "MF4690", MF4600_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon imageCLASS D420", "D420", D420_PID, 600, 640, 877, PIXMA_CAP_ADFDUP),
- DEV ("Canon imageCLASS D480", "D480", D480_PID, 600, 640, 877, PIXMA_CAP_ADFDUP),
- DEV ("Canon imageCLASS MF4360", "MF4360", MF4360_PID, 600, 640, 877, PIXMA_CAP_ADFDUP),
- DEV ("Canon imageCLASS MF4320", "MF4320", MF4320_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon imageCLASS MF4010", "MF4010", MF4010_PID, 600, 640, 877, 0),
- DEV ("Canon imageCLASS MF3240", "MF3240", MF3200_PID, 600, 640, 877, 0),
- DEV ("Canon imageClass MF6500", "MF6500", MF6500_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon imageCLASS MF4410", "MF4410", MF4410_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon i-SENSYS MF4550d", "MF4550", MF4550_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon i-SENSYS MF3010", "MF3010", MF3010_PID, 600, 640, 877, 0),
- DEV ("Canon imageCLASS MF4770n", "MF4770", MF4770_PID, 600, 640, 1050, PIXMA_CAP_ADF),
+ DEV ("Canon imageCLASS MF4270", "MF4270", MF4200_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon imageCLASS MF4150", "MF4100", MF4100_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon imageCLASS MF4690", "MF4690", MF4600_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon imageCLASS D420", "D420", D420_PID, 600, 0, 640, 877, PIXMA_CAP_ADFDUP),
+ DEV ("Canon imageCLASS D480", "D480", D480_PID, 600, 0, 640, 877, PIXMA_CAP_ADFDUP),
+ DEV ("Canon imageCLASS MF4360", "MF4360", MF4360_PID, 600, 0, 640, 877, PIXMA_CAP_ADFDUP),
+ DEV ("Canon imageCLASS MF4320", "MF4320", MF4320_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon imageCLASS MF4010", "MF4010", MF4010_PID, 600, 0, 640, 877, 0),
+ DEV ("Canon imageCLASS MF3240", "MF3240", MF3200_PID, 600, 0, 640, 877, 0),
+ DEV ("Canon imageClass MF6500", "MF6500", MF6500_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon imageCLASS MF4410", "MF4410", MF4410_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon i-SENSYS MF4500 Series", "MF4500", MF4500_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon i-SENSYS MF3010", "MF3010", MF3010_PID, 600, 0, 640, 877, 0),
+ DEV ("Canon i-SENSYS MF4700 Series", "MF4700", MF4700_PID, 600, 0, 640, 1050, PIXMA_CAP_ADF),
+ DEV ("Canon i-SENSYS MF4800 Series", "MF4800", MF4800_PID, 600, 0, 640, 1050, PIXMA_CAP_ADF),
+ DEV ("Canon imageCLASS MF4570dw", "MF4570dw", MF4570_PID, 600, 0, 640, 877, 0),
+ DEV ("Canon i-SENSYS MF8200C Series", "MF8200C", MF8200_PID, 600, 300, 640, 1050, PIXMA_CAP_ADF),
+ DEV ("Canon i-SENSYS MF8300 Series", "MF8300", MF8300_PID, 600, 0, 640, 1050, PIXMA_CAP_ADF),
+ DEV ("Canon imageCLASS D530", "D530", D530_PID, 600, 0, 640, 877, 0),
/* FIXME: the following capabilities all need updating/verifying */
- DEV ("Canon imageCLASS MF5630", "MF5630", MF5630_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon laserBase MF5650", "MF5650", MF5650_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon imageCLASS MF8170c", "MF8170c", MF8100_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon imageClass MF8030", "MF8030", MF8030_PID, 600, 640, 877, PIXMA_CAP_ADF),
- DEV ("Canon i-SENSYS MF5880dn", "MF5880", MF5880_PID, 600, 640, 877, PIXMA_CAP_ADFDUP),
- DEV ("Canon i-SENSYS MF6680dn", "MF6680", MF6680_PID, 600, 640, 877, PIXMA_CAP_ADFDUP),
- DEV ("Canon imageCLASS MF4570dw", "MF4570dw", MF4570_PID, 600, 640, 877, 0),
- DEV ("Canon imageRUNNER 1133", "iR1133", IR1133_PID, 600, 637, 877, PIXMA_CAP_ADFDUP),
- DEV (NULL, NULL, 0, 0, 0, 0, 0)
+ DEV ("Canon imageCLASS MF5630", "MF5630", MF5630_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon laserBase MF5650", "MF5650", MF5650_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon imageCLASS MF8170c", "MF8170c", MF8100_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon imageClass MF8030", "MF8030", MF8030_PID, 600, 0, 640, 877, PIXMA_CAP_ADF),
+ DEV ("Canon i-SENSYS MF5880dn", "MF5880", MF5880_PID, 600, 0, 640, 877, PIXMA_CAP_ADFDUP),
+ DEV ("Canon i-SENSYS MF6680dn", "MF6680", MF6680_PID, 600, 0, 640, 877, PIXMA_CAP_ADFDUP),
+ DEV ("Canon imageRUNNER 1133", "iR1133", IR1133_PID, 600, 0, 637, 877, PIXMA_CAP_ADFDUP),
+ DEV ("Canon i-SENSYS MF5900 Series", "MF5900", MF5900_PID, 600, 0, 640, 1050, PIXMA_CAP_ADFDUP),
+ DEV ("Canon i-SENSYS MF8500C Series", "MF8500C", MF8500_PID, 600, 0, 640, 1050, PIXMA_CAP_ADFDUP),
+ DEV ("Canon i-SENSYS MF6100 Series", "MF6100", MF6100_PID, 600, 0, 640, 1050, PIXMA_CAP_ADFDUP),
+ DEV ("Canon imageClass MF810/820", "MF810/820", MF820_PID, 600, 0, 640, 1050, PIXMA_CAP_ADFDUP),
+ DEV ("Canon i-SENSYS MF220 Series", "MF220", MF220_PID, 600, 0, 640, 1050, PIXMA_CAP_ADFDUP),
+ DEV ("Canon i-SENSYS MF210 Series", "MF210", MF210_PID, 600, 0, 640, 1050, PIXMA_CAP_ADF),
+ DEV (NULL, NULL, 0, 0, 0, 0, 0, 0)
};
diff --git a/backend/pixma_io_sanei.c b/backend/pixma_io_sanei.c
index b25c7eb..9e4a2fa 100644
--- a/backend/pixma_io_sanei.c
+++ b/backend/pixma_io_sanei.c
@@ -1,8 +1,8 @@
/* SANE - Scanner Access Now Easy.
* For limitations, see function sanei_usb_get_vendor_product().
+ Copyright (C) 2011-2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 2006-2007 Wittawat Yamwong <wittawat@web.de>
- Copyright (C) 2011-2013 Rolf Bensch <rolf at bensch hyphen online dot de>
This file is part of the SANE package.
@@ -575,7 +575,8 @@ pixma_wait_interrupt (pixma_io_t * io, void *buf, unsigned size, int timeout)
#endif
error = map_error (sanei_usb_read_int (io->dev, buf, &count));
}
- if (error == PIXMA_EIO || error == PIXMA_EOF)
+ if (error == PIXMA_EIO ||
+ (io->interface == INT_BJNP && error == PIXMA_EOF)) /* EOF is a bjnp timeout error! */
error = PIXMA_ETIMEDOUT; /* FIXME: SANE doesn't have ETIMEDOUT!! */
if (error == 0)
error = count;
diff --git a/backend/pixma_mp150.c b/backend/pixma_mp150.c
index e29dccd..4f8b232 100644
--- a/backend/pixma_mp150.c
+++ b/backend/pixma_mp150.c
@@ -1,8 +1,8 @@
/* SANE - Scanner Access Now Easy.
+ Copyright (C) 2011-2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 2007-2009 Nicolas Martin, <nicols-guest at alioth dot debian dot org>
Copyright (C) 2006-2007 Wittawat Yamwong <wittawat@web.de>
- Copyright (C) 2011-2013 Rolf Bensch <rolf at bensch hyphen online dot de>
This file is part of the SANE package.
@@ -209,6 +209,26 @@
#define MG5500_PID 0x1771
#define MG7100_PID 0x1772
+/* 2014 new devices (untested) */
+#define MX470_PID 0x1774
+#define MX530_PID 0x1775
+#define MB5000_PID 0x1776
+#define MB5300_PID 0x1777
+#define MB2000_PID 0x1778
+#define MB2300_PID 0x1779
+#define E400_PID 0x177a
+#define E560_PID 0x177b
+#define MG7500_PID 0x177c
+#define MG6600_PID 0x177e
+#define MG5600_PID 0x177f
+#define MG2900_PID 0x1780
+#define E460_PID 0x1788
+
+/* 2015 new devices (untested) */
+#define MX490_PID 0x1787
+#define E480_PID 0x1789
+#define MG3600_PID 0x178a
+
/* Generation 4 XML messages that encapsulates the Pixma protocol messages */
#define XML_START_1 \
@@ -284,6 +304,7 @@ typedef struct mp150_t
unsigned stripe_shift;
uint8_t tpu_datalen;
uint8_t tpu_data[0x40];
+ uint8_t adf_state; /* handle adf scanning */
} mp150_t;
/*
@@ -420,7 +441,7 @@ is_calibrated (pixma_t * s)
mp150_t *mp = (mp150_t *) s->subdriver;
if (mp->generation >= 3)
{
- return ((mp->current_status[0] & 0x01) == 1);
+ return ((mp->current_status[0] & 0x01) == 1 || (mp->current_status[0] & 0x02) == 2);
}
if (mp->generation == 1)
{
@@ -454,6 +475,7 @@ static int
abort_session (pixma_t * s)
{
mp150_t *mp = (mp150_t *) s->subdriver;
+ mp->adf_state = state_idle; /* reset adf scanning */
return pixma_exec_short_cmd (s, &mp->cb, cmd_abort_session);
}
@@ -630,10 +652,14 @@ calc_shifting (pixma_t * s)
/* If stripes shift needed (CCD devices), how many pixels shift */
mp->stripe_shift = 0;
+ /* If color plane shift (CCD devices), how many pixels shift */
+ mp->color_shift = mp->shift[0] = mp->shift[1] = mp->shift[2] = 0;
+
switch (s->cfg->pid)
{
case MP800_PID:
case MP800R_PID:
+ case MP830_PID:
if (s->param->xdpi == 2400)
{
if (is_scanning_from_tpu(s))
@@ -641,35 +667,15 @@ calc_shifting (pixma_t * s)
else
mp->stripe_shift = 3;
}
- break;
-
- case MP830_PID:
- if (s->param->xdpi == 2400)
+ if (s->param->ydpi > 75)
{
- if (is_scanning_from_tpu(s))
- mp->stripe_shift = 6;
- else
- mp->stripe_shift = 3;
- }
- break;
-
- default: /* Default, and all CIS devices */
- break;
- }
- /* If color plane shift (CCD devices), how many pixels shift */
- mp->color_shift = mp->shift[0] = mp->shift[1] = mp->shift[2] = 0;
- if (s->param->ydpi > 75)
- {
- switch (s->cfg->pid)
- {
- case MP800_PID:
- case MP800R_PID:
- case MP830_PID:
mp->color_shift = s->param->ydpi / ((s->param->ydpi < 1200) ? 150 : 75);
if (is_scanning_from_tpu (s))
mp->color_shift = s->param->ydpi / 75;
+ /* If you're trying to decipher this color-shifting code,
+ the following line is where the magic is revealed. */
mp->shift[1] = mp->color_shift * get_cis_ccd_line_size (s);
if (is_scanning_from_adf (s))
{ /* ADF */
@@ -681,11 +687,11 @@ calc_shifting (pixma_t * s)
mp->shift[0] = 2 * mp->shift[1];
mp->shift[2] = 0;
}
- break;
+ }
+ break;
- default:
- break;
- }
+ default: /* Default, and all CIS devices */
+ break;
}
return (2 * mp->color_shift + mp->stripe_shift);
}
@@ -940,7 +946,10 @@ handle_interrupt (pixma_t * s, int timeout)
* rr: scan resolution
* poll event with 'scanimage -A' */
if (s->cfg->pid == MG6200_PID
- || s->cfg->pid == MG6300_PID)
+ || s->cfg->pid == MG6300_PID
+ || s->cfg->pid == MX520_PID
+ || s->cfg->pid == MX720_PID
+ || s->cfg->pid == MX920_PID)
/* button no. in buf[7]
* size in buf[10] 01=A4; 02=Letter; 08=10x15; 09=13x18; 0b=auto
* format in buf[11] 01=JPEG; 02=TIFF; 03=PDF; 04=Kompakt-PDF
@@ -1000,7 +1009,7 @@ static int
wait_until_ready (pixma_t * s)
{
mp150_t *mp = (mp150_t *) s->subdriver;
- int error, tmo = 60;
+ int error, tmo = 120; /* some scanners need a long timeout */
RET_IF_ERR ((mp->generation >= 3) ? query_status_3 (s)
: query_status (s));
@@ -1135,11 +1144,19 @@ post_process_image_data (pixma_t * s, pixma_imagebuf_t * ib)
&& s->cfg->pid != MP220_PID
&& s->cfg->pid != MX360_PID
&& s->cfg->pid != MX370_PID
+ && s->cfg->pid != MX530_PID
&& s->cfg->pid != MX890_PID
+ && s->cfg->pid != MX720_PID
+ && s->cfg->pid != MX920_PID
&& s->cfg->pid != MG3100_PID
+ && s->cfg->pid != MG3500_PID
&& s->cfg->pid != MG2100_PID
&& s->cfg->pid != MG5300_PID
- && s->cfg->pid != MG6300_PID)
+ && s->cfg->pid != MG5500_PID
+ && s->cfg->pid != MG6300_PID
+ && s->cfg->pid != MG6400_PID
+ && s->cfg->pid != MG7100_PID
+ && s->cfg->pid != MG7500_PID)
reorder_pixels (mp->linebuf, sptr, c, n, m, s->param->wx, line_size);
/* Crop line to selected borders */
@@ -1201,9 +1218,14 @@ mp150_open (pixma_t * s)
if (s->cfg->pid == MP140_PID)
mp->generation = 2;
+ PDBG (pixma_dbg (3, "*mp150_open***** This is a generation %d scanner. *****\n", mp->generation));
+
/* TPU info data setup */
mp->tpu_datalen = 0;
+ /* adf scanning */
+ mp->adf_state = state_idle;
+
if (mp->generation < 4)
{
query_status (s);
@@ -1281,21 +1303,9 @@ mp150_check_param (pixma_t * s, pixma_scan_param_t * sp)
/*PDBG (pixma_dbg (4, "*mp150_check_param***** Final scan width and line-size: %i, %i *****\n", sp->wx, sp->line_size));*/
/* Some exceptions here for particular devices */
- /* Those devices can scan up to 14" with ADF, but A4 11.7" in flatbed */
- if (( s->cfg->pid == MX850_PID ||
- s->cfg->pid == MX860_PID ||
- s->cfg->pid == MX870_PID ||
- s->cfg->pid == MX880_PID ||
- s->cfg->pid == MX320_PID ||
- s->cfg->pid == MX330_PID ||
- s->cfg->pid == MX340_PID ||
- s->cfg->pid == MX350_PID ||
- s->cfg->pid == MX360_PID ||
- s->cfg->pid == MX410_PID ||
- s->cfg->pid == MX420_PID ||
- s->cfg->pid == MX7600_PID )
- &&
- sp->source == PIXMA_SOURCE_FLATBED)
+ /* Those devices can scan up to legal 14" with ADF, but A4 11.7" in flatbed */
+ /* PIXMA_CAP_ADF also works for PIXMA_CAP_ADFDUP */
+ if ((s->cfg->cap & PIXMA_CAP_ADF) && sp->source == PIXMA_SOURCE_FLATBED)
sp->h = MIN (sp->h, 877 * sp->xdpi / 75);
if (sp->source == PIXMA_SOURCE_TPU)
@@ -1349,7 +1359,8 @@ mp150_scan (pixma_t * s)
return PIXMA_EBUSY;
/* Generation 4: send XML dialog */
- if (mp->generation == 4 && s->param->adf_pageid == 0)
+ /* adf: first page or idle */
+ if (mp->generation == 4 && mp->adf_state == state_idle)
{
if (!send_xml_dialog (s, XML_START_1))
return PIXMA_EPROTO;
@@ -1367,15 +1378,38 @@ mp150_scan (pixma_t * s)
{
if ((error = query_status (s)) < 0)
return error;
+
+ /* wait for inserted paper
+ * timeout: 10 sec */
tmo = 10;
while (!has_paper (s) && --tmo >= 0)
{
+ if ((error = query_status (s)) < 0)
+ return error;
WAIT_INTERRUPT (1000);
PDBG (pixma_dbg
(2, "No paper in ADF. Timed out in %d sec.\n", tmo));
}
+
+ /* no paper inserted
+ * => abort session */
if (!has_paper (s))
+ {
+ PDBG (pixma_dbg (4, "*mp150_scan***** no paper in ADF *****\n"));
+ error = abort_session (s);
+ if (error < 0)
+ return error;
+
+ /* Generation 4: send XML dialog */
+ /* adf: first page or idle */
+ if (mp->generation == 4 && mp->adf_state == state_idle)
+ {
+ if (!send_xml_dialog (s, XML_END))
+ return PIXMA_EPROTO;
+ }
+
return PIXMA_ENO_PAPER;
+ }
}
if (has_ccd_sensor (s) && (mp->generation <= 2))
@@ -1406,8 +1440,10 @@ mp150_scan (pixma_t * s)
}
tmo = 10;
- if (s->param->adf_pageid == 0 || mp->generation <= 2)
- {
+ /* adf: first page or idle */
+ if (mp->generation <= 2 || mp->adf_state == state_idle)
+ { /* single sheet or first sheet from ADF */
+ PDBG (pixma_dbg (4, "*mp150_scan***** start scanning *****\n"));
error = start_session (s);
while (error == PIXMA_EBUSY && --tmo >= 0)
{
@@ -1448,7 +1484,11 @@ mp150_scan (pixma_t * s)
error = send_set_tpu_info (s);
}
else /* ADF pageid != 0 and gen3 or above */
+ { /* next sheet from ADF */
+ PDBG (pixma_dbg (4, "*mp150_scan***** scan next sheet from ADF *****\n"));
pixma_sleep (1000000);
+ }
+
if ((error >= 0) || (mp->generation >= 3))
mp->state = state_warmup;
@@ -1462,6 +1502,10 @@ mp150_scan (pixma_t * s)
mp150_finish_scan (s);
return error;
}
+
+ /* ADF scanning active */
+ if (is_scanning_from_adf (s))
+ mp->adf_state = state_scanning;
return 0;
}
@@ -1495,9 +1539,13 @@ mp150_fill_buffer (pixma_t * s, pixma_imagebuf_t * ib)
do
{
if (s->cancel)
+ {
+ PDBG (pixma_dbg (4, "*mp150_fill_buffer***** s->cancel *****\n"));
return PIXMA_ECANCELED;
+ }
if ((mp->last_block & 0x28) == 0x28)
- { /* end of image */
+ { /* end of image */
+ PDBG (pixma_dbg (4, "*mp150_fill_buffer***** end of image *****\n"));
mp->state = state_finished;
return 0;
}
@@ -1506,6 +1554,8 @@ mp150_fill_buffer (pixma_t * s, pixma_imagebuf_t * ib)
error = read_image_block (s, header, mp->imgbuf + mp->data_left_len);
if (error < 0)
{
+ PDBG (pixma_dbg (4, "*mp150_fill_buffer***** scanner error (%d): end scan *****\n", error));
+ mp->last_block = 0x38; /* end scan in mp150_finish_scan() */
if (error == PIXMA_ECANCELED)
{
/* NOTE: I see this in traffic logs but I don't know its meaning. */
@@ -1569,6 +1619,7 @@ mp150_finish_scan (pixma_t * s)
* abort_session and start_session between pages (last_block=0x28) */
if (mp->generation <= 2 || !is_scanning_from_adf (s) || mp->last_block == 0x38)
{
+ PDBG (pixma_dbg (4, "*mp150_finish_scan***** abort session *****\n"));
error = abort_session (s); /* FIXME: it probably doesn't work in duplex mode! */
if (error < 0)
PDBG (pixma_dbg (1, "WARNING:abort_session() failed %d\n", error));
@@ -1580,6 +1631,9 @@ mp150_finish_scan (pixma_t * s)
PDBG (pixma_dbg (1, "WARNING:XML_END dialog failed \n"));
}
}
+ else
+ PDBG (pixma_dbg (4, "*mp150_finish_scan***** wait for next page from ADF *****\n"));
+
mp->state = state_idle;
/* fall through */
case state_idle:
@@ -1669,8 +1723,8 @@ const pixma_config_t pixma_mp150_devices[] = {
DEVICE ("Canon PIXMA MP610", "MP610", MP610_PID, 4800, 0, 0, 638, 877, PIXMA_CAP_CIS),
DEVICE ("Canon PIXMA MX300", "MX300", MX300_PID, 600, 0, 0, 638, 877, PIXMA_CAP_CIS),
- DEVICE ("Canon PIXMA MX310", "MX310", MX310_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
- DEVICE ("Canon PIXMA MX700", "MX700", MX700_PID, 2400, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MX310", "MX310", MX310_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MX700", "MX700", MX700_PID, 2400, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
DEVICE ("Canon PIXMA MX850", "MX850", MX850_PID, 2400, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
DEVICE ("Canon PIXMA MX7600", "MX7600", MX7600_PID, 4800, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
@@ -1699,7 +1753,7 @@ const pixma_config_t pixma_mp150_devices[] = {
DEVICE ("Canon PIXMA MX360", "MX360", MX360_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
DEVICE ("Canon PIXMA MX410", "MX410", MX410_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
DEVICE ("Canon PIXMA MX420", "MX420", MX420_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
- DEVICE ("Canon PIXMA MX880 Series", "MX880", MX880_PID, 2400, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
+ DEVICE ("Canon PIXMA MX880 Series", "MX880", MX880_PID, 2400, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
/* Generation 4: CIS */
DEVICE ("Canon PIXMA MP640", "MP640", MP640_PID, 4800, 0, 0, 638, 877, PIXMA_CAP_CIS),
@@ -1726,27 +1780,27 @@ const pixma_config_t pixma_mp150_devices[] = {
DEVICE ("Canon PIXMA E500", "E500", E500_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS),
/* Latest devices (2012) Generation 4 CIS */
- DEVICE ("Canon PIXMA MX370 Series", "MX370", MX370_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
- DEVICE ("Canon PIXMA MX430 Series", "MX430", MX430_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
- DEVICE ("Canon PIXMA MX510 Series", "MX510", MX510_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
- DEVICE ("Canon PIXMA MX710 Series", "MX710", MX710_PID, 2400, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
- DEVICE ("Canon PIXMA MX890 Series", "MX890", MX890_PID, 2400, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
- DEVICE ("Canon PIXMA E600 Series", "E600", E600_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MX370 Series", "MX370", MX370_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MX430 Series", "MX430", MX430_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MX510 Series", "MX510", MX510_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MX710 Series", "MX710", MX710_PID, 2400, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
+ DEVICE ("Canon PIXMA MX890 Series", "MX890", MX890_PID, 2400, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
+ DEVICE ("Canon PIXMA E600 Series", "E600", E600_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
DEVICE ("Canon PIXMA MG4200", "MG4200", MG4200_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS),
/* Latest devices (2013) Generation 4 CIS */
DEVICE ("Canon PIXMA E510", "E510", E510_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS),
- DEVICE ("Canon PIXMA E610", "E610", E610_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA E610", "E610", E610_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
DEVICE ("Canon PIXMA MP230", "MP230", MP230_PID, 600, 0, 0, 638, 877, PIXMA_CAP_CIS),
DEVICE ("Canon PIXMA MG2200 Series", "MG2200", MG2200_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS),
DEVICE ("Canon PIXMA MG3200 Series", "MG3200", MG3200_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS),
DEVICE ("Canon PIXMA MG5400 Series", "MG5400", MG5400_PID, 2400, 0, 0, 638, 877, PIXMA_CAP_CIS),
DEVICE ("Canon PIXMA MG6300 Series", "MG6300", MG6300_PID, 2400, 0, 0, 638, 877, PIXMA_CAP_CIS),
- DEVICE ("Canon PIXMA MX390 Series", "MX390", MX390_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
- DEVICE ("Canon PIXMA MX450 Series", "MX450", MX450_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
- DEVICE ("Canon PIXMA MX520 Series", "MX520", MX520_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
- DEVICE ("Canon PIXMA MX720 Series", "MX720", MX720_PID, 2400, 0, 0, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
- DEVICE ("Canon PIXMA MX920 Series", "MX920", MX920_PID, 2400, 0, 600, 638, 877, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
+ DEVICE ("Canon PIXMA MX390 Series", "MX390", MX390_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MX450 Series", "MX450", MX450_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MX520 Series", "MX520", MX520_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MX720 Series", "MX720", MX720_PID, 2400, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
+ DEVICE ("Canon PIXMA MX920 Series", "MX920", MX920_PID, 2400, 0, 600, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
DEVICE ("Canon PIXMA MG2400 Series", "MG2400", MG2400_PID, 600, 0, 0, 638, 877, PIXMA_CAP_CIS),
DEVICE ("Canon PIXMA MG2500 Series", "MG2500", MG2500_PID, 600, 0, 0, 638, 877, PIXMA_CAP_CIS),
DEVICE ("Canon PIXMA MG3500 Series", "MG3500", MG3500_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS),
@@ -1755,5 +1809,25 @@ const pixma_config_t pixma_mp150_devices[] = {
DEVICE ("Canon PIXMA MG6500 Series", "MG6500", MG6500_PID, 2400, 0, 0, 638, 877, PIXMA_CAP_CIS),
DEVICE ("Canon PIXMA MG7100 Series", "MG7100", MG7100_PID, 2400, 0, 0, 638, 877, PIXMA_CAP_CIS),
+ /* Latest devices (2014) Generation 4 CIS */
+ DEVICE ("Canon PIXMA MX470 Series", "MX470", MX470_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MX530 Series", "MX530", MX530_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon MAXIFY MB5000 Series", "MB5000", MB5000_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
+ DEVICE ("Canon MAXIFY MB5300 Series", "MB5300", MB5300_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
+ DEVICE ("Canon MAXIFY MB2000 Series", "MB2000", MB2000_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
+ DEVICE ("Canon MAXIFY MB2300 Series", "MB2300", MB2300_PID, 1200, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADFDUP),
+ DEVICE ("Canon PIXMA E400", "E400", E400_PID, 600, 0, 0, 638, 877, PIXMA_CAP_CIS),
+ DEVICE ("Canon PIXMA E560", "E560", E560_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS),
+ DEVICE ("Canon PIXMA MG7500 Series", "MG7500", MG7500_PID, 2400, 0, 0, 638, 877, PIXMA_CAP_CIS),
+ DEVICE ("Canon PIXMA MG6600 Series", "MG6600", MG6600_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS),
+ DEVICE ("Canon PIXMA MG5600 Series", "MG5600", MG5600_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS),
+ DEVICE ("Canon PIXMA MG2900 Series", "MG2900", MG2900_PID, 600, 0, 0, 638, 877, PIXMA_CAP_CIS),
+ DEVICE ("Canon PIXMA E460 Series", "E460", E460_PID, 600, 0, 0, 638, 877, PIXMA_CAP_CIS),
+
+ /* Latest devices (2015) Generation 4 CIS */
+ DEVICE ("Canon PIXMA MX490 Series", "MX490", MX490_PID, 600, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA E480 Series", "E480", E480_PID, 600, 0, 0, 638, 1050, PIXMA_CAP_CIS | PIXMA_CAP_ADF),
+ DEVICE ("Canon PIXMA MG3600 Series", "MG3600", MG3600_PID, 1200, 0, 0, 638, 877, PIXMA_CAP_CIS),
+
END_OF_DEVICE_LIST
};
diff --git a/backend/pixma_mp730.c b/backend/pixma_mp730.c
index 1980fcc..2184ff7 100644
--- a/backend/pixma_mp730.c
+++ b/backend/pixma_mp730.c
@@ -1,8 +1,8 @@
/* SANE - Scanner Access Now Easy.
+ Copyright (C) 2011-2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 2007-2008 Nicolas Martin, <nicols-guest at alioth dot debian dot org>
Copyright (C) 2006-2007 Wittawat Yamwong <wittawat@web.de>
- Copyright (C) 2011-2013 Rolf Bensch <rolf at bensch hyphen online dot de>
This file is part of the SANE package.
diff --git a/backend/pixma_mp750.c b/backend/pixma_mp750.c
index ea35851..8d2d94c 100644
--- a/backend/pixma_mp750.c
+++ b/backend/pixma_mp750.c
@@ -1,7 +1,7 @@
/* SANE - Scanner Access Now Easy.
+ Copyright (C) 2011-2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 2006-2007 Wittawat Yamwong <wittawat@web.de>
- Copyright (C) 2011-2013 Rolf Bensch <rolf at bensch hyphen online dot de>
This file is part of the SANE package.
diff --git a/backend/pixma_mp810.c b/backend/pixma_mp810.c
index 5b6cdfe..5f9043e 100644
--- a/backend/pixma_mp810.c
+++ b/backend/pixma_mp810.c
@@ -1,8 +1,8 @@
/* SANE - Scanner Access Now Easy.
+ Copyright (C) 2011-2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 2007-2009 Nicolas Martin, <nicols-guest at alioth dot debian dot org>
Copyright (C) 2006-2007 Wittawat Yamwong <wittawat@web.de>
- Copyright (C) 2011-2013 Rolf Bensch <rolf at bensch hyphen online dot de>
This file is part of the SANE package.
@@ -657,6 +657,23 @@ static unsigned calc_shifting (pixma_t * s)
}
break;
+ case MP990_PID:
+ if (s->param->xdpi == 4800)
+ {
+ if (is_scanning_from_tpu (s))
+ {
+ mp->stripe_shift = 6;
+ mp->stripe_shift2 = 6;
+ }
+ else
+ {
+ mp->stripe_shift = 3;
+ mp->stripe_shift2 = 3;
+ }
+ mp->jumplines = 34; /* better than 32 or 34 : applies to flatbed & TPU */
+ }
+ break;
+
default: /* Default, and all CIS devices */
break;
}
@@ -850,7 +867,7 @@ static int send_scan_param (pixma_t * s)
* 0x24 | 1 | all | 0x01
* -----+-------+---------+---------------------------
* 0x25 | 1 | default | 0x00; cs8800f: 0x01
- * | | tpu | 0x00; cs9000f, mg8200: 0x01
+ * | | tpu | 0x00; cs9000f, mg8200, mp990: 0x01
* | | tpuir | cs9000f: 0x00
* -----+-------+---------+---------------------------
* ... | 1 | all | 0x00
@@ -908,8 +925,8 @@ static int send_scan_param (pixma_t * s)
data[0x23] = 0x02;
data[0x24] = 0x01;
- /* MG8200 addition */
- if (s->cfg->pid == MG8200_PID)
+ /* MG8200 & MP990 addition */
+ if (s->cfg->pid == MG8200_PID || s->cfg->pid == MP990_PID)
{
if (is_scanning_from_tpu (s))
{
@@ -1691,7 +1708,8 @@ static unsigned post_process_image_data (pixma_t * s, pixma_imagebuf_t * ib)
/* comment: MP970, CS8800F, CS9000F specific reordering for 4800 dpi */
if ((s->cfg->pid == MP970_PID || s->cfg->pid == CS8800F_PID
- || s->cfg->pid == CS9000F_PID || s->cfg->pid == CS9000F_MII_PID) && (s->param->xdpi == 4800))
+ || s->cfg->pid == CS9000F_PID || s->cfg->pid == CS9000F_MII_PID
+ || s->cfg->pid == MP990_PID) && (s->param->xdpi == 4800))
{
/*PDBG (pixma_dbg (4, "*post_process_image_data***** mp970_reordering pixels n = %i *****\n", n)); */
mp970_reorder_pixels (mp->linebuf, sptr, c, s->param->wx, line_size);
diff --git a/backend/plustek-pp_dac.c b/backend/plustek-pp_dac.c
index dd35ce7..f89d814 100644
--- a/backend/plustek-pp_dac.c
+++ b/backend/plustek-pp_dac.c
@@ -338,7 +338,7 @@ static void dacP98SetInitialGainRegister( pScanData ps )
dacP98FillGainInitialRestRegister( ps );/* Model Control2, LED, Correct.*/
}
-/** Find the the most ideal intensity for each color (RGB)
+/** Find the most ideal intensity for each color (RGB)
*/
static void dacP98SetRGBGainRegister( pScanData ps )
{
@@ -451,7 +451,7 @@ static void dacP98SetInitialGainRAM( pScanData ps )
dacP98DownloadMapTable( ps, ps->pScanBuffer1 );
}
-/** Find the the most ideal intensity for each color (RGB)
+/** Find the most ideal intensity for each color (RGB)
*/
static void dacP98AdjustRGBGain( pScanData ps )
{
diff --git a/backend/plustek-pp_scan.h b/backend/plustek-pp_scan.h
index 3b977bf..5a8f9d7 100644
--- a/backend/plustek-pp_scan.h
+++ b/backend/plustek-pp_scan.h
@@ -152,7 +152,7 @@
/*
* WARNING - never use the _SECOND define with the _DODELAY macro !!
- * they are for use the the MiscStartTimer function and the _DO_UDELAY macro
+ * they are for use the MiscStartTimer function and the _DO_UDELAY macro
*/
#ifndef __KERNEL__
typedef double TimerDef, *pTimerDef;
diff --git a/backend/plustek-usbcalfile.c b/backend/plustek-usbcalfile.c
index 5638b2e..afea3f9 100644
--- a/backend/plustek-usbcalfile.c
+++ b/backend/plustek-usbcalfile.c
@@ -89,7 +89,7 @@ typedef struct {
static u_short a_wWhiteShading[_SHADING_BUF] = {0};
static u_short a_wDarkShading[_SHADING_BUF] = {0};
-/* the version the the calibration files */
+/* the version the calibration files */
#define _PT_CF_VERSION 0x0002
/** function to read a text file and returns the string which starts which
diff --git a/backend/pnm.c b/backend/pnm.c
index 88b6e4a..b8d3192 100644
--- a/backend/pnm.c
+++ b/backend/pnm.c
@@ -267,7 +267,7 @@ static SANE_Option_Descriptor sod[] = {
SANE_I18N ("Hand-Scanner Simulation"),
SANE_I18N ("Simulate a hand-scanner. Hand-scanners often do not know the "
"image height a priori. Instead, they return a height of -1. "
- "Setting this option allows to test whether a frontend can "
+ "Setting this option allows one to test whether a frontend can "
"handle this correctly."),
SANE_TYPE_BOOL,
SANE_UNIT_NONE,
diff --git a/backend/ricoh.c b/backend/ricoh.c
index a349179..88f33d1 100644
--- a/backend/ricoh.c
+++ b/backend/ricoh.c
@@ -73,6 +73,7 @@
#define MAX(a,b) ((a) > (b) ? (a) : (b))
+static const SANE_Device **devlist = NULL;
static int num_devices = 0;
static Ricoh_Device *first_dev = NULL;
static Ricoh_Scanner *first_handle = NULL;
@@ -221,11 +222,13 @@ attach (const char *devnam, Ricoh_Device ** devp)
dev->sane.name = strdup (devnam);
dev->sane.vendor = "RICOH";
- str = malloc (16 + 1);
- memset (str, 0, sizeof (str));
- strncpy (str, (char *)ibuf.product, sizeof(ibuf.product));
- strncpy (str + sizeof(ibuf.revision), (char *)ibuf.revision, sizeof(ibuf.revision));
- str[sizeof(ibuf.product) + sizeof(ibuf.revision)] = '\0';
+ str = malloc (sizeof(ibuf.product) + sizeof(ibuf.revision) + 1);
+ if (str)
+ {
+ str[0] = '\0';
+ strncat (str, (char *)ibuf.product, sizeof(ibuf.product));
+ strncat (str, (char *)ibuf.revision, sizeof(ibuf.revision));
+ }
dev->sane.model = str;
dev->sane.type = "flatbed scanner";
@@ -535,6 +538,9 @@ sane_exit (void)
free ((void *) dev->sane.model);
free (dev);
}
+
+ if (devlist)
+ free (devlist);
DBG (11, "<< sane_exit\n");
}
@@ -542,7 +548,6 @@ sane_exit (void)
SANE_Status
sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
{
- static const SANE_Device **devlist = 0;
Ricoh_Device *dev;
int i;
diff --git a/backend/rts8891.c b/backend/rts8891.c
index d86347b..bdb4011 100644
--- a/backend/rts8891.c
+++ b/backend/rts8891.c
@@ -2212,7 +2212,13 @@ sane_close (SANE_Handle handle)
/* switch off lamp and close usb */
if (dev->conf.allowsharing == SANE_TRUE)
{
- sanei_usb_claim_interface (dev->devnum, 0);
+ SANE_Status status = sanei_usb_claim_interface (dev->devnum, 0);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (DBG_warn, "sane_close: cannot claim usb interface: %s\n",
+ sane_strstatus(status));
+ DBG (DBG_warn, "sane_close: continuing anyway\n");
+ }
}
set_lamp_state (session, 0);
sanei_usb_close (dev->devnum);
@@ -3197,14 +3203,6 @@ find_origin (struct Rts8891_Device *dev, SANE_Bool * changed)
return status;
}
- if (status != SANE_STATUS_GOOD)
- {
- free(image);
- free(data);
- DBG (DBG_error, "find_origin: failed to wait for data\n");
- return status;
- }
-
if (DBG_LEVEL > DBG_io2)
{
write_gray_data (data, "find_origin.pnm", width, height);
diff --git a/backend/s9036.c b/backend/s9036.c
index 9313622..1b97f80 100644
--- a/backend/s9036.c
+++ b/backend/s9036.c
@@ -45,6 +45,7 @@
#undef Byte
#define Byte SANE_Byte
+static const SANE_Device **devlist = NULL;
static int num_devices;
static S9036_Device *s9036_devices;
@@ -870,12 +871,14 @@ sane_exit (void)
sane_close (dev->handle);
free (dev);
}
+
+ if (devlist)
+ free (devlist);
}
SANE_Status
sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
{
- static const SANE_Device **devlist = 0;
S9036_Device *dev;
int i;
diff --git a/backend/snapscan-options.c b/backend/snapscan-options.c
index 15f3a4a..52fee81 100644
--- a/backend/snapscan-options.c
+++ b/backend/snapscan-options.c
@@ -44,7 +44,7 @@
If you do not wish that, delete this exception notice.
This file is a component of the implementation of a backend for many
- of the the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
+ of the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
/* $Id$
SANE SnapScan backend */
diff --git a/backend/snapscan-scsi.c b/backend/snapscan-scsi.c
index ac0efea..861ff32 100644
--- a/backend/snapscan-scsi.c
+++ b/backend/snapscan-scsi.c
@@ -44,7 +44,7 @@
If you do not wish that, delete this exception notice.
This file is a component of the implementation of a backend for many
- of the the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
+ of the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
/* $Id$
diff --git a/backend/snapscan-sources.c b/backend/snapscan-sources.c
index d91060e..63eadb2 100644
--- a/backend/snapscan-sources.c
+++ b/backend/snapscan-sources.c
@@ -44,7 +44,7 @@
If you do not wish that, delete this exception notice.
This file is a component of the implementation of a backend for many
- of the the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
+ of the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
/* $Id$
diff --git a/backend/snapscan-sources.h b/backend/snapscan-sources.h
index 53b705b..a5ed3df 100644
--- a/backend/snapscan-sources.h
+++ b/backend/snapscan-sources.h
@@ -44,7 +44,7 @@
If you do not wish that, delete this exception notice.
This file is a component of the implementation of a backend for many
- of the the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
+ of the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
/* $Id$
diff --git a/backend/snapscan.c b/backend/snapscan.c
index 44b757b..3c0fb81 100644
--- a/backend/snapscan.c
+++ b/backend/snapscan.c
@@ -45,7 +45,7 @@
If you do not wish that, delete this exception notice.
This file is a component of the implementation of a backend for many
- of the the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
+ of the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
/* $Id$
diff --git a/backend/snapscan.h b/backend/snapscan.h
index 2795d88..19a9fb5 100644
--- a/backend/snapscan.h
+++ b/backend/snapscan.h
@@ -44,7 +44,7 @@
If you do not wish that, delete this exception notice.
This file is a component of the implementation of a backend for many
- of the the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
+ of the AGFA SnapScan and Acer Vuego/Prisa flatbed scanners. */
/* $Id$
SANE SnapScan backend */
diff --git a/backend/sp15c.c b/backend/sp15c.c
index 7a3808e..3937a30 100644
--- a/backend/sp15c.c
+++ b/backend/sp15c.c
@@ -311,7 +311,6 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize)
SANE_Status
sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only)
{
- static const SANE_Device **devlist = 0;
struct sp15c *dev;
int i;
@@ -990,6 +989,9 @@ sane_exit (void)
free (dev->buffer);
free (dev);
}
+
+ if (devlist)
+ free (devlist);
} /* sane_exit */
/* }################ internal (support) routines ################{ */
diff --git a/backend/sp15c.h b/backend/sp15c.h
index 52535e0..e078316 100644
--- a/backend/sp15c.h
+++ b/backend/sp15c.h
@@ -97,6 +97,7 @@ static const char RCSid_h[] = "$Header$";
*
*/
+static const SANE_Device **devlist = NULL;
static int num_devices;
static struct sp15c *first_dev;
diff --git a/backend/tamarack.c b/backend/tamarack.c
index 9baec51..e7073af 100644
--- a/backend/tamarack.c
+++ b/backend/tamarack.c
@@ -77,6 +77,7 @@
#define TAMARACK_CONFIG_FILE "tamarack.conf"
+static const SANE_Device **devlist = NULL;
static int num_devices;
static Tamarack_Device *first_dev;
static Tamarack_Scanner *first_handle;
@@ -950,12 +951,14 @@ sane_exit (void)
free ((void *) dev->sane.model);
free (dev);
}
+
+ if (devlist)
+ free (devlist);
}
SANE_Status
sane_get_devices (const SANE_Device ***device_list, SANE_Bool local_only)
{
- static const SANE_Device **devlist = 0;
Tamarack_Device *dev;
int i;
diff --git a/backend/test.c b/backend/test.c
index 8f8851a..d5b7365 100644
--- a/backend/test.c
+++ b/backend/test.c
@@ -348,7 +348,7 @@ init_options (Test_Device * test_device)
od->title = SANE_I18N ("Hand-scanner simulation");
od->desc = SANE_I18N ("Simulate a hand-scanner. Hand-scanners do not "
"know the image height a priori. Instead, they "
- "return a height of -1. Setting this option allows "
+ "return a height of -1. Setting this option allows one "
"to test whether a frontend can handle this "
"correctly. This option also enables a fixed width "
"of 11 cm.");
@@ -1120,7 +1120,10 @@ read_option (SANE_String line, SANE_String option_string,
return SANE_STATUS_INVAL;
if (strcmp (word, option_string) != 0)
- return SANE_STATUS_INVAL;
+ {
+ free(word);
+ return SANE_STATUS_INVAL;
+ }
free (word);
word = 0;
@@ -1240,7 +1243,6 @@ read_option (SANE_String line, SANE_String option_string,
if (word)
free (word);
- word = 0;
return SANE_STATUS_GOOD;
}
@@ -1453,7 +1455,7 @@ sane_init (SANE_Int * __sane_unused__ version_code, SANE_Auth_Callback __sane_un
{
FILE *fp;
SANE_Int linenumber;
- SANE_Char line[PATH_MAX], *word;
+ SANE_Char line[PATH_MAX], *word = NULL;
SANE_String_Const cp;
SANE_Device *sane_device;
Test_Device *test_device, *previous_device;
@@ -1481,7 +1483,9 @@ sane_init (SANE_Int * __sane_unused__ version_code, SANE_Auth_Callback __sane_un
DBG (4, "sane_init: reading config file `%s'\n", TEST_CONFIG_FILE);
while (sanei_config_read (line, sizeof (line), fp))
{
- word = 0;
+ if (word)
+ free (word);
+ word = NULL;
linenumber++;
cp = sanei_config_get_string (line, &word);
@@ -1490,8 +1494,6 @@ sane_init (SANE_Int * __sane_unused__ version_code, SANE_Auth_Callback __sane_un
DBG (5,
"sane_init: config file line %3d: ignoring empty line\n",
linenumber);
- if (word)
- free (word);
continue;
}
if (word[0] == '#')
@@ -1499,7 +1501,6 @@ sane_init (SANE_Int * __sane_unused__ version_code, SANE_Auth_Callback __sane_un
DBG (5,
"sane_init: config file line %3d: ignoring comment line\n",
linenumber);
- free (word);
continue;
}
@@ -1599,6 +1600,8 @@ sane_init (SANE_Int * __sane_unused__ version_code, SANE_Auth_Callback __sane_un
DBG (3, "sane-init: I don't know how to handle option `%s'\n",
word);
} /* while */
+ if (word)
+ free (word);
fclose (fp);
} /* if */
else
diff --git a/backend/umax-uc630.c b/backend/umax-uc630.c
index 26c6831..0fbc59f 100644
--- a/backend/umax-uc630.c
+++ b/backend/umax-uc630.c
@@ -76,14 +76,14 @@ static unsigned char UC630_INQUIRY[] =
/* 60 -62 scanner capability */
0xfd,
- 0x8c, /* 0xbc ? */
+ 0x80,
0x03,
/* 63 reserved */
0x00,
/* 64 gamma */
- 0xa1,
+ 0x00,
/* 65 reserved */
0x00,
@@ -113,13 +113,13 @@ static unsigned char UC630_INQUIRY[] =
0x00,
/* 73 max optical res in 100 dpi */
- 0x04,
+ 0x03,
/* 74 max x_res in 100 dpi */
- 0x04,
+ 0x03,
/* 75 max y_res in 100 dpi */
- 0x04,
+ 0x06,
/* 76-77 fb max scan width in 0.01 inch */
0x03, 0x52,
@@ -167,7 +167,7 @@ static unsigned char UC630_INQUIRY[] =
0x00,
/* 92-93 window descriptor block length */
- 0x00, 0x30,
+ 0x00, 0x31,
/* 94 optical resolution residue (1dpi) */
0x00,
diff --git a/backend/umax.c b/backend/umax.c
index b2ceb00..0d8ddba 100644
--- a/backend/umax.c
+++ b/backend/umax.c
@@ -1035,7 +1035,7 @@ static SANE_Status sense_handler(int scsi_fd, unsigned char *result, void *arg)
if (asc == 0x00)
{
- DBG(DBG_sense, "-> button protocoll\n");
+ DBG(DBG_sense, "-> button protocol\n");
if (ascq & 1)
{
dev->button0_pressed = 1;
diff --git a/backend/umax_pp_low.c b/backend/umax_pp_low.c
index ef10bd7..c5f58a7 100644
--- a/backend/umax_pp_low.c
+++ b/backend/umax_pp_low.c
@@ -10898,7 +10898,7 @@ sanei_umax_pp_scan (int x, int y, int width, int height, int dpi, int color,
/* scan time are high enough to forget about usec */
elapsed = tf.tv_sec - td.tv_sec;
- DBG (8, "%ld bytes transfered in %f seconds ( %.2f Kb/s)\n", somme,
+ DBG (8, "%ld bytes transferred in %f seconds ( %.2f Kb/s)\n", somme,
elapsed, (somme / elapsed) / 1024.0);
#endif
diff --git a/backend/v4l.c b/backend/v4l.c
index 38595ed..519bf01 100644
--- a/backend/v4l.c
+++ b/backend/v4l.c
@@ -290,6 +290,13 @@ init_options (V4L_Scanner * s)
s->val[OPT_MODE].s = strdup (mode_list[0]);
if (!s->val[OPT_MODE].s)
return SANE_STATUS_NO_MEM;
+ s->opt[OPT_MODE].size = 1; /* '\0' */
+ for (i = 0; mode_list[i] != 0; ++i)
+ {
+ int len = strlen(mode_list[i]) + 1;
+ if (s->opt[OPT_MODE].size < len)
+ s->opt[OPT_MODE].size = len;
+ }
/* channel */
s->opt[OPT_CHANNEL].name = "channel";
@@ -305,6 +312,13 @@ init_options (V4L_Scanner * s)
return SANE_STATUS_NO_MEM;
if (s->channel[0] == 0 || s->channel[1] == 0)
s->opt[OPT_CHANNEL].cap |= SANE_CAP_INACTIVE;
+ s->opt[OPT_CHANNEL].size = 1; /* '\0' */
+ for (i = 0; s->channel[i] != 0; ++i)
+ {
+ int len = strlen(s->channel[i]) + 1;
+ if (s->opt[OPT_CHANNEL].size < len)
+ s->opt[OPT_CHANNEL].size = len;
+ }
/* "Geometry" group: */
s->opt[OPT_GEOMETRY_GROUP].title = "Geometry";
diff --git a/config.guess b/config.guess
index b79252d..3c022c5 100755..100644
--- a/config.guess
+++ b/config.guess
@@ -1,8 +1,8 @@
#! /bin/sh
# Attempt to guess a canonical system name.
-# Copyright 1992-2013 Free Software Foundation, Inc.
+# Copyright 1992-2015 Free Software Foundation, Inc.
-timestamp='2013-06-10'
+timestamp='2015-09-14'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -24,12 +24,12 @@ timestamp='2013-06-10'
# program. This Exception is an additional permission under section 7
# of the GNU General Public License, version 3 ("GPLv3").
#
-# Originally written by Per Bothner.
+# Originally written by Per Bothner; maintained since 2000 by Ben Elliston.
#
# You can get the latest version of this script from:
# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD
#
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+# Please send patches to <config-patches@gnu.org>.
me=`echo "$0" | sed -e 's,.*/,,'`
@@ -50,7 +50,7 @@ version="\
GNU config.guess ($timestamp)
Originally written by Per Bothner.
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -149,7 +149,7 @@ Linux|GNU|GNU/*)
LIBC=gnu
#endif
EOF
- eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`
+ eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`
;;
esac
@@ -168,20 +168,27 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
# Note: NetBSD doesn't particularly care about the vendor
# portion of the name. We always set it to "unknown".
sysctl="sysctl -n hw.machine_arch"
- UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \
- /usr/sbin/$sysctl 2>/dev/null || echo unknown)`
+ UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \
+ /sbin/$sysctl 2>/dev/null || \
+ /usr/sbin/$sysctl 2>/dev/null || \
+ echo unknown)`
case "${UNAME_MACHINE_ARCH}" in
armeb) machine=armeb-unknown ;;
arm*) machine=arm-unknown ;;
sh3el) machine=shl-unknown ;;
sh3eb) machine=sh-unknown ;;
sh5el) machine=sh5le-unknown ;;
+ earmv*)
+ arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'`
+ endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'`
+ machine=${arch}${endian}-unknown
+ ;;
*) machine=${UNAME_MACHINE_ARCH}-unknown ;;
esac
# The Operating System including object format, if it has switched
# to ELF recently, or will in the future.
case "${UNAME_MACHINE_ARCH}" in
- arm*|i386|m68k|ns32k|sh3*|sparc|vax)
+ arm*|earm*|i386|m68k|ns32k|sh3*|sparc|vax)
eval $set_cc_for_build
if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \
| grep -q __ELF__
@@ -197,6 +204,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
os=netbsd
;;
esac
+ # Determine ABI tags.
+ case "${UNAME_MACHINE_ARCH}" in
+ earm*)
+ expr='s/^earmv[0-9]/-eabi/;s/eb$//'
+ abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"`
+ ;;
+ esac
# The OS release
# Debian GNU/NetBSD machines have a different userland, and
# thus, need a distinct triplet. However, they do not need
@@ -207,13 +221,13 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
release='-gnu'
;;
*)
- release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'`
+ release=`echo ${UNAME_RELEASE} | sed -e 's/[-_].*//' | cut -d. -f1,2`
;;
esac
# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:
# contains redundant information, the shorter form:
# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.
- echo "${machine}-${os}${release}"
+ echo "${machine}-${os}${release}${abi}"
exit ;;
*:Bitrig:*:*)
UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`
@@ -235,6 +249,9 @@ case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in
*:MirBSD:*:*)
echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}
exit ;;
+ *:Sortix:*:*)
+ echo ${UNAME_MACHINE}-unknown-sortix
+ exit ;;
alpha:OSF1:*:*)
case $UNAME_RELEASE in
*4.0)
@@ -579,8 +596,9 @@ EOF
else
IBM_ARCH=powerpc
fi
- if [ -x /usr/bin/oslevel ] ; then
- IBM_REV=`/usr/bin/oslevel`
+ if [ -x /usr/bin/lslpp ] ; then
+ IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc |
+ awk -F: '{ print $3 }' | sed s/[0-9]*$/0/`
else
IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}
fi
@@ -826,7 +844,7 @@ EOF
*:MINGW*:*)
echo ${UNAME_MACHINE}-pc-mingw32
exit ;;
- i*:MSYS*:*)
+ *:MSYS*:*)
echo ${UNAME_MACHINE}-pc-msys
exit ;;
i*:windows32*:*)
@@ -932,6 +950,9 @@ EOF
crisv32:Linux:*:*)
echo ${UNAME_MACHINE}-axis-linux-${LIBC}
exit ;;
+ e2k:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
frv:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
@@ -944,6 +965,9 @@ EOF
ia64:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
+ k1om:Linux:*:*)
+ echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ exit ;;
m32r*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
@@ -969,10 +993,10 @@ EOF
eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`
test x"${CPU}" != x && { echo "${CPU}-unknown-linux-${LIBC}"; exit; }
;;
- or1k:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ openrisc*:Linux:*:*)
+ echo or1k-unknown-linux-${LIBC}
exit ;;
- or32:Linux:*:*)
+ or32:Linux:*:* | or1k*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
exit ;;
padre:Linux:*:*)
@@ -1020,7 +1044,7 @@ EOF
echo ${UNAME_MACHINE}-dec-linux-${LIBC}
exit ;;
x86_64:Linux:*:*)
- echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
+ echo ${UNAME_MACHINE}-pc-linux-${LIBC}
exit ;;
xtensa*:Linux:*:*)
echo ${UNAME_MACHINE}-unknown-linux-${LIBC}
@@ -1260,16 +1284,26 @@ EOF
if test "$UNAME_PROCESSOR" = unknown ; then
UNAME_PROCESSOR=powerpc
fi
- if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
- if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
- (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
- grep IS_64BIT_ARCH >/dev/null
- then
- case $UNAME_PROCESSOR in
- i386) UNAME_PROCESSOR=x86_64 ;;
- powerpc) UNAME_PROCESSOR=powerpc64 ;;
- esac
+ if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then
+ if [ "$CC_FOR_BUILD" != 'no_compiler_found' ]; then
+ if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \
+ (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \
+ grep IS_64BIT_ARCH >/dev/null
+ then
+ case $UNAME_PROCESSOR in
+ i386) UNAME_PROCESSOR=x86_64 ;;
+ powerpc) UNAME_PROCESSOR=powerpc64 ;;
+ esac
+ fi
fi
+ elif test "$UNAME_PROCESSOR" = i386 ; then
+ # Avoid executing cc on OS X 10.9, as it ships with a stub
+ # that puts up a graphical alert prompting to install
+ # developer tools. Any system running Mac OS X 10.7 or
+ # later (Darwin 11 and later) is required to have a 64-bit
+ # processor. This is not true of the ARM version of Darwin
+ # that Apple uses in portable devices.
+ UNAME_PROCESSOR=x86_64
fi
echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}
exit ;;
@@ -1361,154 +1395,6 @@ EOF
exit ;;
esac
-eval $set_cc_for_build
-cat >$dummy.c <<EOF
-#ifdef _SEQUENT_
-# include <sys/types.h>
-# include <sys/utsname.h>
-#endif
-main ()
-{
-#if defined (sony)
-#if defined (MIPSEB)
- /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed,
- I don't know.... */
- printf ("mips-sony-bsd\n"); exit (0);
-#else
-#include <sys/param.h>
- printf ("m68k-sony-newsos%s\n",
-#ifdef NEWSOS4
- "4"
-#else
- ""
-#endif
- ); exit (0);
-#endif
-#endif
-
-#if defined (__arm) && defined (__acorn) && defined (__unix)
- printf ("arm-acorn-riscix\n"); exit (0);
-#endif
-
-#if defined (hp300) && !defined (hpux)
- printf ("m68k-hp-bsd\n"); exit (0);
-#endif
-
-#if defined (NeXT)
-#if !defined (__ARCHITECTURE__)
-#define __ARCHITECTURE__ "m68k"
-#endif
- int version;
- version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`;
- if (version < 4)
- printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version);
- else
- printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version);
- exit (0);
-#endif
-
-#if defined (MULTIMAX) || defined (n16)
-#if defined (UMAXV)
- printf ("ns32k-encore-sysv\n"); exit (0);
-#else
-#if defined (CMU)
- printf ("ns32k-encore-mach\n"); exit (0);
-#else
- printf ("ns32k-encore-bsd\n"); exit (0);
-#endif
-#endif
-#endif
-
-#if defined (__386BSD__)
- printf ("i386-pc-bsd\n"); exit (0);
-#endif
-
-#if defined (sequent)
-#if defined (i386)
- printf ("i386-sequent-dynix\n"); exit (0);
-#endif
-#if defined (ns32000)
- printf ("ns32k-sequent-dynix\n"); exit (0);
-#endif
-#endif
-
-#if defined (_SEQUENT_)
- struct utsname un;
-
- uname(&un);
-
- if (strncmp(un.version, "V2", 2) == 0) {
- printf ("i386-sequent-ptx2\n"); exit (0);
- }
- if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */
- printf ("i386-sequent-ptx1\n"); exit (0);
- }
- printf ("i386-sequent-ptx\n"); exit (0);
-
-#endif
-
-#if defined (vax)
-# if !defined (ultrix)
-# include <sys/param.h>
-# if defined (BSD)
-# if BSD == 43
- printf ("vax-dec-bsd4.3\n"); exit (0);
-# else
-# if BSD == 199006
- printf ("vax-dec-bsd4.3reno\n"); exit (0);
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# endif
-# else
- printf ("vax-dec-bsd\n"); exit (0);
-# endif
-# else
- printf ("vax-dec-ultrix\n"); exit (0);
-# endif
-#endif
-
-#if defined (alliant) && defined (i860)
- printf ("i860-alliant-bsd\n"); exit (0);
-#endif
-
- exit (1);
-}
-EOF
-
-$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&
- { echo "$SYSTEM_NAME"; exit; }
-
-# Apollos put the system type in the environment.
-
-test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }
-
-# Convex versions that predate uname can use getsysinfo(1)
-
-if [ -x /usr/convex/getsysinfo ]
-then
- case `getsysinfo -f cpu_type` in
- c1*)
- echo c1-convex-bsd
- exit ;;
- c2*)
- if getsysinfo -f scalar_acc
- then echo c32-convex-bsd
- else echo c2-convex-bsd
- fi
- exit ;;
- c34*)
- echo c34-convex-bsd
- exit ;;
- c38*)
- echo c38-convex-bsd
- exit ;;
- c4*)
- echo c4-convex-bsd
- exit ;;
- esac
-fi
-
cat >&2 <<EOF
$0: unable to guess system type
diff --git a/config.sub b/config.sub
index 61cb4bc..1acc966 100755..100644
--- a/config.sub
+++ b/config.sub
@@ -1,8 +1,8 @@
#! /bin/sh
# Configuration validation subroutine script.
-# Copyright 1992-2013 Free Software Foundation, Inc.
+# Copyright 1992-2015 Free Software Foundation, Inc.
-timestamp='2013-10-01'
+timestamp='2015-08-20'
# This file is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License as published by
@@ -25,7 +25,7 @@ timestamp='2013-10-01'
# of the GNU General Public License, version 3 ("GPLv3").
-# Please send patches with a ChangeLog entry to config-patches@gnu.org.
+# Please send patches to <config-patches@gnu.org>.
#
# Configuration subroutine to validate and canonicalize a configuration type.
# Supply the specified configuration type as an argument.
@@ -68,7 +68,7 @@ Report bugs and patches to <config-patches@gnu.org>."
version="\
GNU config.sub ($timestamp)
-Copyright 1992-2013 Free Software Foundation, Inc.
+Copyright 1992-2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE."
@@ -117,7 +117,7 @@ maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'`
case $maybe_os in
nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \
linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \
- knetbsd*-gnu* | netbsd*-gnu* | \
+ knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \
kopensolaris*-gnu* | \
storm-chaos* | os2-emx* | rtmk-nova*)
os=-$maybe_os
@@ -255,12 +255,13 @@ case $basic_machine in
| arc | arceb \
| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \
| avr | avr32 \
+ | ba \
| be32 | be64 \
| bfin \
| c4x | c8051 | clipper \
| d10v | d30v | dlx | dsp16xx \
- | epiphany \
- | fido | fr30 | frv \
+ | e2k | epiphany \
+ | fido | fr30 | frv | ft32 \
| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \
| hexagon \
| i370 | i860 | i960 | ia64 \
@@ -283,8 +284,10 @@ case $basic_machine in
| mips64vr5900 | mips64vr5900el \
| mipsisa32 | mipsisa32el \
| mipsisa32r2 | mipsisa32r2el \
+ | mipsisa32r6 | mipsisa32r6el \
| mipsisa64 | mipsisa64el \
| mipsisa64r2 | mipsisa64r2el \
+ | mipsisa64r6 | mipsisa64r6el \
| mipsisa64sb1 | mipsisa64sb1el \
| mipsisa64sr71k | mipsisa64sr71kel \
| mipsr5900 | mipsr5900el \
@@ -296,14 +299,14 @@ case $basic_machine in
| nds32 | nds32le | nds32be \
| nios | nios2 | nios2eb | nios2el \
| ns16k | ns32k \
- | open8 \
- | or1k | or32 \
+ | open8 | or1k | or1knd | or32 \
| pdp10 | pdp11 | pj | pjl \
| powerpc | powerpc64 | powerpc64le | powerpcle \
| pyramid \
+ | riscv32 | riscv64 \
| rl78 | rx \
| score \
- | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
+ | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \
| sh64 | sh64le \
| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \
| sparcv8 | sparcv9 | sparcv9b | sparcv9v \
@@ -311,6 +314,7 @@ case $basic_machine in
| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \
| ubicom32 \
| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \
+ | visium \
| we32k \
| x86 | xc16x | xstormy16 | xtensa \
| z8k | z80)
@@ -325,6 +329,9 @@ case $basic_machine in
c6x)
basic_machine=tic6x-unknown
;;
+ leon|leon[3-9])
+ basic_machine=sparc-$basic_machine
+ ;;
m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip)
basic_machine=$basic_machine-unknown
os=-none
@@ -370,12 +377,13 @@ case $basic_machine in
| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \
| arm-* | armbe-* | armle-* | armeb-* | armv*-* \
| avr-* | avr32-* \
+ | ba-* \
| be32-* | be64-* \
| bfin-* | bs2000-* \
| c[123]* | c30-* | [cjt]90-* | c4x-* \
| c8051-* | clipper-* | craynv-* | cydra-* \
| d10v-* | d30v-* | dlx-* \
- | elxsi-* \
+ | e2k-* | elxsi-* \
| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \
| h8300-* | h8500-* \
| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \
@@ -402,8 +410,10 @@ case $basic_machine in
| mips64vr5900-* | mips64vr5900el-* \
| mipsisa32-* | mipsisa32el-* \
| mipsisa32r2-* | mipsisa32r2el-* \
+ | mipsisa32r6-* | mipsisa32r6el-* \
| mipsisa64-* | mipsisa64el-* \
| mipsisa64r2-* | mipsisa64r2el-* \
+ | mipsisa64r6-* | mipsisa64r6el-* \
| mipsisa64sb1-* | mipsisa64sb1el-* \
| mipsisa64sr71k-* | mipsisa64sr71kel-* \
| mipsr5900-* | mipsr5900el-* \
@@ -415,16 +425,18 @@ case $basic_machine in
| nios-* | nios2-* | nios2eb-* | nios2el-* \
| none-* | np1-* | ns16k-* | ns32k-* \
| open8-* \
+ | or1k*-* \
| orion-* \
| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \
| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \
| pyramid-* \
+ | riscv32-* | riscv64-* \
| rl78-* | romp-* | rs6000-* | rx-* \
| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \
| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \
| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \
| sparclite-* \
- | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \
+ | sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx*-* \
| tahoe-* \
| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \
| tile*-* \
@@ -432,6 +444,7 @@ case $basic_machine in
| ubicom32-* \
| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \
| vax-* \
+ | visium-* \
| we32k-* \
| x86-* | x86_64-* | xc16x-* | xps100-* \
| xstormy16-* | xtensa*-* \
@@ -508,6 +521,9 @@ case $basic_machine in
basic_machine=i386-pc
os=-aros
;;
+ asmjs)
+ basic_machine=asmjs-unknown
+ ;;
aux)
basic_machine=m68k-apple
os=-aux
@@ -769,6 +785,9 @@ case $basic_machine in
basic_machine=m68k-isi
os=-sysv
;;
+ leon-*|leon[3-9]-*)
+ basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'`
+ ;;
m68knommu)
basic_machine=m68k-unknown
os=-linux
@@ -824,6 +843,10 @@ case $basic_machine in
basic_machine=powerpc-unknown
os=-morphos
;;
+ moxiebox)
+ basic_machine=moxie-unknown
+ os=-moxiebox
+ ;;
msdos)
basic_machine=i386-pc
os=-msdos
@@ -1356,7 +1379,7 @@ case $os in
| -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \
| -sym* | -kopensolaris* | -plan9* \
| -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \
- | -aos* | -aros* \
+ | -aos* | -aros* | -cloudabi* | -sortix* \
| -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \
| -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \
| -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \
@@ -1369,14 +1392,14 @@ case $os in
| -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \
| -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \
| -linux-newlib* | -linux-musl* | -linux-uclibc* \
- | -uxpv* | -beos* | -mpeix* | -udk* \
+ | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \
| -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \
| -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \
| -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \
| -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \
| -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \
| -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \
- | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)
+ | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es* | -tirtos*)
# Remember, each alternative MUST END IN *, to match a version number.
;;
-qnx*)
@@ -1594,9 +1617,6 @@ case $basic_machine in
mips*-*)
os=-elf
;;
- or1k-*)
- os=-elf
- ;;
or32-*)
os=-coff
;;
diff --git a/configure b/configure
index 65d8cdc..5f58b62 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
#! /bin/sh
# Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for sane-backends 1.0.24.
+# Generated by GNU Autoconf 2.69 for sane-backends 1.0.25.
#
# Report bugs to <sane-devel@lists.alioth.debian.org>.
#
@@ -590,8 +590,8 @@ MAKEFLAGS=
# Identity of this package.
PACKAGE_NAME='sane-backends'
PACKAGE_TARNAME='sane-backends'
-PACKAGE_VERSION='1.0.24'
-PACKAGE_STRING='sane-backends 1.0.24'
+PACKAGE_VERSION='1.0.25'
+PACKAGE_STRING='sane-backends 1.0.25'
PACKAGE_BUGREPORT='sane-devel@lists.alioth.debian.org'
PACKAGE_URL=''
@@ -644,6 +644,8 @@ BACKEND_MANS_ENABLED
BACKEND_CONFS_ENABLED
PRELOADABLE_BACKENDS_ENABLED
PRELOADABLE_BACKENDS
+INSTALL_UMAX_PP_TOOLS_FALSE
+INSTALL_UMAX_PP_TOOLS_TRUE
BACKEND_LIBS_ENABLED
SANEI_SANEI_JPEG_LO
HAVE_JPEG_FALSE
@@ -678,10 +680,13 @@ USB_LIBS
LIBUSB_1_0_LIBS
LIBUSB_1_0_CFLAGS
SYSTEMD_LIBS
+SYSTEMD_CFLAGS
ALLOCA
LIBOBJS
SOCKET_LIBS
RESMGR_LIBS
+SNMP_CFLAGS
+SNMP_LIBS
SNMP_CONFIG_PATH
AVAHI_LIBS
AVAHI_CFLAGS
@@ -695,6 +700,7 @@ LOCKPATH_GROUP
INSTALL_LOCKPATH
PTHREAD_LIBS
IEEE1284_LIBS
+PNG_LIBS
TIFF_LIBS
JPEG_LIBS
SYSLOG_LIBS
@@ -834,6 +840,7 @@ with_gphoto2
with_v4l
enable_avahi
with_snmp
+with_systemd
enable_libusb_1_0
enable_libusb
enable_scsibuffersize
@@ -870,6 +877,8 @@ LIBV4L_CFLAGS
LIBV4L_LIBS
AVAHI_CFLAGS
AVAHI_LIBS
+SYSTEMD_CFLAGS
+SYSTEMD_LIBS
LIBUSB_1_0_CFLAGS
LIBUSB_1_0_LIBS
BACKENDS
@@ -1414,7 +1423,7 @@ if test "$ac_init_help" = "long"; then
# Omit some internal or obsolete options to make the list less imposing.
# This message is too long to be a string in the A/UX 3.1 sh.
cat <<_ACEOF
-\`configure' configures sane-backends 1.0.24 to adapt to many kinds of systems.
+\`configure' configures sane-backends 1.0.25 to adapt to many kinds of systems.
Usage: $0 [OPTION]... [VAR=VALUE]...
@@ -1484,7 +1493,7 @@ fi
if test -n "$ac_init_help"; then
case $ac_init_help in
- short | recursive ) echo "Configuration of sane-backends 1.0.24:";;
+ short | recursive ) echo "Configuration of sane-backends 1.0.25:";;
esac
cat <<\_ACEOF
@@ -1542,6 +1551,7 @@ Optional Packages:
--with-gphoto2 include the gphoto2 backend [default=yes]
--with-v4l include the v4l backend [default=yes]
--with-snmp enable SNMP support [default=yes]
+ --with-systemd enable systemd support [default=yes]
--with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use
both]
--with-gnu-ld assume the C compiler uses GNU ld [default=no]
@@ -1569,6 +1579,10 @@ Some influential environment variables:
AVAHI_CFLAGS
C compiler flags for AVAHI, overriding pkg-config
AVAHI_LIBS linker flags for AVAHI, overriding pkg-config
+ SYSTEMD_CFLAGS
+ C compiler flags for SYSTEMD, overriding pkg-config
+ SYSTEMD_LIBS
+ linker flags for SYSTEMD, overriding pkg-config
LIBUSB_1_0_CFLAGS
C compiler flags for LIBUSB_1_0, overriding pkg-config
LIBUSB_1_0_LIBS
@@ -1643,7 +1657,7 @@ fi
test -n "$ac_init_help" && exit $ac_status
if $ac_init_version; then
cat <<\_ACEOF
-sane-backends configure 1.0.24
+sane-backends configure 1.0.25
generated by GNU Autoconf 2.69
Copyright (C) 2012 Free Software Foundation, Inc.
@@ -2249,7 +2263,7 @@ cat >config.log <<_ACEOF
This file contains any messages produced by compilers while
running configure, to aid debugging if configure makes a mistake.
-It was created by sane-backends $as_me 1.0.24, which was
+It was created by sane-backends $as_me 1.0.25, which was
generated by GNU Autoconf 2.69. Invocation command line was
$ $0 $@
@@ -2602,12 +2616,12 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu
V_MAJOR=1
V_MINOR=0
-V_REV=24
+V_REV=25
is_release=yes
-am__api_version='1.13'
+am__api_version='1.14'
ac_aux_dir=
for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do
@@ -3122,7 +3136,7 @@ fi
# Define the identity of the package.
PACKAGE='sane-backends'
- VERSION='1.0.24'
+ VERSION='1.0.25'
cat >>confdefs.h <<_ACEOF
@@ -3173,6 +3187,47 @@ am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'
+# POSIX will say in a future version that running "rm -f" with no argument
+# is OK; and we want to be able to make that assumption in our Makefile
+# recipes. So use an aggressive probe to check that the usage we want is
+# actually supported "in the wild" to an acceptable degree.
+# See automake bug#10828.
+# To make any issue more visible, cause the running configure to be aborted
+# by default if the 'rm' program in use doesn't match our expectations; the
+# user can still override this though.
+if rm -f && rm -fr && rm -rf; then : OK; else
+ cat >&2 <<'END'
+Oops!
+
+Your 'rm' program seems unable to run without file operands specified
+on the command line, even when the '-f' option is present. This is contrary
+to the behaviour of most rm programs out there, and not conforming with
+the upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>
+
+Please tell bug-automake@gnu.org about your system, including the value
+of your $PATH and any error possibly output before this message. This
+can help us improve future automake versions.
+
+END
+ if test x"$ACCEPT_INFERIOR_RM_PROGRAM" = x"yes"; then
+ echo 'Configuration will proceed anyway, since you have set the' >&2
+ echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to "yes"' >&2
+ echo >&2
+ else
+ cat >&2 <<'END'
+Aborting the configuration process, to ensure you take notice of the issue.
+
+You can download and install GNU coreutils to get an 'rm' implementation
+that behaves properly: <http://www.gnu.org/software/coreutils/>.
+
+If you want to complete the configuration process using your problematic
+'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM
+to "yes", and re-run configure.
+
+END
+ as_fn_error $? "Your 'rm' program is bad, sorry." "$LINENO" 5
+ fi
+fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles" >&5
$as_echo_n "checking whether to enable maintainer-specific portions of Makefiles... " >&6; }
@@ -3201,7 +3256,7 @@ ac_config_headers="$ac_config_headers include/sane/config.h"
PACKAGE=sane-backends
-VERSION=1.0.24
+VERSION=1.0.25
NUMBER_VERSION=${V_MAJOR}.${V_MINOR}.${V_REV}
cat >>confdefs.h <<_ACEOF
@@ -4107,6 +4162,65 @@ ac_cpp='$CPP $CPPFLAGS'
ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together" >&5
+$as_echo_n "checking whether $CC understands -c and -o together... " >&6; }
+if ${am_cv_prog_cc_c_o+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+int
+main ()
+{
+
+ ;
+ return 0;
+}
+_ACEOF
+ # Make sure it works both with $CC and with simple cc.
+ # Following AC_PROG_CC_C_O, we do the test twice because some
+ # compilers refuse to overwrite an existing .o file with -o,
+ # though they will create one.
+ am_cv_prog_cc_c_o=yes
+ for am_i in 1 2; do
+ if { echo "$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext" >&5
+ ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); } \
+ && test -f conftest2.$ac_objext; then
+ : OK
+ else
+ am_cv_prog_cc_c_o=no
+ break
+ fi
+ done
+ rm -f core conftest*
+ unset am_i
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o" >&5
+$as_echo "$am_cv_prog_cc_c_o" >&6; }
+if test "$am_cv_prog_cc_c_o" != yes; then
+ # Losing compiler, so override with the script.
+ # FIXME: It is wrong to rewrite CC.
+ # But if we don't then we get into trouble of one sort or another.
+ # A longer-term fix would be to have automake use am__CC in this case,
+ # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
+ CC="$am_aux_dir/compile $CC"
+fi
+ac_ext=c
+ac_cpp='$CPP $CPPFLAGS'
+ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
+ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
+ac_compiler_gnu=$ac_cv_c_compiler_gnu
+
DEPDIR="${am__leading_dot}deps"
ac_config_commands="$ac_config_commands depfiles"
@@ -4299,131 +4413,6 @@ else
fi
-if test "x$CC" != xcc; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5
-$as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether cc understands -c and -o together" >&5
-$as_echo_n "checking whether cc understands -c and -o together... " >&6; }
-fi
-set dummy $CC; ac_cc=`$as_echo "$2" |
- sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-if eval \${ac_cv_prog_cc_${ac_cc}_c_o+:} false; then :
- $as_echo_n "(cached) " >&6
-else
- cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h. */
-
-int
-main ()
-{
-
- ;
- return 0;
-}
-_ACEOF
-# Make sure it works both with $CC and with simple cc.
-# We do the test twice because some compilers refuse to overwrite an
-# existing .o file with -o, though they will create one.
-ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
-rm -f conftest2.*
-if { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } &&
- test -f conftest2.$ac_objext && { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; };
-then
- eval ac_cv_prog_cc_${ac_cc}_c_o=yes
- if test "x$CC" != xcc; then
- # Test first that cc exists at all.
- if { ac_try='cc -c conftest.$ac_ext >&5'
- { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; }; }; then
- ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5'
- rm -f conftest2.*
- if { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; } &&
- test -f conftest2.$ac_objext && { { case "(($ac_try" in
- *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
- *) ac_try_echo=$ac_try;;
-esac
-eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
-$as_echo "$ac_try_echo"; } >&5
- (eval "$ac_try") 2>&5
- ac_status=$?
- $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
- test $ac_status = 0; };
- then
- # cc works too.
- :
- else
- # cc exists but doesn't like -o.
- eval ac_cv_prog_cc_${ac_cc}_c_o=no
- fi
- fi
- fi
-else
- eval ac_cv_prog_cc_${ac_cc}_c_o=no
-fi
-rm -f core conftest*
-
-fi
-if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
-$as_echo "yes" >&6; }
-else
- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
-$as_echo "no" >&6; }
-
-$as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h
-
-fi
-
-# FIXME: we rely on the cache variable name because
-# there is no other way.
-set dummy $CC
-am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'`
-eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o
-if test "$am_t" != yes; then
- # Losing compiler, so override with the script.
- # FIXME: It is wrong to rewrite CC.
- # But if we don't then we get into trouble of one sort or another.
- # A longer-term fix would be to have automake use am__CC in this case,
- # and then we could set am__CC="\$(top_srcdir)/compile \$(CC)"
- CC="$am_aux_dir/compile $CC"
-fi
-
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \$(MAKE)" >&5
@@ -5192,7 +5181,6 @@ else
fi
-INCLUDES="${INCLUDES} -I/usr/local/include"
if test "${ac_cv_c_compiler_gnu}" = "yes"; then
@@ -5218,6 +5206,7 @@ if test "${ac_cv_c_compiler_gnu}" = "yes"; then
ANSI_FLAG=
;;
esac
+ NORMAL_CFLAGS="${NORMAL_CFLAGS} ${ANSI_FLAG}"
WARN_CFLAGS="${WARN_CFLAGS} ${ANSI_FLAG}"
# Check whether --enable-warnings was given.
@@ -7252,6 +7241,61 @@ fi
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for png_init_io in -lpng" >&5
+$as_echo_n "checking for png_init_io in -lpng... " >&6; }
+if ${ac_cv_lib_png_png_init_io+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ ac_check_lib_save_LIBS=$LIBS
+LIBS="-lpng $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+
+/* Override any GCC internal prototype to avoid an error.
+ Use char because int might match the return type of a GCC
+ builtin and then its argument prototype would still apply. */
+#ifdef __cplusplus
+extern "C"
+#endif
+char png_init_io ();
+int
+main ()
+{
+return png_init_io ();
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ ac_cv_lib_png_png_init_io=yes
+else
+ ac_cv_lib_png_png_init_io=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_png_png_init_io" >&5
+$as_echo "$ac_cv_lib_png_png_init_io" >&6; }
+if test "x$ac_cv_lib_png_png_init_io" = xyes; then :
+
+ ac_fn_c_check_header_mongrel "$LINENO" "png.h" "ac_cv_header_png_h" "$ac_includes_default"
+if test "x$ac_cv_header_png_h" = xyes; then :
+ sane_cv_use_libpng="yes"; PNG_LIBS="-lpng"
+fi
+
+
+
+fi
+
+ if test "$sane_cv_use_libpng" = "yes" ; then
+
+$as_echo "#define HAVE_LIBPNG 1" >>confdefs.h
+
+ fi
+
+
+
ac_fn_c_check_header_mongrel "$LINENO" "ieee1284.h" "ac_cv_header_ieee1284_h" "$ac_includes_default"
if test "x$ac_cv_header_ieee1284_h" = xyes; then :
@@ -7988,8 +8032,8 @@ $as_echo "no" >&6; }
fi
if test "$with_snmp" = "yes" -a "${LIBSNMP_EXISTS}x" = "yesx"; then
- LIBS="$LIBS $SNMP_LIBS"
- CFLAGS="$CFLAGS $SNMP_CFLAGS"
+
+
$as_echo "#define HAVE_LIBSNMP 1" >>confdefs.h
@@ -9616,6 +9660,42 @@ fi
+if test "${ac_cv_header_sys_io_h}" = "yes"; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for inb,outb (provided by sys/io.h)" >&5
+$as_echo_n "checking for inb,outb (provided by sys/io.h)... " >&6; }
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+#include <sys/io.h>
+int
+main ()
+{
+inb(0);outb(0,0);
+ ;
+ return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ sane_cv_have_sys_io_h_with_inb_outb="yes"
+else
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ sane_cv_have_sys_io_h_with_inb_outb="no"
+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: sys/io.h does not provide inb,outb (non i386/x32/x86_64 arch?)" >&5
+$as_echo "$as_me: WARNING: sys/io.h does not provide inb,outb (non i386/x32/x86_64 arch?)" >&2;}
+fi
+rm -f core conftest.err conftest.$ac_objext \
+ conftest$ac_exeext conftest.$ac_ext
+ if test "$sane_cv_have_sys_io_h_with_inb_outb" = "yes"; then
+
+$as_echo "#define SANE_HAVE_SYS_IO_H_WITH_INB_OUTB 1" >>confdefs.h
+
+ fi
+else
+ sane_cv_have_sys_io_h_with_inb_outb="no"
+fi
+
@@ -9649,31 +9729,168 @@ $as_echo "#define HAVE_DEV_URANDOM 1" >>confdefs.h
fi
-$as_echo "checking for cups"
-if test -e /usr/include/cups/cups.h ; then
-$as_echo "#define HAVE_CUPS 1" >>confdefs.h
- with_cups="yes"
- LIBS="-lcups $LIBS"
+# Check whether --with-systemd was given.
+if test "${with_systemd+set}" = set; then :
+ withval=$with_systemd;
+fi
+
+if test "x$with_systemd" != xno ; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SYSTEMD" >&5
+$as_echo_n "checking for SYSTEMD... " >&6; }
+
+if test -n "$SYSTEMD_CFLAGS"; then
+ pkg_cv_SYSTEMD_CFLAGS="$SYSTEMD_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libsystemd") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_SYSTEMD_CFLAGS=`$PKG_CONFIG --cflags "libsystemd" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$SYSTEMD_LIBS"; then
+ pkg_cv_SYSTEMD_LIBS="$SYSTEMD_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libsystemd") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_SYSTEMD_LIBS=`$PKG_CONFIG --libs "libsystemd" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
else
- $as_echo "cups.h not found, you may want to install a cups development package"
- $as_echo "in order to autodetect network scanners in kodakaio."
- with_cups="no"
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
fi
-$as_echo_n "Checking for systemd..."
-if test -e /usr/include/systemd/sd-daemon.h ; then
-$as_echo "#define HAVE_SYSTEMD 1" >>confdefs.h
- with_systemd="yes"
- SYSTEMD_LIBS=" -lsystemd-daemon"
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ SYSTEMD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsystemd" 2>&1`
+ else
+ SYSTEMD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsystemd" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$SYSTEMD_PKG_ERRORS" >&5
+
+ have_systemd=no
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ have_systemd=no
+else
+ SYSTEMD_CFLAGS=$pkg_cv_SYSTEMD_CFLAGS
+ SYSTEMD_LIBS=$pkg_cv_SYSTEMD_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ have_systemd=yes
+fi
+ if test "x$have_systemd" = xno; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SYSTEMD" >&5
+$as_echo_n "checking for SYSTEMD... " >&6; }
- $as_echo "yes"
+if test -n "$SYSTEMD_CFLAGS"; then
+ pkg_cv_SYSTEMD_CFLAGS="$SYSTEMD_CFLAGS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd-daemon\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libsystemd-daemon") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_SYSTEMD_CFLAGS=`$PKG_CONFIG --cflags "libsystemd-daemon" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
else
- with_systemd="no"
- $as_echo "no"
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+if test -n "$SYSTEMD_LIBS"; then
+ pkg_cv_SYSTEMD_LIBS="$SYSTEMD_LIBS"
+ elif test -n "$PKG_CONFIG"; then
+ if test -n "$PKG_CONFIG" && \
+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libsystemd-daemon\""; } >&5
+ ($PKG_CONFIG --exists --print-errors "libsystemd-daemon") 2>&5
+ ac_status=$?
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; }; then
+ pkg_cv_SYSTEMD_LIBS=`$PKG_CONFIG --libs "libsystemd-daemon" 2>/dev/null`
+ test "x$?" != "x0" && pkg_failed=yes
+else
+ pkg_failed=yes
+fi
+ else
+ pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+ _pkg_short_errors_supported=yes
+else
+ _pkg_short_errors_supported=no
+fi
+ if test $_pkg_short_errors_supported = yes; then
+ SYSTEMD_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "libsystemd-daemon" 2>&1`
+ else
+ SYSTEMD_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "libsystemd-daemon" 2>&1`
+ fi
+ # Put the nasty error message in config.log where it belongs
+ echo "$SYSTEMD_PKG_ERRORS" >&5
+
+ have_systemd=no
+elif test $pkg_failed = untried; then
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+ have_systemd=no
+else
+ SYSTEMD_CFLAGS=$pkg_cv_SYSTEMD_CFLAGS
+ SYSTEMD_LIBS=$pkg_cv_SYSTEMD_LIBS
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+ have_systemd=yes
+fi
+ fi
+ if test "x$have_systemd" = xyes; then
+
+$as_echo "#define HAVE_SYSTEMD 1" >>confdefs.h
+
+
+ else
+ if test "x$with_systemd" = xyes; then
+ as_fn_error $? "Systemd support was requested but systemd was not found" "$LINENO" 5
+ fi
+ fi
fi
@@ -17857,12 +18074,12 @@ fi
ALL_BACKENDS="abaton agfafocus apple artec artec_eplus48u as6e \
avision bh canon canon630u canon_dr canon_pp cardscan \
coolscan coolscan2 coolscan3 dc25 dc210 dc240 \
- dell1600n_net dmc epjitsu epson epson2 fujitsu genesys \
+ dell1600n_net dmc epjitsu epson epson2 epsonds fujitsu genesys \
gphoto2 gt68xx hp hp3500 hp3900 hp4200 hp5400 \
hp5590 hpsj5s hpljm1005 hs2p ibm kodak kodakaio kvs1025 kvs20xx \
kvs40xx leo lexmark ma1509 magicolor \
matsushita microtek microtek2 mustek mustek_pp \
- mustek_usb mustek_usb2 nec net niash pie pint \
+ mustek_usb mustek_usb2 nec net niash pie pieusb pint \
pixma plustek plustek_pp qcam ricoh rts8891 s9036 \
sceptre sharp sm3600 sm3840 snapscan sp15c st400 \
stv680 tamarack teco1 teco2 teco3 test u12 umax
@@ -17922,14 +18139,21 @@ for be in ${BACKENDS}; do
mustek_pp)
if test "${sane_cv_use_libieee1284}" != "yes" && test "${enable_parport_directio}" != "yes"; then
- echo "*** $be backend requires libieee1284 and paraport-directio libraries - $DISABLE_MSG"
+ echo "*** $be backend requires libieee1284 or parport-directio libraries - $DISABLE_MSG"
backend_supported="no"
fi
;;
dell1600n_net)
if test "${sane_cv_use_libjpeg}" != "yes" || test "${sane_cv_use_libtiff}" != "yes"; then
- echo "*** $be backend requires JPEG and/or TIFF library - $DISABLE_MSG"
+ echo "*** $be backend requires JPEG and TIFF library - $DISABLE_MSG"
+ backend_supported="no"
+ fi
+ ;;
+
+ epsonds)
+ if test "${sane_cv_use_libjpeg}" != "yes"; then
+ echo "*** $be backend requires JPEG library - $DISABLE_MSG"
backend_supported="no"
fi
;;
@@ -17950,9 +18174,9 @@ for be in ${BACKENDS}; do
;;
qcam)
- if test "${ac_cv_func_ioperm}" = "no" \
+ if ( test "${ac_cv_func_ioperm}" = "no" || test "${sane_cv_have_sys_io_h_with_inb_outb}" = "no" )\
&& test "${ac_cv_func__portaccess}" = "no"; then
- echo "*** $be backend requires ioperm and portaccess functions - $DISABLE_MSG"
+ echo "*** $be backend requires (ioperm, inb and outb) or portaccess functions - $DISABLE_MSG"
backend_supported="no"
fi
;;
@@ -18021,8 +18245,19 @@ for backend in ${BACKENDS} ; do
BACKEND_LIBS_ENABLED="${BACKEND_LIBS_ENABLED} libsane-${backend}.la"
BACKEND_CONFS_ENABLED="${BACKEND_CONFS_ENABLED} ${backend}.conf"
BACKEND_MANS_ENABLED="${BACKEND_MANS_ENABLED} sane-${backend}.5"
+ if test x$backend = xumax_pp; then
+ install_umax_pp_tools=yes
+ fi
done
+ if test xyes = x$install_umax_pp_tools; then
+ INSTALL_UMAX_PP_TOOLS_TRUE=
+ INSTALL_UMAX_PP_TOOLS_FALSE='#'
+else
+ INSTALL_UMAX_PP_TOOLS_TRUE='#'
+ INSTALL_UMAX_PP_TOOLS_FALSE=
+fi
+
if test "${enable_preload}" = "auto"; then
@@ -18089,14 +18324,21 @@ for be in ${BACKENDS}; do
mustek_pp)
if test "${sane_cv_use_libieee1284}" != "yes" && test "${enable_parport_directio}" != "yes"; then
- echo "*** $be backend requires libieee1284 and paraport-directio libraries - $DISABLE_MSG"
+ echo "*** $be backend requires libieee1284 or parport-directio libraries - $DISABLE_MSG"
backend_supported="no"
fi
;;
dell1600n_net)
if test "${sane_cv_use_libjpeg}" != "yes" || test "${sane_cv_use_libtiff}" != "yes"; then
- echo "*** $be backend requires JPEG and/or TIFF library - $DISABLE_MSG"
+ echo "*** $be backend requires JPEG and TIFF library - $DISABLE_MSG"
+ backend_supported="no"
+ fi
+ ;;
+
+ epsonds)
+ if test "${sane_cv_use_libjpeg}" != "yes"; then
+ echo "*** $be backend requires JPEG library - $DISABLE_MSG"
backend_supported="no"
fi
;;
@@ -18117,9 +18359,9 @@ for be in ${BACKENDS}; do
;;
qcam)
- if test "${ac_cv_func_ioperm}" = "no" \
+ if ( test "${ac_cv_func_ioperm}" = "no" || test "${sane_cv_have_sys_io_h_with_inb_outb}" = "no" )\
&& test "${ac_cv_func__portaccess}" = "no"; then
- echo "*** $be backend requires ioperm and portaccess functions - $DISABLE_MSG"
+ echo "*** $be backend requires (ioperm, inb and outb) or portaccess functions - $DISABLE_MSG"
backend_supported="no"
fi
;;
@@ -18411,6 +18653,10 @@ if test -z "${HAVE_JPEG_TRUE}" && test -z "${HAVE_JPEG_FALSE}"; then
as_fn_error $? "conditional \"HAVE_JPEG\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
+if test -z "${INSTALL_UMAX_PP_TOOLS_TRUE}" && test -z "${INSTALL_UMAX_PP_TOOLS_FALSE}"; then
+ as_fn_error $? "conditional \"INSTALL_UMAX_PP_TOOLS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
if test -z "${ENABLE_TRANSLATIONS_TRUE}" && test -z "${ENABLE_TRANSLATIONS_FALSE}"; then
as_fn_error $? "conditional \"ENABLE_TRANSLATIONS\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -18816,7 +19062,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
# report actual input values of CONFIG_FILES etc. instead of their
# values after options handling.
ac_log="
-This file was extended by sane-backends $as_me 1.0.24, which was
+This file was extended by sane-backends $as_me 1.0.25, which was
generated by GNU Autoconf 2.69. Invocation command line was
CONFIG_FILES = $CONFIG_FILES
@@ -18882,7 +19128,7 @@ _ACEOF
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
ac_cs_version="\\
-sane-backends config.status 1.0.24
+sane-backends config.status 1.0.25
configured by $0, generated by GNU Autoconf 2.69,
with options \\"\$ac_cs_config\\"
@@ -21180,7 +21426,6 @@ fi
echo "IPv6 support: `eval eval echo ${ipv6}`"
echo "Avahi support: `eval eval echo ${enable_avahi}`"
echo "SNMP support: `eval eval echo ${with_snmp}`"
-echo "CUPS support: `eval eval echo ${with_cups}`"
echo "-> The following backends will be built:"
for backend in ${BACKENDS} ; do
echo $ECHO_N "${backend} "
diff --git a/configure.in b/configure.in
index a91d584..96a52e5 100644
--- a/configure.in
+++ b/configure.in
@@ -3,10 +3,10 @@ dnl Process this file with autoconf to produce a configure script. -*-m4-*-
dnl ***********************************************************************
dnl When preparing a release, increase the numeric and string version numbers,
dnl remove the "cvs" suffix, and set is_release=yes
-AC_INIT([sane-backends],[1.0.24],[sane-devel@lists.alioth.debian.org])
+AC_INIT([sane-backends],[1.0.25],[sane-devel@lists.alioth.debian.org])
V_MAJOR=1
V_MINOR=0
-V_REV=24
+V_REV=25
is_release=yes
dnl ***********************************************************************
@@ -82,7 +82,6 @@ AM_CONDITIONAL(CROSS_COMPILING, test x$cross_compiling = xyes)
dnl ***********************************************************************
dnl set compiler/linker flags
dnl ***********************************************************************
-INCLUDES="${INCLUDES} -I/usr/local/include"
AC_SUBST(INCLUDES)
SANE_SET_CFLAGS([$is_release])
SANE_SET_LDFLAGS
@@ -123,6 +122,7 @@ AC_SUBST(SYSLOG_LIBS)
SANE_CHECK_JPEG
SANE_CHECK_TIFF
+SANE_CHECK_PNG
SANE_CHECK_IEEE1284
SANE_CHECK_PTHREAD
SANE_CHECK_LOCKING
@@ -185,8 +185,8 @@ else
fi
if test "$with_snmp" = "yes" -a "${LIBSNMP_EXISTS}x" = "yesx"; then
- LIBS="$LIBS $SNMP_LIBS"
- CFLAGS="$CFLAGS $SNMP_CFLAGS"
+ AC_SUBST(SNMP_LIBS)
+ AC_SUBST(SNMP_CFLAGS)
AC_DEFINE(HAVE_LIBSNMP, 1, [Define to 1 if you have the net-snmp library.])
else
AC_MSG_WARN([*** Warning: net-snmp library disabled, autodetecting network scanners will not be supported.])
@@ -314,6 +314,25 @@ AC_CHECK_FUNCS(atexit ioperm i386_set_ioperm \
AC_REPLACE_FUNCS(getenv isfdtype sigprocmask snprintf \
strcasestr strdup strndup strsep usleep sleep syslog vsyslog)
+dnl sys/io.h might provide ioperm but not inb,outb (like for
+dnl non i386/x32/x86_64 with musl libc)
+if test "${ac_cv_header_sys_io_h}" = "yes"; then
+ AC_MSG_CHECKING([for inb,outb (provided by sys/io.h)])
+ AC_LINK_IFELSE(
+ [AC_LANG_PROGRAM([[#include <sys/io.h>]],
+ [[inb(0);outb(0,0);]])],
+ [AC_MSG_RESULT([yes])
+ sane_cv_have_sys_io_h_with_inb_outb="yes"],
+ [AC_MSG_RESULT([no])
+ sane_cv_have_sys_io_h_with_inb_outb="no"
+ AC_MSG_WARN([sys/io.h does not provide inb,outb (non i386/x32/x86_64 arch?)])])
+ if test "$sane_cv_have_sys_io_h_with_inb_outb" = "yes"; then
+ AC_DEFINE(SANE_HAVE_SYS_IO_H_WITH_INB_OUTB, 1, [Define to 1 if you have the <sys/io.h> providing inb,outb.])
+ fi
+else
+ sane_cv_have_sys_io_h_with_inb_outb="no"
+fi
+
SANE_PROTOTYPES
if test "$ac_cv_header_os2_h" = "yes" ; then
@@ -332,29 +351,33 @@ if test -c /dev/urandom ; then
AC_DEFINE(HAVE_DEV_URANDOM, 1, [Is /dev/urandom available?])
fi
-dnl added by PN 3/2/12 to detect cups
-$as_echo "checking for cups"
-if test -e /usr/include/cups/cups.h ; then
- AC_DEFINE(HAVE_CUPS, 1, [Is /usr/include/cups/cups.h available?])
- with_cups="yes"
- LIBS="-lcups $LIBS"
-else
- $as_echo "cups.h not found, you may want to install a cups development package"
- $as_echo "in order to autodetect network scanners in kodakaio."
- with_cups="no"
-fi
-
-dnl added by llagendijk 12/7/2012 to detect systemd for saned
-$as_echo_n "Checking for systemd..."
-if test -e /usr/include/systemd/sd-daemon.h ; then
+dnl added by PN 3/2/12 to detect cups commented out 15/10/13 since avahi is now used instead
+dnl $as_echo "checking for cups"
+dnl if test -e /usr/include/cups/cups.h ; then
+dnl AC_DEFINE(HAVE_CUPS, 1, [Is /usr/include/cups/cups.h available?])
+dnl with_cups="yes"
+dnl LIBS="-lcups $LIBS"
+dnl else
+dnl $as_echo "cups.h not found, you may want to install a cups development package"
+dnl $as_echo "in order to autodetect network scanners in kodakaio."
+dnl with_cups="no"
+dnl fi
+
+AC_ARG_WITH(systemd,
+ AC_HELP_STRING([--with-systemd], [enable systemd support @<:@default=yes@:>@]))
+if test "x$with_systemd" != xno ; then
+ PKG_CHECK_MODULES(SYSTEMD, [libsystemd], have_systemd=yes, have_systemd=no)
+ if test "x$have_systemd" = xno; then
+ PKG_CHECK_MODULES(SYSTEMD, [libsystemd-daemon], have_systemd=yes, have_systemd=no)
+ fi
+ if test "x$have_systemd" = xyes; then
AC_DEFINE(HAVE_SYSTEMD, 1, [Is /usr/include/systemd/sd-daemon.h available?])
- with_systemd="yes"
- SYSTEMD_LIBS=" -lsystemd-daemon"
AC_SUBST(SYSTEMD_LIBS)
- $as_echo "yes"
-else
- with_systemd="no"
- $as_echo "no"
+ else
+ if test "x$with_systemd" = xyes; then
+ AC_MSG_ERROR([Systemd support was requested but systemd was not found])
+ fi
+ fi
fi
dnl ***********
@@ -610,12 +633,12 @@ AC_ARG_ENABLE(local-backends,
ALL_BACKENDS="abaton agfafocus apple artec artec_eplus48u as6e \
avision bh canon canon630u canon_dr canon_pp cardscan \
coolscan coolscan2 coolscan3 dc25 dc210 dc240 \
- dell1600n_net dmc epjitsu epson epson2 fujitsu genesys \
+ dell1600n_net dmc epjitsu epson epson2 epsonds fujitsu genesys \
gphoto2 gt68xx hp hp3500 hp3900 hp4200 hp5400 \
hp5590 hpsj5s hpljm1005 hs2p ibm kodak kodakaio kvs1025 kvs20xx \
kvs40xx leo lexmark ma1509 magicolor \
matsushita microtek microtek2 mustek mustek_pp \
- mustek_usb mustek_usb2 nec net niash pie pint \
+ mustek_usb mustek_usb2 nec net niash pie pieusb pint \
pixma plustek plustek_pp qcam ricoh rts8891 s9036 \
sceptre sharp sm3600 sm3840 snapscan sp15c st400 \
stv680 tamarack teco1 teco2 teco3 test u12 umax
@@ -663,8 +686,12 @@ for backend in ${BACKENDS} ; do
BACKEND_LIBS_ENABLED="${BACKEND_LIBS_ENABLED} libsane-${backend}.la"
BACKEND_CONFS_ENABLED="${BACKEND_CONFS_ENABLED} ${backend}.conf"
BACKEND_MANS_ENABLED="${BACKEND_MANS_ENABLED} sane-${backend}.5"
+ if test x$backend = xumax_pp; then
+ install_umax_pp_tools=yes
+ fi
done
AC_SUBST(BACKEND_LIBS_ENABLED)
+AM_CONDITIONAL(INSTALL_UMAX_PP_TOOLS, test xyes = x$install_umax_pp_tools)
AC_ARG_VAR(PRELOADABLE_BACKENDS, [list of backends to preload into single DLL])
if test "${enable_preload}" = "auto"; then
@@ -816,7 +843,7 @@ fi
echo "IPv6 support: `eval eval echo ${ipv6}`"
echo "Avahi support: `eval eval echo ${enable_avahi}`"
echo "SNMP support: `eval eval echo ${with_snmp}`"
-echo "CUPS support: `eval eval echo ${with_cups}`"
+dnl echo "CUPS support: `eval eval echo ${with_cups}`" commented out 15/10/13
echo "-> The following backends will be built:"
for backend in ${BACKENDS} ; do
echo $ECHO_N "${backend} "
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 12ec658..a7e47af 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -18,10 +18,10 @@ EXTRA_DIST = scanimage.man sane-config.man sane-find-scanner.man \
# custom install/uninstall if we required man pages for every backend.
BACKEND_MANS_ENABLED = @BACKEND_MANS_ENABLED@
BACKEND_5MANS = sane-abaton.5 sane-agfafocus.5 sane-apple.5 sane-as6e.5 \
- sane-dll.5 sane-dc25.5 sane-dmc.5 sane-epson.5 sane-epson2.5 \
+ sane-dll.5 sane-dc25.5 sane-dmc.5 sane-epson.5 sane-epson2.5 sane-epsonds.5 \
sane-hp.5 sane-gphoto2.5 sane-leo.5 sane-lexmark.5 \
sane-matsushita.5 sane-microtek.5 sane-microtek2.5 sane-mustek.5 \
- sane-nec.5 sane-net.5 sane-pie.5 sane-pint.5 sane-pnm.5 \
+ sane-nec.5 sane-net.5 sane-pie.5 sane-pieusb.5 sane-pint.5 sane-pnm.5 \
sane-umax.5 sane-qcam.5 sane-scsi.5 sane-artec.5 sane-kodak.5 sane-kodakaio.5 \
sane-fujitsu.5 sane-sharp.5 sane-s9036.5 sane-tamarack.5 \
sane-ricoh.5 sane-avision.5 sane-plustek.5 sane-st400.5 \
@@ -41,10 +41,10 @@ BACKEND_5MANS = sane-abaton.5 sane-agfafocus.5 sane-apple.5 sane-as6e.5 \
EXTRA_DIST += sane-abaton.man sane-agfafocus.man sane-apple.man sane-as6e.man \
sane-dll.man sane-dc25.man sane-dmc.man sane-epson.man \
- sane-epson2.man sane-hp.man sane-gphoto2.man sane-leo.man \
+ sane-epson2.man sane-epsonds.man sane-hp.man sane-gphoto2.man sane-leo.man \
sane-lexmark.man sane-matsushita.man sane-microtek.man \
sane-microtek2.man sane-mustek.man sane-nec.man sane-net.man \
- sane-pie.man sane-pint.man sane-pnm.man sane-umax.man \
+ sane-pie.man sane-pieusb.man sane-pint.man sane-pnm.man sane-umax.man \
sane-qcam.man sane-scsi.man sane-artec.man sane-fujitsu.man \
sane-sharp.man sane-s9036.man sane-tamarack.man sane-kodak.man sane-kodakaio.man\
sane-ricoh.man sane-avision.man sane-plustek.man sane-st400.man \
@@ -169,6 +169,7 @@ DESC_FILES = descriptions/abaton.desc descriptions/agfafocus.desc \
descriptions/dc210.desc descriptions/dc240.desc descriptions/dc25.desc \
descriptions/dell1600n_net.desc descriptions/dll.desc descriptions/dmc.desc \
descriptions/epjitsu.desc descriptions/epson2.desc descriptions/epson.desc \
+ descriptions/epsonds.desc \
descriptions/fujitsu.desc descriptions/genesys.desc \
descriptions/gphoto2.desc descriptions/gt68xx.desc descriptions/hp3500.desc \
descriptions/hp3900.desc descriptions/hp4200.desc descriptions/hp5400.desc \
@@ -182,7 +183,7 @@ DESC_FILES = descriptions/abaton.desc descriptions/agfafocus.desc \
descriptions/microtek.desc descriptions/mustek.desc \
descriptions/mustek_pp.desc descriptions/mustek_usb2.desc \
descriptions/mustek_usb.desc descriptions/nec.desc descriptions/net.desc \
- descriptions/niash.desc descriptions/pie.desc descriptions/pint.desc \
+ descriptions/niash.desc descriptions/pie.desc descriptions/pieusb.desc descriptions/pint.desc \
descriptions/p5.desc descriptions/pixma.desc descriptions/plustek.desc \
descriptions/plustek_pp.desc descriptions/pnm.desc descriptions/qcam.desc \
descriptions/ricoh.desc descriptions/rts8891.desc descriptions/s9036.desc \
diff --git a/doc/Makefile.in b/doc/Makefile.in
index 20b8ffb..ef83201 100644
--- a/doc/Makefile.in
+++ b/doc/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -253,6 +253,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -264,11 +265,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -336,13 +340,13 @@ man1_MANS = scanimage.1 sane-config.1 sane-find-scanner.1 gamma4scanimage.1
EXTRA_DIST = scanimage.man sane-config.man sane-find-scanner.man \
gamma4scanimage.man sane-abaton.man sane-agfafocus.man \
sane-apple.man sane-as6e.man sane-dll.man sane-dc25.man \
- sane-dmc.man sane-epson.man sane-epson2.man sane-hp.man \
- sane-gphoto2.man sane-leo.man sane-lexmark.man \
+ sane-dmc.man sane-epson.man sane-epson2.man sane-epsonds.man \
+ sane-hp.man sane-gphoto2.man sane-leo.man sane-lexmark.man \
sane-matsushita.man sane-microtek.man sane-microtek2.man \
sane-mustek.man sane-nec.man sane-net.man sane-pie.man \
- sane-pint.man sane-pnm.man sane-umax.man sane-qcam.man \
- sane-scsi.man sane-artec.man sane-fujitsu.man sane-sharp.man \
- sane-s9036.man sane-tamarack.man sane-kodak.man \
+ sane-pieusb.man sane-pint.man sane-pnm.man sane-umax.man \
+ sane-qcam.man sane-scsi.man sane-artec.man sane-fujitsu.man \
+ sane-sharp.man sane-s9036.man sane-tamarack.man sane-kodak.man \
sane-kodakaio.man sane-ricoh.man sane-avision.man \
sane-plustek.man sane-st400.man sane-mustek_pp.man \
sane-dc210.man sane-v4l.man sane-snapscan.man sane-canon.man \
@@ -373,10 +377,10 @@ EXTRA_DIST = scanimage.man sane-config.man sane-find-scanner.man \
icons/references.gif icons/references_gr.gif icons/up.gif \
icons/up_gr.gif
BACKEND_5MANS = sane-abaton.5 sane-agfafocus.5 sane-apple.5 sane-as6e.5 \
- sane-dll.5 sane-dc25.5 sane-dmc.5 sane-epson.5 sane-epson2.5 \
+ sane-dll.5 sane-dc25.5 sane-dmc.5 sane-epson.5 sane-epson2.5 sane-epsonds.5 \
sane-hp.5 sane-gphoto2.5 sane-leo.5 sane-lexmark.5 \
sane-matsushita.5 sane-microtek.5 sane-microtek2.5 sane-mustek.5 \
- sane-nec.5 sane-net.5 sane-pie.5 sane-pint.5 sane-pnm.5 \
+ sane-nec.5 sane-net.5 sane-pie.5 sane-pieusb.5 sane-pint.5 sane-pnm.5 \
sane-umax.5 sane-qcam.5 sane-scsi.5 sane-artec.5 sane-kodak.5 sane-kodakaio.5 \
sane-fujitsu.5 sane-sharp.5 sane-s9036.5 sane-tamarack.5 \
sane-ricoh.5 sane-avision.5 sane-plustek.5 sane-st400.5 \
@@ -452,6 +456,7 @@ DESC_FILES = descriptions/abaton.desc descriptions/agfafocus.desc \
descriptions/dc210.desc descriptions/dc240.desc descriptions/dc25.desc \
descriptions/dell1600n_net.desc descriptions/dll.desc descriptions/dmc.desc \
descriptions/epjitsu.desc descriptions/epson2.desc descriptions/epson.desc \
+ descriptions/epsonds.desc \
descriptions/fujitsu.desc descriptions/genesys.desc \
descriptions/gphoto2.desc descriptions/gt68xx.desc descriptions/hp3500.desc \
descriptions/hp3900.desc descriptions/hp4200.desc descriptions/hp5400.desc \
@@ -465,7 +470,7 @@ DESC_FILES = descriptions/abaton.desc descriptions/agfafocus.desc \
descriptions/microtek.desc descriptions/mustek.desc \
descriptions/mustek_pp.desc descriptions/mustek_usb2.desc \
descriptions/mustek_usb.desc descriptions/nec.desc descriptions/net.desc \
- descriptions/niash.desc descriptions/pie.desc descriptions/pint.desc \
+ descriptions/niash.desc descriptions/pie.desc descriptions/pieusb.desc descriptions/pint.desc \
descriptions/p5.desc descriptions/pixma.desc descriptions/plustek.desc \
descriptions/plustek_pp.desc descriptions/pnm.desc descriptions/qcam.desc \
descriptions/ricoh.desc descriptions/rts8891.desc descriptions/s9036.desc \
diff --git a/doc/descriptions-external/epkowa.desc b/doc/descriptions-external/epkowa.desc
index 55f4eb2..9217aaf 100644
--- a/doc/descriptions-external/epkowa.desc
+++ b/doc/descriptions-external/epkowa.desc
@@ -1,5 +1,5 @@
;;; epkowa.desc -*- emacs-lisp -*- (eh, sort of)
-;;; Copyright (C) 2004--2013 Olaf Meeuwissen
+;;; Copyright (C) 2004--2015 Olaf Meeuwissen
;;;
;;; This file is part of the "Image Scan!" documentation.
;;;
@@ -40,7 +40,7 @@
;; Backend data.
;;
:backend "epkowa"
-:version "iscan 2.29.1/iscan-data 1.23.0"
+:version "iscan 2.30.1/iscan-data 1.36.0"
:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
@@ -80,6 +80,18 @@
;; List of EPSON scanners and all-in-ones.
;;
+:model "AL-MX300DN Series"
+:interface "USB"
+:usbid "0x04b8" "0x08ac"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "AL-MX300DNF Series"
+:interface "USB"
+:usbid "0x04b8" "0x08ac"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "Actionscanner II"
:interface "parallel SCSI"
:status :good
@@ -125,7 +137,7 @@
:interface "USB"
:usbid "0x04b8" "0x0878"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-704A"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-704A"
:model "Artisan 700"
:interface "USB"
@@ -221,37 +233,67 @@
:interface "USB"
:usbid "0x04b8" "0x0862"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "EP-704A"
:interface "USB"
:usbid "0x04b8" "0x0878"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "EP-705A"
:interface "USB"
:usbid "0x04b8" "0x089f"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-706A"
+:interface "USB"
+:usbid "0x04b8" "0x08b7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-707A"
+:interface "USB"
+:usbid "0x04b8" "0x08c9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "EP-774A"
:interface "USB"
:usbid "0x04b8" "0x0893"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "EP-775A"
:interface "USB"
:usbid "0x04b8" "0x089e"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "EP-775AW"
:interface "USB"
:usbid "0x04b8" "0x089e"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-776AB"
+:interface "USB"
+:usbid "0x04b8" "0x08b6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-776AW"
+:interface "USB"
+:usbid "0x04b8" "0x08b6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-777A"
+:interface "USB"
+:usbid "0x04b8" "0x08c8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "EP-801A"
:interface "USB"
@@ -313,6 +355,42 @@
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:model "EP-806AB"
+:interface "USB"
+:usbid "0x04b8" "0x08b5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-806AR"
+:interface "USB"
+:usbid "0x04b8" "0x08b5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-806AW"
+:interface "USB"
+:usbid "0x04b8" "0x08b5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-807AB"
+:interface "USB"
+:usbid "0x04b8" "0x08c7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-807AR"
+:interface "USB"
+:usbid "0x04b8" "0x08c7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-807AW"
+:interface "USB"
+:usbid "0x04b8" "0x08c7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "EP-901A"
:interface "USB"
:usbid "0x04b8" "0x0844"
@@ -367,6 +445,30 @@
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:model "EP-906F"
+:interface "USB"
+:usbid "0x04b8" "0x08b4"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-907F"
+:interface "USB"
+:usbid "0x04b8" "0x08c6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-976A3"
+:interface "USB"
+:usbid "0x04b8" "0x08b3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-977A3"
+:interface "USB"
+:usbid "0x04b8" "0x08c5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "ES-300C"
:interface "SCSI parallel"
:status :good
@@ -425,7 +527,7 @@
:interface "SCSI USB"
:usbid "0x04b8" "0x0126"
:status :good
-:comment "network interface unsupported<br>IEEE1394 untested"
+:comment "network interface not supported<br>IEEE1394 untested"
:model "ES-8000"
:interface "SCSI"
@@ -446,7 +548,7 @@
:interface "USB"
:usbid "0x04b8" "0x0129"
:status :good
-:comment "network interface unsupported<br>IEEE1394 untested"
+:comment "network interface not supported<br>IEEE1394 untested"
:model "ES-D200"
:interface "USB"
@@ -890,6 +992,12 @@
:status :good
:comment "requires DFSG non-free iscan-plugin-perfection-v370"
+:model "GT-S650"
+:interface "USB"
+:usbid "0x04b8" "0x013d"
+:status :good
+:comment "requires DFSG non-free iscan-plugin-gt-s650"
+
:model "GT-X700" ; product spec (JP)
:interface "USB"
:usbid "0x04b8" "0x0128"
@@ -920,11 +1028,18 @@
:status :good
:comment "requires DFSG non-free iscan-plugin-gt-x820"
+:model "GT-X830"
+:interface "USB"
+:usbid "0x04b8" "0x0153"
+:status :good
+:comment "requires DFSG non-free iscan-plugin-gt-x830"
+
:model "GT-X900"
:interface "USB"
:usbid "0x04b8" "0x012c"
:status :good
:comment "IEEE1394 untested"
+:scsi "EPSON" "GT-X900" "processor"
:model "GT-X970"
:interface "USB"
@@ -932,6 +1047,11 @@
:status :good
:comment "IEEE1394 untested"
+:model "GT-X980"
+:interface "USB"
+:usbid "0x04b8" "0x0151"
+:status :good
+
:model "K200 Series"
:interface "USB"
:usbid "0x04b8" "0x0871"
@@ -980,12 +1100,18 @@
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
-:model "L550"
+:model "L550 Series"
:interface "USB"
:usbid "0x04b8" "0x08a9"
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:model "L850 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08ca"
+:status :complete
+:comment "all-in-one"
+
:model "LP-7900CS"
:status :untested
:comment "business all-in-one; scanner is a ES-7000H"
@@ -1068,6 +1194,24 @@
:status :good
:comment "network interface not supported<br>business all-in-one"
+:model "LP-M8040"
+:interface "USB"
+:usbid "0x04b8" "0x08ad"
+:status :good
+:comment "network interface not supported<br>business all-in-one"
+
+:model "LP-M8040A"
+:interface "USB"
+:usbid "0x04b8" "0x08ad"
+:status :good
+:comment "network interface not supported<br>business all-in-one"
+
+:model "LP-M8040F"
+:interface "USB"
+:usbid "0x04b8" "0x08ad"
+:status :good
+:comment "network interface not supported<br>business all-in-one"
+
:model "M200 Series"
:interface "USB"
:usbid "0x04b8" "0x08aa"
@@ -1126,7 +1270,7 @@
:interface "USB"
:usbid "0x04b8" "0x0864"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "ME OFFICE 570W Series"
:interface "USB"
@@ -1138,13 +1282,13 @@
:interface "USB"
:usbid "0x04b8" "0x0848"
:status :good
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "ME OFFICE 620F Series"
:interface "USB"
:usbid "0x04b8" "0x0863"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "ME OFFICE 650FN Series"
:interface "USB"
@@ -1296,6 +1440,18 @@
:status :complete
:comment "all-in-one"
+:model "PX-046A"
+:interface "USB"
+:usbid "0x04b8" "0x08ae"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-047A"
+:interface "USB"
+:usbid "0x04b8" "0x08c0"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "PX-1600F"
:interface "USB"
:usbid "0x04b8" "0x0869"
@@ -1350,6 +1506,18 @@
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:model "PX-436A"
+:interface "USB"
+:usbid "0x04b8" "0x08af"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-437A"
+:interface "USB"
+:usbid "0x04b8" "0x08bf"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "PX-501A"
:interface "USB"
:usbid "0x04b8" "0x084a"
@@ -1462,7 +1630,7 @@
:interface "USB"
:usbid "0x04b8" "0x087d"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "PX-FA700"
:interface "USB"
@@ -1470,6 +1638,54 @@
:status :good
:comment "all-in-one"
+:model "PX-M350F"
+:interface "USB"
+:usbid "0x04b8" "0x08d0"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M5040F"
+:interface "USB"
+:usbid "0x04b8" "0x08b9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M5041F"
+:interface "USB"
+:usbid "0x04b8" "0x08b9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M650A"
+:interface "USB"
+:usbid "0x04b8" "0x08c3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M650F"
+:interface "USB"
+:usbid "0x04b8" "0x08c3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M740F"
+:interface "USB"
+:usbid "0x04b8" "0x08b8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M741F"
+:interface "USB"
+:usbid "0x04b8" "0x08b8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M840F"
+:interface "USB"
+:usbid "0x04b8" "0x08bd"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "Perfection 600"
:interface "SCSI"
:status :unsupported
@@ -1690,6 +1906,12 @@
:status :good
:comment "requires DFSG non-free iscan-plugin-gt-s600<br>overseas version of the GT-S600"
+:model "Perfection V19"
+:interface "USB"
+:usbid "0x04b8" "0x013c"
+:status :good
+:comment "requires DFSG non-free iscan-plugin-gt-s650"
+
:model "Perfection V30"
:interface "USB"
:usbid "0x04b8" "0x0131"
@@ -1708,6 +1930,12 @@
:status :good
:comment "requires DFSG non-free iscan-plugin-perfection-v370<br>overseas version of the GT-S640"
+:model "Perfection V39"
+:interface "USB"
+:usbid "0x04b8" "0x013d"
+:status :good
+:comment "requires DFSG non-free iscan-plugin-gt-s650<br>overseas version of the GT-S650"
+
:model "Perfection V100 Photo"
:interface "USB"
:usbid "0x04b8" "0x012d"
@@ -1750,6 +1978,12 @@
:status :good
:comment "requires DFSG non-free iscan-plugin-gt-x770<br>overseas version of the GT-X770"
+:model "Perfection V550 Photo"
+:interface "USB"
+:usbid "0x04b8" "0x013b"
+:status :good
+:comment "requires DFSG non-free iscan-plugin-perfection-v550"
+
:model "Perfection V600 Photo"
:interface "USB"
:usbid "0x04b8" "0x013a"
@@ -1761,12 +1995,25 @@
:usbid "0x04b8" "0x012c"
:status :good
:comment "IEEE1394 untested<br>overseas version of the GT-X900"
+:scsi "EPSON" "GT-X900" "processor"
:model "Perfection V750 Photo"
:interface "USB"
:usbid "0x04b8" "0x012c"
:status :good
:comment "IEEE1394 untested<br>overseas version of the GT-X900"
+:scsi "EPSON" "GT-X900" "processor"
+
+:model "Perfection V800 Photo"
+:interface "USB"
+:usbid "0x04b8" "0x0151"
+:status :good
+
+:model "Perfection V850 Pro"
+:interface "USB"
+:usbid "0x04b8" "0x0151"
+:status :good
+:comment "overseas version of the GT-X980"
:model "Stylus CX1500" ; Australia
:interface "USB"
@@ -2125,13 +2372,13 @@
:interface "USB"
:usbid "0x04b8" "0x0848"
:status :good
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus Office BX305F"
:interface "USB"
:usbid "0x04b8" "0x0863"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus Office BX305FW"
:interface "USB"
@@ -2215,13 +2462,13 @@
:interface "USB"
:usbid "0x04b8" "0x0848"
:status :good
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus Office TX320F Series"
:interface "USB"
:usbid "0x04b8" "0x0863"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus Office TX510FN Series"
:interface "USB"
@@ -2263,7 +2510,7 @@
:interface "USB"
:usbid "0x04b8" "0x0862"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-703A"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-703A"
:model "Stylus Photo PX700W"
:interface "USB"
@@ -2545,7 +2792,7 @@
:interface "USB"
:usbid "0x04b8" "0x0848"
:status :good
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus NX330 Series"
:interface "USB"
@@ -2569,7 +2816,7 @@
:interface "USB"
:usbid "0x04b8" "0x0864"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus NX430W Series"
:interface "USB"
@@ -2683,7 +2930,7 @@
:interface "USB"
:usbid "0x04b8" "0x0864"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus SX430W Series"
:interface "USB"
@@ -2827,7 +3074,7 @@
:interface "USB"
:usbid "0x04b8" "0x0864"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus TX430W Series"
:interface "USB"
@@ -2877,6 +3124,24 @@
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-535F"
+:model "WF-2630 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c4"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-2650 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-2660 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "WF-3520 Series"
:interface "USB"
:usbid "0x04b8" "0x0899"
@@ -2895,6 +3160,42 @@
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:model "WF-3620 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M740F"
+
+:model "WF-3640 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M741F"
+
+:model "WF-4630 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08be"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-4640 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08be"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-5620 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08bd"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M840F"
+
+:model "WF-5690 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08bd"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "WF-7510 Series"
:interface "USB"
:usbid "0x04b8" "0x0869"
@@ -2907,47 +3208,77 @@
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-1700F"
+:model "WF-7610 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M5040F"
+
+:model "WF-7620 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M5041F"
+
:model "WF-M1560 Series"
:interface "USB"
:usbid "0x04b8" "0x08ab"
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:model "WF-M5690 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08d0"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M350F"
+
+:model "WF-R4640 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08cd"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-R5690 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08cd"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "WP-4511"
:interface "USB"
:usbid "0x04b8" "0x087d"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
:model "WP-4515"
:interface "USB"
:usbid "0x04b8" "0x087d"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "WP-4521"
:interface "USB"
:usbid "0x04b8" "0x087d"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
:model "WP-4525"
:interface "USB"
:usbid "0x04b8" "0x087d"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
:model "WP-4530 Series"
:interface "USB"
:usbid "0x04b8" "0x087d"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
:model "WP-4540 Series"
:interface "USB"
:usbid "0x04b8" "0x087d"
:status :complete
-:comment "network interface option supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
:model "WP-4590 Series"
:interface "USB"
@@ -2965,7 +3296,7 @@
:interface "USB"
:usbid "0x04b8" "0x0863"
:status :complete
-:comment "network interface (option) supported via DFSG non-free iscan-network-nt package<br>some models in the series have a built-in network interface<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>some models in the series have a built-in network interface<br>all-in-one"
:model "WorkForce 435"
:interface "USB"
@@ -3055,19 +3386,25 @@
:interface "USB"
:usbid "0x04b8" "0x08ae"
:status :complete
-:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-046A"
:model "XP-212"
:interface "USB"
:usbid "0x04b8" "0x08ae"
:status :complete
-:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-046A"
:model "XP-215"
:interface "USB"
:usbid "0x04b8" "0x08ae"
:status :complete
-:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-046A"
+
+:model "XP-225"
+:interface "USB"
+:usbid "0x04b8" "0x08c0"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-047A"
:model "XP-300 Series"
:interface "USB"
@@ -3079,7 +3416,13 @@
:interface "USB"
:usbid "0x04b8" "0x08af"
:status :complete
-:comment "network interface supported via DFSG non-free iscan-network-nt package"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-436A"
+
+:model "XP-320 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08bf"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-437A"
:model "XP-400 Series"
:interface "USB"
@@ -3093,32 +3436,104 @@
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:model "XP-420 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c1"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "XP-600 Series"
:interface "USB"
:usbid "0x04b8" "0x089e"
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-775A"
+:model "XP-510 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-706A"
+
+:model "XP-520 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-777A"
+
+:model "XP-610 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-776AB/EP-776AW"
+
+:model "XP-620 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-777A"
+
:model "XP-700 Series"
:interface "USB"
:usbid "0x04b8" "0x089d"
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:model "XP-710 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-806AB/EP-806AR/EP-806AW"
+
+:model "XP-720 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-807AB/EP-807AR/EP-807AW"
+
:model "XP-750 Series"
:interface "USB"
:usbid "0x04b8" "0x089c"
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-805A/EP-805AR/EP-805AW"
+:model "XP-760 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-807AB/EP-807AR/EP-807AW"
+
:model "XP-800 Series"
:interface "USB"
:usbid "0x04b8" "0x089b"
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-905A"
+:model "XP-810 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b4"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-906F"
+
+:model "XP-820 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-907F"
+
:model "XP-850 Series"
:interface "USB"
:usbid "0x04b8" "0x089a"
:status :complete
:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-905F"
+
+:model "XP-860 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-907F"
+
+:model "XP-950 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-976A3"
diff --git a/doc/descriptions/avision.desc b/doc/descriptions/avision.desc
index 708f5ea..bff25f5 100644
--- a/doc/descriptions/avision.desc
+++ b/doc/descriptions/avision.desc
@@ -19,7 +19,7 @@
;:status :stable
; backend's web page
-:url "http://skull.piratehaven.org/~mike/sane/avision.html"
+:url "http://exactcode.com/site/open_source/saneavision/"
; name of manpage (if it exists)
:manpage "sane-avision"
@@ -111,7 +111,13 @@
:interface "USB"
:usbid "0x0638" "0x0a2b"
:comment "duplex! sheetfed scanner"
-:status :complete
+:status :basic
+
+:model "AV220D2"
+:interface "USB"
+:usbid "0x0638" "0x1a31"
+:comment "duplex! sheetfed scanner"
+:status :untested
:model "AV220+"
:interface "USB"
diff --git a/doc/descriptions/canon_dr.desc b/doc/descriptions/canon_dr.desc
index b69bdcc..86a8507 100644
--- a/doc/descriptions/canon_dr.desc
+++ b/doc/descriptions/canon_dr.desc
@@ -11,9 +11,9 @@
:backend "canon_dr" ; name of backend
:url "http://www.thebility.com/canon/"
-:version "41" ; version of backend
+:version "51" ; version of backend
:manpage "sane-canon_dr" ; name of manpage (if it exists)
-:comment "Backend updated for SANE release 1.0.24, see sane-canon_dr manpage"
+:comment "Backend updated for SANE release 1.0.25, see sane-canon_dr manpage"
:devicetype :scanner ; start of a list of devices....
; other types: :stillcam, :vidcam,
; :meta, :api
@@ -226,8 +226,8 @@
:model "DR-7080C"
:interface "USB SCSI"
:usbid "0x04a9" "0x1604"
-:status :untested
-:comment "Please test!"
+:status :good
+:comment "ADF and flatbed work"
:model "DR-7090C"
:interface "USB SCSI"
@@ -265,37 +265,62 @@
:status :untested
:comment "Please test!"
-:model "DR-C125"
+:model "DR-C120"
:interface "USB"
-;:usbid "0x1083" "0x"
+:usbid "0x1083" "0x1651"
:status :untested
-:comment "Similar protocol to other canon_dr machines, but unsupported image format."
+
+:model "DR-C125"
+:interface "USB"
+:usbid "0x1083" "0x1640"
+:status :good
:model "DR-C130"
:interface "USB"
-;:usbid "0x1083" "0x"
+:usbid "0x1083" "0x164a"
:status :untested
-:model "DR-G1100"
+:model "DR-C225"
:interface "USB"
-;:usbid "0x1083" "0x"
+:usbid "0x1083" "0x1658"
:status :untested
+:comment ""
+
+:model "DR-F120"
+:interface "USB"
+:usbid "0x1083" "0x1654"
+:status :untested
+
+:model "DR-G1100"
+:interface "USB"
+:usbid "0x1083" "0x1650"
+:status :good
:model "DR-G1130"
:interface "USB"
-;:usbid "0x1083" "0x"
+:usbid "0x1083" "0x164f"
:status :untested
:model "DR-M140"
:interface "USB"
-;:usbid "0x1083" "0x"
-:status :untested
+:usbid "0x1083" "0x163f"
+:status :good
:model "DR-M160"
:interface "USB"
+:usbid "0x1083" "0x163e"
+:status :good
+
+:model "DR-M160II"
+:interface "USB"
;:usbid "0x1083" "0x"
:status :untested
+:model "DR-M1060"
+:interface "USB"
+:usbid "0x1083" "0x1657"
+:status :untested
+
:model "P-150"
:interface "USB"
;:usbid "0x1083" "0x"
@@ -306,15 +331,63 @@
;:usbid "0x1083" "0x"
:status :untested
+:model "P-201"
+:interface "USB"
+:usbid "0x1083" "0x1652"
+:status :untested
+
+:model "DR-P208"
+:interface "USB"
+:usbid "0x1083" "0x164b"
+:status :untested
+:comment "Same as P-208?"
+
:model "P-208"
:interface "USB"
:usbid "0x1083" "0x164c"
:status :basic
:comment "All modes and resolutions working, but calibration is poor."
+:model "DR-P208II"
+:interface "USB"
+:usbid "0x1083" "0x165d"
+:status :untested
+
+:model "P-208II"
+:interface "USB"
+:usbid "0x1083" "0x165f"
+:status :untested
+
+:model "DR-P215"
+:interface "USB"
+:usbid "0x1083" "0x1641"
+:status :untested
+:comment "Same as P-215?"
+
:model "P-215"
:interface "USB"
:usbid "0x1083" "0x1646"
:status :basic
:comment "All modes and resolutions working, but calibration is poor. Card reader slot not working."
+:model "P-215"
+:interface "USB"
+:usbid "0x1083" "0x1647"
+:status :basic
+:comment "This is the same device as the 0x1646 P-215, but the mode switch on the scanner is in the wrong position, you must move the switch."
+
+:model "DR-P215II"
+:interface "USB"
+:usbid "0x1083" "0x1659"
+:status :untested
+
+:model "P-215II"
+:interface "USB"
+:usbid "0x1083" "0x165b"
+:status :untested
+
+:model "FSU-201"
+:interface "USB"
+:usbid "0x1083" "0x1648"
+:status :untested
+
diff --git a/doc/descriptions/epjitsu.desc b/doc/descriptions/epjitsu.desc
index 7c453df..b11ee96 100644
--- a/doc/descriptions/epjitsu.desc
+++ b/doc/descriptions/epjitsu.desc
@@ -11,9 +11,9 @@
:backend "epjitsu" ; name of backend
:url "http://www.thebility.com/epjitsu/"
-:version "20" ; version of backend
+:version "27" ; version of backend
:manpage "sane-epjitsu" ; name of manpage (if it exists)
-:comment "Backend updated for SANE release 1.0.21, see sane-epjitsu manpage"
+:comment "Backend updated for SANE release 1.0.26, see sane-epjitsu manpage"
:devicetype :scanner ; start of a list of devices....
; other types: :stillcam, :vidcam,
; :meta, :api
@@ -42,9 +42,9 @@
:model "ScanSnap S1100"
:interface "USB"
-:status :unsupported
+:status :good
:usbid "0x04c5" "0x1200"
-:comment "Beta version of backend source available, which works well, but breaks support for other epjitsu scanners. See http://ubuntuforums.org/showthread.php?t=1678335"
+:comment "Hardware only supports 300 and 600 dpi simplex color. Backend manufactures gray and binary modes."
:model "ScanSnap S1300"
:interface "USB"
@@ -52,3 +52,14 @@
:usbid "0x04c5" "0x11ed"
:comment "Same as S300, with different usb id"
+:model "ScanSnap S1300i"
+:interface "USB"
+:status :good
+:usbid "0x04c5" "0x128d"
+:comment "Similar to S1300."
+
+:model "fi-65F"
+:interface "USB"
+:status :basic
+;:usbid "0x04c5" "0x10c7"
+:comment "A6-size flatbed, 300/600 dpi, color/gray/binary."
diff --git a/doc/descriptions/epson.desc b/doc/descriptions/epson.desc
index a31fc84..1c9d8a2 100644
--- a/doc/descriptions/epson.desc
+++ b/doc/descriptions/epson.desc
@@ -176,6 +176,7 @@
:model "Expression 800"
:interface "SCSI"
:status :complete
+:scsi "EPSON" "Expression800" "processor"
:model "Expression 1600"
:interface "SCSI USB IEEE-1394"
@@ -189,9 +190,7 @@
:model "FilmScan 200"
:interface "SCSI"
-:comment "A better backend for the FilmScan 200 can be found at <A HREF=\"http://www.vjet.demon.co.uk/scanner/\">http://www.vjet.demon.co.uk/scanner/</A>"
:status :unsupported
-:url "http://www.vjet.demon.co.uk/scanner/"
:model "CX-3200"
:interface "USB"
diff --git a/doc/descriptions/epson2.desc b/doc/descriptions/epson2.desc
index 9d9461d..de61b76 100644
--- a/doc/descriptions/epson2.desc
+++ b/doc/descriptions/epson2.desc
@@ -19,11 +19,23 @@
:mfg "Epson"
:url "http://www.epson.com/"
+:model "AL-MX300DN Series"
+:interface "USB"
+:usbid "0x04b8" "0x08ac"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+:url "http://www.epson.com/"
+
+:model "AL-MX300DNF Series"
+:interface "USB"
+:usbid "0x04b8" "0x08ac"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "Actionscanner II"
:interface "parallel SCSI"
:status :good
:comment "overseas version of the GT-5000"
-:url "http://www.epson.com/"
:model "AcuLaser CX11"
:interface "USB"
@@ -38,10 +50,34 @@
:comment "network interface supported<br>AcuLaser CX11 with network interface and fax"
:model "AcuLaser CX21"
-:interface "USB"
+:interface "USB Network"
:usbid "0x04b8" "0x0835"
:status :good
-:comment "network interface probably supported"
+:comment "network interface supported"
+
+:model "AcuLaser MX20DN"
+:interface "USB"
+:usbid "0x04b8" "0x0866"
+:status :complete
+:comment "network interface probably supported<br>business all-in-one"
+
+:model "AcuLaser MX20DNF"
+:interface "USB"
+:usbid "0x04b8" "0x0866"
+:status :complete
+:comment "network interface probably supported<br>business all-in-one"
+
+:model "AcuLaser MX21DNF"
+:interface "USB"
+:usbid "0x04b8" "0x0866"
+:status :complete
+:comment "network interface probably supported<br>business all-in-one"
+
+:model "Artisan 635"
+:interface "USB"
+:usbid "0x04b8" "0x0878"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-704A"
:model "Artisan 700"
:interface "USB Network"
@@ -52,8 +88,20 @@
:model "Artisan 710 Series"
:interface "USB"
:usbid "0x04b8" "0x0852"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-802A"
+
+:model "Artisan 725"
+:interface "USB"
+:usbid "0x04b8" "0x0861"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-803A"
+
+:model "Artisan 730 Series"
+:interface "USB"
+:usbid "0x04b8" "0x087b"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-804A"
:model "Artisan 800"
:interface "USB"
@@ -64,8 +112,20 @@
:model "Artisan 810 Series"
:interface "USB"
:usbid "0x04b8" "0x0853"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-902A"
+
+:model "Artisan 835"
+:interface "USB"
+:usbid "0x04b8" "0x0860"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-903A"
+
+:model "Artisan 837"
+:interface "USB"
+:usbid "0x04b8" "0x0879"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-904F"
:model "CC-500L" ; product spec (JP)
:interface "USB"
@@ -97,12 +157,84 @@
:status :unsupported
:comment "all-in-one"
-:model "EP-702A"
+:model "DS-30"
:interface "USB"
-:usbid "0x04b8" "0x0850"
+:usbid "0x04b8" "0x0147"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
+:model "EP-702A"
+:interface "USB"
+:usbid "0x04b8" "0x0850"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-703A"
+:interface "USB"
+:usbid "0x04b8" "0x0862"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-704A"
+:interface "USB"
+:usbid "0x04b8" "0x0878"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-705A"
+:interface "USB"
+:usbid "0x04b8" "0x089f"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-706A"
+:interface "USB"
+:usbid "0x04b8" "0x08b7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-707A"
+:interface "USB"
+:usbid "0x04b8" "0x08c9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-774A"
+:interface "USB"
+:usbid "0x04b8" "0x0893"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-775A"
+:interface "USB"
+:usbid "0x04b8" "0x089e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-775AW"
+:interface "USB"
+:usbid "0x04b8" "0x089e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-776AB"
+:interface "USB"
+:usbid "0x04b8" "0x08b6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-776AW"
+:interface "USB"
+:usbid "0x04b8" "0x08b6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-777A"
+:interface "USB"
+:usbid "0x04b8" "0x08c8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "EP-801A"
:interface "USB Network"
:usbid "0x04b8" "0x0846"
@@ -112,8 +244,92 @@
:model "EP-802A"
:interface "USB"
:usbid "0x04b8" "0x0852"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-803A"
+:interface "USB"
+:usbid "0x04b8" "0x0861"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-803AW"
+:interface "USB"
+:usbid "0x04b8" "0x0861"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-804A"
+:interface "USB"
+:usbid "0x04b8" "0x087b"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-804AR"
+:interface "USB"
+:usbid "0x04b8" "0x087b"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-804AW"
+:interface "USB"
+:usbid "0x04b8" "0x087b"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-805A"
+:interface "USB"
+:usbid "0x04b8" "0x089c"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-805AR"
+:interface "USB"
+:usbid "0x04b8" "0x089c"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-805AW"
+:interface "USB"
+:usbid "0x04b8" "0x089c"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-806AB"
+:interface "USB"
+:usbid "0x04b8" "0x08b5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-806AR"
+:interface "USB"
+:usbid "0x04b8" "0x08b5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-806AW"
+:interface "USB"
+:usbid "0x04b8" "0x08b5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-807AB"
+:interface "USB"
+:usbid "0x04b8" "0x08c7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-807AR"
+:interface "USB"
+:usbid "0x04b8" "0x08c7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-807AW"
+:interface "USB"
+:usbid "0x04b8" "0x08c7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "EP-901A"
:interface "USB"
@@ -130,8 +346,68 @@
:model "EP-902A"
:interface "USB"
:usbid "0x04b8" "0x0853"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-903A"
+:interface "USB"
+:usbid "0x04b8" "0x0860"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-903F"
+:interface "USB"
+:usbid "0x04b8" "0x0860"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-904A"
+:interface "USB"
+:usbid "0x04b8" "0x0879"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-904F"
+:interface "USB"
+:usbid "0x04b8" "0x0879"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-905A"
+:interface "USB"
+:usbid "0x04b8" "0x089b"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-905F"
+:interface "USB"
+:usbid "0x04b8" "0x089a"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-906F"
+:interface "USB"
+:usbid "0x04b8" "0x08b4"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-907F"
+:interface "USB"
+:usbid "0x04b8" "0x08c6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-976A3"
+:interface "USB"
+:usbid "0x04b8" "0x08b3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "EP-977A3"
+:interface "USB"
+:usbid "0x04b8" "0x08c5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "ES-300C"
:interface "SCSI parallel"
@@ -191,7 +467,7 @@
:interface "SCSI USB"
:usbid "0x04b8" "0x0126"
:status :good
-:comment "network interface unsupported<br>IEEE1394 untested"
+:comment "network interface probably supported<br>IEEE1394 untested"
:model "ES-8000"
:interface "SCSI"
@@ -212,14 +488,30 @@
:interface "USB"
:usbid "0x04b8" "0x0129"
:status :good
-:comment "network interface unsupported<br>IEEE1394 untested"
+:comment "network interface probably supported<br>IEEE1394 untested"
+
+:model "ES-D200"
+:interface "USB"
+:usbid "0x04b8" "0x0137"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
+
+:model "ES-D350"
+:interface "USB"
+:usbid "0x04b8" "0x0144"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
:model "ES-D400"
:interface "USB"
:usbid "0x04b8" "0x0136"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
+
+:model "ES-G11000"
+:interface "USB"
+:usbid "0x04b8" "0x014b"
+:status :good
:model "ES-H300"
:interface "USB"
@@ -230,8 +522,8 @@
:model "ES-H7200"
:interface "USB Ethernet"
:usbid "0x04b8" "0x0138"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :good
+:comment "network interface supported via DFSG non-free iscan-network-nt package"
:model "Expression 636"
:interface "SCSI"
@@ -240,6 +532,7 @@
:model "Expression 800" ; command spec
:interface "SCSI"
+:scsi "EPSON" "Expression800" "processor"
:status :complete
:comment "overseas version of the GT-9600"
@@ -291,6 +584,12 @@
:status :untested
:comment "network interface probably supported"
+:model "Expression 11000XL"
+:interface "USB"
+:usbid "0x04b8" "0x014b"
+:status :good
+:comment "overseas version of the ES-G11000"
+
:model "F-3200" ; product spec (JP)
:interface "USB IEEE1394"
:usbid "0x04b8" "0x080a"
@@ -304,14 +603,13 @@
:model "FilmScan 200"
:interface "SCSI"
:status :minimal
-:comment "will be supported"
+:comment "missing documentation"
:model "GT-1500"
:interface "USB"
:usbid "0x04b8" "0x0133"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-2200"
:interface "USB"
@@ -337,6 +635,7 @@
:model "GT-5500"
:interface "SCSI"
+:scsi "EPSON" "SCANNER GT-5500" "processor"
:status :good
:model "GT-6000"
@@ -360,6 +659,7 @@
:model "GT-7000S"
:interface "SCSI"
+:scsi "EPSON" "SCANNER GT-7000" "processor"
:status :complete
:model "GT-7000U"
@@ -372,14 +672,12 @@
:usbid "0x04b8" "0x010f"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-7300U" ; product spec (JP)
:interface "USB"
:usbid "0x04b8" "0x011d"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-7400U" ; product spec (JP)
:interface "USB"
@@ -461,7 +759,6 @@
:usbid "0x04b8" "0x0116"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-9500"
:interface "SCSI"
@@ -472,16 +769,16 @@
:status :complete
:model "GT-9700F" ; product spec (JP)
-:interface "USB"
+:interface "USB IEEE1394"
+:scsi "EPSON" "GT-9700" "processor"
:usbid "0x04b8" "0x0112"
:status :complete
-:comment "IEEE1394 untested"
:model "GT-9800F" ; product spec (JP)
-:interface "USB"
+:interface "USB IEEE1394"
+:scsi "EPSON" "GT-9800" "processor"
:usbid "0x04b8" "0x011c"
:status :complete
-:comment "IEEE1394 untested"
:model "GT-10000"
:interface "SCSI"
@@ -490,7 +787,6 @@
:model "GT-10000+" ; command spec
:interface "SCSI"
-:scsi "EPSON" "SCANNER GT-10000" "processor"
:status :good
:comment "IEEE1394 untested<br>overseas version of the ES-6000H"
@@ -508,8 +804,8 @@
:model "GT-20000"
:interface "USB Ethernet"
:usbid "0x04b8" "0x0138"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :good
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>overseas version of the ES-H7200"
:model "GT-30000" ; command spec
:interface "SCSI"
@@ -521,98 +817,126 @@
:usbid "0x04b8" "0x0133"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-F500" ; product spec (JP)
:interface "USB"
:usbid "0x04b8" "0x0121"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-F520"
:interface "USB"
:usbid "0x04b8" "0x0122"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-F550" ; product spec (JP)
:interface "USB"
:usbid "0x04b8" "0x0121"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-F570"
:interface "USB"
:usbid "0x04b8" "0x0122"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-F600" ; product spec (JP)
:interface "USB"
:usbid "0x04b8" "0x0118"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-F650"
:interface "USB"
:usbid "0x04b8" "0x012d"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-F670"
:interface "USB"
:usbid "0x04b8" "0x012e"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-F700"
:interface "USB"
:usbid "0x04b8" "0x012f"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-F720"
:interface "USB"
:usbid "0x04b8" "0x0131"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
+
+:model "GT-F730"
+:interface "USB"
+:usbid "0x04b8" "0x0142"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
+
+:model "GT-F740"
+:interface "USB"
+:usbid "0x04b8" "0x014a"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
:model "GT-S50"
:interface "USB"
:usbid "0x04b8" "0x0137"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
+
+:model "GT-S55"
+:interface "USB"
+:usbid "0x04b8" "0x0143"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
:model "GT-S80"
:interface "USB"
:usbid "0x04b8" "0x0136"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
+
+:model "GT-S85"
+:interface "USB"
+:usbid "0x04b8" "0x0144"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
:model "GT-S600"
:interface "USB"
:usbid "0x04b8" "0x012d"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-S620"
:interface "USB"
:usbid "0x04b8" "0x0131"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
+
+:model "GT-S630"
+:interface "USB"
+:usbid "0x04b8" "0x0142"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
+
+:model "GT-S640"
+:interface "USB"
+:usbid "0x04b8" "0x014a"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
+
+:model "GT-S650"
+:interface "USB"
+:usbid "0x04b8" "0x013d"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
:model "GT-X700" ; product spec (JP)
:interface "USB"
@@ -625,14 +949,12 @@
:usbid "0x04b8" "0x0119"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-X770"
:interface "USB"
:usbid "0x04b8" "0x0130"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "GT-X800" ; product spec (JP)
:interface "USB"
@@ -645,10 +967,16 @@
:usbid "0x04b8" "0x013a"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
+
+:model "GT-X830"
+:interface "USB"
+:usbid "0x04b8" "0x0153"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
:model "GT-X900"
:interface "USB"
+:scsi "EPSON" "GT-X900" "processor"
:usbid "0x04b8" "0x012c"
:status :good
:comment "IEEE1394 untested"
@@ -659,6 +987,71 @@
:status :good
:comment "IEEE1394 untested"
+:model "GT-X980"
+:interface "USB"
+:usbid "0x04b8" "0x0151"
+:status :good
+
+:model "K200 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0871"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "K300 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0872"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "L200 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0873"
+:status :complete
+:comment "all-in-one"
+
+:model "L210 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08a1"
+:status :complete
+:comment "all-in-one"
+
+:model "L350"
+:interface "USB"
+:usbid "0x04b8" "0x08a1"
+:status :complete
+:comment "all-in-one"
+
+:model "L351"
+:interface "USB"
+:usbid "0x04b8" "0x08a1"
+:status :complete
+:comment "all-in-one"
+
+:model "L355"
+:interface "USB"
+:usbid "0x04b8" "0x08a8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "L358"
+:interface "USB"
+:usbid "0x04b8" "0x08a8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "L550 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08a9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "L850 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08ca"
+:status :complete
+:comment "all-in-one"
+
:model "LP-7900CS"
:status :untested
:comment "business all-in-one; scanner is a ES-7000H"
@@ -711,6 +1104,12 @@
:status :good
:comment "network interface probably supported<br>business all-in-one"
+:model "LP-M5300 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0894"
+:status :good
+:comment "network interface probably supported<br>business all-in-one"
+
:model "LP-M5500"
:interface "USB"
:usbid "0x04b8" "0x0817"
@@ -735,6 +1134,30 @@
:status :good
:comment "network interface probably supported<br>business all-in-one"
+:model "LP-M8040"
+:interface "USB"
+:usbid "0x04b8" "0x08ad"
+:status :good
+:comment "network interface probably supported<br>business all-in-one"
+
+:model "LP-M8040A"
+:interface "USB"
+:usbid "0x04b8" "0x08ad"
+:status :good
+:comment "network interface probably supported<br>business all-in-one"
+
+:model "LP-M8040F"
+:interface "USB"
+:usbid "0x04b8" "0x08ad"
+:status :good
+:comment "network interface probably supported<br>business all-in-one"
+
+:model "M200 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08aa"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "ME 200"
:interface "USB"
:usbid "0x04b8" "0x0830"
@@ -747,17 +1170,65 @@
:status :good
:comment "all-in-one<br>overseas version of the PX-401A"
+:model "ME 320 Series"
+:interface "USB"
+:usbid "0x04b8" "0x085c"
+:status :complete
+:comment "all-in-one"
+
+:model "ME 330 Series"
+:interface "USB"
+:usbid "0x04b8" "0x085c"
+:status :complete
+:comment "all-in-one"
+
+:model "ME 340 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0883"
+:status :complete
+:comment "all-in-one"
+
:model "ME OFFICE 510"
:interface "USB"
:usbid "0x04b8" "0x084f"
:status :good
:comment "all-in-one"
+:model "ME OFFICE 520 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0865"
+:status :complete
+:comment "all-in-one"
+
+:model "ME OFFICE 535"
+:interface "USB"
+:usbid "0x04b8" "0x0881"
+:status :complete
+:comment "all-in-one<br>overseas version of the PX-404A"
+
+:model "ME OFFICE 560W Series"
+:interface "USB"
+:usbid "0x04b8" "0x0864"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "ME OFFICE 570W Series"
+:interface "USB"
+:usbid "0x04b8" "0x0880"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-434A"
+
:model "ME Office 600F"
:interface "USB"
:usbid "0x04b8" "0x0848"
:status :good
-:comment "all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "ME OFFICE 620F Series"
+:interface "USB"
+:usbid "0x04b8" "0x0863"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "ME OFFICE 650FN Series"
:interface "USB"
@@ -771,6 +1242,48 @@
:status :good
:comment "network interface probably supported<br>all-in-one<br>overseas version of the PX-601F"
+:model "ME OFFICE 900WD Series"
+:interface "USB"
+:usbid "0x04b8" "0x085e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-503A"
+
+:model "ME OFFICE 940FW Series"
+:interface "USB"
+:usbid "0x04b8" "0x0890"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "ME OFFICE 960FWD Series"
+:interface "USB"
+:usbid "0x04b8" "0x085d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "ME-101"
+:interface "USB"
+:usbid "0x04b8" "0x08a0"
+:status :complete
+:comment "all-in-one"
+
+:model "ME-301"
+:interface "USB"
+:usbid "0x04b8" "0x0896"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "ME-303"
+:interface "USB"
+:usbid "0x04b8" "0x0897"
+:status :complete
+:comment "all-in-one<br>overseas version of the PX-405A"
+
+:model "ME-401"
+:interface "USB"
+:usbid "0x04b8" "0x0898"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-435A"
+
:model "PM-A700" ; product spec (JP)
:interface "USB"
:usbid "0x04b8" "0x0814"
@@ -861,6 +1374,36 @@
:status :good
:comment "all-in-one<br>PM-A970 with network interface"
+:model "PX-045A"
+:interface "USB"
+:usbid "0x04b8" "0x0895"
+:status :complete
+:comment "all-in-one"
+
+:model "PX-046A"
+:interface "USB"
+:usbid "0x04b8" "0x08ae"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-047A"
+:interface "USB"
+:usbid "0x04b8" "0x08c0"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-1600F"
+:interface "USB"
+:usbid "0x04b8" "0x0869"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-1700F"
+:interface "USB"
+:usbid "0x04b8" "0x087c"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "PX-401A"
:interface "USB"
:usbid "0x04b8" "0x0841"
@@ -873,6 +1416,48 @@
:status :good
:comment "all-in-one"
+:model "PX-403A"
+:interface "USB"
+:usbid "0x04b8" "0x087f"
+:status :complete
+:comment "all-in-one"
+
+:model "PX-404A"
+:interface "USB"
+:usbid "0x04b8" "0x0881"
+:status :complete
+:comment "all-in-one"
+
+:model "PX-405A"
+:interface "USB"
+:usbid "0x04b8" "0x0897"
+:status :complete
+:comment "all-in-one"
+
+:model "PX-434A"
+:interface "USB"
+:usbid "0x04b8" "0x0880"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-435A"
+:interface "USB"
+:usbid "0x04b8" "0x0898"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-436A"
+:interface "USB"
+:usbid "0x04b8" "0x08af"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-437A"
+:interface "USB"
+:usbid "0x04b8" "0x08bf"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "PX-501A"
:interface "USB"
:usbid "0x04b8" "0x084a"
@@ -885,12 +1470,66 @@
:status :good
:comment "all-in-one"
+:model "PX-503A"
+:interface "USB"
+:usbid "0x04b8" "0x085e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-504A"
+:interface "USB"
+:usbid "0x04b8" "0x0891"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-505F"
+:interface "USB"
+:usbid "0x04b8" "0x08a5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-535F"
+:interface "USB"
+:usbid "0x04b8" "0x08a6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "PX-601F"
:interface "USB"
:usbid "0x04b8" "0x0847"
:status :good
:comment "network interface probably supported"
+:model "PX-602F"
+:interface "USB"
+:usbid "0x04b8" "0x0855"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-603F"
+:interface "USB"
+:usbid "0x04b8" "0x085d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-605F"
+:interface "USB"
+:usbid "0x04b8" "0x0899"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-673F"
+:interface "USB"
+:usbid "0x04b8" "0x086a"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-675F"
+:interface "USB"
+:usbid "0x04b8" "0x0899"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "PX-A550" ; product spec (JP)
:interface "USB"
:usbid "0x04b8" "0x080e"
@@ -927,12 +1566,66 @@
:status :good
:comment "all-in-one"
+:model "PX-B750F"
+:interface "USB"
+:usbid "0x04b8" "0x087d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "PX-FA700"
:interface "USB"
:usbid "0x04b8" "0x083a"
:status :good
:comment "all-in-one"
+:model "PX-M350F"
+:interface "USB"
+:usbid "0x04b8" "0x08d0"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M5040F"
+:interface "USB"
+:usbid "0x04b8" "0x08b9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M5041F"
+:interface "USB"
+:usbid "0x04b8" "0x08b9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M650A"
+:interface "USB"
+:usbid "0x04b8" "0x08c3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M650F"
+:interface "USB"
+:usbid "0x04b8" "0x08c3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M740F"
+:interface "USB"
+:usbid "0x04b8" "0x08b8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M741F"
+:interface "USB"
+:usbid "0x04b8" "0x08b8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "PX-M840F"
+:interface "USB"
+:usbid "0x04b8" "0x08bd"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "Perfection 600"
:interface "SCSI"
:status :unsupported
@@ -941,11 +1634,12 @@
:model "Perfection 610" ; command spec
:interface "USB"
:usbid "0x04b8" "0x0103"
-:status :complete
+:status :basic
:comment "overseas version of the GT-6600U"
:model "Perfection 636S"
:interface "SCSI"
+:scsi "EPSON" "Perfection636" "processor"
:status :complete
:comment "overseas version of the GT-7000S"
@@ -969,6 +1663,7 @@
:model "Perfection 1200S" ; command spec
:interface "SCSI"
+:scsi "EPSON" "Perfection1200" "processor"
:status :complete
:comment "overseas version of the GT-7600S"
@@ -995,28 +1690,24 @@
:usbid "0x04b8" "0x010f"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 1250 PHOTO"
:interface "USB"
:usbid "0x04b8" "0x010f"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 1260"
:interface "USB"
:usbid "0x04b8" "0x011d"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 1260 PHOTO"
:interface "USB"
:usbid "0x04b8" "0x011d"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 1270"
:interface "USB"
@@ -1077,9 +1768,9 @@
:comment "overseas version of the GT-9300UF"
:model "Perfection 2450 PHOTO" ; command spec
-:interface "USB IEEE-1394"
-:usbid "0x04b8" "0x0112"
+:interface "USB IEEE1394"
:scsi "EPSON" "GT-9700" "processor"
+:usbid "0x04b8" "0x0112"
:status :complete
:comment "overseas version of the GT-9700F"
@@ -1088,26 +1779,23 @@
:usbid "0x04b8" "0x0121"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 2580 PHOTO"
:interface "USB"
:usbid "0x04b8" "0x0121"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 3170 PHOTO"
:interface "USB"
:usbid "0x04b8" "0x0116"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 3200 PHOTO" ; command spec
-:interface "USB IEEE-1394"
-:usbid "0x04b8" "0x011c"
+:interface "USB IEEE1394"
:scsi "EPSON" "GT-9800" "processor"
+:usbid "0x04b8" "0x011c"
:status :complete
:comment "overseas version of the GT-9800F"
@@ -1116,28 +1804,24 @@
:usbid "0x04b8" "0x0122"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 3590 PHOTO"
:interface "USB"
:usbid "0x04b8" "0x0122"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 4180 PHOTO"
:interface "USB"
:usbid "0x04b8" "0x0118"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 4490 PHOTO"
:interface "USB"
:usbid "0x04b8" "0x0119"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection 4870 PHOTO" ; command spec
:interface "USB"
@@ -1161,69 +1845,116 @@
:usbid "0x04b8" "0x012d"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
+
+:model "Perfection V19"
+:interface "USB"
+:usbid "0x04b8" "0x013c"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
:model "Perfection V30"
:interface "USB"
:usbid "0x04b8" "0x0131"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
+
+:model "Perfection V33"
+:interface "USB"
+:usbid "0x04b8" "0x0142"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
+
+:model "Perfection V37"
+:interface "USB"
+:usbid "0x04b8" "0x014a"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
+
+:model "Perfection V39"
+:interface "USB"
+:usbid "0x04b8" "0x013d"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
:model "Perfection V100 Photo"
:interface "USB"
:usbid "0x04b8" "0x012d"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection V200 Photo"
:interface "USB"
:usbid "0x04b8" "0x012e"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection V300 Photo"
:interface "USB"
:usbid "0x04b8" "0x0131"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
+
+:model "Perfection V330 Photo"
+:interface "USB"
+:usbid "0x04b8" "0x0142"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
+
+:model "Perfection V370 Photo"
+:interface "USB"
+:usbid "0x04b8" "0x014a"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
:model "Perfection V350 Photo"
:interface "USB"
:usbid "0x04b8" "0x012f"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection V500 Photo"
:interface "USB"
:usbid "0x04b8" "0x0130"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
+
+:model "Perfection V550 Photo"
+:interface "USB"
+:usbid "0x04b8" "0x013b"
+:status :unsupported
+:comment "supported by the epkowa backend plus non-free interpreter"
:model "Perfection V600 Photo"
:interface "USB"
:usbid "0x04b8" "0x013a"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Perfection V700 Photo"
:interface "USB"
+:scsi "EPSON" "GT-X900" "processor"
:usbid "0x04b8" "0x012c"
:status :good
:comment "IEEE1394 untested<br>overseas version of the GT-X900"
:model "Perfection V750 Photo"
:interface "USB"
+:scsi "EPSON" "GT-X900" "processor"
:usbid "0x04b8" "0x012c"
:status :good
:comment "IEEE1394 untested<br>overseas version of the GT-X900"
+:model "Perfection V800 Photo"
+:interface "USB"
+:usbid "0x04b8" "0x0151"
+:status :good
+
+:model "Perfection V850 Pro"
+:interface "USB"
+:usbid "0x04b8" "0x0151"
+:status :good
+:comment "overseas version of the GT-X980"
+
:model "Stylus CX1500" ; Australia
:interface "USB"
:usbid "0x04b8" "0x080c"
@@ -1286,7 +2017,8 @@
:model "Stylus CX3810"
:interface "USB"
-:status :untested
+:usbid "0x04b8" "0x0818"
+:status :good
:comment "all-in-one"
:model "Stylus CX3900"
@@ -1312,14 +2044,12 @@
:usbid "0x04b8" "0x083f"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Stylus CX4400"
:interface "USB"
:usbid "0x04b8" "0x083f"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Stylus CX4500"
:interface "USB"
@@ -1386,14 +2116,12 @@
:usbid "0x04b8" "0x083f"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Stylus CX5600"
:interface "USB"
:usbid "0x04b8" "0x083f"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Stylus CX5700F"
:interface "USB"
@@ -1531,7 +2259,6 @@
:usbid "0x04b8" "0x083f"
:status :unsupported
:comment "supported by the epkowa backend plus non-free interpreter"
-:url "http://download.ebz.epson.net/dsc/search/01/search/?OSC=LX"
:model "Stylus DX4800"
:interface "USB"
@@ -1585,7 +2312,25 @@
:interface "USB"
:usbid "0x04b8" "0x0848"
:status :good
-:comment "all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus Office BX305F"
+:interface "USB"
+:usbid "0x04b8" "0x0863"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus Office BX305FW"
+:interface "USB"
+:usbid "0x04b8" "0x0863"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus Office BX305FW Plus"
+:interface "USB"
+:usbid "0x04b8" "0x0870"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus Office BX310FN Series"
:interface "USB"
@@ -1593,6 +2338,30 @@
:status :good
:comment "all-in-one"
+:model "Stylus Office BX320FW Series"
+:interface "USB"
+:usbid "0x04b8" "0x085f"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus Office BX535WD"
+:interface "USB"
+:usbid "0x04b8" "0x0891"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>overseas version of the PX-504A"
+
+:model "Stylus Office BX630FW Series"
+:interface "USB"
+:usbid "0x04b8" "0x0890"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus Office BX525WD"
+:interface "USB"
+:usbid "0x04b8" "0x085e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-503A"
+
:model "Stylus Office BX600FW"
:interface "USB"
:usbid "0x04b8" "0x0847"
@@ -1602,14 +2371,44 @@
:model "Stylus Office BX610FW Series"
:interface "USB"
:usbid "0x04b8" "0x0855"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-602F"
+
+:model "Stylus Office BX625FWD"
+:interface "USB"
+:usbid "0x04b8" "0x085d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus Office BX635FWD"
+:interface "USB"
+:usbid "0x04b8" "0x088f"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus Office BX925FWD"
+:interface "USB"
+:usbid "0x04b8" "0x086a"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-673F"
+
+:model "Stylus Office BX935FWD"
+:interface "USB"
+:usbid "0x04b8" "0x0892"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus Office TX300F"
:interface "USB"
:usbid "0x04b8" "0x0848"
:status :good
-:comment "all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus Office TX320F Series"
+:interface "USB"
+:usbid "0x04b8" "0x0863"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus Office TX510FN Series"
:interface "USB"
@@ -1617,6 +2416,12 @@
:status :good
:comment "all-in-one"
+:model "Stylus Office TX525FW"
+:interface "USB"
+:usbid "0x04b8" "0x085f"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "Stylus Office TX600FW"
:interface "USB"
:usbid "0x04b8" "0x0847"
@@ -1626,14 +2431,26 @@
:model "Stylus Office TX610FW Series"
:interface "USB"
:usbid "0x04b8" "0x0855"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-602F"
+
+:model "Stylus Office TX620FWD Series"
+:interface "USB"
+:usbid "0x04b8" "0x085d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus Photo PX650 Series"
:interface "USB"
:usbid "0x04b8" "0x0850"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-702A"
+
+:model "Stylus Photo PX660 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0862"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-703A"
:model "Stylus Photo PX700W"
:interface "USB Network"
@@ -1644,8 +2461,20 @@
:model "Stylus Photo PX710W Series"
:interface "USB"
:usbid "0x04b8" "0x0852"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-802A"
+
+:model "Stylus Photo PX720WD Series"
+:interface "USB"
+:usbid "0x04b8" "0x0861"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-803A"
+
+:model "Stylus Photo PX730WD Series"
+:interface "USB"
+:usbid "0x04b8" "0x087b"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-804A"
:model "Stylus Photo PX800FW"
:interface "USB"
@@ -1656,8 +2485,20 @@
:model "Stylus Photo PX810FW Series"
:interface "USB"
:usbid "0x04b8" "0x0853"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-902A"
+
+:model "Stylus Photo PX820FWD Series"
+:interface "USB"
+:usbid "0x04b8" "0x0860"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-903A"
+
+:model "Stylus Photo PX830FWD Series"
+:interface "USB"
+:usbid "0x04b8" "0x0879"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-904F"
:model "Stylus Photo RX420"
:interface "USB"
@@ -1794,8 +2635,8 @@
:model "Stylus Photo TX650 Series"
:interface "USB"
:usbid "0x04b8" "0x0850"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-702A"
:model "Stylus Photo TX700W"
:interface "USB"
@@ -1806,8 +2647,20 @@
:model "Stylus Photo TX710W Series"
:interface "USB"
:usbid "0x04b8" "0x0852"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-802A"
+
+:model "Stylus Photo TX720WD Series"
+:interface "USB"
+:usbid "0x04b8" "0x0861"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-803A"
+
+:model "Stylus Photo TX730WD Series"
+:interface "USB"
+:usbid "0x04b8" "0x087b"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-804A"
:model "Stylus Photo TX800FW"
:interface "USB"
@@ -1815,6 +2668,12 @@
:status :good
:comment "network interface probably supported<br>all-in-one<br>overseas version of the EP-901A"
+:model "Stylus Photo TX820FWD Series"
+:interface "USB"
+:usbid "0x04b8" "0x0860"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-903A"
+
:model "Stylus NX100"
:interface "USB"
:usbid "0x04b8" "0x0841"
@@ -1827,6 +2686,24 @@
:status :good
:comment "all-in-one<br>overseas version of the PX-402A"
+:model "Stylus NX125"
+:interface "USB"
+:usbid "0x04b8" "0x085c"
+:status :complete
+:comment "all-in-one"
+
+:model "Stylus NX127"
+:interface "USB"
+:usbid "0x04b8" "0x085c"
+:status :complete
+:comment "all-in-one"
+
+:model "Stylus NX130 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0883"
+:status :complete
+:comment "all-in-one"
+
:model "Stylus NX200"
:interface "USB"
:usbid "0x04b8" "0x0849"
@@ -1839,11 +2716,29 @@
:status :good
:comment "all-in-one"
-:model "Stylus NX300"
+:model "Stylus NX220 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0865"
+:status :complete
+:comment "all-in-one"
+
+:model "Stylus NX230 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0885"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus NX300 Series"
:interface "USB"
:usbid "0x04b8" "0x0848"
:status :good
-:comment "all-in-one"
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus NX330 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0880"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus NX400"
:interface "USB"
@@ -1857,12 +2752,42 @@
:status :good
:comment "network interface probably supported<br>all-in-one"
+:model "Stylus NX420 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0864"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus NX430W Series"
+:interface "USB"
+:usbid "0x04b8" "0x0884"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "Stylus NX510 Series"
:interface "USB"
:usbid "0x04b8" "0x0856"
:status :good
:comment "all-in-one<br>overseas version of the PX-502A"
+:model "Stylus NX530 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0891"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-504A"
+
+:model "Stylus NX625"
+:interface "USB"
+:usbid "0x04b8" "0x085e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-503A"
+
+:model "Stylus NX635"
+:interface "USB"
+:usbid "0x04b8" "0x0891"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>overseas version of the PX-504A"
+
:model "Stylus SX100"
:interface "USB"
:usbid "0x04b8" "0x0841"
@@ -1878,7 +2803,13 @@
:model "Stylus SX125"
:interface "USB"
:usbid "0x04b8" "0x085c"
-:status :untested
+:status :complete
+:comment "all-in-one"
+
+:model "Stylus SX130 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0883"
+:status :complete
:comment "all-in-one"
:model "Stylus SX200"
@@ -1899,6 +2830,24 @@
:status :good
:comment "all-in-one"
+:model "Stylus SX218"
+:interface "USB"
+:usbid "0x04b8" "0x0865"
+:status :complete
+:comment "all-in-one"
+
+:model "Stylus SX230 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0881"
+:status :complete
+:comment "all-in-one<br>overseas version of the PX-404A"
+
+:model "Stylus SX235W"
+:interface "USB"
+:usbid "0x04b8" "0x0885"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "Stylus SX400"
:interface "USB"
:usbid "0x04b8" "0x084a"
@@ -1917,12 +2866,42 @@
:status :good
:comment "network interface probably supported<br>all-in-one"
+:model "Stylus SX420W Series"
+:interface "USB"
+:usbid "0x04b8" "0x0864"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus SX430W Series"
+:interface "USB"
+:usbid "0x04b8" "0x0880"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus SX440W Series"
+:interface "USB"
+:usbid "0x04b8" "0x0884"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "Stylus SX510W Series"
:interface "USB"
:usbid "0x04b8" "0x0856"
:status :good
:comment "all-in-one<br>overseas version of the PX-502A"
+:model "Stylus SX525WD"
+:interface "USB"
+:usbid "0x04b8" "0x085e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-503A"
+
+:model "Stylus SX535WD"
+:interface "USB"
+:usbid "0x04b8" "0x0891"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>overseas version of the PX-504A"
+
:model "Stylus SX600FW"
:interface "USB"
:usbid "0x04b8" "0x0847"
@@ -1932,8 +2911,14 @@
:model "Stylus SX610FW Series"
:interface "USB"
:usbid "0x04b8" "0x0855"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-602F"
+
+:model "Stylus SX620FW Series"
+:interface "USB"
+:usbid "0x04b8" "0x085d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
:model "Stylus Scan 2000"
:interface "USB"
@@ -1959,6 +2944,18 @@
:status :good
:comment "all-in-one<br>overseas version of the PX-402A"
+:model "Stylus TX120 Series"
+:interface "USB"
+:usbid "0x04b8" "0x085c"
+:status :complete
+:comment "all-in-one"
+
+:model "Stylus TX130 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0883"
+:status :complete
+:comment "all-in-one"
+
:model "Stylus TX200"
:interface "USB"
:usbid "0x04b8" "0x0849"
@@ -1983,6 +2980,24 @@
:status :good
:comment "all-in-one"
+:model "Stylus TX220 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0865"
+:status :complete
+:comment "all-in-one"
+
+:model "Stylus TX230W Series"
+:interface "USB"
+:usbid "0x04b8" "0x0885"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus TX235"
+:interface "USB"
+:usbid "0x04b8" "0x0881"
+:status :complete
+:comment "all-in-one<br>overseas version of the PX-404A"
+
:model "Stylus TX400"
:interface "USB"
:usbid "0x04b8" "0x084a"
@@ -1995,24 +3010,258 @@
:status :good
:comment "network interface probably supported<br>all-in-one"
+:model "Stylus TX420W Series"
+:interface "USB"
+:usbid "0x04b8" "0x0864"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus TX430W Series"
+:interface "USB"
+:usbid "0x04b8" "0x0880"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "Stylus TX435W"
+:interface "USB"
+:usbid "0x04b8" "0x0884"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "Stylus TX550W Series"
:interface "USB"
:usbid "0x04b8" "0x0856"
:status :good
:comment "all-in-one<br>overseas version of the PX-502A"
+:model "Stylus TX560WD Series"
+:interface "USB"
+:usbid "0x04b8" "0x085e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-503A"
+
+:model "WF-2510 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08a5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-505F"
+
+:model "WF-2520 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08a6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-535F"
+
+:model "WF-2530 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08a6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-535F"
+
+:model "WF-2540 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08a6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-535F"
+
+:model "WF-2630 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c4"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-2650 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-2660 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-3520 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0899"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-605F"
+
+:model "WF-3530 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0899"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-675F"
+
+:model "WF-3540 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0899"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-3620 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M740F"
+
+:model "WF-3640 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M741F"
+
+:model "WF-4630 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08be"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-4640 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08be"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-5620 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08bd"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M840F"
+
+:model "WF-5690 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08bd"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-7510 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0869"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-1600F"
+
+:model "WF-7520 Series"
+:interface "USB"
+:usbid "0x04b8" "0x087c"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-1700F"
+
+:model "WF-7610 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M5040F"
+
+:model "WF-7620 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b9"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M5041F"
+
+:model "WF-M1560 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08ab"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-M5690 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08d0"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-M350F"
+
+:model "WF-R4640 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08cd"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WF-R5690 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08cd"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WP-4511"
+:interface "USB"
+:usbid "0x04b8" "0x087d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
+
+:model "WP-4515"
+:interface "USB"
+:usbid "0x04b8" "0x087d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WP-4521"
+:interface "USB"
+:usbid "0x04b8" "0x087d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
+
+:model "WP-4525"
+:interface "USB"
+:usbid "0x04b8" "0x087d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
+
+:model "WP-4530 Series"
+:interface "USB"
+:usbid "0x04b8" "0x087d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
+
+:model "WP-4540 Series"
+:interface "USB"
+:usbid "0x04b8" "0x087d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-B750F"
+
+:model "WP-4590 Series"
+:interface "USB"
+:usbid "0x04b8" "0x087e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "WorkForce 310 Series"
:interface "USB"
:usbid "0x04b8" "0x0854"
:status :good
:comment "all-in-one"
+:model "WorkForce 320 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0863"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>some models in the series have a built-in network interface<br>all-in-one"
+
+:model "WorkForce 435"
+:interface "USB"
+:usbid "0x04b8" "0x0870"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "WorkForce 500"
:interface "USB"
:usbid "0x04b8" "0x084c"
:status :good
:comment "all-in-one"
+:model "WorkForce 520 Series"
+:interface "USB"
+:usbid "0x04b8" "0x085f"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WorkForce 545"
+:interface "USB"
+:usbid "0x04b8" "0x0890"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
:model "WorkForce 600"
:interface "USB"
:usbid "0x04b8" "0x0847"
@@ -2022,6 +3271,220 @@
:model "WorkForce 610 Series"
:interface "USB"
:usbid "0x04b8" "0x0855"
-:status :unsupported
-:comment "supported by the epkowa backend plus non-free interpreter"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-602F"
+
+:model "WorkForce 625"
+:interface "USB"
+:usbid "0x04b8" "0x085e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-503A"
+
+:model "WorkForce 630 Series"
+:interface "USB"
+:usbid "0x04b8" "0x085d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WorkForce 645"
+:interface "USB"
+:usbid "0x04b8" "0x088f"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WorkForce 840 Series"
+:interface "USB"
+:usbid "0x04b8" "0x086a"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-673F"
+
+:model "WorkForce 845"
+:interface "USB"
+:usbid "0x04b8" "0x0892"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "WorkForce K301"
+:interface "USB"
+:usbid "0x04b8" "0x0872"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "XP-100 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0895"
+:status :complete
+:comment "all-in-one<br>overseas version of the PX-045A"
+
+:model "XP-200 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0896"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "XP-211"
+:interface "USB"
+:usbid "0x04b8" "0x08ae"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-046A"
+
+:model "XP-212"
+:interface "USB"
+:usbid "0x04b8" "0x08ae"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-046A"
+
+:model "XP-215"
+:interface "USB"
+:usbid "0x04b8" "0x08ae"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-046A"
+
+:model "XP-225"
+:interface "USB"
+:usbid "0x04b8" "0x08c0"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-047A"
+
+:model "XP-300 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0898"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-435A"
+
+:model "XP-310 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08af"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-436A"
+
+:model "XP-320 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08bf"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-437A"
+
+:model "XP-400 Series"
+:interface "USB"
+:usbid "0x04b8" "0x0898"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the PX-435A"
+
+:model "XP-410 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b0"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "XP-420 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c1"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "XP-600 Series"
+:interface "USB"
+:usbid "0x04b8" "0x089e"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-775A"
+
+:model "XP-510 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-706A"
+
+:model "XP-520 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-777A"
+
+:model "XP-610 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-776AB/EP-776AW"
+
+:model "XP-620 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c8"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-777A"
+
+:model "XP-700 Series"
+:interface "USB"
+:usbid "0x04b8" "0x089d"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one"
+
+:model "XP-710 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b5"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-806AB/EP-806AR/EP-806AW"
+
+:model "XP-720 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-807AB/EP-807AR/EP-807AW"
+
+:model "XP-750 Series"
+:interface "USB"
+:usbid "0x04b8" "0x089c"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-805A/EP-805AR/EP-805AW"
+
+:model "XP-760 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c7"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-807AB/EP-807AR/EP-807AW"
+
+:model "XP-800 Series"
+:interface "USB"
+:usbid "0x04b8" "0x089b"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-905A"
+
+:model "XP-810 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b4"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-906F"
+
+:model "XP-820 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-907F"
+
+:model "XP-850 Series"
+:interface "USB"
+:usbid "0x04b8" "0x089a"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-905F"
+
+:model "XP-860 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08c6"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-907F"
+
+:model "XP-950 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08b3"
+:status :complete
+:comment "network interface supported via DFSG non-free iscan-network-nt package<br>all-in-one<br>overseas version of the EP-976A3"
+
+:model "Epson ME 350"
+:interface "USB"
+:usbid "0x04b8" "0x088d"
+:status :good
+
+:model "WP-M4525, WP-M4521, PX-K751F, WP-M4595"
+:interface "USB"
+:usbid "0x04b8" "0x08a7"
+:status :good
diff --git a/doc/descriptions/epsonds.desc b/doc/descriptions/epsonds.desc
new file mode 100644
index 0000000..0b7c6c6
--- /dev/null
+++ b/doc/descriptions/epsonds.desc
@@ -0,0 +1,97 @@
+;
+; SANE Backend specification file for the epsonds backend
+;
+; Copyright (C) 2015 Alessandro Zummo
+; Released under GPLv2
+;
+
+:backend "epsonds"
+:version "1.0.18"
+:new :yes
+:manpage "sane-epsonds"
+
+:devicetype :scanner
+
+:mfg "Epson"
+:url "http://www.epson.com/"
+
+:model "DS-5500"
+:interface "USB"
+:usbid "0x04b8" "0x0145"
+:status :untested
+
+:model "DS-6500"
+:interface "USB"
+:usbid "0x04b8" "0x0145"
+:status :untested
+
+:model "DS-7500"
+:interface "USB"
+:usbid "0x04b8" "0x0145"
+:status :untested
+
+:model "DS-50000"
+:interface "USB"
+:usbid "0x04b8" "0x0146"
+:status :untested
+
+:model "DS-60000"
+:interface "USB"
+:usbid "0x04b8" "0x0146"
+:status :good
+
+:model "DS-70000"
+:interface "USB"
+:usbid "0x04b8" "0x0146"
+:status :untested
+
+:model "DS-510"
+:interface "USB"
+:usbid "0x04b8" "0x014c"
+:status :good
+
+:model "DS-560"
+:interface "USB"
+:usbid "0x04b8" "0x014d"
+:status :untested
+
+:model "DS-40"
+:interface "USB"
+:usbid "0x04b8" "0x0150"
+:status :untested
+
+:model "DS-760"
+:interface "USB"
+:usbid "0x04b8" "0x0152"
+:status :untested
+
+:model "DS-860"
+:interface "USB"
+:usbid "0x04b8" "0x0152"
+:status :untested
+
+:model "DS-520"
+:interface "USB"
+:usbid "0x04b8" "0x0154"
+:status :untested
+
+:model "PX-M7050 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08bc"
+:status :untested
+
+:model "WF-8510/8590 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08bc"
+:status :untested
+
+:model "PX-M7050FX Series"
+:interface "USB"
+:usbid "0x04b8" "0x08cc"
+:status :untested
+
+:model "WF-R8590 Series"
+:interface "USB"
+:usbid "0x04b8" "0x08cc"
+:status :untested
+
diff --git a/doc/descriptions/fujitsu.desc b/doc/descriptions/fujitsu.desc
index 1691ad5..d4e232b 100644
--- a/doc/descriptions/fujitsu.desc
+++ b/doc/descriptions/fujitsu.desc
@@ -12,9 +12,9 @@
:backend "fujitsu" ; name of backend
:url "http://www.thebility.com/fujitsu/"
-:version "117" ; version of backend
+:version "127" ; version of backend
:manpage "sane-fujitsu" ; name of manpage (if it exists)
-:comment "Backend updated for SANE release 1.0.24, see sane-fujitsu manpage"
+:comment "Backend updated for SANE release 1.0.25, see sane-fujitsu manpage"
:devicetype :scanner ; start of a list of devices....
; other types: :stillcam, :vidcam,
; :meta, :api
@@ -143,6 +143,18 @@
:usbid "0x04c5" "0x1150"
:comment "small, recent, discontinued"
+:model "fi-6130Z"
+:interface "USB"
+:status :complete
+:usbid "0x04c5" "0x11f3"
+:comment "small, recent, discontinued"
+
+:model "fi-6230Z"
+:interface "USB"
+:status :complete
+:usbid "0x04c5" "0x11f4"
+:comment "small, recent, discontinued"
+
:model "ScanSnap S1500"
:interface "USB"
:status :complete
@@ -155,9 +167,14 @@
:usbid "0x04c5" "0x11a2"
:comment "small, discontinued, same as S1500"
+:model "ScanSnap N1800"
+:interface "Ethernet"
+:status :untested
+:comment "small, discontinued, integrated touchscreen and keyboard"
+
;==================================================
; CURRENT MODELS, SMALL
-:model "ScanSnap N1800"
+:model "ScanSnap N7100"
:interface "Ethernet"
:status :untested
:comment "small, current, integrated touchscreen and keyboard"
@@ -173,16 +190,16 @@
:usbid "0x04c5" "0x11fc"
:comment "small, current"
-:model "fi-6130Z"
+:model "fi-7160"
:interface "USB"
:status :complete
-:usbid "0x04c5" "0x11f3"
+:usbid "0x04c5" "0x132e"
:comment "small, current"
-:model "fi-6230Z"
+:model "fi-7260"
:interface "USB"
:status :complete
-:usbid "0x04c5" "0x11f4"
+:usbid "0x04c5" "0x132f"
:comment "small, current"
:model "ScanSnap iX500"
@@ -191,6 +208,18 @@
:usbid "0x04c5" "0x132b"
:comment "small, current, WiFi not supported. Hardware only scans in color. Backend generates binary and grayscale modes."
+:model "ScanSnap iX100"
+:interface "USB WiFi"
+:status :good
+:usbid "0x04c5" "0x13f4"
+:comment "small, current, WiFi not supported."
+
+:model "ScanSnap SV600"
+:interface "USB"
+:status :untested
+:usbid "0x04c5" "0x128e"
+:comment "Also has a second USB VID 0x13ba. Will require some gymnastics to support."
+
;==================================================
; DISCONTINUED OLDER MODELS, MEDIUM
:model "M3093E"
@@ -290,6 +319,18 @@
:usbid "0x04c5" "0x114e"
:comment "medium, recent, discontinued"
+:model "fi-6140Z"
+:interface "SCSI USB"
+:status :complete
+:usbid "0x04c5" "0x11f1"
+:comment "medium, recent, discontinued"
+
+:model "fi-6240Z"
+:interface "SCSI USB"
+:status :complete
+:usbid "0x04c5" "0x11f2"
+:comment "medium, recent, discontinued"
+
;==================================================
; CURRENT MODELS, MEDIUM
@@ -299,16 +340,16 @@
:usbid "0x04c5" "0x114a"
:comment "medium, current"
-:model "fi-6140Z"
-:interface "SCSI USB"
+:model "fi-7180"
+:interface "USB"
:status :complete
-:usbid "0x04c5" "0x11f1"
+:usbid "0x04c5" "0x132c"
:comment "medium, current"
-:model "fi-6240Z"
-:interface "SCSI USB"
+:model "fi-7280"
+:interface "USB"
:status :complete
-:usbid "0x04c5" "0x11f2"
+:usbid "0x04c5" "0x132d"
:comment "medium, current"
;==================================================
@@ -442,3 +483,8 @@
:status :untested
:usbid "0x04c5" "0x119e"
:comment "big, current. VRS CGA board unsupported, Independent ultrasonic control and multistream unsupported"
+
+:model "fi-6400"
+:interface "SCSI USB"
+:status :untested
+;:usbid "0x04c5" "0x"
diff --git a/doc/descriptions/genesys.desc b/doc/descriptions/genesys.desc
index 4cb2fc0..6d400f2 100644
--- a/doc/descriptions/genesys.desc
+++ b/doc/descriptions/genesys.desc
@@ -79,7 +79,7 @@
:model "ScanJet 4850C"
:interface "USB"
:usbid "0x03f0" "0x1b05"
-:status :untested
+:status :good
:comment "resolution from 100 to 2400 supported, UTA not supported yet"
:model "ScanJet G4010"
@@ -127,6 +127,12 @@
:usbid "0x04a9" "0x221c"
:status :good
+:model "CanoScan LiDE 80"
+:interface "USB"
+:usbid "0x04a9" "0x2214"
+:status :basic
+:comment "No 2400 dpi support, slow speed at lower resolution"
+
:model "CanoScan LiDE 100"
:interface "USB"
:usbid "0x04a9" "0x1904"
@@ -139,6 +145,12 @@
:status :complete
:comment "GL124 based, resolution from 75 to 2400 dpi"
+:model "CanoScan LiDE 120"
+:interface "USB"
+:usbid "0x04a9" "0x190e"
+:status :unsupported
+:comment "GL124+ based, resolution from 75 to 2400 dpi"
+
:model "CanoScan LiDE 200"
:interface "USB"
:usbid "0x04a9" "0x1905"
@@ -149,7 +161,13 @@
:interface "USB"
:usbid "0x04a9" "0x190a"
:status :complete
-:comment "GL124 based, resolution from 75 to 2400 dpi"
+:comment "GL124 based, resolution from 75 to 4800 dpi"
+
+:model "CanoScan LiDE 220"
+:interface "USB"
+:usbid "0x04a9" "0x190f"
+:status :complete
+:comment "GL124+ based, resolution from 75 to 4800 dpi"
:model "CanoScan 4400f"
:interface "USB"
diff --git a/doc/descriptions/hp.desc b/doc/descriptions/hp.desc
index 8a662c5..24f4f4a 100644
--- a/doc/descriptions/hp.desc
+++ b/doc/descriptions/hp.desc
@@ -10,9 +10,8 @@
;
:backend "hp" ; name of backend
-:version "1.06" ; version of backend
+:version "unmaintained" ; version of backend
:manpage "sane-hp" ; name of manpage (if it exists)
-:url "http://www.kirchgessner.net/" ; backend's web page
:devicetype :scanner ; start of a list of devices....
; other types: :stillcam, :vidcam,
@@ -58,27 +57,30 @@
:interface "SCSI"
:status :complete
:scsi "HP" "C1130A" "processor"
+:comment "Buttons may not work on some scanners"
:model "ScanJet 4100C"
:interface "USB"
:usbid "0x03f0" "0x0101"
:status :complete
+:comment "Buttons may not work on some scanners"
:model "ScanJet 5p"
:interface "SCSI"
:status :complete
:scsi "HP" "C5110A" "processor"
+:comment "Buttons may not work on some scanners"
:model "ScanJet 5100C"
:interface "Parport"
:status :complete
-:comment "Requires ppscsi driver and epst module"
+:comment "Requires ppscsi driver and epst module. Buttons may not work on some scanners"
:model "ScanJet 5200C"
:interface "Parport USB"
:usbid "0x03f0" "0x0401"
:status :complete
-:comment "Parallel interface requires ppscsi driver and epst module"
+:comment "Parallel interface requires ppscsi driver and epst module. Buttons may not work on some scanners"
:model "ScanJet 6100C"
:interface "SCSI"
@@ -89,27 +91,32 @@
:scsi "HP" "C6270A" "processor"
:usbid "0x03f0" "0x0201"
:status :complete
+:comment "Buttons may not work on some scanners"
:model "ScanJet 6250C"
:interface "SCSI USB"
:usbid "0x03f0" "0x0201"
:status :complete
+:comment "Buttons may not work on some scanners"
:model "ScanJet 6300C"
:interface "SCSI USB"
:scsi "HP" "C7670A" "processor"
:usbid "0x03f0" "0x0601"
:status :complete
+:comment "Buttons may not work on some scanners"
:model "ScanJet 6350C"
:interface "SCSI USB"
:usbid "0x03f0" "0x0601"
:status :complete
+:comment "Buttons may not work on some scanners"
:model "ScanJet 6390C"
:interface "SCSI USB"
:usbid "0x03f0" "0x0601"
:status :complete
+:comment "Buttons may not work on some scanners"
:model "PhotoSmart PhotoScanner"
:interface "SCSI"
diff --git a/doc/descriptions/kodakaio.desc b/doc/descriptions/kodakaio.desc
index 7882513..8c9c4ce 100644
--- a/doc/descriptions/kodakaio.desc
+++ b/doc/descriptions/kodakaio.desc
@@ -1,10 +1,9 @@
:backend "kodakaio"
:url "http://sourceforge.net/projects/cupsdriverkodak/"
-:version "2.4.6"
+:version "2.7.2"
:manpage "sane-kodakaio"
:comment "Backend for Kodak AiO ESP and Hero printers. Also possibly Advent AWL10"
:devicetype :scanner
-:new :no
:mfg "Kodak"
:url "http://www.kodak.com/"
@@ -57,7 +56,7 @@
:model "ESP 5200"
:interface "USB Ethernet"
:usbid "0x040a" "0x4041"
-:status :basic
+:status :complete
:comment "USB good, Network good"
:model "ESP 5300"
@@ -156,8 +155,8 @@
:model "Hero Office 6.1"
:interface "USB"
:usbid "0x040a" "0x4062"
-:status :untested
-:comment "Please test!"
+:status :basic
+:comment "Does the adf work?"
:model "Hero 7.1"
:interface "USB"
@@ -168,7 +167,7 @@
:model "Hero 9.1"
:interface "USB Ethernet"
:usbid "0x040a" "0x4067"
-:status :basic
+:status :complete
:comment "USB good, Network good"
;===================================
diff --git a/doc/descriptions/kvs40xx.desc b/doc/descriptions/kvs40xx.desc
index 2b16930..8cc054f 100644
--- a/doc/descriptions/kvs40xx.desc
+++ b/doc/descriptions/kvs40xx.desc
@@ -14,7 +14,6 @@
:manpage "sane-kvs40xx" ; name of manpage (if it exists)
:comment "New backend for SANE release 1.0.23, see sane-kvs40xx manpage"
:devicetype :scanner ; start of a list of devices....
-:new :no
:mfg "Panasonic" ; name a manufacturer
:url "http://www.panasonic.com/"
diff --git a/doc/descriptions/magicolor.desc b/doc/descriptions/magicolor.desc
index 3a7d9b0..be785e9 100644
--- a/doc/descriptions/magicolor.desc
+++ b/doc/descriptions/magicolor.desc
@@ -22,6 +22,12 @@
:comment "Multi-function color laser printer with fax, scanner and network interface"
:url "http://www.konicaminolta.eu/business-solutions/products/laser-printers/all-in-one/magicolor-1690mf/key-features.html"
+:model "magicolor 4690MF"
+:interface "USB Network"
+:usbid "0x132b" "0x2079"
+:status :good
+:comment "Multi-function color laser printer with fax, scanner and network interface"
+
:model "BizHub 162/132"
:interface "USB Network"
:usbid "ignore"
diff --git a/doc/descriptions/mustek_usb2.desc b/doc/descriptions/mustek_usb2.desc
index 011cef9..011cef9 100755..100644
--- a/doc/descriptions/mustek_usb2.desc
+++ b/doc/descriptions/mustek_usb2.desc
diff --git a/doc/descriptions/pieusb.desc b/doc/descriptions/pieusb.desc
new file mode 100644
index 0000000..102cd45
--- /dev/null
+++ b/doc/descriptions/pieusb.desc
@@ -0,0 +1,86 @@
+;
+; SANE Backend specification file
+;
+; It's basically emacs-lisp --- so ";" indicates comment to end of line.
+; All syntactic elements are keyword tokens, followed by a string or
+; keyword argument, as specified.
+;
+; ":backend" *must* be specified.
+; All other information is optional (but what good is the file without it?).
+;
+
+:backend "pieusb" ; name of backend
+:version "1.0" ; version of backend
+:new :yes
+:manpage "sane-pieusb" ; name of manpage (if it exists)
+:url "https://github.com/kkaempf/sane-backends" ; backend's web page
+
+:devicetype :scanner ; start of a list of devices....
+ ; other types: :stillcam, :vidcam,
+ ; :meta, :api
+
+:mfg "PIE"
+:url "http://www.scanace.com"
+
+:model "PowerSlide 3600"
+:interface "USB"
+:status :untested
+:comment "Identical to Reflecta DigitDia 3600"
+
+:model "PowerSlide 3650"
+:interface "USB"
+:status :untested
+:comment "Identical to Reflecta DigitDia 4000"
+
+:model "PowerSlide 4000"
+:interface "USB"
+:status :untested
+:comment "Identical to Reflecta DigitDia 5000"
+
+:model "PowerSlide 5000"
+:interface "USB"
+:status :untested
+:comment "Identical to Reflecta DigitDia 6000"
+
+:mfg "Reflecta"
+:url "https://reflecta.de"
+
+:model "Reflecta ProScan 7200"
+:interface "USB"
+:usbid "0x05e3" "0x0145"
+:status :basic
+:comment "Similar to PrimeFilm 7250 scanner from Pacific Image Electronics"
+
+:model "CrystalScan 7200"
+:interface "USB"
+:status :untested
+
+:model "Reflecta CrystalScan 7250"
+:interface "USB"
+:usbid "0x05e3" "0x0145"
+:status :basic
+:comment "Similar to PrimeFilm 7250 scanner from Pacific Image Electronics"
+
+:model "DigitDia 3600"
+:interface "USB"
+:status :untested
+:comment "Identical to Pacific Image Electronics PowerSlide 3600 scanner"
+
+:model "DigitDia 4000"
+:interface "USB"
+:status :untested
+:comment "Identical to Pacific Image Electronics PowerSlide 3650 scanner"
+
+:model "DigitDia 5000"
+:interface "USB"
+:status :untested
+:comment "Identical to Pacific Image Electronics PowerSlide 4000 scanner"
+
+:model "Reflecta DigitDia 6000 Multiple Slide Scanner"
+:interface "USB"
+:usbid "0x05e3" "0x0142"
+:status :good
+:comment "Identical to Pacific Image Electronics PowerSlide 5000 scanner"
+
+; :comment and :url specifiers are optional after :mfg, :model, :desc,
+; and at the top-level.
diff --git a/doc/descriptions/pixma.desc b/doc/descriptions/pixma.desc
index 5983b0a..84ddcd4 100644
--- a/doc/descriptions/pixma.desc
+++ b/doc/descriptions/pixma.desc
@@ -11,10 +11,8 @@
; See doc/descriptions.txt for details.
:backend "pixma" ; name of backend
-:version "0.17.4" ; version of backend (or "unmaintained")
+:version "0.17.23" ; version of backend (or "unmaintained")
:manpage "sane-pixma" ; name of manpage (if it exists)
-:url "http://home.arcor.de/wittawat/pixma/" ; 0.13.2 backend's web page
-:url "http://mp610.blogspot.com/" ; the pixma backend blog
;:comment "Devices marked as experimantal are disabled by default. See the manual page for how to enable them."
:devicetype :scanner ; start of a list of devices....
@@ -24,6 +22,24 @@
:mfg "Canon" ; name a manufacturer
:url "http://www.canon.com/"
+:model "PIXMA E400"
+:interface "USB"
+:usbid "0x04a9" "0x177a"
+:status :untested
+:comment "Testers needed!"
+
+:model "PIXMA E460 Series"
+:interface "USB"
+:usbid "0x04a9" "0x1788"
+:status :untested
+:comment "Testers needed!"
+
+:model "PIXMA E480 Series"
+:interface "USB WiFi"
+:usbid "0x04a9" "0x1789"
+:status :untested
+:comment "Testers needed!"
+
:model "PIXMA E500"
:interface "USB"
:usbid "0x04a9" "0x1758"
@@ -36,6 +52,12 @@
:status :untested
:comment "Testers needed!"
+:model "PIXMA E560"
+:interface "USB"
+:usbid "0x04a9" "0x177b"
+:status :untested
+:comment "Testers needed!"
+
:model "PIXMA E600"
:interface "USB"
:usbid "0x04a9" "0x175a"
@@ -57,36 +79,48 @@
:model "PIXMA MG2200 Series"
:interface "USB"
:usbid "0x04a9" "0x1760"
-:status :untested
-:comment "Testers needed!"
+:status :complete
+:comment "All resolutions supported (up to 1200DPI)."
:model "PIXMA MG2400 Series"
:interface "USB"
:usbid "0x04a9" "0x176c"
-:status :untested
-:comment "Testers needed!"
+:status :complete
+:comment "All resolutions supported (up to 600DPI)."
:model "PIXMA MG2500 Series"
:interface "USB"
:usbid "0x04a9" "0x176d"
-:status :untested
-:comment "Testers needed!"
+:status :complete
+:comment "All resolutions supported (up to 600DPI)."
+
+:model "PIXMA MG2900 Series"
+:interface "USB WiFi"
+:usbid "0x04a9" "0x1780"
+:status :complete
+:comment "All resolutions supported (up to 600DPI)."
:model "PIXMA MG3100 Series"
-:interface "USB WLAN"
+:interface "USB WiFi"
:usbid "0x04a9" "0x1752"
:status :complete
:comment "All resolutions supported (up to 1200DPI)."
:model "PIXMA MG3200 Series"
-:interface "USB"
+:interface "USB WiFi"
:usbid "0x04a9" "0x1762"
-:status :untested
-:comment "Testers needed!"
+:status :complete
+:comment "All resolutions supported (up to 1200DPI)."
:model "PIXMA MG3500 Series"
-:interface "USB"
+:interface "USB WiFi"
:usbid "0x04a9" "0x176e"
+:status :complete
+:comment "All resolutions supported (up to 1200DPI)."
+
+:model "PIXMA MG3600 Series"
+:interface "USB Ethernet WiFi"
+:usbid "0x04a9" "0x178a"
:status :untested
:comment "Testers needed!"
@@ -127,10 +161,16 @@
:comment "Testers needed!"
:model "PIXMA MG5500 Series"
-:interface "USB"
+:interface "USB WiFi"
:usbid "0x04a9" "0x1771"
-:status :untested
-:comment "Testers needed!"
+:status :complete
+:comment "All resolutions supported (up to 1200DPI)."
+
+:model "PIXMA MG5600 Series"
+:interface "USB WiFi"
+:usbid "0x04a9" "0x177f"
+:status :complete
+:comment "All resolutions supported (up to 1200DPI)."
:model "PIXMA MG6100 Series"
:interface "USB"
@@ -151,10 +191,10 @@
:comment "All resolutions supported (up to 2400DPI)."
:model "PIXMA MG6400 Series"
-:interface "USB"
+:interface "USB WiFi"
:usbid "0x04a9" "0x1770"
-:status :untested
-:comment "Testers needed!"
+:status :complete
+:comment "All resolutions supported (up to 1200DPI)."
:model "PIXMA MG6500 Series"
:interface "USB"
@@ -162,12 +202,24 @@
:status :untested
:comment "Testers needed!"
-:model "PIXMA MG7100 Series"
+:model "PIXMA MG6600 Series"
:interface "USB"
-:usbid "0x04a9" "0x1772"
+:usbid "0x04a9" "0x177e"
:status :untested
:comment "Testers needed!"
+:model "PIXMA MG7100 Series"
+:interface "USB"
+:usbid "0x04a9" "0x1772"
+:status :complete
+:comment "All resolutions supported (up to 2400DPI)."
+
+:model "PIXMA MG7500 Series"
+:interface "USB Ethernet WiFi"
+:usbid "0x04a9" "0x177c"
+:status :complete
+:comment "All resolutions supported (up to 2400DPI)."
+
:model "PIXMA MG8100 Series"
:interface "USB"
:usbid "0x04a9" "0x174b"
@@ -545,7 +597,7 @@
:interface "USB"
:usbid "0x04a9" "0x174d"
:status :complete
-:comment "Flatbed and ADF scan. All resolutions supported (up to 1200DPI). ADF empty buggy."
+:comment "Flatbed and ADF scan. All resolutions supported (up to 1200DPI)."
:model "PIXMA MX370 Series"
:interface "USB"
@@ -560,16 +612,16 @@
:comment "Testers needed!"
:model "PIXMA MX410"
-:interface "USB Ethernet"
+:interface "USB Ethernet WiFi"
:usbid "0x04a9" "0x174e"
-:status :untested
-:comment "Same protocol as Pixma MX420? Testers needed!"
+:status :complete
+:comment "Flatbed and ADF scan. All resolutions supported (up to 1200DPI)."
:model "PIXMA MX420"
:interface "USB Ethernet"
:usbid "0x04a9" "0x174f"
:status :complete
-:comment "Flatbed and ADF scan. All resolutions supported (up to 1200DPI). ADF empty buggy."
+:comment "Flatbed and ADF scan. All resolutions supported (up to 1200DPI)."
:model "PIXMA MX430 Series"
:interface "USB Ethernet"
@@ -583,17 +635,35 @@
:status :untested
:comment "Testers needed!"
-:model "PIXMA MX510 Series"
+:model "PIXMA MX470 Series"
:interface "USB Ethernet"
-:usbid "0x04a9" "0x175c"
+:usbid "0x04a9" "0x1774"
+:status :complete
+:comment "Flatbed and ADF scan. All resolutions supported (up to 1200DPI)."
+
+:model "PIXMA MX490 Series"
+:interface "USB WiFi"
+:usbid "0x04a9" "0x1787"
:status :untested
:comment "Testers needed!"
+:model "PIXMA MX510 Series"
+:interface "USB Ethernet"
+:usbid "0x04a9" "0x175c"
+:status :complete
+:comment "Flatbed and ADF scan. All resolutions supported (up to 1200DPI)."
+
:model "PIXMA MX520 Series"
-:interface "USB"
+:interface "USB Ethernet WiFi"
:usbid "0x04a9" "0x1769"
-:status :untested
-:comment "Testers needed!"
+:status :complete
+:comment "Flatbed and ADF scan. All resolutions supported (up to 1200DPI)."
+
+:model "PIXMA MX530 Series"
+:interface "USB WiFi"
+:usbid "0x04a9" "0x1775"
+:status :complete
+:comment "Flatbed and ADF scan. All resolutions supported (up to 1200DPI)."
:model "PIXMA MX700"
:interface "USB Ethernet"
@@ -608,10 +678,10 @@
:comment "Testers needed!"
:model "PIXMA MX720 Series"
-:interface "USB"
+:interface "USB Ethernet WiFi"
:usbid "0x04a9" "0x176a"
-:status :untested
-:comment "Testers needed!"
+:status :complete
+:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported."
:model "PIXMA MX850"
:interface "USB Ethernet"
@@ -629,37 +699,37 @@
:interface "USB Ethernet"
:usbid "0x04a9" "0x1743"
:status :complete
-:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported, ADF empty buggy."
+:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported."
:model "PIXMA MX880 Series"
:interface "USB Ethernet"
:usbid "0x04a9" "0x1750"
:status :complete
-:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported, ADF empty buggy."
+:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported."
:model "PIXMA MX882"
:interface "USB Ethernet"
:usbid "0x04a9" "0x1750"
:status :complete
-:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported, ADF empty buggy."
+:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported."
:model "PIXMA MX885"
:interface "USB Ethernet"
:usbid "0x04a9" "0x1750"
:status :complete
-:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported, ADF empty buggy."
+:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported."
:model "PIXMA MX890 Series"
:interface "USB Ethernet"
:usbid "0x04a9" "0x175e"
:status :complete
-:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported, ADF empty buggy."
+:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported."
:model "PIXMA MX920 Series"
-:interface "USB"
+:interface "USB Ethernet WiFi"
:usbid "0x04a9" "0x176b"
-:status :untested
-:comment "Testers needed!"
+:status :good
+:comment "All resolutions supported (up to 2400DPI). Flatbed, ADF simplex and Duplex supported."
:model "PIXMA MX7600"
:interface "USB Ethernet"
@@ -679,6 +749,30 @@
:status :complete
:comment "All resolutions supported (up to 600DPI). Flatbed, ADF simplex and Duplex supported."
+:model "imageCLASS D530"
+:interface "USB"
+:usbid "0x04a9" "0x2775"
+:status :complete
+:comment "All resolutions supported (up to 600DPI)"
+
+:model "i-SENSYS MF210 Series"
+:interface "USB Ethernet WiFi"
+:usbid "0x04a9" "0x27a9"
+:status :untested
+:comment "Testers needed!"
+
+:model "i-SENSYS MF220 Series"
+:interface "USB Ethernet WiFi"
+:usbid "0x04a9" "0x27a8"
+:status :untested
+:comment "Testers needed!"
+
+:model "i-SENSYS MF810/820"
+:interface "USB Ethernet"
+:usbid "0x04a9" "0x27a6"
+:status :untested
+:comment "Testers needed!"
+
:model "i-SENSYS MF3010"
:interface "USB Ethernet"
:usbid "0x04a9" "0x2759"
@@ -781,23 +875,17 @@
:status :good
:comment "Flatbed and ADF scan. All resolutions supported (up to 600DPI). ADF empty buggy."
-:model "i-SENSYS MF4550d"
+:model "i-SENSYS MF4500 Series"
:interface "USB"
:usbid "0x04a9" "0x2736"
:status :good
:comment "Flatbed and ADF scan. All resolutions supported (up to 600DPI)."
-:model "imageCLASS MF4770n"
-:interface "USB Ethernet"
-:usbid "0x04a9" "0x2774"
-:status :good
-:comment "Flatbed scan. All resolutions supported (up to 600DPI). ADF buggy."
-
:model "imageCLASS MF4570dw"
:interface "USB"
:usbid "0x04a9" "0x275a"
-:status :untested
-:comment "Testers needed!"
+:status :complete
+:comment "All resolutions supported (up to 600DPI)"
:model "imageCLASS MF4660"
:interface "USB"
@@ -811,6 +899,18 @@
:status :complete
:comment "Flatbed and ADF scan. All resolutions supported (up to 600DPI)"
+:model "i-SENSYS MF4700 Series"
+:interface "USB Ethernet"
+:usbid "0x04a9" "0x2774"
+:status :good
+:comment "Flatbed scan. All resolutions supported (up to 600DPI). ADF buggy."
+
+:model "i-SENSYS MF4800 Series"
+:interface "USB Ethernet"
+:usbid "0x04a9" "0x2773"
+:status :complete
+:comment "Flatbed and ADF scan. All resolutions supported (up to 600DPI). Ethernet buggy."
+
:model "imageCLASS MF5630"
:interface "USB"
:usbid "0x04a9" "0x264e"
@@ -847,6 +947,18 @@
:status :untested
:comment "Testers needed!"
+:model "i-SENSYS MF5900 Series"
+:interface "USB Ethernet"
+:usbid "0x04a9" "0x2743"
+:status :untested
+:comment "Testers needed!"
+
+:model "i-SENSYS MF6100 Series"
+:interface "USB Ethernet"
+:usbid "0x04a9" "0x278e"
+:status :untested
+:comment "Testers needed!"
+
:model "imageCLASS MF6500 series"
:interface "USB"
:usbid "0x04a9" "0x2686"
@@ -877,6 +989,24 @@
:status :untested
:comment "Testers needed!"
+:model "i-SENSYS MF8200C Series"
+:interface "USB Ethernet"
+:usbid "0x04a9" "0x2779"
+:status :complete
+:comment "Flatbed and ADF scan. All resolutions supported (up to 600DPI). Note: document feeder does not have 600DPI capability."
+
+:model "i-SENSYS MF8300 Series"
+:interface "USB Ethernet"
+:usbid "0x04a9" "0x2708"
+:status :complete
+:comment "Flatbed and ADF scan. All resolutions supported (up to 600DPI)."
+
+:model "i-SENSYS MF8500C Series"
+:interface "USB Ethernet"
+:usbid "0x04a9" "0x277a"
+:status :untested
+:comment "Same protocol as MF8200C Series? Testers needed!"
+
:model "imageRUNNER 1020/1024/1025"
:interface "USB"
:usbid "0x04a9" "0x26e6"
@@ -889,6 +1019,30 @@
:status :untested
:comment "Testers needed!"
+:model "MAXIFY MB2000 Series"
+:interface "USB"
+:usbid "0x04a9" "0x1778"
+:status :untested
+:comment "Testers needed!"
+
+:model "MAXIFY MB2300 Series"
+:interface "USB"
+:usbid "0x04a9" "0x1779"
+:status :untested
+:comment "Testers needed!"
+
+:model "MAXIFY MB5000 Series"
+:interface "USB"
+:usbid "0x04a9" "0x1776"
+:status :untested
+:comment "Testers needed!"
+
+:model "MAXIFY MB5300 Series"
+:interface "USB"
+:usbid "0x04a9" "0x1777"
+:status :untested
+:comment "Testers needed!"
+
:model "CanoScan 8800F"
:interface "USB"
:usbid "0x04a9" "0x1901"
diff --git a/doc/descriptions/stv680.desc b/doc/descriptions/stv680.desc
index fee96d7..fee96d7 100755..100644
--- a/doc/descriptions/stv680.desc
+++ b/doc/descriptions/stv680.desc
diff --git a/doc/descriptions/u12.desc b/doc/descriptions/u12.desc
index e5ff81f..ccf37f0 100644
--- a/doc/descriptions/u12.desc
+++ b/doc/descriptions/u12.desc
@@ -5,7 +5,6 @@
:backend "u12"
:version "0.02"
:manpage "sane-u12"
-:new :no
; backend's web page
:url "http://www.gjaeger.de/scanner/u12/"
diff --git a/doc/descriptions/unsupported.desc b/doc/descriptions/unsupported.desc
index 4f59ebf..d7e4128 100644
--- a/doc/descriptions/unsupported.desc
+++ b/doc/descriptions/unsupported.desc
@@ -424,13 +424,6 @@
:status :unsupported
:comment "Philips chip. Backend started, see link"
-:model "CanoScan LiDE 80"
-:url "/unsupported/canon-lide-80.html"
-:interface "USB"
-:usbid "0x04a9" "0x2214"
-:status :unsupported
-:comment "GL841 based, to be added to genesys backend"
-
:model "CanoScan LiDE 90"
:url "/unsupported/canon-lide-90.html"
:interface "USB"
@@ -788,13 +781,6 @@
:status :unsupported
:comment "Not supported yet by SANE. See link for details."
-:model "ScanJet 2400c"
-:url "/unsupported/hp-scanjet-2400c.html"
-:interface "USB"
-:usbid "0x03f0" "0x0a01"
-:status :unsupported
-:comment "GL646 based, to be added to genesys backend"
-
:model "Photosmart C3180"
:url "/unsupported/hp-photosmart-3180.html"
:interface "USB"
@@ -821,13 +807,6 @@
:comment "Not supported. See ScanJet 4600 entry."
:status :unsupported
-:model "ScanJet 4850C"
-:url "/unsupported/hp-scanjet-4850.html"
-:interface "USB"
-:usbid "0x03f0" "0x1b05"
-:comment "GL841, maybe can be added to genesys backend "
-:status :unsupported
-
:model "ScanJet 4890C"
:url "/unsupported/hp-scanjet-4850.html"
:interface "USB"
diff --git a/doc/releases.txt b/doc/releases.txt
index 320c8a0..a1b5478 100644
--- a/doc/releases.txt
+++ b/doc/releases.txt
@@ -38,14 +38,19 @@ Making the release:
* unpack tar.gz in temporary directory
* make diff from last release by unpacking it also in temporary directory
and running e.g.
- diff -uNr sane-backends-1.0.14 sane-backends-1.0.15 > sane-backends-1.0.14-1.0.15.diff
+ diff -uNr sane-backends-1.0.23 sane-backends-1.0.24 > sane-backends-1.0.23-1.0.24.diff
* check that the diff applies cleanly to the old version
* gzip the diff
* install devel headers required to build optional backends (1284,gphoto,etc)
* check that the new version .tar.gz can be compiled
-* upload these files together with the .diff.gz to the FTP/HTTP servers
+* upload the .tar.gz, tar.gz.md5 and .diff.gz to the FTP/HTTP servers
(at the moment: alioth.debian.org, ftp files are in
/srv/alioth.debian.org/chroot/ftproot/pub/sane/ )
+ In the alioth web interface, you should upload the smallest file first,
+ since you don't get error messages until after an upload completes,
+ and you might need to change something.
+ You can add the larger files afterwards. You may have to split larger
+ files.
Announcing the release:
@@ -55,15 +60,15 @@ Announcing the release:
* rebuild sane-backends.html and sane-mfgs.html (make -C doc html-pages)
* use man2html from http://hydra.nac.uci.edu/indiv/ehood/man2html.html
to rebuild html man pages (make -C doc html-man) (no other version works)
-* add md5 sum to sane-md5sum.txt
+* add md5 sum to sane-md5sums.txt
* check and update platforms page (sane-support.html)
* add announcement to index.html
* git commit -a && git push
* check that website was updated automatically. if not, see:
- /org/alioth.debian.org/chroot/home/groups/sane/bin/update-htdocs.sh
+ /home/groups/sane/bin/update-htdocs.sh
* rebuild descriptions.db (make -C doc descriptions.db)
* scp doc/descriptions.db to alioth:
- /org/alioth.debian.org/chroot/home/groups/sane/search/release
+ /home/groups/sane/search/release
* write announcements sane-devel, maybe others (e.g. freshmeat),
include the md5 hash
diff --git a/doc/sane-apple.man b/doc/sane-apple.man
index 2d388bf..7c55a5a 100644
--- a/doc/sane-apple.man
+++ b/doc/sane-apple.man
@@ -121,6 +121,7 @@ Cannot up/download halftone patterns, calibration vectors,
custom Color Correction Tables (CCT) and of course custom gamma tables.
.TP
.B Park/UnPark (OneScanner, ColorOneScanner)
+Some capabilities are missing.
.PP
The above functionalities are missing because I don't
have the hardware to experiment on. Another reason is my lack
@@ -240,8 +241,8 @@ and
.TP
.B Scan
Make scanning possible for all models in all supported modes.
-.TP
-.B Missing Functionality
+.PP
+Add other missing functionality
.SH "SEE ALSO"
sane(7), sane\-scsi(5)
diff --git a/doc/sane-avision.man b/doc/sane-avision.man
index 805d342..299bb72 100644
--- a/doc/sane-avision.man
+++ b/doc/sane-avision.man
@@ -157,9 +157,9 @@ export SANE_DEBUG_AVISION=7
.SH "SEE ALSO"
sane(7), sane\-scsi(5), sane\-usb(5)
.br
-http://skull.piratehaven.org/~mike/sane/avision.html
+http://exactcode.com/site/open_source/saneavision/
.SH MAINTAINER
-Mike Kelly
+Ren\['e] Rebe
.SH AUTHOR
Ren\['e] Rebe and Meino Christian Cramer
diff --git a/doc/sane-canon_dr.man b/doc/sane-canon_dr.man
index 6ac3fc3..3e8ac06 100644
--- a/doc/sane-canon_dr.man
+++ b/doc/sane-canon_dr.man
@@ -1,4 +1,4 @@
-.TH sane\-canon_dr 5 "16 Sep 2013" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
+.TH sane\-canon_dr 5 "31 Aug 2015" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
.IX sane\-canon_dr
.SH NAME
@@ -10,7 +10,7 @@ The
library implements a SANE (Scanner Access Now Easy) backend which
provides access to some Canon DR-series scanners.
-This document describes backend version 41, which shipped with SANE 1.0.24.
+This document describes backend version 51, which shipped with SANE 1.0.25.
.SH SUPPORTED HARDWARE
This version has only been tested with a few scanner models. Please see
diff --git a/doc/sane-cardscan.man b/doc/sane-cardscan.man
index 75cd161..7c081af 100644
--- a/doc/sane-cardscan.man
+++ b/doc/sane-cardscan.man
@@ -53,7 +53,7 @@ used by the backend:
.PP
"lines_per_block 16" (or other number from 1 to 32)
.RS
-Controls the number of lines of image data which will be aquired in each pass.
+Controls the number of lines of image data which will be acquired in each pass.
Older scanners will require this number set lower, often 1.
.RE
.PP
diff --git a/doc/sane-coolscan.man b/doc/sane-coolscan.man
index bf83014..5952039 100644
--- a/doc/sane-coolscan.man
+++ b/doc/sane-coolscan.man
@@ -39,7 +39,7 @@ permissions of that device, have a look at sane\-scsi.
Some SCSI-adapters and low-level SCSI drivers do not work correctly with this backend and the
Coolscan scanners. These systems hang when the autofocus command is send to the Scanner.
-To see a list of which card/driver combinations work or dont work have a look at:
+To see a list of which card/driver combinations work or don't work have a look at:
http://andreas.rick.free.fr/sane/autofocus.html.
diff --git a/doc/sane-epjitsu.man b/doc/sane-epjitsu.man
index 1e201c0..5d2a8ca 100644
--- a/doc/sane-epjitsu.man
+++ b/doc/sane-epjitsu.man
@@ -1,4 +1,4 @@
-.TH sane\-epjitsu 5 "09 Feb 2010" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
+.TH sane\-epjitsu 5 "12 Jun 2014" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
.IX sane\-epjitsu
.SH NAME
@@ -7,10 +7,10 @@ sane\-epjitsu \- SANE backend for Epson-based Fujitsu USB scanners.
.SH DESCRIPTION
The
.B sane\-epjitsu
-library implements a SANE (Scanner Access Now Easy) backend which provides basic access the Fujitsu fi\-60F and ScanSnap S300/S1300 scanners.
+library implements a SANE (Scanner Access Now Easy) backend which provides basic access the Fujitsu fi\-60F/fi\-65F and ScanSnap S300/S1300/S1100 scanners.
.SH HARDWARE SUPPORT
-These scanners are fairly limited, only supporting a couple of modes and resolutions, and always scanning full width. The backend supports missing modes (binary, grayscale) in software, but makes no effort to offer intermediate resolutions or scan area controls. See
+These scanners are fairly limited, only supporting a couple of modes and resolutions, and always scanning full width. The backend supports missing modes (binary, grayscale) and intermediate resolutions in software, but provides only minimal scan area controls. See
.B KNOWN ISSUES.
This backend may support other scanners. If physical inspection reveals an Epson chipset, please contact the author for instructions on collecting a USB trace under Windows to verify.
@@ -84,13 +84,10 @@ The backend uses a single environment variable, SANE_DEBUG_EPJITSU, which enable
.SH KNOWN ISSUES
.PP
.RS
-No scan area options are exposed.
+Only limited scan area options are exposed.
.br
.br
-fi\-60F hardware grayscale mode is not used.
-.br
-.br
-The S1100 is not currently supported, but a patch is available.
+fi\-60F and fi\-65F hardware grayscale mode is not used.
.RE
.SH CREDITS
diff --git a/doc/sane-epson.man b/doc/sane-epson.man
index 3790df6..d474bb7 100644
--- a/doc/sane-epson.man
+++ b/doc/sane-epson.man
@@ -91,7 +91,7 @@ are "None", "Halftone A (Hard Tone)", "Halftone B (Soft Tone)", "Halftone C
The
.I \-\-dropout
-switch selects the so called dropout color. Vald options are None,
+switch selects the so called dropout color. Valid options are None,
Red, Green and Blue. The default is None. The dropout color is used for
monochrome scanning and selects the color that is not scanned. This can
be used to e.g. scan an original with a colored background.
@@ -269,7 +269,7 @@ environment variable controls the SCSI related debug level for this backend.
Only a value of 2 is supported.
.TP
.B SANE_EPSON_CMD_LVL
-This allows to override the function or command level that the backend
+This allows one to override the function or command level that the backend
uses to communicate with the scanner. The function level a scanner
supports is determined during the initialization of the device. If
the backend does not recognize the function level reported by the
diff --git a/doc/sane-epson2.man b/doc/sane-epson2.man
index 27ee34e..896b340 100644
--- a/doc/sane-epson2.man
+++ b/doc/sane-epson2.man
@@ -137,7 +137,7 @@ are "None", "Halftone A (Hard Tone)", "Halftone B (Soft Tone)", "Halftone C
The
.I \-\-dropout
-switch selects the so called dropout color. Vald options are None,
+switch selects the so called dropout color. Valid options are None,
Red, Green and Blue. The default is None. The dropout color is used for
monochrome scanning and selects the color that is not scanned. This can
be used to e.g. scan an original with a colored background.
@@ -323,7 +323,7 @@ backend. E.g., a value of 128 requests all debug output to be printed.
Smaller levels reduce verbosity.
.TP
.B SANE_EPSON2_CMD_LVL
-This allows to override the function or command level that the backend
+This allows one to override the function or command level that the backend
uses to communicate with the scanner. The function level a scanner
supports is determined during the initialization of the device. If
the backend does not recognize the function level reported by the
diff --git a/doc/sane-epsonds.man b/doc/sane-epsonds.man
new file mode 100644
index 0000000..ea9bcbb
--- /dev/null
+++ b/doc/sane-epsonds.man
@@ -0,0 +1,101 @@
+.TH sane\-epsonds 5 "29 Mar 2015" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
+.IX sane\-epsonds
+.SH NAME
+sane\-epsonds \- SANE backend for EPSON ESC/I-2 scanners
+.SH DESCRIPTION
+The
+.B sane\-epsonds
+library implements a SANE (Scanner Access Now Easy) backend that
+provides access to Epson ESC/I-2 scanners.
+.PP
+Valid command line options and their syntax can be listed by using
+.RS
+scanimage \-\-help \-d epsonds
+.RE
+Not all devices support all options.
+.TP
+.I Scan Mode
+The
+.I \-\-mode
+switch selects the basic mode of operation of the scanner. Valid choices
+are Lineart, Gray and Color. The Lineart mode is black and white only,
+Gray will produce 256 levels of gray or more depending on the scanner
+and Color means 24 bit color mode or more depending on the scanner.
+Some scanners will internally use 36 bit color, their external interface
+however may only support 24 bits.
+
+The
+.I \-\-depth
+option selects the bit depth the scanner is using. This option is only
+available for scanners that support more than one bit depth. Older
+scanners will always transfer the image in 8bit mode. Newer scanners
+allow to select either 8 bits, 12 or 14 bits per color channel. For a
+color scan this means an effective color depth of 36 or 42 bits over
+all three channels. The valid choices depend on the scanner model.
+
+The
+.I \-\-resolution
+switch selects the resolution for a scan. Some EPSON scanners will scan in
+any resolution between the lowest and highest possible value. The list
+reported by the scanner can be displayed using the "\-\-help \-d epson"
+parameters to scanimage.
+
+The geometry options
+.I \-l \-t \-x \-y
+control the scan area: \-l sets the top left x coordinate, \-t the top
+left y coordinate, \-x selects the width and \-y the height of the scan
+area. All parameters are specified in millimeters.
+
+The
+.I \-\-source
+option selects the scan source. Valid options depend on the installed
+options. The default is "Flatbed".
+
+The
+.I \-\-eject
+option ejects the sheet in the ADF.
+
+The
+.I \-\-adf-mode
+option select the ADF mode (simplex/duplex).
+
+.SH CONFIGURATION FILE
+The configuration file @CONFIGDIR@/epsonds.conf specifies the device(s) that the
+backend will use. Possible connection types are:
+.TP
+.I USB
+For not automatically detected USB scanners, their VENDOR and PRODUCT ID can
+be specified manually in the config file.
+More information about valid syntax for USB devices can be found in sane\-usb(5).
+.TP
+.I Network (not yet supported)
+Network scanners can be auto-discovered if
+.I autodiscovery
+is specified after
+.I
+net
+keyword. An IP address to connect to can also be used.
+.SH FILES
+.TP
+.I @LIBDIR@/libsane\-epsonds.a
+The static library implementing this backend.
+.TP
+.I @LIBDIR@/libsane\-epsonds.so
+The shared library implementing this backend (present on systems that
+support dynamic loading).
+.SH ENVIRONMENT
+.TP
+.B SANE_DEBUG_EPSONDS
+If the library was compiled with debug support enabled, this
+environment variable controls the debug level for this backend. E.g.,
+a value of 128 requests all debug output to be printed. Smaller
+levels reduce verbosity. Values around 11-16 will usuallybe enough for
+a bug report.
+
+.SH "SEE ALSO"
+
+sane\-usb(5), scanimage(1), xscanimage(1), xsane(1)
+
+.SH AUTHOR
+
+The package is written by Alessandro Zummo
diff --git a/doc/sane-fujitsu.man b/doc/sane-fujitsu.man
index e996802..29004d9 100644
--- a/doc/sane-fujitsu.man
+++ b/doc/sane-fujitsu.man
@@ -1,4 +1,4 @@
-.TH sane\-fujitsu 5 "17 Sep 2013" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
+.TH sane\-fujitsu 5 "31 Aug 2015" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
.IX sane\-fujitsu
.SH NAME
@@ -10,13 +10,13 @@ The
library implements a SANE (Scanner Access Now Easy) backend which
provides access to most Fujitsu flatbed and ADF scanners.
-This document describes backend version 117, which shipped with SANE 1.0.24.
+This document describes backend version 127, which shipped with SANE 1.0.25.
.SH SUPPORTED HARDWARE
This version supports every known model which speaks the Fujitsu SCSI and
SCSI\-over\-USB protocols. Specifically, the SCSI M309x and M409x series, the
SCSI fi\-series, most of the USB fi\-series, the USB ScanSnap S5xx/S15xx, and
-the USB iX5xx series scanners are supported. Please see the list at
+the USB iX1xx/5xx series scanners are supported. Please see the list at
http://www.sane\-project.org/sane\-supported\-devices.html for details.
This backend may support other Fujitsu scanners. The best
@@ -215,7 +215,7 @@ Automatic length detection support funded by:
Martin G. Miller
mgmiller at optonline.net
-Hardware donated, software image enhancement and fi-6xxx support funded by:
+Hardware donated, software image enhancement and fi-6/7xxx support funded by:
Fujitsu Computer Products of America, Inc.
www.fcpa.com
diff --git a/doc/sane-genesys.man b/doc/sane-genesys.man
index 0cd1ffb..ee3e0af 100644
--- a/doc/sane-genesys.man
+++ b/doc/sane-genesys.man
@@ -10,7 +10,7 @@ access to USB flatbed scanners based on the Genesys GL646, GL841, GL843, GL847 a
At present, the following scanners are known to work with this backend:
.PP
.RS
-Canon LiDE 35/40/50/60/100/110/200/210/700
+Canon LiDE 35/40/50/60/100/110/200/210/220/700
.br
Hewlett-Packard HP2300C/HP2400/HP3670/HP3690/G4010/G4050
.br
@@ -48,11 +48,18 @@ GL841, GL843, GL847 or GL124 chipset, you can try to add it to the backend.
.SH "CALIBRATION"
To give correct image quality, sheet fed scanners need to be calibrated using the
calibration sheet sold with the scanner. To do calibration, you must insert this target
-in the feeder then start calibration either by passing the --calibrate option to scanimage
+in the feeder then start calibration either by passing the \-\-calibrate option to scanimage
or by clicking on the available 'calibrate' button in the 'advanced options' in a graphical
frontend. The result of the calibration is stored in a file in the home directory of the user doing it.
If you plug the scanner in another machine or use it with another account, calibration
-will have to be redone.
+will have to be redone, unles you use the \-\-calibration\-file option.
+If no home directory is defined,
+USERAPPPROFILE will be used, then TMPDIR or TMP. If none of these directories exist, the backend will try
+to write in the current working directory. Flatbed scanners also make use of the calibration file as a cache
+to avoid calibration before each scan. Calibration file name is the name of the scanner model if only
+one scanner is detected. In the case of several identical model, the file name will be the name
+of the logical USB device name. The expiration time manages the time a calibration is valid in cache.
+A value of -1 means forever, 0 means no cache.
.SH EXTRAS SCAN OPTIONS
@@ -69,13 +76,13 @@ whith brightness below that value will be scanned as black.
.B \-\-brightness value
.RS
- -100..100 (in steps of 1). Set the brightness enhancement. 0 for no enhancement, negative
+ \-100..100 (in steps of 1). Set the brightness enhancement. 0 for no enhancement, negative
values to decrease brigthness, and positive values to increase it.
.RE
.B \-\-contrast value
.RS
- -100..100 (in steps of 1). Set the contrast enhancement. 0 for no enhancement, negative
+ \-100..100 (in steps of 1). Set the contrast enhancement. 0 for no enhancement, negative
values to decrease contrast, and positive values to increase it.
.RE
@@ -112,9 +119,16 @@ next scan will happen.
.B \-\-calibration\-file
.RS
Specify the calibration file name to use. At least the directory containing the file
-must exist, since it won't be created. This allow to handle the case of several identical devices
-that would otherwise use the same calibration data. This option is disabled if the backend is ran
-as root.
+must exist, since it won't be created. This option is disabled if the backend is ran
+as root. It maybe used in case of sheet-fed scanners to share a calibration file for several
+users.
+.RE
+
+.B \-\-expiration\-time
+.RS
+ Specify the time (in minutes) a cached calibration is considered valid. If older than the given value, a new
+calibration is done. A value of -1 means no expiration and cached value are kept forever unless cleared by
+userwith the calibration clear option. A value of 0 means cache is disabled.
.RE
.PP
@@ -268,6 +282,9 @@ cncsolutions (http://www.cncsolutions.com.br) sponsored and supported the work o
.TP
Brian Paavo from Benthic Science Limited for donating a Canoscan LiDE 700F.
.br
+.TP
+Dany Qumsiyeh for donating a Canoscan LiDE 210 and a LiDE 220.
+.br
.SH "SEE ALSO"
.BR sane (7),
@@ -295,7 +312,7 @@ Alexey Osipov <simba@lerlan.ru> for HP2400 final support
Powersaving isn't implemented for gl646 based scanner. Dynamic (emulated from gray data and with dithering) isn't enabled for gl646 scanners. Hardware lineart is limited up to 600 dpi for gl847 based scanners, due to the way image sensors are built.
.br
.TP
-This backend will be much slower if not using libusb-1.0. So be sure that sane-backends is built with the --enable-libusb_1_0 option.
+This backend will be much slower if not using libusb\-1.0. So be sure that sane\-backends is built with the \-\-enable-libusb_1_0 option.
.br
.SH "BUGS"
diff --git a/doc/sane-gt68xx.man b/doc/sane-gt68xx.man
index 4296ed4..e3d29af 100644
--- a/doc/sane-gt68xx.man
+++ b/doc/sane-gt68xx.man
@@ -117,7 +117,7 @@ can set the "correct" name here.
.PP
The
.B afe
-option allows to set custom offset and gain values for the Analog FrontEnd of
+option allows one to set custom offset and gain values for the Analog FrontEnd of
the scanner. This option can be either used to select the AFE values if
automatic coarse calibration is disabled, or to make automatic coarse
calibration faster. For the latter usage, enable debug level 3 (see below),
diff --git a/doc/sane-kodakaio.man b/doc/sane-kodakaio.man
index e5303b6..40310ed 100644
--- a/doc/sane-kodakaio.man
+++ b/doc/sane-kodakaio.man
@@ -1,4 +1,4 @@
-.TH sane\-kodakaio 2.4 "17 Jun 2012" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
+.TH sane\-kodakaio 5 "17 Jun 2012" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
.IX sane\-kodakaio
.SH NAME
diff --git a/doc/sane-mustek_pp.man b/doc/sane-mustek_pp.man
index 1316cf2..253759d 100644
--- a/doc/sane-mustek_pp.man
+++ b/doc/sane-mustek_pp.man
@@ -486,5 +486,3 @@ also a worthy information. Please also include the optical resolution and lamp t
.I any further comments
if you have comments about the documentation (what could be done better), or you
think I should know something, please include it.
-.TP
-.I some nice greetings
diff --git a/doc/sane-pieusb.man b/doc/sane-pieusb.man
new file mode 100644
index 0000000..e38e8e1
--- /dev/null
+++ b/doc/sane-pieusb.man
@@ -0,0 +1,111 @@
+.TH sane\-pieusb 5 "10 Aug 2015" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
+.IX sane\-pieusb
+.SH NAME
+sane\-pieusb \- SANE backend for USB-connected PIE PowerSlide and
+Reflecta DigitDia/CrystalScan/ProScan slide scanners
+
+.SH DESCRIPTION
+The
+.B sane\-pieusb
+library implements a SANE (Scanner Access Now Easy) backend that
+provides access to USB-connected PIE and Reflecta slide scanners.
+.br
+At present, the following scanners should work with this backend:
+.PP
+.ft CR
+.nf
+Model: Status
+------------------------- ------
+PIE PowerSlide 3600 Untested
+PIE PowerSlide 3650 Untested
+PIE PowerSlide 4000 Untested
+PIE PowerSlide 5000 Untested
+Reflecta CrystalScan 7200 Untested
+Reflecta ProScan 4000 Untested
+Reflecta ProScan 7200 Untested
+Reflecta DigitDia 3600 Untested
+Reflecta DigitDia 4000 Untested
+Reflecta DigitDia 5000 Untested
+Reflecta DigitDia 6000 Ok
+.fi
+.ft R
+.PP
+
+.SH "MULTIPLE SLIDES"
+Support for multiple slide scanners (like the PowerSlide or DigitDia
+series) is done by auto-advancing ('Advance slide' setting) the slide
+after each scan.
+
+However, for best results, it is recommended to do a preview for
+every slide since this sets gamma, brightness, and contrast to optimal
+values.
+
+Attention: SANE does not have an automatic landscape/portrait
+detection and re-orientation when scanning multiple slides. You have
+to put all slides into one orientation first !
+
+.SH "DIRT REMOVAL"
+If available, pieusb supports infrared scans for dirt detection and
+removal. This must be enabled via the 'Clean image' setting.
+
+.SH "KNOWN PROBLEMS"
+The pieusb backend supports dirt removal based on infrared scan
+information. Since SANE does not provide post-processing in the
+backend, pieusb does the scanning and dirt removal during the setup
+phase. The 'scan' phase is only used to transfer the completed image.
+Therefore pieusb does not multi-thread making a typical frontend
+appear as 'blocked'. Also cancel requests are only honored between
+scans.
+
+.SH "ENVIRONMENT"
+.TP
+.B SANE_DEBUG_PIEUSB
+If the library was compiled with debug support enabled, this
+environment variable controls the debug level for this backend. E.g.,
+a value of 128 requests all debug output to be printed. Smaller
+levels reduce verbosity.
+
+.PP
+.RS
+.ft CR
+.nf
+level debug output
+\-\-\-\-\-\-\- \-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-\-
+ 0 nothing
+ 1 errors
+ 2 warnings & minor errors
+ 5 additional information
+ 7 SANE api calls
+ 9 backend functions
+11 scanner functions
+13 usb functions
+15 image buffer functions
+.fi
+.ft R
+.RE
+.PP
+
+.SH FILES
+.TP
+.I @CONFIGDIR@/pieusb.conf
+The backend configuration file
+.TP
+.I @LIBDIR@/libsane\-pieusb.a
+The static library implementing this backend.
+.TP
+.I @LIBDIR@/libsane\-pieusb.so
+The shared library implementing this backend (present on systems that
+support dynamic loading).
+.PP
+
+.SH SEE ALSO
+sane(7)
+
+.SH "CONTACT AND BUG-REPORTS"
+Please send any information and bug-reports to:
+.br
+.B Klaus Kämpf <kkaempf@suse.com>
+
+.SH AUTHORS
+The pieusb backend is based on work by Jan Vleeshouwers, Michael
+Rickmann, and Klaus Kämpf
diff --git a/doc/sane-pixma.man b/doc/sane-pixma.man
index b108679..ca692cb 100644
--- a/doc/sane-pixma.man
+++ b/doc/sane-pixma.man
@@ -1,4 +1,4 @@
-.TH "sane\-pixma" "5" "24 Sep 2013" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
+.TH "sane\-pixma" "5" "30 Sep 2015" "@PACKAGEVERSION@" "SANE Scanner Access Now Easy"
.IX sane\-pixma
.SH NAME
sane\-pixma \- SANE backend for Canon Multi-Function Printers and CanoScan Scanners
@@ -8,16 +8,18 @@ The
library implements a SANE (Scanner Access Now Easy) backend that provides
access to Canon PIXMA / i-SENSYS / imageCLASS / imageRUNNER multi-function
devices (All-in-one printers) and the Canon CanoScan Flatbed/TPU scanners.
-The backend implements both USB interface and network interface
-using Canon's BJNP protocol. The network interface supports scanners over
-IPv4 as well as IPv6.
+The backend implements both the USB interface and network interface
+(using Canon's BJNP and MFNP protocols). The network interface supports scanners
+over IPv4 as well as IPv6 (MFNP over IPv6 is untested).
.PP
Currently, the following models work with this backend:
.PP
.RS
-PIXMA MG2100, MG3100, MG4200, MG5100, MG5200, MG5300
+PIXMA MG2100, MG2200, MG2400, MG2500, MG2900, MG3100, MG3200
.br
-PIXMA MG6100, MG6200, MG6300, MG8200
+PIXMA MG3500, MG4200, MG5100, MG5200, MG5300, MG5500, MG5600
+.br
+PIXMA MG6100, MG6200, MG6300, MG6400, MG7100, MG7500, MG8200
.br
PIXMA MP140, MP150, MP160, MP170, MP180, MP190
.br
@@ -39,9 +41,9 @@ PIXMA MP960, MP970, MP980, MP990
.br
PIXMA MX300, MX310, MX330, MX340, MX350, MX360, MX370
.br
-PIXMA MX420, MX700, MX7600
+PIXMA MX410, MX420, MX470, MX510, MX520, MX530, MX700, MX720
.br
-PIXMA MX850, MX860, MX870, MX882, MX885, MX890
+PIXMA MX850, MX860, MX870, MX882, MX885, MX890, MX920, MX7600
.br
imageCLASS MF3110, MF3240, MF4010, MF4018
.br
@@ -49,11 +51,15 @@ imageCLASS MF4120, MF4122, MF4140, MF4150
.br
imageCLASS MF4270, MF4350d, MF4370dn, MF4380dn
.br
-imageCLASS MF4410, MF4430, MF4660, MF4690, MF4770n
+imageCLASS MF4410, MF4430, MF4570dw, MF4660, MF4690
+.br
+imageCLASS MF5730, MF5770, MF6550, D420, D480, D530
.br
-imageCLASS MF5730, MF5770, MF6550, D420, D480
+i-SENSYS MF3010, MF4320d, MF4330d, MF4500 Series
.br
-i-SENSYS MF3010, MF4320d, MF4330d, MF4550d
+i-SENSYS MF4700 Series, MF4800 Series, MF8200C Series
+.br
+i-SENSYS MF8300 Series
.br
imageRUNNER 1020/1024/1025
.br
@@ -65,8 +71,6 @@ and must be switched off and on.
.PP
.RS
PIXMA MP760, MP770, MP780, MP790
-.br
-PIXMA MX360
.RE
.PP
The following models may use the same Pixma protocol as those listed
@@ -75,23 +79,23 @@ in the backend so that they get recognized and activated.
Feedback in the sane\-devel mailing list welcome.
.PP
.RS
-PIXMA E500, E510, E600, E610
+PIXMA E400, E460, E480, E500, E510, E560, E600, E610
.br
-PIXMA MG2200, MG2400, MG2500, MG3200, MG4100, MG5400, MG5500
-.br
-PIXMA MG6400, MG6500, MG7100, MG8100
+PIXMA MG3600, MG4100, MG5400, MG6500, MG6600, MG8100
.br
PIXMA MP375R, MP493, MP495, MP740
.br
-PIXMA MX320, MX390, MX410, MX430, MX450, MX510, MX520
-.br
-PIXMA MX710, MX720, MX920
+PIXMA MX320, MX390, MX430, MX450, MX490, MX710
.br
-imageCLASS MF4570dw, MF5630, MF5650, MF5750, MF8030, MF8170c
+imageCLASS MF810/820, MF5630, MF5650, MF5750, MF8030, MF8170c
.br
imageRUNNER 1133
.br
-i-SENSYS MF5880dn, MF6680dn
+i-SENSYS MF210 Series, MF220 Series, MF5880dn, MF5900 Series
+.br
+i-SENSYS MF6100 Series, MF6680dn, MF8500C Series
+.br
+MAXIFY MB2000, MB2300, MB5000, MB5300
.RE
.PP
\#The following models may use partly the same Pixma protocol as other devices
@@ -119,11 +123,14 @@ The backend supports:
.PP
The device name for USB devices is in the form pixma:xxxxyyyy_zzzzz
where x, y and z are vendor ID, product ID and serial number respectively.
+.PP
Example: pixma:04A91709_123456 is a MP150.
.PP
-Device names for BJNP devices is in the form pixma:aaaa_bbbbb
+Device names for BJNP/MFNP devices is in the form pixma:aaaa_bbbbb
where aaaa is the scanners model and bbbb is the hostname or ip-adress.
.PP
+Example: pixma:MF4800_192.168.1.45 is a MF4800 Series multi-function peripheral.
+.PP
This backend, based on cloning original Canon drivers protocols, is in
a production stage. Designed has been carried out without any applicable
manufacturer documentation, probably never available. However, we have tested
@@ -136,10 +143,10 @@ provides the following
\#.B experimental
options for button handling, i.e. the options might change in the future.
.br
-The button status can be polled i.e. with 'scanimage -A'.
+The button status can be polled i.e. with 'scanimage \-A'.
.br
Button scan is disabled on MAC OS X due to darwin libusb not handling
-timeouts in usb interrupt reads.
+timeouts in usb interrupt reads, but may work when using the network protocol.
.TP
.I button\-controlled
This option can be used by applications (like
@@ -154,7 +161,7 @@ first page in the scanner, press the button, then the next page, press
the button and so on. When you finished, press the gray-scan button. (For
MP150 you have to stop the frontend by pressing Ctrl-C for example.)
.TP
-.I button\-update
+.I button\-update (deprecated)
(write only) In the past this option was required to be set to force
reading of the button status for
.I button\-1
@@ -202,25 +209,36 @@ support dynamic loading).
.I @CONFIGDIR@/pixma.conf
The backend configuration file (see also description of
.B SANE_CONFIG_DIR
-below). The files contains an optional list of scanners. Normally only scanners
-that can not be auto-detected because they are on a different subnet shall be
-listed here. If your OS does not allow enumeration of interfaces (i.e. it does not
-support the getifaddrs() function) you may need to add your scanner here as well.
+below). The files contains an optional list of networked scanners. Normally
+only scanners that can not be auto-detected because they are on a different
+subnet shall be listed here. If your OS does not allow enumeration of
+interfaces (i.e. it does not support the getifaddrs() function) you may need
+to add your scanner here as well.
+.PP
Scanners shall be listed as:
.PP
.RS
-.I bjnp://<host>
+.I <method>://<host>[:port]
.RE
.RS
-where host is the hostname or IP address of the scanner, e.g. bjnp://10.0.1.4
+.PP
+where method indicates the protocol used (bjnp is used for inkjet multi-functionals
+and mfnp is used for laser multi-functionals).
+.PP
+host is the hostname or IP address of the scanner, e.g. bjnp://10.0.1.4
for IPv4, bjnp://[2001:888:118e:18e2:21e:8fff:fe36:b64a] for a literal
-IPv6-address or bjnp://myscanner.mydomain.org. Define each scanner on a new
-line.
+IPv6-address or bjnp://myscanner.mydomain.org for a hostname.
+.PP
+The port number is optional and in normally implied by the method.
+Port 8610 is the standard port for mfnp, 8612 for bjnp.
+.PP
+Define each scanner on a new line.
.SH USB SUPPORT
USB scanners will be auto-detected and require no configuration.
.SH NETWORKING SUPPORT
The pixma backend supports network scanners using the so called Canon BJNP
-protocol. Both IPv4 and IPv6 are supported.
+protocol and MFNP protocol. Both IPv4 and IPv6 are supported, but IPv6 is as
+yet untested with MFNP. Please report your results on the mailing list.
.PP
Configuration is normally not required.
The pixma backend will auto-detect your scanner if it is within
@@ -229,24 +247,27 @@ the same subnet as your computer if your OS does support this.
If your scanner can not be auto-detected, you can add it to the pixma
configuration file (see above).
.SH FIREWALLING FOR NETWORKED SCANNERS
-The sane pixma backend communicates with port 8612 on the scanner. So
-you will have to allow outgoing traffic TO port 8612 on the common subnet
-for scanning.
+The sane pixma backend communicates with port 8610 for MFNP or port 8612
+for BJNP on the scanner. So
+you will have to allow outgoing traffic TO port 8610 or 8612 on the
+common subnet for scanning.
.PP
Scanner detection is slightly more complicated. The pixma backend sends
a broadcast on all direct connected subnets it can find (provided your OS
allows for enumeration of all netowrk interfaces). The broadcast is sent FROM
-port 8612 TO port 8612 on the broadcast address of each interface.
+port 8612 TO port 8610 or 8612 on the broadcast address of each interface.
The outgoing packets will be allowed by the rule described above.
.PP
Responses from the scanner are sent back to the computer TO port 8612.
Connection tracking however does not see a match as the response does not come
from the broadcast address but from the scanners own address.
For automatic detection of your scanner, you will therefore have to allow
-incoming packets TO port 8612 on your computer.
+incoming packets TO port 8612 on your computer. This applies to both MFNP and
+BJNP.
.PP
-So in short: open the firewall for all traffic from your computer to port 8612
-AND to port 8612 to your computer.
+So in short: open the firewall for all traffic from your computer to port
+8610 (for MFNP) or 8612 (for BJNP)
+AND to port 8612 (for both BJNP and MFNP) to your computer.
.PP
With the firewall rules above there is no need to add the scanner to the
pixma.conf file, unless the scanner is on a network that is not directly
@@ -266,6 +287,8 @@ the verbosity and includes the information printed at the lower levels.
.br
3 print debug-level messages
.br
+4 print verbose debug-level messages
+.br
11 dump USB traffic
.br
21 full dump USB traffic
@@ -275,8 +298,8 @@ the verbosity and includes the information printed at the lower levels.
.B SANE_DEBUG_BJNP
If the library was compiled with debug support enabled, this environment
variable controls the debug level for the
-.B BJNP
-network protocol for this backend. Higher value increases
+.B BJNP and MFNP
+network protocols for this backend. Higher value increases
the verbosity and includes the information printed at the lower levels.
.RS
0 print nothing (default)
diff --git a/doc/sane-scsi.man b/doc/sane-scsi.man
index c1032ee..bcb7d77 100644
--- a/doc/sane-scsi.man
+++ b/doc/sane-scsi.man
@@ -28,7 +28,7 @@ for Epson scanners,
for HP scanners, etc.).
.PP
For some operating systems (e.g. Linux and OS/2), there is an alternate way of
-specifying scanner devices. This alternate way allows to identify scanners by
+specifying scanner devices. This alternate way allows one to identify scanners by
the SCSI vendor and model string and/or by the SCSI device address (consisting
of bus number, channel number, id, and logical unit number). The syntax for
specifying a scanner in this way is:
diff --git a/doc/sane-test.man b/doc/sane-test.man
index 41b9aa4..e582895 100644
--- a/doc/sane-test.man
+++ b/doc/sane-test.man
@@ -40,7 +40,7 @@ Setting option
.B hand\-scanner
results in the test-backend behaving like a hand-scanner. Hand-scanners do
not know the image height a priori. Instead, they return a height of \-1.
-Setting this option allows to test whether a frontend can handle this
+Setting this option allows one to test whether a frontend can handle this
correctly. This option also enables a fixed width of 11 cm.
.PP
Setting option
@@ -68,7 +68,7 @@ ADF will be "empty".
.SH SPECIAL OPTIONS
Option
.B test\-picture
-allows to set the image that's returned to the frontend. While "Solid white"
+allows one to set the image that's returned to the frontend. While "Solid white"
and "Solid black" are quite obvious, the other options need some more
explanation. Color patterns are used to determine if all modes and their
colors are represented correctly by the frontend. The grid should look like the
@@ -76,10 +76,10 @@ same in every mode and resolution. A table of all the test pictures can be
found at: http://www.meier\-geinitz.de/sane/test\-backend/test\-pictures.html.
.PP
If option
-.B invert\-endianess
+.B invert\-endianness
is set, the upper and lower bytes of image data in 16 bit modes are exchanged.
This option can be used to test the 16 bit modes of frontends, e.g. if the
-frontend uses the correct endianess.
+frontend uses the correct endianness.
.PP
If option
.B read\-limit
diff --git a/doc/sane-umax_pp.man b/doc/sane-umax_pp.man
index 2a8349d..09e6ea0 100644
--- a/doc/sane-umax_pp.man
+++ b/doc/sane-umax_pp.man
@@ -58,7 +58,7 @@ needs to run as root. To allow user access to the scanner
run the backend through the network interface (See saned(8) and sane\-net(5)).
A more relaxed solution (security wise) is to add suid bit to the frontend
(See chmod(1)).
-The backend drop root priviledges as soon as it can, right after gaining direct
+The backend drop root privileges as soon as it can, right after gaining direct
access to IO ports, which lessen risks when being root.
.SH "DEVICE NAMES"
@@ -100,7 +100,7 @@ root (*BSD and linux), or with 'IOPL=yes' on
OS/2
.PP
.RE
-\fBNOTE:\fR in all cases, you must have sufficient priviledges
+\fBNOTE:\fR in all cases, you must have sufficient privileges
to get access to the chosen device or address. Depending on the
security settings, devices may not be available for all users.
You have to change permissions on the dev/ppi* or /dev/parport* devices.
diff --git a/doc/sane-usb.man b/doc/sane-usb.man
index 5052e41..8237a8a 100644
--- a/doc/sane-usb.man
+++ b/doc/sane-usb.man
@@ -90,7 +90,7 @@ can be found on the SANE webpage
and the individual backend manpages.
.PP
Most backends can detect USB scanners automatically using "usb" configuration
-file lines. This method allows to identify scanners by the USB vendor and
+file lines. This method allows one to identify scanners by the USB vendor and
product numbers. The syntax for specifying a scanner this way is:
.PP
.RS
diff --git a/doc/sane.man b/doc/sane.man
index b062782..4fad9a9 100644
--- a/doc/sane.man
+++ b/doc/sane.man
@@ -429,7 +429,7 @@ for details.
.TP
.B plustek
The SANE plustek backend supports USB flatbed scanners that use the National
-Semiconductor LM983[1/2/3]-chipset aka Merlin. Scanners using this LM983x chips
+Semiconductor LM983[1/2/3] chipset aka Merlin. Scanners using this LM983x chips
include some models from Plustek, KYE/Genius, Hewlett-Packard, Mustek, Umax,
Epson, and Canon. See
.BR sane\-plustek (5)
diff --git a/doc/saned.man b/doc/saned.man
index d8e8983..5f7bc20 100644
--- a/doc/saned.man
+++ b/doc/saned.man
@@ -164,7 +164,7 @@ The configuration line normally looks like this:
.PP
.RS
sane\-port stream tcp nowait saned.saned @SBINDIR@/saned saned
-.E
+.RE
.PP
However, if your system uses
.BR tcpd (8)
@@ -214,7 +214,19 @@ service sane\-port
.ft R
.RE
.SH SYSTEMD CONFIGURATION
-for systemd we need to add 2 configuation files in
+Saned can be compiled with explicit systemd support. This
+will allow logging debugging information to be forwarded
+to the systemd journal. The systemd support
+requires compilation with the systemd-devel package
+installed on the system. this is the preferred option.
+
+Saned can be used wih systemd without the systemd integration
+compiled in, but then logging of debug information is not supported.
+
+The systemd configuration is different for the 2 options, so
+both are described below.
+.SH Systemd configuration for saned with systemd support compiled in
+for the systemd configuration we need to add 2 configuation files in
.I /etc/systemd/system.
.PP
The first file we need to add here is called
@@ -257,23 +269,89 @@ Group=saned
StandardInput=null
StandardOutput=syslog
StandardError=syslog
-# Environment=SANE_CONFIG_DIR=@CONFIGDIR@ SANE_DEBUG_DLL=255
+Environment=SANE_CONFIG_DIR=@CONFIGDIR@
+# If you need to debug your configuration uncomment the next line and
+# change it as appropriate to set the desired debug options
+# Environment=SANE_DEBUG_DLL=255 SANE_DEBUG_BJNP=5
+
+[Install]
+Also=saned.socket
.fi
.ft R
.RE
.PP
-Is you need to set an environment variable for saned like
+You need to set an environment variable for
.B SANE_CONFIG_DIR
-you will have to remove the # on the last line and set the variable
-appropriately. Multiple variables can be set by separating the assignments
-by spaces as shown in the example above.
+pointing to the directory where saned can find its configuration files.
+you will have to remove the # on the last line and set the variables
+for the desired debugging information if required. Multiple variables
+can be set by separating the assignments by spaces as shown in the
+example above.
.PP
Unlike
.I (x)inetd
-systemd allows debugging output from backends set using
-.B SANE_DEBUG_<backend_name>
-to be captured. With the service unit as described above, the debugging output is
+, systemd allows debugging output from backends set using
+.B SANE_DEBUG_XXX
+to be captured. See the man-page for your backend to see what options
+are supported.
+With the service unit as described above, the debugging output is
forwarded to the system log.
+
+.SH Systemd configuration when saned is compiled without systemd support
+This configuration will also work when Saned is compiled WITH systemd integration
+support, but it does not allow debugging information to be logged.
+.PP
+for systemd configuration for saned, we need to add 2 configuation files in
+.I /etc/systemd/system.
+.PP
+The first file we need to add here is called
+.I saned.socket.
+It is identical to the version for systemd with the support compiled in.
+It shall have the following contents:
+.PP
+.RS
+.ft CR
+.nf
+[Unit]
+Description=saned incoming socket
+
+[Socket]
+ListenStream=6566
+Accept=yes
+MaxConnections=1
+
+[Install]
+WantedBy=sockets.target
+.fi
+.ft R
+.RE
+.PP
+The second file to be added is
+.I saned@.service
+This one differes from the sersion with systemd integration compiled in:
+.PP
+.RS
+.ft CR
+.nf
+[Unit]
+Description=Scanner Service
+Requires=saned.socket
+
+[Service]
+ExecStart=/usr/sbin/saned
+User=saned
+Group=saned
+StandardInput=socket
+
+Environment=SANE_CONFIG_DIR=/etc/sane.d
+
+[Install]
+Also=saned.socket
+.fi
+.ft R
+.RE
+.PP
+
.SH FILES
.TP
.I /etc/hosts.equiv
diff --git a/doc/scanimage.man b/doc/scanimage.man
index 79a1251..4d47eb8 100644
--- a/doc/scanimage.man
+++ b/doc/scanimage.man
@@ -42,7 +42,8 @@ command-line options. After command-line processing,
normally proceeds to acquire an image. The image data is written to
standard output in one of the PNM (portable aNyMaP) formats (PBM for
black-and-white images, PGM for grayscale images, and PPM for color
-images) or in TIFF (black-and-white, grayscale or color).
+images), TIFF format (black-and-white, grayscale or color), PNG format,
+or JPEG format.
.B scanimage
accesses image acquisition devices through the
.B SANE
@@ -103,9 +104,11 @@ The
option selects how image data is written to standard output.
.I format
can be
-.B pnm
+.BR pnm ,
+.BR tiff ,
+.BR png ,
or
-.BR tiff.
+.BR jpeg .
If
.B \-\-format
is not used, PNM is written.
@@ -164,8 +167,8 @@ feeders.
is used to specify the format of the filename that each page will be written
to. Each page is written out to a single file. If
.I format
-is not specified, the default of out%d.pnm (or out%d.tif for \-\-format tiff)
-will be used.
+is not specified, the default of out%d.pnm (or out%d.tif for \-\-format tiff,
+out%d.png for \-\-format png or out%d.jpg for \-\- format jpeg) will be used.
.I format
is given as a printf style string with one integer parameter.
.B \-\-batch\-start
@@ -262,9 +265,9 @@ level.
.PP
The
.B \-B
-or
-.B \-\-buffer-size
-changes the input buffer size from 32KB to the number kB specified or 1M.
+option without argument changes the input buffer size from the default 32KB to 1MB. For finer grained control, use
+.B \-\-buffer-size=
+followed by the number of KB.
.PP
The
.B \-V
diff --git a/frontend/Makefile.am b/frontend/Makefile.am
index a501931..23061b3 100644
--- a/frontend/Makefile.am
+++ b/frontend/Makefile.am
@@ -18,7 +18,7 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include
scanimage_SOURCES = scanimage.c stiff.c stiff.h
scanimage_LDADD = ../backend/libsane.la ../sanei/libsanei.la ../lib/liblib.la \
- ../lib/libfelib.la
+ ../lib/libfelib.la @PNG_LIBS@ @JPEG_LIBS@
saned_SOURCES = saned.c
saned_LDADD = ../backend/libsane.la ../sanei/libsanei.la ../lib/liblib.la \
diff --git a/frontend/Makefile.in b/frontend/Makefile.in
index 18b9877..2e36e0e 100644
--- a/frontend/Makefile.in
+++ b/frontend/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -275,6 +275,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -286,11 +287,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -357,7 +361,7 @@ top_srcdir = @top_srcdir@
AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_builddir)/include -I$(top_srcdir)/include
scanimage_SOURCES = scanimage.c stiff.c stiff.h
scanimage_LDADD = ../backend/libsane.la ../sanei/libsanei.la ../lib/liblib.la \
- ../lib/libfelib.la
+ ../lib/libfelib.la @PNG_LIBS@ @JPEG_LIBS@
saned_SOURCES = saned.c
saned_LDADD = ../backend/libsane.la ../sanei/libsanei.la ../lib/liblib.la \
@@ -533,14 +537,14 @@ distclean-compile:
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
diff --git a/frontend/scanimage.c b/frontend/scanimage.c
index d41c849..7f7c1f0 100644
--- a/frontend/scanimage.c
+++ b/frontend/scanimage.c
@@ -1,5 +1,6 @@
/* scanimage -- command line scanning utility
Uses the SANE library.
+ Copyright (C) 2015 Rolf Bensch <rolf at bensch hyphen online dot de>
Copyright (C) 1996, 1997, 1998 Andreas Beck and David Mosberger
Copyright (C) 1999 - 2009 by the SANE Project -- See AUTHORS and ChangeLog
@@ -41,6 +42,14 @@
#include <sys/types.h>
#include <sys/stat.h>
+#ifdef HAVE_LIBPNG
+#include <png.h>
+#endif
+
+#ifdef HAVE_LIBJPEG
+#include <jpeglib.h>
+#endif
+
#include "../include/_stdint.h"
#include "../include/sane/sane.h"
@@ -55,10 +64,6 @@
#define PATH_MAX 1024
#endif
-#ifndef HAVE_ATEXIT
-# define atexit(func) on_exit(func, 0) /* works for SunOS, at least */
-#endif
-
typedef struct
{
uint8_t *data;
@@ -76,6 +81,7 @@ Image;
#define OPTION_BATCH_DOUBLE 1005
#define OPTION_BATCH_INCREMENT 1006
#define OPTION_BATCH_PROMPT 1007
+#define OPTION_BATCH_PRINT 1008
#define BATCH_COUNT_UNLIMITED -1
@@ -95,6 +101,7 @@ static struct option basic_options[] = {
{"batch-start", required_argument, NULL, OPTION_BATCH_START_AT},
{"batch-double", no_argument, NULL, OPTION_BATCH_DOUBLE},
{"batch-increment", required_argument, NULL, OPTION_BATCH_INCREMENT},
+ {"batch-print", no_argument, NULL, OPTION_BATCH_PRINT},
{"batch-prompt", no_argument, NULL, OPTION_BATCH_PROMPT},
{"format", required_argument, NULL, OPTION_FORMAT},
{"accept-md5-only", no_argument, NULL, OPTION_MD5},
@@ -105,6 +112,8 @@ static struct option basic_options[] = {
#define OUTPUT_PNM 0
#define OUTPUT_TIFF 1
+#define OUTPUT_PNG 2
+#define OUTPUT_JPEG 3
#define BASE_OPTSTRING "d:hi:Lf:B::nvVTAbp"
#define STRIP_HEIGHT 256 /* # lines we increment image height */
@@ -133,7 +142,7 @@ static int accept_only_md5_auth = 0;
static const char *icc_profile = NULL;
static void fetch_options (SANE_Device * device);
-static void scanimage_exit (void);
+static void scanimage_exit (int);
static SANE_Word tl_x = 0;
static SANE_Word tl_y = 0;
@@ -152,6 +161,7 @@ auth_callback (SANE_String_Const resource,
int md5mode = 0, len, query_user = 1;
FILE *pass_file;
struct stat stat_buf;
+ char * uname = NULL;
*tmp = 0;
@@ -250,7 +260,7 @@ auth_callback (SANE_String_Const resource,
md5mode = 1;
len = (strstr (resource, "$MD5$") - resource);
if (query_user == 1)
- fprintf (stderr, "Authentification required for resource %*.*s. "
+ fprintf (stderr, "Authentication required for resource %*.*s. "
"Enter username: ", len, len, resource);
}
else
@@ -270,14 +280,14 @@ auth_callback (SANE_String_Const resource,
if (query_user == 1)
fprintf (stderr,
- "Authentification required for resource %s. Enter username: ",
+ "Authentication required for resource %s. Enter username: ",
resource);
}
if (query_user == 1)
- fgets (username, SANE_MAX_USERNAME_LEN, stdin);
+ uname = fgets (username, SANE_MAX_USERNAME_LEN, stdin);
- if ((strlen (username)) && (username[strlen (username) - 1] == '\n'))
+ if (uname != NULL && (strlen (username)) && (username[strlen (username) - 1] == '\n'))
username[strlen (username) - 1] = 0;
if (query_user == 1)
@@ -684,7 +694,7 @@ parse_scalar (const SANE_Option_Descriptor * opt, const char *str,
fprintf (stderr,
"%s: option --%s: bad option value (rest of option: %s)\n",
prog_name, opt->name, str);
- exit (1);
+ scanimage_exit (1);
}
str = end;
@@ -793,7 +803,7 @@ parse_vector (const SANE_Option_Descriptor * opt, const char *str,
{
fprintf (stderr, "%s: option --%s: closing bracket missing "
"(rest of option: %s)\n", prog_name, opt->name, str);
- exit (1);
+ scanimage_exit (1);
}
str = end + 1;
}
@@ -805,20 +815,20 @@ parse_vector (const SANE_Option_Descriptor * opt, const char *str,
fprintf (stderr,
"%s: option --%s: index %d out of range [0..%ld]\n",
prog_name, opt->name, index, (long) vector_length - 1);
- exit (1);
+ scanimage_exit (1);
}
/* read value */
str = parse_scalar (opt, str, &value);
if (!str)
- exit (1);
+ scanimage_exit (1);
if (*str && *str != '-' && *str != ',')
{
fprintf (stderr,
"%s: option --%s: illegal separator (rest of option: %s)\n",
prog_name, opt->name, str);
- exit (1);
+ scanimage_exit (1);
}
/* store value: */
@@ -871,7 +881,7 @@ fetch_options (SANE_Device * device)
if (opt == NULL)
{
fprintf (stderr, "Could not get option descriptor for option 0\n");
- exit (1);
+ scanimage_exit (1);
}
status = sane_control_option (device, 0, SANE_ACTION_GET_VALUE,
@@ -880,7 +890,7 @@ fetch_options (SANE_Device * device)
{
fprintf (stderr, "Could not get value for option 0: %s\n",
sane_strstatus (status));
- exit (1);
+ scanimage_exit (1);
}
/* build the full table of long options */
@@ -891,7 +901,7 @@ fetch_options (SANE_Device * device)
if (opt == NULL)
{
fprintf (stderr, "Could not get option descriptor for option %d\n",i);
- exit (1);
+ scanimage_exit (1);
}
/* create command line option only for settable options */
@@ -1010,7 +1020,7 @@ set_option (SANE_Handle device, int optnum, void *valuep)
{
fprintf (stderr, "%s: setting of option --%s failed (%s)\n",
prog_name, opt->name, sane_strstatus (status));
- exit (1);
+ scanimage_exit (1);
}
if ((info & SANE_INFO_INEXACT) && opt->size == sizeof (SANE_Word))
@@ -1045,7 +1055,7 @@ process_backend_option (SANE_Handle device, int optnum, const char *optarg)
{
fprintf (stderr, "%s: attempted to set inactive option %s\n",
prog_name, opt->name);
- exit (1);
+ scanimage_exit (1);
}
if ((opt->cap & SANE_CAP_AUTOMATIC) && optarg &&
@@ -1058,7 +1068,7 @@ process_backend_option (SANE_Handle device, int optnum, const char *optarg)
fprintf (stderr,
"%s: failed to set option --%s to automatic (%s)\n",
prog_name, opt->name, sane_strstatus (status));
- exit (1);
+ scanimage_exit (1);
}
return;
}
@@ -1078,7 +1088,7 @@ process_backend_option (SANE_Handle device, int optnum, const char *optarg)
{
fprintf (stderr, "%s: option --%s: bad option value `%s'\n",
prog_name, opt->name, optarg);
- exit (1);
+ scanimage_exit (1);
}
}
break;
@@ -1094,7 +1104,7 @@ process_backend_option (SANE_Handle device, int optnum, const char *optarg)
if (!vector)
{
fprintf (stderr, "%s: out of memory\n", prog_name);
- exit (1);
+ scanimage_exit (1);
}
}
parse_vector (opt, optarg, vector, vector_length);
@@ -1106,7 +1116,7 @@ process_backend_option (SANE_Handle device, int optnum, const char *optarg)
if (!valuep)
{
fprintf (stderr, "%s: out of memory\n", prog_name);
- exit (1);
+ scanimage_exit (1);
}
strncpy (valuep, optarg, opt->size);
((char *) valuep)[opt->size - 1] = 0;
@@ -1125,7 +1135,7 @@ process_backend_option (SANE_Handle device, int optnum, const char *optarg)
}
static void
-write_pnm_header (SANE_Frame format, int width, int height, int depth)
+write_pnm_header (SANE_Frame format, int width, int height, int depth, FILE *ofp)
{
/* The netpbm-package does not define raw image data with maxval > 255. */
/* But writing maxval 65535 for 16bit data gives at least a chance */
@@ -1136,22 +1146,95 @@ write_pnm_header (SANE_Frame format, int width, int height, int depth)
case SANE_FRAME_GREEN:
case SANE_FRAME_BLUE:
case SANE_FRAME_RGB:
- printf ("P6\n# SANE data follows\n%d %d\n%d\n", width, height,
+ fprintf (ofp, "P6\n# SANE data follows\n%d %d\n%d\n", width, height,
(depth <= 8) ? 255 : 65535);
break;
default:
if (depth == 1)
- printf ("P4\n# SANE data follows\n%d %d\n", width, height);
+ fprintf (ofp, "P4\n# SANE data follows\n%d %d\n", width, height);
else
- printf ("P5\n# SANE data follows\n%d %d\n%d\n", width, height,
+ fprintf (ofp, "P5\n# SANE data follows\n%d %d\n%d\n", width, height,
(depth <= 8) ? 255 : 65535);
break;
}
#ifdef __EMX__ /* OS2 - write in binary mode. */
- _fsetmode (stdout, "b");
+ _fsetmode (ofp, "b");
+#endif
+}
+
+#ifdef HAVE_LIBPNG
+static void
+write_png_header (SANE_Frame format, int width, int height, int depth, FILE *ofp, png_structp* png_ptr, png_infop* info_ptr)
+{
+ int color_type;
+
+ *png_ptr = png_create_write_struct
+ (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
+ if (!*png_ptr) {
+ fprintf(stderr, "png_create_write_struct failed\n");
+ exit(1);
+ }
+ *info_ptr = png_create_info_struct(*png_ptr);
+ if (!*info_ptr) {
+ fprintf(stderr, "png_create_info_struct failed\n");
+ exit(1);
+ }
+ png_init_io(*png_ptr, ofp);
+
+ switch (format)
+ {
+ case SANE_FRAME_RED:
+ case SANE_FRAME_GREEN:
+ case SANE_FRAME_BLUE:
+ case SANE_FRAME_RGB:
+ color_type = PNG_COLOR_TYPE_RGB;
+ break;
+
+ default:
+ color_type = PNG_COLOR_TYPE_GRAY;
+ break;
+ }
+
+ png_set_IHDR(*png_ptr, *info_ptr, width, height,
+ depth, color_type, PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);
+
+ png_write_info(*png_ptr, *info_ptr);
+}
#endif
+
+#ifdef HAVE_LIBJPEG
+static void
+write_jpeg_header (SANE_Frame format, int width, int height, FILE *ofp, struct jpeg_compress_struct *cinfo, struct jpeg_error_mgr *jerr)
+{
+ cinfo->err = jpeg_std_error(jerr);
+ jpeg_create_compress(cinfo);
+ jpeg_stdio_dest(cinfo, ofp);
+
+ cinfo->image_width = width;
+ cinfo->image_height = height;
+ switch (format)
+ {
+ case SANE_FRAME_RED:
+ case SANE_FRAME_GREEN:
+ case SANE_FRAME_BLUE:
+ case SANE_FRAME_RGB:
+ cinfo->in_color_space = JCS_RGB;
+ cinfo->input_components = 3;
+ break;
+
+ default:
+ cinfo->in_color_space = JCS_GRAYSCALE;
+ cinfo->input_components = 1;
+ break;
+ }
+
+ jpeg_set_defaults(cinfo);
+ jpeg_set_quality(cinfo, 75, TRUE);
+ jpeg_start_compress(cinfo, TRUE);
}
+#endif
static void *
advance (Image * image)
@@ -1184,7 +1267,7 @@ advance (Image * image)
}
static SANE_Status
-scan_it (void)
+scan_it (FILE *ofp)
{
int i, len, first_frame = 1, offset = 0, must_buffer = 0, hundred_percent;
SANE_Byte min = 0xff, max = 0;
@@ -1196,6 +1279,18 @@ scan_it (void)
};
SANE_Word total_bytes = 0, expected_bytes;
SANE_Int hang_over = -1;
+#ifdef HAVE_LIBPNG
+ int pngrow = 0;
+ png_bytep pngbuf = NULL;
+ png_structp png_ptr;
+ png_infop info_ptr;
+#endif
+#ifdef HAVE_LIBJPEG
+ int jpegrow = 0;
+ JSAMPLE *jpegbuf = NULL;
+ struct jpeg_compress_struct cinfo;
+ struct jpeg_error_mgr jerr;
+#endif
do
{
@@ -1234,12 +1329,12 @@ scan_it (void)
fprintf (stderr, "%s: scanning image of size %dx%d pixels at "
"%d bits/pixel\n",
prog_name, parm.pixels_per_line, parm.lines,
- 8 * parm.bytes_per_line / parm.pixels_per_line);
+ parm.depth * (SANE_FRAME_RGB == parm.format ? 3 : 1));
else
fprintf (stderr, "%s: scanning image %d pixels wide and "
"variable height at %d bits/pixel\n",
prog_name, parm.pixels_per_line,
- 8 * parm.bytes_per_line / parm.pixels_per_line);
+ parm.depth * (SANE_FRAME_RGB == parm.format ? 3 : 1));
}
fprintf (stderr, "%s: acquiring %s frame\n", prog_name,
@@ -1269,21 +1364,44 @@ scan_it (void)
offset = 0;
}
else
- {
- if (output_format == OUTPUT_TIFF)
+ switch(output_format)
+ {
+ case OUTPUT_TIFF:
sanei_write_tiff_header (parm.format,
parm.pixels_per_line, parm.lines,
parm.depth, resolution_value,
- icc_profile);
- else
+ icc_profile, ofp);
+ break;
+ case OUTPUT_PNM:
write_pnm_header (parm.format, parm.pixels_per_line,
- parm.lines, parm.depth);
- }
+ parm.lines, parm.depth, ofp);
+ break;
+#ifdef HAVE_LIBPNG
+ case OUTPUT_PNG:
+ write_png_header (parm.format, parm.pixels_per_line,
+ parm.lines, parm.depth, ofp, &png_ptr, &info_ptr);
+ break;
+#endif
+#ifdef HAVE_LIBJPEG
+ case OUTPUT_JPEG:
+ write_jpeg_header (parm.format, parm.pixels_per_line,
+ parm.lines, ofp, &cinfo, &jerr);
+ break;
+#endif
+ }
break;
default:
break;
}
+#ifdef HAVE_LIBPNG
+ if(output_format == OUTPUT_PNG)
+ pngbuf = malloc(parm.bytes_per_line);
+#endif
+#ifdef HAVE_LIBJPEG
+ if(output_format == OUTPUT_JPEG)
+ jpegbuf = malloc(parm.bytes_per_line);
+#endif
if (must_buffer)
{
@@ -1397,8 +1515,61 @@ scan_it (void)
}
else /* ! must_buffer */
{
+#ifdef HAVE_LIBPNG
+ if (output_format == OUTPUT_PNG)
+ {
+ int i = 0;
+ int left = len;
+ while(pngrow + left >= parm.bytes_per_line)
+ {
+ memcpy(pngbuf + pngrow, buffer + i, parm.bytes_per_line - pngrow);
+ if(parm.depth == 1)
+ {
+ int j;
+ for(j = 0; j < parm.bytes_per_line; j++)
+ pngbuf[j] = ~pngbuf[j];
+ }
+ png_write_row(png_ptr, pngbuf);
+ i += parm.bytes_per_line - pngrow;
+ left -= parm.bytes_per_line - pngrow;
+ pngrow = 0;
+ }
+ memcpy(pngbuf + pngrow, buffer + i, left);
+ pngrow += left;
+ }
+ else
+#endif
+#ifdef HAVE_LIBJPEG
+ if (output_format == OUTPUT_JPEG)
+ {
+ int i = 0;
+ int left = len;
+ while(jpegrow + left >= parm.bytes_per_line)
+ {
+ memcpy(jpegbuf + jpegrow, buffer + i, parm.bytes_per_line - jpegrow);
+ if(parm.depth == 1)
+ {
+ int col1, col8;
+ JSAMPLE *buf8 = malloc(parm.bytes_per_line * 8);
+ for(col1 = 0; col1 < parm.bytes_per_line; col1++)
+ for(col8 = 0; col8 < 8; col8++)
+ buf8[col1 * 8 + col8] = jpegbuf[col1] & (1 << (8 - col8 - 1)) ? 0 : 0xff;
+ jpeg_write_scanlines(&cinfo, &buf8, 1);
+ free(buf8);
+ } else {
+ jpeg_write_scanlines(&cinfo, &jpegbuf, 1);
+ }
+ i += parm.bytes_per_line - jpegrow;
+ left -= parm.bytes_per_line - jpegrow;
+ jpegrow = 0;
+ }
+ memcpy(jpegbuf + jpegrow, buffer + i, left);
+ jpegrow += left;
+ }
+ else
+#endif
if ((output_format == OUTPUT_TIFF) || (parm.depth != 16))
- fwrite (buffer, 1, len, stdout);
+ fwrite (buffer, 1, len, ofp);
else
{
#if !defined(WORDS_BIGENDIAN)
@@ -1409,7 +1580,7 @@ scan_it (void)
{
if (len > 0)
{
- fwrite (buffer, 1, 1, stdout);
+ fwrite (buffer, 1, 1, ofp);
buffer[0] = (SANE_Byte) hang_over;
hang_over = -1;
start = 1;
@@ -1430,7 +1601,7 @@ scan_it (void)
len--;
}
#endif
- fwrite (buffer, 1, len, stdout);
+ fwrite (buffer, 1, len, ofp);
}
}
@@ -1451,13 +1622,29 @@ scan_it (void)
{
image.height = image.y;
- if (output_format == OUTPUT_TIFF)
+ switch(output_format) {
+ case OUTPUT_TIFF:
sanei_write_tiff_header (parm.format, parm.pixels_per_line,
image.height, parm.depth, resolution_value,
- icc_profile);
- else
+ icc_profile, ofp);
+ break;
+ case OUTPUT_PNM:
write_pnm_header (parm.format, parm.pixels_per_line,
- image.height, parm.depth);
+ image.height, parm.depth, ofp);
+ break;
+#ifdef HAVE_LIBPNG
+ case OUTPUT_PNG:
+ write_png_header (parm.format, parm.pixels_per_line,
+ image.height, parm.depth, ofp, &png_ptr, &info_ptr);
+ break;
+#endif
+#ifdef HAVE_LIBJPEG
+ case OUTPUT_JPEG:
+ write_jpeg_header (parm.format, parm.pixels_per_line,
+ parm.lines, ofp, &cinfo, &jerr);
+ break;
+#endif
+ }
#if !defined(WORDS_BIGENDIAN)
/* multibyte pnm file may need byte swap to LE */
@@ -1475,13 +1662,33 @@ scan_it (void)
}
#endif
- fwrite (image.data, 1, image.height * image.width, stdout);
+ fwrite (image.data, 1, image.height * image.width, ofp);
}
+#ifdef HAVE_LIBPNG
+ if(output_format == OUTPUT_PNG)
+ png_write_end(png_ptr, info_ptr);
+#endif
+#ifdef HAVE_LIBJPEG
+ if(output_format == OUTPUT_JPEG)
+ jpeg_finish_compress(&cinfo);
+#endif
/* flush the output buffer */
- fflush( stdout );
+ fflush( ofp );
cleanup:
+#ifdef HAVE_LIBPNG
+ if(output_format == OUTPUT_PNG) {
+ png_destroy_write_struct(&png_ptr, &info_ptr);
+ free(pngbuf);
+ }
+#endif
+#ifdef HAVE_LIBJPEG
+ if(output_format == OUTPUT_JPEG) {
+ jpeg_destroy_compress(&cinfo);
+ free(jpegbuf);
+ }
+#endif
if (image.data)
free (image.data);
@@ -1562,12 +1769,12 @@ test_it (void)
if (parm.lines >= 0)
fprintf (stderr, "%s: scanning image of size %dx%d pixels at "
"%d bits/pixel\n", prog_name, parm.pixels_per_line, parm.lines,
- 8 * parm.bytes_per_line / parm.pixels_per_line);
+ parm.depth * (SANE_FRAME_RGB == parm.format ? 3 : 1));
else
fprintf (stderr, "%s: scanning image %d pixels wide and "
"variable height at %d bits/pixel\n",
prog_name, parm.pixels_per_line,
- 8 * parm.bytes_per_line / parm.pixels_per_line);
+ parm.depth * (SANE_FRAME_RGB == parm.format ? 3 : 1));
fprintf (stderr, "%s: acquiring %s frame, %d bits/sample\n", prog_name,
parm.format <= SANE_FRAME_BLUE ? format_name[parm.format]:"Unknown",
parm.depth);
@@ -1645,7 +1852,7 @@ get_resolution (void)
}
static void
-scanimage_exit (void)
+scanimage_exit (int status)
{
if (device)
{
@@ -1663,6 +1870,7 @@ scanimage_exit (void)
free (option_number);
if (verbose > 1)
fprintf (stderr, "scanimage: finished\n");
+ exit (status);
}
/** @brief print device options to stdout
@@ -1708,6 +1916,7 @@ main (int argc, char **argv)
char readbuf[2];
char *readbuf2;
int batch = 0;
+ int batch_print = 0;
int batch_prompt = 0;
int batch_count = BATCH_COUNT_UNLIMITED;
int batch_start_at = 1;
@@ -1715,8 +1924,7 @@ main (int argc, char **argv)
SANE_Status status;
char *full_optstring;
SANE_Int version_code;
-
- atexit (scanimage_exit);
+ FILE *ofp = NULL;
buffer_size = (32 * 1024); /* default size */
@@ -1776,6 +1984,9 @@ main (int argc, char **argv)
case 'n':
dont_scan = 1;
break;
+ case OPTION_BATCH_PRINT:
+ batch_print = 1;
+ break;
case OPTION_BATCH_PROMPT:
batch_prompt = 1;
break;
@@ -1795,6 +2006,24 @@ main (int argc, char **argv)
case OPTION_FORMAT:
if (strcmp (optarg, "tiff") == 0)
output_format = OUTPUT_TIFF;
+ else if (strcmp (optarg, "png") == 0)
+ {
+#ifdef HAVE_LIBPNG
+ output_format = OUTPUT_PNG;
+#else
+ fprintf(stderr, "PNG support not compiled in\n");
+ exit(1);
+#endif
+ }
+ else if (strcmp (optarg, "jpeg") == 0)
+ {
+#ifdef HAVE_LIBJPEG
+ output_format = OUTPUT_JPEG;
+#else
+ fprintf(stderr, "JPEG support not compiled in\n");
+ exit(1);
+#endif
+ }
else
output_format = OUTPUT_PNM;
break;
@@ -1811,7 +2040,7 @@ main (int argc, char **argv)
{
fprintf (stderr, "%s: sane_get_devices() failed: %s\n",
prog_name, sane_strstatus (status));
- exit (1);
+ scanimage_exit (1);
}
if (ch == 'L')
@@ -1826,23 +2055,16 @@ main (int argc, char **argv)
else
{
int i = 0, int_arg = 0;
- char *percent, *start, *fmt;
+ const char *percent, *start;
const char *text_arg = 0;
- char cc, ftype;
-
- fmt = malloc (strlen (optarg) + 1);
- if (fmt == 0)
- {
- fprintf (stderr, "%s: not enough memory\n", prog_name);
- exit (1);
- }
+ char ftype;
for (i = 0; device_list[i]; ++i)
{
- strcpy (fmt, optarg);
- start = fmt;
+ start = optarg;
while (*start && (percent = strchr (start, '%')))
{
+ int start_len = percent - start;
percent++;
if (*percent)
{
@@ -1850,19 +2072,19 @@ main (int argc, char **argv)
{
case 'd':
text_arg = device_list[i]->name;
- ftype = *percent = 's';
+ ftype = 's';
break;
case 'v':
text_arg = device_list[i]->vendor;
- ftype = *percent = 's';
+ ftype = 's';
break;
case 'm':
text_arg = device_list[i]->model;
- ftype = *percent = 's';
+ ftype = 's';
break;
case 't':
text_arg = device_list[i]->type;
- ftype = *percent = 's';
+ ftype = 's';
break;
case 'i':
int_arg = i;
@@ -1870,45 +2092,40 @@ main (int argc, char **argv)
break;
case 'n':
text_arg = "\n";
- ftype = *percent = 's';
+ ftype = 's';
break;
case '%':
- ftype = 0;
+ text_arg = "%";
+ ftype = 's';
break;
default:
fprintf (stderr,
"%s: unknown format specifier %%%c\n",
prog_name, *percent);
- *percent = '%';
- ftype = 0;
+ text_arg = "%";
+ ftype = 's';
}
- percent++;
- cc = *percent;
- *percent = 0;
+ printf ("%.*s", start_len, start);
switch (ftype)
{
case 's':
- printf (start, text_arg);
+ printf ("%s", text_arg);
break;
case 'i':
- printf (start, int_arg);
- break;
- case 0:
- printf (start);
+ printf ("%i", int_arg);
break;
}
- *percent = cc;
- start = percent;
+ start = percent + 1;
}
else
{
- /* last char of the string is a '%', suppress it */
- *start = 0;
+ /* last char of the string is a '%', ignore it */
+ start++;
break;
}
}
if (*start)
- printf (start);
+ printf ("%s", start);
}
}
if (i == 0 && ch != 'f')
@@ -1920,7 +2137,7 @@ main (int argc, char **argv)
if (defdevname)
printf ("default device is `%s'\n", defdevname);
- exit (0);
+ scanimage_exit (0);
}
case 'V':
@@ -1928,7 +2145,7 @@ main (int argc, char **argv)
VERSION, SANE_VERSION_MAJOR (version_code),
SANE_VERSION_MINOR (version_code),
SANE_VERSION_BUILD (version_code));
- exit (0);
+ scanimage_exit (0);
default:
break; /* ignore device specific options for now */
@@ -1945,7 +2162,7 @@ standard output.\n\
Parameters are separated by a blank from single-character options (e.g.\n\
-d epson) and by a \"=\" from multi-character options (e.g. --device-name=epson).\n\
-d, --device-name=DEVICE use a given scanner device (e.g. hp:/dev/scanner)\n\
- --format=pnm|tiff file format of output file\n\
+ --format=pnm|tiff|png|jpeg file format of output file\n\
-i, --icc-profile=PROFILE include this ICC profile into TIFF file\n", prog_name);
printf ("\
-L, --list-devices show available scanner devices\n\
@@ -1953,24 +2170,26 @@ Parameters are separated by a blank from single-character options (e.g.\n\
can be specified: %%d (device name), %%v (vendor),\n\
%%m (model), %%t (type), %%i (index number), and\n\
%%n (newline)\n\
--b, --batch[=FORMAT] working in batch mode, FORMAT is `out%%d.pnm' or\n\
- `out%%d.tif' by default depending on --format\n");
+-b, --batch[=FORMAT] working in batch mode, FORMAT is `out%%d.pnm' `out%%d.tif'\n\
+ `out%%d.png' or `out%%d.jpg' by default depending on --format\n");
printf ("\
--batch-start=# page number to start naming files with\n\
--batch-count=# how many pages to scan in batch mode\n\
--batch-increment=# increase page number in filename by #\n\
--batch-double increment page number by two, same as\n\
--batch-increment=2\n\
- --batch-prompt ask for pressing a key before scanning a page\n\
- --accept-md5-only only accept authorization requests using md5\n");
+ --batch-print print image filenames to stdout\n\
+ --batch-prompt ask for pressing a key before scanning a page\n");
printf ("\
+ --accept-md5-only only accept authorization requests using md5\n\
-p, --progress print progress messages\n\
-n, --dont-scan only set options, don't actually scan\n\
-T, --test test backend thoroughly\n\
-A, --all-options list all available backend options\n\
-h, --help display this help message and exit\n\
-v, --verbose give even more status messages\n\
--B, --buffer-size=# change input buffer size (in kB, default 32)\n\
+-B, --buffer-size=# change input buffer size (in kB, default 32)\n");
+ printf ("\
-V, --version print version information\n");
}
@@ -1987,12 +2206,12 @@ Parameters are separated by a blank from single-character options (e.g.\n\
{
fprintf (stderr, "%s: sane_get_devices() failed: %s\n",
prog_name, sane_strstatus (status));
- exit (1);
+ scanimage_exit (1);
}
if (!device_list[0])
{
fprintf (stderr, "%s: no SANE devices found\n", prog_name);
- exit (1);
+ scanimage_exit (1);
}
devname = device_list[0]->name;
}
@@ -2014,7 +2233,7 @@ Parameters are separated by a blank from single-character options (e.g.\n\
if (help)
device = 0;
else
- exit (1);
+ scanimage_exit (1);
}
if (device)
@@ -2027,7 +2246,7 @@ Parameters are separated by a blank from single-character options (e.g.\n\
{
fprintf (stderr, "%s: unable to get option count descriptor\n",
prog_name);
- exit (1);
+ scanimage_exit (1);
}
/* We got a device, find out how many options it has */
@@ -2037,7 +2256,7 @@ Parameters are separated by a blank from single-character options (e.g.\n\
{
fprintf (stderr, "%s: unable to determine option count\n",
prog_name);
- exit (1);
+ scanimage_exit (1);
}
/* malloc global option lists */
@@ -2049,7 +2268,7 @@ Parameters are separated by a blank from single-character options (e.g.\n\
{
fprintf (stderr, "%s: out of memory in main()\n",
prog_name);
- exit (1);
+ scanimage_exit (1);
}
/* load global option lists */
@@ -2080,7 +2299,7 @@ Parameters are separated by a blank from single-character options (e.g.\n\
if (!full_optstring)
{
fprintf (stderr, "%s: out of memory\n", prog_name);
- exit (1);
+ scanimage_exit (1);
}
strcpy (full_optstring, BASE_OPTSTRING);
@@ -2101,7 +2320,7 @@ Parameters are separated by a blank from single-character options (e.g.\n\
{
case ':':
case '?':
- exit (1); /* error message is printed by getopt_long() */
+ scanimage_exit (1); /* error message is printed by getopt_long() */
case 'd':
case 'h':
@@ -2141,7 +2360,7 @@ Parameters are separated by a blank from single-character options (e.g.\n\
fprintf (stderr, "%s: argument without option: `%s'; ", prog_name,
argv[argc - 1]);
fprintf (stderr, "try %s --help\n", prog_name);
- exit (1);
+ scanimage_exit (1);
}
free (full_optstring);
@@ -2174,7 +2393,7 @@ Parameters are separated by a blank from single-character options (e.g.\n\
{
printf ("\nAll options specific to device `%s':\n", devname);
print_options(device, num_dev_options, SANE_TRUE);
- exit (0);
+ scanimage_exit (0);
}
}
@@ -2207,11 +2426,11 @@ List of available devices:", prog_name);
}
}
fputc ('\n', stdout);
- exit (0);
+ scanimage_exit (0);
}
if (dont_scan)
- exit (0);
+ scanimage_exit (0);
if (output_format != OUTPUT_PNM)
resolution_value = get_resolution ();
@@ -2231,20 +2450,37 @@ List of available devices:", prog_name);
if (batch && NULL == format)
{
- if (output_format == OUTPUT_TIFF)
+ switch(output_format) {
+ case OUTPUT_TIFF:
format = "out%d.tif";
- else
+ break;
+ case OUTPUT_PNM:
format = "out%d.pnm";
+ break;
+#ifdef HAVE_LIBPNG
+ case OUTPUT_PNG:
+ format = "out%d.png";
+ break;
+#endif
+#ifdef HAVE_LIBJPEG
+ case OUTPUT_JPEG:
+ format = "out%d.jpg";
+ break;
+#endif
+ }
}
+ if (!batch)
+ ofp = stdout;
+
if (batch)
fprintf (stderr,
"Scanning %d pages, incrementing by %d, numbering from %d\n",
batch_count, batch_increment, batch_start_at);
- else if(isatty(fileno(stdout))){
+ else if(isatty(fileno(ofp))){
fprintf (stderr,"%s: output is not a file, exiting\n", prog_name);
- exit (1);
+ scanimage_exit (1);
}
buffer = malloc (buffer_size);
@@ -2275,7 +2511,11 @@ List of available devices:", prog_name);
{
fprintf (stderr, "Batch terminated, %d pages scanned\n",
(n - batch_increment));
- fclose (stdout);
+ if (ofp)
+ {
+ fclose (ofp);
+ ofp = NULL;
+ }
break; /* get out of this loop */
}
}
@@ -2295,19 +2535,27 @@ List of available devices:", prog_name);
{
fprintf (stderr, "%s: sane_start: %s\n",
prog_name, sane_strstatus (status));
- fclose (stdout);
+ if (ofp)
+ {
+ fclose (ofp);
+ ofp = NULL;
+ }
break;
}
+
/* write to .part file while scanning is in progress */
- if (batch && NULL == freopen (part_path, "w", stdout))
+ if (batch)
{
- fprintf (stderr, "cannot open %s\n", part_path);
- sane_cancel (device);
- return SANE_STATUS_ACCESS_DENIED;
+ if (NULL == (ofp = fopen (part_path, "w")))
+ {
+ fprintf (stderr, "cannot open %s\n", part_path);
+ sane_cancel (device);
+ return SANE_STATUS_ACCESS_DENIED;
+ }
}
- status = scan_it ();
+ status = scan_it (ofp);
if (batch)
{
fprintf (stderr, "Scanned page %d.", n);
@@ -2320,17 +2568,16 @@ List of available devices:", prog_name);
case SANE_STATUS_EOF:
status = SANE_STATUS_GOOD;
if (batch)
- {
- /* close output file by redirecting, do not close
- stdout here! */
- if (NULL == freopen ("/dev/null", "w", stdout))
+ {
+ if (!ofp || 0 != fclose(ofp))
{
- fprintf (stderr, "cannot open /dev/null\n");
+ fprintf (stderr, "cannot close image file\n");
sane_cancel (device);
return SANE_STATUS_ACCESS_DENIED;
}
else
{
+ ofp = NULL;
/* let the fully scanned file show up */
if (rename (part_path, path))
{
@@ -2339,13 +2586,22 @@ List of available devices:", prog_name);
sane_cancel (device);
return SANE_STATUS_ACCESS_DENIED;
}
+ if (batch_print)
+ {
+ fprintf (stdout, "%s\n", path);
+ fflush (stdout);
+ }
}
}
break;
default:
if (batch)
{
- fclose (stdout);
+ if (ofp)
+ {
+ fclose (ofp);
+ ofp = NULL;
+ }
unlink (part_path);
}
break;
@@ -2356,10 +2612,18 @@ List of available devices:", prog_name);
&& (batch_count == BATCH_COUNT_UNLIMITED || --batch_count))
&& SANE_STATUS_GOOD == status);
+ if (batch
+ && SANE_STATUS_NO_DOCS == status
+ && (batch_count == BATCH_COUNT_UNLIMITED)
+ && n > batch_start_at)
+ status = SANE_STATUS_GOOD;
+
sane_cancel (device);
}
else
status = test_it ();
+ scanimage_exit (status);
+ /* the line below avoids compiler warnings */
return status;
}
diff --git a/frontend/stiff.c b/frontend/stiff.c
index 1107e09..01d845b 100644
--- a/frontend/stiff.c
+++ b/frontend/stiff.c
@@ -586,10 +586,10 @@ write_tiff_color_header (FILE *fptr, int width, int height, int depth,
void
sanei_write_tiff_header (SANE_Frame format, int width, int height, int depth,
- int resolution, const char *icc_profile)
+ int resolution, const char *icc_profile, FILE *ofp)
{
#ifdef __EMX__ /* OS2 - write in binary mode. */
- _fsetmode(stdout, "b");
+ _fsetmode(ofp, "b");
#endif
switch (format)
{
@@ -597,14 +597,14 @@ sanei_write_tiff_header (SANE_Frame format, int width, int height, int depth,
case SANE_FRAME_GREEN:
case SANE_FRAME_BLUE:
case SANE_FRAME_RGB:
- write_tiff_color_header (stdout, width, height, depth, resolution, icc_profile);
+ write_tiff_color_header (ofp, width, height, depth, resolution, icc_profile);
break;
default:
if (depth == 1)
- write_tiff_bw_header (stdout, width, height, resolution);
+ write_tiff_bw_header (ofp, width, height, resolution);
else
- write_tiff_grey_header (stdout, width, height, depth, resolution, icc_profile);
+ write_tiff_grey_header (ofp, width, height, depth, resolution, icc_profile);
break;
}
}
diff --git a/frontend/stiff.h b/frontend/stiff.h
index 8583832..6560ef6 100644
--- a/frontend/stiff.h
+++ b/frontend/stiff.h
@@ -17,4 +17,4 @@
void
sanei_write_tiff_header (SANE_Frame format, int width, int height, int depth,
- int resolution, const char *icc_profile);
+ int resolution, const char *icc_profile, FILE *ofp);
diff --git a/frontend/tstbackend.c b/frontend/tstbackend.c
index 6dcd940..82c54dc 100644
--- a/frontend/tstbackend.c
+++ b/frontend/tstbackend.c
@@ -46,6 +46,7 @@
static struct option basic_options[] = {
{"device-name", required_argument, NULL, 'd'},
{"level", required_argument, NULL, 'l'},
+ {"scan", NULL, NULL, 's'},
{"recursion", required_argument, NULL, 'r'},
{"get-devices", required_argument, NULL, 'g'},
{"help", 0, NULL, 'h'}
@@ -1134,7 +1135,7 @@ static void test_scan(SANE_Handle device)
unsigned char *image = NULL;
SANE_Parameters params;
size_t to_read;
- SANE_Int len;
+ SANE_Int len=0;
int ask_len;
int rc;
int fd;
@@ -1660,12 +1661,22 @@ SANE_Status status;
return 0;
}
+/** test test_default
+ * test by scanning using default values
+ * @param device device to use for the scan
+ */
+static void test_default(SANE_Device * device)
+{
+ test_scan(device);
+}
+
static void usage(const char *execname)
{
- printf("Usage: %s [-d backend_name] [-l test_level] [-r recursion_level] [-g time (s)]\n", execname);
+ printf("Usage: %s [-d backend_name] [-l test_level] [-s] [-r recursion_level] [-g time (s)]\n", execname);
printf("\t-v\tverbose level\n");
printf("\t-d\tbackend name\n");
printf("\t-l\tlevel of testing (0=some, 1=0+options, 2=1+scans, 3=longest tests)\n");
+ printf("\t-s\tdo a scan during open/close tests\n");
printf("\t-r\trecursion level for option testing (the higher, the longer)\n");
printf("\t-g\ttime to loop on sane_get_devices function to test scannet hotplug detection (time is in seconds).\n");
}
@@ -1684,6 +1695,7 @@ main (int argc, char **argv)
int rc;
int recursion_level;
int time;
+ int default_scan;
printf("tstbackend, Copyright (C) 2002 Frank Zago\n");
printf("tstbackend comes with ABSOLUTELY NO WARRANTY\n");
@@ -1696,8 +1708,9 @@ main (int argc, char **argv)
recursion_level = 5; /* 5 levels or recursion should be enough */
test_level = 0; /* basic tests only */
time = 0; /* no get devices loop */
+ default_scan = 0;
- while ((ch = getopt_long (argc, argv, "-v:d:l:r:g:h", basic_options,
+ while ((ch = getopt_long (argc, argv, "-v:d:l:r:g:h:s", basic_options,
&index)) != EOF) {
switch(ch) {
case 'v':
@@ -1716,6 +1729,10 @@ main (int argc, char **argv)
}
break;
+ case 's':
+ default_scan = 1;
+ break;
+
case 'r':
recursion_level = atoi(optarg);
break;
@@ -1824,6 +1841,10 @@ main (int argc, char **argv)
rc = check(ERR, (status == SANE_STATUS_GOOD),
"sane_open failed with %s for device %s", sane_strstatus (status), devname);
if (!rc) goto the_exit;
+
+ if (default_scan) {
+ test_default (device);
+ }
sane_close (device);
}
diff --git a/include/Makefile.am b/include/Makefile.am
index 5650e7f..c949491 100644
--- a/include/Makefile.am
+++ b/include/Makefile.am
@@ -15,4 +15,4 @@ EXTRA_DIST += sane/config.h.in sane/sanei.h sane/sanei_ab306.h \
sane/sanei_jpeg.h sane/sanei_lm983x.h sane/sanei_net.h sane/sanei_pa4s2.h \
sane/sanei_pio.h sane/sanei_pp.h sane/sanei_pv8630.h sane/sanei_scsi.h \
sane/sanei_tcp.h sane/sanei_thread.h sane/sanei_udp.h sane/sanei_usb.h \
- sane/sanei_wire.h sane/sanei_magic.h
+ sane/sanei_wire.h sane/sanei_magic.h sane/sanei_ir.h
diff --git a/include/Makefile.in b/include/Makefile.in
index a445d84..45395a4 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -253,6 +253,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -264,11 +265,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -342,7 +346,8 @@ EXTRA_DIST = lalloca.h lassert.h lgetopt.h md5.h font_6x11.h \
sane/sanei_net.h sane/sanei_pa4s2.h sane/sanei_pio.h \
sane/sanei_pp.h sane/sanei_pv8630.h sane/sanei_scsi.h \
sane/sanei_tcp.h sane/sanei_thread.h sane/sanei_udp.h \
- sane/sanei_usb.h sane/sanei_wire.h sane/sanei_magic.h
+ sane/sanei_usb.h sane/sanei_wire.h sane/sanei_magic.h \
+ sane/sanei_ir.h
all: all-am
.SUFFIXES:
diff --git a/include/sane/config.h.in b/include/sane/config.h.in
index c62938b..ace060c 100644
--- a/include/sane/config.h.in
+++ b/include/sane/config.h.in
@@ -61,9 +61,6 @@
/* Define to 1 if you have the `cfmakeraw' function. */
#undef HAVE_CFMAKERAW
-/* Is /usr/include/cups/cups.h available? */
-#undef HAVE_CUPS
-
/* Define to 1 if you have the <ddk/ntddscsi.h> header file. */
#undef HAVE_DDK_NTDDSCSI_H
@@ -174,6 +171,9 @@
/* Define to 1 if you have the libjpeg library. */
#undef HAVE_LIBJPEG
+/* Define to 1 if you have the libpng library. */
+#undef HAVE_LIBPNG
+
/* Define to 1 if you have the net-snmp library. */
#undef HAVE_LIBSNMP
@@ -454,9 +454,6 @@
*/
#undef LT_OBJDIR
-/* Define to 1 if your C compiler doesn't accept -c and -o together. */
-#undef NO_MINUS_C_MINUS_O
-
/* Define to the name of the distribution. */
#undef PACKAGE
@@ -490,6 +487,9 @@
/* SANE DLL minor number */
#undef SANE_DLL_V_MINOR
+/* Define to 1 if you have the <sys/io.h> providing inb,outb. */
+#undef SANE_HAVE_SYS_IO_H_WITH_INB_OUTB
+
/* SCSI command buffer size */
#undef SCSIBUFFERSIZE
diff --git a/include/sane/sanei_ir.h b/include/sane/sanei_ir.h
new file mode 100644
index 0000000..aaca524
--- /dev/null
+++ b/include/sane/sanei_ir.h
@@ -0,0 +1,393 @@
+/** @file sanei_ir.h
+ *
+ * This file provides an interface to the
+ * sanei_ir functions for utilizing the infrared plane
+ *
+ * Copyright (C) 2012 Michael Rickmann <mrickma@gwdg.de>
+ *
+ * This file is part of the SANE package.
+ *
+ * Essentially three things have to be done:
+ * - 1) reduce red spectral overlap from the infrared (ired) plane
+ * - 2) find the dirt
+ * - 3) replace the dirt
+ *
+ * - 1) is mainly adressed by sanei_ir_spectral_clean
+ * - 2) by sanei_ir_filter_madmean
+ * - 3) by sanei_ir_dilate_mean
+ */
+
+
+#ifndef SANEI_IR_H
+#define SANEI_IR_H
+
+#include <stdint.h>
+
+#define SAMPLE_SIZE 40000 /**< maximal for random sampling */
+
+#define HISTOGRAM_SHIFT 8 /**< standard histogram size */
+#define HISTOGRAM_SIZE (1 << HISTOGRAM_SHIFT)
+
+#define SAFE_LOG(x) ( ((x) > 0.0) ? log ((x)) : (0.0) ) /**< define log (0) = 0 */
+
+#define MAD_WIN2_SIZE(x) ( (((x) * 4) / 3) | 1 ) /**< MAD filter: 2nd window size */
+
+typedef uint16_t SANE_Uint;
+
+/**
+ * @brief Pointer to access values of different bit depths
+ */
+typedef union
+{
+ uint8_t *b8; /**< <= 8 bits */
+ uint16_t *b16; /**< > 8, <= 16 bits */
+}
+SANEI_IR_bufptr;
+
+
+/** Initialize sanei_ir.
+ *
+ * Call this before any other sanei_ir function.
+ */
+extern void sanei_ir_init (void);
+
+/**
+ * @brief Create the normalized histogram of a grayscale image
+ *
+ * @param[in] params describes image
+ * @param[in] img_data image pointer { grayscale }
+ * @param[out] histogram an array of double with histogram
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ *
+ * @note
+ * histogram has to be freed by calling routine
+ */
+extern SANE_Status
+sanei_ir_create_norm_histogram (const SANE_Parameters * params,
+ const SANE_Uint *img_data,
+ double ** histogram);
+
+/**
+ * @brief Implements Yen's thresholding method
+ *
+ * @param[in] params describes image
+ * @param[in] norm_histo points to a normalized histogram
+ * @param[out] thresh found threshold
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ *
+ * -# Yen J.C., Chang F.J., and Chang S. (1995) "A New Criterion
+ * for Automatic Multilevel Thresholding" IEEE Trans. on Image
+ * Processing, 4(3): 370-378
+ * -# Sezgin M. and Sankur B. (2004) "Survey over Image Thresholding
+ * Techniques and Quantitative Performance Evaluation" Journal of
+ * Electronic Imaging, 13(1): 146-165
+ * -# M. Emre Celebi, 06.15.2007, fourier_0.8,
+ * http://sourceforge.net/projects/fourier-ipal/
+ * -# ImageJ Multithresholder plugin,
+ * http://rsbweb.nih.gov/ij/plugins/download/AutoThresholder.java
+ */
+extern SANE_Status
+sanei_ir_threshold_yen (const SANE_Parameters * params,
+ double * norm_histo, int *thresh);
+
+/**
+ * @brief Implements Otsu's thresholding method
+ *
+ * @param[in] params describes image
+ * @param[in] norm_histo points to a normalized histogram
+ * @param[out] thresh found threshold
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ *
+ * -# Otsu N. (1979) "A Threshold Selection Method from Gray Level Histograms"
+ * IEEE Trans. on Systems, Man and Cybernetics, 9(1): 62-66
+ * -# M. Emre Celebi, 06.15.2007, fourier_0.8
+ * http://sourceforge.net/projects/fourier-ipal/
+ */
+extern SANE_Status
+sanei_ir_threshold_otsu (const SANE_Parameters * params,
+ double * norm_histo, int *thresh);
+
+/**
+ * @brief Implements a Maximum Entropy thresholding method
+ *
+ * @param[in] params describes image
+ * @param[in] norm_histo points to a normalized histogram
+ * @param[out] thresh found threshold
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ *
+ * -# Kapur J.N., Sahoo P.K., and Wong A.K.C. (1985) "A New Method for
+ * Gray-Level Picture Thresholding Using the Entropy of the Histogram"
+ * Graphical Models and Image Processing, 29(3): 273-285
+ * -# M. Emre Celebi, 06.15.2007, fourier_0.8
+ * http://sourceforge.net/projects/fourier-ipal/
+ * -# ImageJ Multithresholder plugin,
+ * http://rsbweb.nih.gov/ij/plugins/download/AutoThresholder.java
+ */
+extern SANE_Status
+sanei_ir_threshold_maxentropy (const SANE_Parameters * params,
+ double * norm_histo, int *thresh);
+
+/**
+ * @brief Generate gray scale luminance image from separate R, G, B images
+ *
+ * @param params points to image description
+ * @param[in] in_img pointer to at least 3 planes of image data
+ * @param[out] out_img newly allocated image
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ * - SANE_STATUS_UNSUPPORTED - wrong input bit depth
+ *
+ * @note out_img has to be freed by the calling routine.
+ * @note on input params describe a single color plane,
+ * on output params are updated if image depth is scaled
+ */
+SANE_Status
+sanei_ir_RGB_luminance (SANE_Parameters * params, const SANE_Uint **in_img,
+ SANE_Uint **out_img);
+
+/**
+ * @brief Convert image from >8 bit depth to an 8 bit image.
+ *
+ * @param[in] params pimage description
+ * @param[in] in_img points to input image data
+ * @param[out] out_params if != NULL
+ * receives description of new image
+ * @param[out] out_img newly allocated 8-bit image
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ * - SANE_STATUS_UNSUPPORTED - wrong input bit depth
+ *
+ * @note
+ * out_img has to be freed by the calling routine,
+ */
+
+extern SANE_Status
+sanei_ir_to_8bit (SANE_Parameters * params, const SANE_Uint *in_img,
+ SANE_Parameters * out_params, SANE_Uint **out_img);
+
+/**
+ * @brief Allocate and initialize logarithmic lookup table
+ *
+ * @param[in] length of table, usually 1 << depth
+ * @param[out] lut_ln adress of pointer to allocated table
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ *
+ * @note natural logarithms are provided
+ */
+SANE_Status sanei_ir_ln_table (int len, double **lut_ln);
+
+/**
+ * @brief Reduces red spectral overlap from an infrared image plane
+ *
+ * @param[in] params pointer to image description
+ * @param[in] lut_ln pointer lookup table
+ * if NULL it is dynamically handled
+ * @param[in] red_data pointer to red image plane
+ * @param ired_data pointer to ired image plane
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ *
+ * This routine is based on the observation that the relation beween the infrared value
+ * ired and the red value red of an image point can be described by ired = b + a * ln (red).
+ * First points are randomly sampled to calculate the linear regression coefficent a.
+ * Then ired' = ired - a * ln (red) is calculated for each pixel. Finally, the ir' image
+ * is scaled between 0 and maximal value. For the logarithms a lookup table is used.
+ * Negative films show very little spectral overlap but positive film usually has to be
+ * cleaned. As we do a statistical measure of the film here dark margins and lumps of
+ * dirt have to be excluded.
+ *
+ * @note original ired data are replaced by the cleaned ones
+*/
+extern SANE_Status
+sanei_ir_spectral_clean (const SANE_Parameters * params, double *lut_ln,
+ const SANE_Uint *red_data,
+ SANE_Uint *ir_data);
+
+/**
+ * @brief Optimized mean filter
+ *
+ * @param[in] params pointer to image description
+ * @param[in] in_img Pointer to grey scale image data
+ * @param[out] out_img Pointer to grey scale image data
+ * @param[in] win_rows Height of filtering window, odd
+ * @param[in] win_cols Width of filtering window, odd
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ * - SANE_STATUS_INVAL - wrong window size
+ *
+ * @note At the image margins the size of the filtering window
+ * is adapted. So there is no need to pad the image.
+ * @note Memory for the output image has to be allocated before
+ */
+extern SANE_Status
+sanei_ir_filter_mean (const SANE_Parameters * params,
+ const SANE_Uint *in_img, SANE_Uint *out_img,
+ int win_rows, int win_cols);
+
+
+/**
+ * @brief Find noise by adaptive thresholding
+ *
+ * @param[in] params pointer to image description
+ * @param[in] in_img pointer to grey scale image
+ * @param[out] out_img address of pointer to newly allocated binary image
+ * @param[in] win_size Size of filtering window
+ * @param[in] a_val Parameter, below is definetly clean
+ * @param[in] b_val Parameter, above is definetly noisy
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ *
+ * This routine follows the concept of Crnojevic's MAD (median of the absolute deviations
+ * from the median) filter. The first median filter step is replaced with a mean filter.
+ * The dirty pixels which we wish to remove are always darker than the real signal. But
+ * at high resolutions the scanner may generate some noise and the ired cleaning step can
+ * reverse things. So a maximum filter will not do.
+ * The second median is replaced by a mean filter to reduce computation time. Inspite of
+ * these changes Crnojevic's recommendations for the choice of the parameters "a" and "b"
+ * are still valid when scaled to the color depth.
+ *
+ * @reco Crnojevic recommends 10 < a_val < 30 and 50 < b_val < 100 for 8 bit color depth
+ *
+ * @note a_val, b_val are scaled by the routine according to bit depth
+ * @note "0" in the mask output is regarded "dirty", 255 "clean"
+ *
+ * -# Crnojevic V. (2005) "Impulse Noise Filter with Adaptive Mad-Based Threshold"
+ * Proc. of the IEEE Int. Conf. on Image Processing, 3: 337-340
+ */
+extern SANE_Status
+sanei_ir_filter_madmean (const SANE_Parameters * params,
+ const SANE_Uint *in_img,
+ SANE_Uint ** out_img, int win_size,
+ int a_val, int b_val);
+
+
+/**
+ * @brief Add dark pixels to mask from static threshold
+ *
+ * @param[in] params pointer to image description
+ * @param[in] in_img pointer to grey scale image
+ * @param mask_img pointer to binary image (0, 255)
+ * @param[in] threshold below which the pixel is set 0
+ */
+void
+sanei_ir_add_threshold (const SANE_Parameters * params,
+ const SANE_Uint *in_img,
+ SANE_Uint * mask_img, int threshold);
+
+
+/**
+ * @brief Calculates minimal Manhattan distances for an image mask
+ *
+ * @param[in] params pointer to image description
+ * @param[in] mask_img pointer to binary image (0, 255)
+ * @param[out] dist_map integer pointer to map of closest distances
+ * @param[out] idx_map integer pointer to indices of closest pixels
+ * @param[in] erode == 0: closest pixel has value 0, != 0: is 255
+ *
+ * manhattan_dist takes a mask image consisting of 0 or 255 values. Given that
+ * a 0 represents a dirty pixel and erode != 0, manhattan_dist will calculate the
+ * shortest distance to a clean (255) pixel and record which pixel that was so
+ * that the clean parts of the image can be dilated into the dirty ones. Thresholding
+ * can be done on the distance. Conversely, if erode == 0 the distance of a clean
+ * pixel to the closest dirty one is calculated which can be used to dilate the mask.
+ *
+ * @ref extended and C version of
+ * http://ostermiller.org/dilate_and_erode.html
+ */
+void
+sanei_ir_manhattan_dist (const SANE_Parameters * params,
+ const SANE_Uint * mask_img, unsigned int *dist_map,
+ unsigned int *idx_map, unsigned int erode);
+
+
+/**
+ * @brief Dilate or erode a mask image
+ *
+ * @param[in] params pointer to image description
+ * @param mask_img pointer to binary image (0, 255)
+ * @param dist_map integer pointer to map of closest distances
+ * @param idx_map integer pointer to indices of closest pixels
+ * @param[in] by number of pixels, > 0 dilate, < 0 erode
+ *
+ * @note by > 0 will enlarge the 0 valued area
+ */
+void
+sanei_ir_dilate (const SANE_Parameters * params, SANE_Uint * mask_img,
+ unsigned int *dist_map, unsigned int *idx_map, int by);
+
+/**
+ * @brief Suggest cropping for dark margins of positive film
+ *
+ * @param[in] params pointer to image description
+ * @param[in] dist_map integer pointer to map of closest distances
+ * @param[in] inner crop within (!=0) or outside (==0) the image's edges
+ * @param[out] edges pointer to array holding top, bottom, left
+ * and right edges
+ *
+ * The distance map as calculated by sanei_ir_manhattan_dist contains
+ * distances to the next clean pixel. Dark margins are detected as dirt.
+ * So the first/last rows/columns tell us how to crop. This is rather
+ * fast if the distance map has been calculated anyhow.
+ */
+void
+sanei_ir_find_crop (const SANE_Parameters * params,
+ unsigned int * dist_map, int inner, int * edges);
+
+/**
+ * @brief Dilate clean image parts into dirty ones and smooth int inner,
+ *
+ * @param[in] params pointer to image description
+ * @param in_img array of pointers to color planes of image
+ * @param[in] mask_img pointer to dirt mask image
+ * @param[in] dist_max threshold up to which dilation is done
+ * @param[in] expand the dirt mask before replacing the pixels
+ * @param[in] win_size size of adaptive mean filtering window
+ * @param[in] smooth triangular filter whole image for grain removal
+ * @param[in] inner find crop within or outside the image's edges
+ * @param[out] crop array of 4 integers, if non-NULL, top, bottom,
+ * left and right values for cropping are returned.
+ *
+ * @return
+ * - SANE_STATUS_GOOD - success
+ * - SANE_STATUS_NO_MEM - if out of memory
+ *
+ * The main purpose of this routine is to replace dirty pixels.
+ * As spin-off it obtains half of what is needed for film grain
+ * smoothening and most of how to crop positive film.
+ * To speed things up these functions are also implemented.
+ */
+SANE_Status
+sanei_ir_dilate_mean (const SANE_Parameters * params,
+ SANE_Uint **in_img,
+ SANE_Uint *mask_img,
+ int dist_max, int expand, int win_size,
+ SANE_Bool smooth, int inner,
+ int *crop);
+
+
+#endif /* not SANEI_IR_H */
diff --git a/japi/Makefile.in b/japi/Makefile.in
index 550bd8d..fa5e6cb 100644
--- a/japi/Makefile.in
+++ b/japi/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -291,6 +291,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -302,11 +303,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -481,14 +485,14 @@ distclean-compile:
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
diff --git a/lib/Makefile.in b/lib/Makefile.in
index ee46c65..b0fea29 100644
--- a/lib/Makefile.in
+++ b/lib/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -260,6 +260,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -271,11 +272,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -428,14 +432,14 @@ distclean-compile:
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
diff --git a/lib/snprintf.c b/lib/snprintf.c
index aca8df9..cdf6513 100644
--- a/lib/snprintf.c
+++ b/lib/snprintf.c
@@ -2,180 +2,616 @@
#ifndef HAVE_SNPRINTF
-/***************************************************************************
- * LPRng - An Extended Print Spooler System
- *
- * Copyright 1988-1997, Patrick Powell, San Diego, CA
- * papowell@sdsu.edu
- * See below for conditions of use.
- *
- ***************************************************************************
- * MODULE: snprintf.c
- * PURPOSE: LPRng version of printf - absolutely bombproof (hopefully!)
+/**************************************************************************
+ * Copyright 1994-2003 Patrick Powell, San Diego, CA <papowell@lprng.com>
**************************************************************************/
-#if 0
- The "Artistic License"
+/*
+ Overview:
- Preamble
+ snprintf( char *buffer, int len, const char *format,...)
+ plp_unsafe_snprintf( char *buffer, int len, const char *format,...)
+ its horribly unsafe companion that does NOT protect you from
+ the printing of evil control characters, but may be necessary
+ See the man page documentation below
-The intent of this document is to state the conditions under which a
-Package may be copied, such that the Copyright Holder maintains some
-semblance of artistic control over the development of the package,
-while giving the users of the package the right to use and distribute
-the Package in a more-or-less customary fashion, plus the right to make
-reasonable modifications.
+ This version of snprintf was developed originally for printing
+ on a motley collection of specialized hardware that had NO IO
+ library. Due to contractual restrictions, a clean room implementation
+ of the printf() code had to be developed.
-Definitions:
+ The method chosen for printf was to be as paranoid as possible,
+ as these platforms had NO memory protection, and very small
+ address spaces. This made it possible to try to print
+ very long strings, i.e. - all of memory, very easily. To guard
+ against this, all printing was done via a buffer, generous enough
+ to hold strings, but small enough to protect against overruns,
+ etc.
- "Package" refers to the collection of files distributed by the
- Copyright Holder, and derivatives of that collection of files
- created through textual modification.
+ Strangely enough, this proved to be of immense importance when
+ SPRINTFing to a buffer on a stack... The rest, of course, is
+ well known, as buffer overruns in the stack are a common way to
+ do horrible things to operating systems, security, etc etc.
- "Standard Version" refers to such a Package if it has not been
- modified, or has been modified in accordance with the wishes
- of the Copyright Holder as specified below.
+ This version of snprintf is VERY limited by modern standards.
- "Copyright Holder" is whoever is named in the copyright or
- copyrights for the package.
+ Revision History:
+ First Released Version - 1994. This version had NO comments.
+ First Released Version - 1994. This version had NO comments.
+ Second Major Released Version - Tue May 23 10:43:44 PDT 2000
+ Configuration and other items changed. Read this doc.
+ Treat this as a new version.
+ Minor Revision - Mon Apr 1 09:41:28 PST 2002
+ - fixed up some constants and casts
- "You" is you, if you are thinking about copying or distributing
- this Package.
+ COPYRIGHT AND TERMS OF USE:
- "Reasonable copying fee" is whatever you can justify on the
- basis of media cost, duplication charges, time of people involved,
- and so on. (You will not be required to justify it to the
- Copyright Holder, but only to the computing community at large
- as a market that must bear the fee.)
+ You may use, copy, distribute, or otherwise incorporate this software
+ and documentation into any product or other item, provided that
+ the copyright in the documentation and source code as well as the
+ source code generated constant strings in the object, executable
+ or other code remain in place and are present in executable modules
+ or objects.
- "Freely Available" means that no fee is charged for the item
- itself, though there may be fees involved in handling the item.
- It also means that recipients of the item may redistribute it
- under the same conditions they received it.
+ You may modify this code as appropriate to your usage; however the
+ modified version must be identified by changing the various source
+ and object code identification strings as is appropriately noted
+ in the source code.
-1. You may make and give away verbatim copies of the source form of the
-Standard Version of this Package without restriction, provided that you
-duplicate all of the original copyright notices and associated disclaimers.
+ You can use this with the GNU CONFIGURE utility.
+ This should define the following macros appropriately:
-2. You may apply bug fixes, portability fixes and other modifications
-derived from the Public Domain or from the Copyright Holder. A Package
-modified in such a way shall still be considered the Standard Version.
+ HAVE_STDARG_H - if the <stdargs.h> include file is available
+ HAVE_VARARG_H - if the <varargs.h> include file is available
-3. You may otherwise modify your copy of this Package in any way, provided
-that you insert a prominent notice in each changed file stating how and
-when you changed that file, and provided that you do at least ONE of the
-following:
+ HAVE_STRERROR - if the strerror() routine is available.
+ If it is not available, then examine the lines containing
+ the tests below.
- a) place your modifications in the Public Domain or otherwise make them
- Freely Available, such as by posting said modifications to Usenet or
- an equivalent medium, or placing the modifications on a major archive
- site such as uunet.uu.net, or by allowing the Copyright Holder to include
- your modifications in the Standard Version of the Package.
+ HAVE_SYS_ERRLIST - have sys_errlist available
+ HAVE_DECL_SYS_ERRLIST - sys_errlist declaration in include files
+ HAVE_SYS_NERR - have sys_nerr available
+ HAVE_DECL_SYS_NERR - sys_nerr declaration in include files
- b) use the modified Package only within your corporation or organization.
+ HAVE_QUAD_T - if the quad_t type is defined
+ HAVE_LONG_LONG - if the long long type is defined
+ HAVE_LONG_DOUBLE - if the long double type is defined
- c) rename any non-standard executables so the names do not conflict
- with standard executables, which must also be provided, and provide
- a separate manual page for each non-standard executable that clearly
- documents how it differs from the Standard Version.
+ If you are using the GNU configure (autoconf) facility, add the
+ following line to the configure.in file, to force checking for the
+ quad_t and long long data types:
- d) make other distribution arrangements with the Copyright Holder.
-4. You may distribute the programs of this Package in object code or
-executable form, provided that you do at least ONE of the following:
+ AC_CHECK_HEADERS(stdlib.h,stdio.h,unistd.h,errno.h)
+ AC_CHECK_FUNCS(strerror)
+ AC_CACHE_CHECK(for errno,
+ ac_cv_errno,
+ [
+ AC_TRY_LINK(,[extern int errno; return (errno);],
+ ac_cv_errno=yes, ac_cv_errno=no)
+ ])
+ if test "$ac_cv_errno" = yes; then
+ AC_DEFINE(HAVE_ERRNO)
+ AC_CACHE_CHECK(for errno declaration,
+ ac_cv_decl_errno,
+ [
+ AC_TRY_COMPILE([
+ #include <stdio.h>
+ #ifdef HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+ #ifdef HAVE_UNISTD_H
+ #include <unistd.h>
+ #endif
+ #ifdef HAVE_ERRNO_H
+ #include <errno.h>
+ ],[return(sys_nerr);],
+ ac_cv_decl_errno=yes, ac_cv_decl_errno=no)
+ ])
+ if test "$ac_cv_decl_errno" = yes; then
+ AC_DEFINE(HAVE_DECL_ERRNO)
+ fi;
+ fi
- a) distribute a Standard Version of the executables and library files,
- together with instructions (in the manual page or equivalent) on where
- to get the Standard Version.
+ AC_CACHE_CHECK(for sys_nerr,
+ ac_cv_sys_nerr,
+ [
+ AC_TRY_LINK(,[extern int sys_nerr; return (sys_nerr);],
+ ac_cv_sys_nerr=yes, ac_cv_sys_nerr=no)
+ ])
+ if test "$ac_cv_sys_nerr" = yes; then
+ AC_DEFINE(HAVE_SYS_NERR)
+ AC_CACHE_CHECK(for sys_nerr declaration,
+ ac_cv_decl_sys_nerr,
+ [
+ AC_TRY_COMPILE([
+ #include <stdio.h>
+ #ifdef HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+ #ifdef HAVE_UNISTD_H
+ #include <unistd.h>
+ #endif],[return(sys_nerr);],
+ ac_cv_decl_sys_nerr_def=yes, ac_cv_decl_sys_nerr_def=no)
+ ])
+ if test "$ac_cv_decl_sys_nerr" = yes; then
+ AC_DEFINE(HAVE_DECL_SYS_NERR)
+ fi
+ fi
- b) accompany the distribution with the machine-readable source of
- the Package with your modifications.
- c) give non-standard executables non-standard names, and clearly
- document the differences in manual pages (or equivalent), together
- with instructions on where to get the Standard Version.
+ AC_CACHE_CHECK(for sys_errlist array,
+ ac_cv_sys_errlist,
+ [AC_TRY_LINK(,[extern char *sys_errlist[];
+ sys_errlist[0];],
+ ac_cv_sys_errlist=yes, ac_cv_sys_errlist=no)
+ ])
+ if test "$ac_cv_sys_errlist" = yes; then
+ AC_DEFINE(HAVE_SYS_ERRLIST)
+ AC_CACHE_CHECK(for sys_errlist declaration,
+ ac_cv_sys_errlist_def,
+ [AC_TRY_COMPILE([
+ #include <stdio.h>
+ #include <errno.h>
+ #ifdef HAVE_STDLIB_H
+ #include <stdlib.h>
+ #endif
+ #ifdef HAVE_UNISTD_H
+ #include <unistd.h>
+ #endif],[char *s = sys_errlist[0]; return(*s);],
+ ac_cv_decl_sys_errlist=yes, ac_cv_decl_sys_errlist=no)
+ ])
+ if test "$ac_cv_decl_sys_errlist" = yes; then
+ AC_DEFINE(HAVE_DECL_SYS_ERRLIST)
+ fi
+ fi
- d) make other distribution arrangements with the Copyright Holder.
-5. You may charge a reasonable copying fee for any distribution of this
-Package. You may charge any fee you choose for support of this
-Package. You may not charge a fee for this Package itself. However,
-you may distribute this Package in aggregate with other (possibly
-commercial) programs as part of a larger (possibly commercial) software
-distribution provided that you do not advertise this Package as a
-product of your own.
-6. The name of the Copyright Holder may not be used to endorse or promote
-products derived from this software without specific prior written permission.
+ AC_CACHE_CHECK(checking for long long,
+ ac_cv_long_long,
+ [
+ AC_TRY_COMPILE([
+ #include <stdio.h>
+ #include <sys/types.h>
+ ], [printf("%d",sizeof(long long));],
+ ac_cv_long_long=yes, ac_cv_long_long=no)
+ ])
+ if test $ac_cv_long_long = yes; then
+ AC_DEFINE(HAVE_LONG_LONG)
+ fi
-7. THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
-IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
-WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ AC_CACHE_CHECK(checking for long double,
+ ac_cv_long_double,
+ [
+ AC_TRY_COMPILE([
+ #include <stdio.h>
+ #include <sys/types.h>
+ ], [printf("%d",sizeof(long double));],
+ ac_cv_long_double=yes, ac_cv_long_double=no)
+ ])
+ if test $ac_cv_long_double = yes; then
+ AC_DEFINE(HAVE_LONG_DOUBLE)
+ fi
- The End
-#include "lp.h"
-#endif
+ AC_CACHE_CHECK(checking for quad_t,
+ ac_cv_quad_t,
+ [
+ AC_TRY_COMPILE([
+ #include <stdio.h>
+ #include <sys/types.h>
+ ], [printf("%d",sizeof(quad_t));],
+ ac_cv_quad_t=yes, ac_cv_quad_t=no)
+ ])
+ if test $ac_cv_quad_t = yes; then
+ AC_DEFINE(HAVE_QUAD_T)
+ fi
-#include <stdarg.h>
-#include <errno.h>
-#include <sys/types.h>
-#define HAVE_STDARGS /* let's hope that works everywhere (mj) */
-#define VA_LOCAL_DECL va_list ap;
-#define VA_START(f) va_start(ap, f)
-#define VA_SHIFT(v,t) ; /* no-op for ANSI */
-#define VA_END va_end(ap)
-/**** ENDINCLUDE ****/
-static char *const _id = "$Id$";
+ NAME
+ snprintf, plp_vsnprintf - formatted output conversion
+
+ SYNOPSIS
+ #include <stdio.h>
+ #include <stdarg.h>
+
+ int
+ snprintf(const char *format, size_t size, va_list ap);
+ int
+ plp_unsafe_snprintf(const char *format, size_t size, va_list ap);
+
+ AKA snprintf and unsafe_snprintf in the documentation below
+
+ int
+ vsnprintf(char *str, size_t size, const char *format, va_list ap);
+ int
+ unsafe_vsnprintf(char *str, size_t size, const char *format, va_list ap);
+
+ AKA vsnprintf and unsafe_vsnprintf in the documentation below
+
+ (Multithreaded Safe)
+
+ DESCRIPTION
+ The printf() family of functions produces output according to
+ a format as described below. Snprintf(), and vsnprintf()
+ write to the character string str. These functions write the
+ output under the control of a format string that specifies
+ how subsequent arguments (or arguments accessed via the
+ variable-length argument facilities of stdarg(3)) are converted
+ for output. These functions return the number of characters
+ printed (not including the trailing `\0' used to end output
+ to strings). Snprintf() and vsnprintf() will write at most
+ size-1 of the characters printed into the output string (the
+ size'th character then gets the terminating `\0'); if the
+ return value is greater than or equal to the size argument,
+ the string was too short and some of the printed characters
+ were discarded. The size or str may be given as zero to find
+ out how many characters are needed; in this case, the str
+ argument is ignored.
+
+ By default, the snprintf function will not format control
+ characters (except new line and tab) in strings. This is a
+ safety feature that has proven to be extremely critical when
+ using snprintf for secure applications and when debugging.
+ If you MUST have control characters formatted or printed,
+ then use the unsafe_snprintf() and unsafe_vsnprintf() and on
+ your own head be the consequences. You have been warned.
+
+ There is one exception to the comments above, and that is
+ the "%c" (character) format. It brutally assumes that the
+ user will have performed the necessary 'isprint()' or other
+ checks and uses the integer value as a character.
+
+ The format string is composed of zero or more directives:
+ ordinary characters (not %), which are copied unchanged to
+ the output stream; and conversion specifications, each
+ of which results in fetching zero or more subsequent arguments.
+ Each conversion specification is introduced by the character
+ %. The arguments must correspond properly (after type promotion)
+ with the conversion specifier. After the %, the following
+ appear in sequence:
+
+ o Zero or more of the following flags:
+
+ - A zero `0' character specifying zero padding. For
+ all conversions except n, the converted value is padded
+ on the left with zeros rather than blanks. If a
+ precision is given with a numeric conversion (d, i,
+ o, u, i, x, and X), the `0' flag is ignored.
+
+ - A negative field width flag `-' indicates the converted
+ value is to be left adjusted on the field boundary. Except
+ for n conversions, the converted value is padded on
+ the right with blanks, rather than on the left with
+ blanks or zeros. A `-' overrides a `0' if both are
+ given.
+
+ - A space, specifying that a blank should be left before
+ a positive number produced by a signed conversion (d, e, E, f,
+ g, G, or i).
+
+ - A `+' character specifying that a sign always be placed
+ before a number produced by a signed conversion. A `+' overrides
+ a space if both are used.
+
+ o An optional decimal digit string specifying a minimum
+ field width. If the converted value has fewer
+ characters than the field width, it will be padded
+ with spaces on the left (or right, if the
+ left-adjustment flag has been given) to fill out
+ the field width.
+
+ o An optional precision, in the form of a period `.' followed
+ by an optional digit string. If the digit string
+ is omitted, the precision is taken as zero. This
+ gives the minimum number of digits to appear for
+ d, i, o, u, x, and X conversions, the number of
+ digits to appear after the decimal-point for e,
+ E, and f conversions, the maximum number of
+ significant digits for g and G conversions, or
+ the maximum number of characters to be printed
+ from a string for s conversions.
+
+ o The optional character h, specifying that a following d,
+ i, o, u, x, or X conversion corresponds to a short
+ int or unsigned short int argument, or that a
+ following n conversion corresponds to a pointer
+ to a short int argument.
+
+ o The optional character l (ell) specifying that a following
+ d, i, o, u, x, or X conversion applies to a pointer
+ to a long int or unsigned long int argument, or
+ that a following n conversion corresponds to a
+ pointer to a long int argument.
+
+ o The optional character q, specifying that a following d,
+ i, o, u, x, or X conversion corresponds to a quad_t
+ or u_quad_t argument, or that a following n
+ conversion corresponds to a quad_t argument.
+ This value is always printed in HEX notation. Tough.
+ quad_t's are an OS system implementation, and should
+ not be allowed.
+
+ o The character L specifying that a following e, E, f, g,
+ or G conversion corresponds to a long double
+ argument.
+
+ o A character that specifies the type of conversion to be applied.
+
+
+ A field width or precision, or both, may be indicated by an asterisk `*'
+ instead of a digit string. In this case, an int argument supplies the
+ field width or precision. A negative field width is treated as a left
+ adjustment flag followed by a positive field width; a negative precision
+ is treated as though it were missing.
+
+ The conversion specifiers and their meanings are:
+
+ diouxX The int (or appropriate variant) argument is converted to signed
+ decimal (d and i), unsigned octal (o), unsigned decimal
+ (u), or unsigned hexadecimal (x and X) notation. The
+ letters abcdef are used for x conversions; the letters
+ ABCDEF are used for X conversions. The precision, if
+ any, gives the minimum number of digits that must
+ appear; if the converted value requires fewer digits,
+ it is padded on the left with zeros.
+
+ eE The double argument is rounded and converted in the style
+ [-]d.ddde+-dd where there is one digit before the decimal-point
+ character and the number of digits after it is equal
+ to the precision; if the precision is missing, it is
+ taken as 6; if the precision is zero, no decimal-point
+ character appears. An E conversion uses the letter
+ E (rather than e) to introduce the exponent.
+ The exponent always contains at least two digits; if
+ the value is zero, the exponent is 00.
+
+ f The double argument is rounded and converted to decimal notation
+ in the style [-]ddd.ddd, where the number of digits after the
+ decimal-point character is equal to the precision specification.
+ If the precision is missing, it is taken as 6; if the precision
+ is explicitly zero, no decimal-point character appears. If a
+ decimal point appears, at least one digit appears before it.
+
+ g The double argument is converted in style f or e (or
+ E for G conversions). The precision specifies the
+ number of significant digits. If the precision is
+ missing, 6 digits are given; if the precision is zero,
+ it is treated as 1. Style e is used if the exponent
+ from its conversion is less than -4 or greater than
+ or equal to the precision. Trailing zeros are removed
+ from the fractional part of the result; a decimal
+ point appears only if it is followed by at least one
+ digit.
+
+ c The int argument is converted to an unsigned char,
+ and the resulting character is written.
+
+ s The ``char *'' argument is expected to be a pointer to an array
+ of character type (pointer to a string). Characters
+ from the array are written up to (but not including)
+ a terminating NUL character; if a precision is
+ specified, no more than the number specified are
+ written. If a precision is given, no null character
+ need be present; if the precision is not specified,
+ or is greater than the size of the array, the array
+ must contain a terminating NUL character.
+
+ % A `%' is written. No argument is converted. The complete
+ conversion specification is `%%'.
+
+ In no case does a non-existent or small field width cause truncation of a
+ field; if the result of a conversion is wider than the field width, the
+ field is expanded to contain the conversion result.
+
+ EXAMPLES
+ To print a date and time in the form `Sunday, July 3, 10:02', where
+ weekday and month are pointers to strings:
+
+ #include <stdio.h>
+ fprintf(stdout, "%s, %s %d, %.2d:%.2d\n",
+ weekday, month, day, hour, min);
+
+ To print pi to five decimal places:
+
+ #include <math.h>
+ #include <stdio.h>
+ fprintf(stdout, "pi = %.5f\n", 4 * atan(1.0));
+
+ To allocate a 128 byte string and print into it:
+
+ #include <stdio.h>
+ #include <stdlib.h>
+ #include <stdarg.h>
+ char *newfmt(const char *fmt, ...)
+ {
+ char *p;
+ va_list ap;
+ if ((p = malloc(128)) == NULL)
+ return (NULL);
+ va_start(ap, fmt);
+ (void) vsnprintf(p, 128, fmt, ap);
+ va_end(ap);
+ return (p);
+ }
+
+ SEE ALSO
+ printf(1), scanf(3)
+
+ STANDARDS
+ Turkey C Standardization and wimpy POSIX folks did not define
+ snprintf or vsnprintf().
+
+ BUGS
+ The conversion formats %D, %O, and %U are not standard and are provided
+ only for backward compatibility. The effect of padding the %p format
+ with zeros (either by the `0' flag or by specifying a precision), and the
+ benign effect (i.e., none) of the `#' flag on %n and %p conversions, as
+ well as other nonsensical combinations such as %Ld, are not standard;
+ such combinations should be avoided.
+
+ The typedef names quad_t and u_quad_t are infelicitous.
+
+*/
+
+
+#include <sys/types.h>
+#include <ctype.h>
+#include <stdlib.h>
+#include <stdio.h>
+#if defined(HAVE_STRING_H)
+# include <string.h>
+#endif
+#if defined(HAVE_STRINGS_H)
+# include <strings.h>
+#endif
+#if defined(HAVE_ERRNO_H)
+#include <errno.h>
+#endif
/*
- * dopr(): poor man's version of doprintf
+ * For testing, define these values
*/
+#if 0
+#define HAVE_STDARG_H 1
+#define TEST 1
+#define HAVE_QUAD_T 1
+#endif
+
+/**** ENDINCLUDE ****/
+
+/*************************************************
+ * KEEP THIS STRING - MODIFY AT THE END WITH YOUR REVISIONS
+ * i.e. - the LOCAL REVISIONS part is for your use
+ *************************************************/
+
+
+ static char *const _id = "plp_snprintf V2000.08.18 Copyright Patrick Powell 1988-2000 "
+ "$Id: plp_snprintf.c,v 1.4 2005/04/14 20:05:19 papowell Exp $"
+ " LOCAL REVISIONS: renamed plp_snprintf to snprintf, conditionalized everything on HAVE_SNPRINTF";
+
+/* varargs declarations: */
+
+# undef HAVE_STDARGS /* let's hope that works everywhere (mj) */
+# undef VA_LOCAL_DECL
+# undef VA_START
+# undef VA_SHIFT
+# undef VA_END
+
+#if defined(HAVE_STDARG_H)
+# include <stdarg.h>
+# define HAVE_STDARGS /* let's hope that works everywhere (mj) */
+# define VA_LOCAL_DECL va_list ap;
+# define VA_START(f) va_start(ap, f)
+# define VA_SHIFT(v,t) ; /* no-op for ANSI */
+# define VA_END va_end(ap)
+#else
+# if defined(HAVE_VARARGS_H)
+# include <varargs.h>
+# undef HAVE_STDARGS
+# define VA_LOCAL_DECL va_list ap;
+# define VA_START(f) va_start(ap) /* f is ignored! */
+# define VA_SHIFT(v,t) v = va_arg(ap,t)
+# define VA_END va_end(ap)
+# else
+ XX ** NO VARARGS ** XX
+# endif
+#endif
-static char * plp_Errormsg ( int err );
-static void dopr( char *buffer, const char *format, va_list args );
-static void fmtstr( char *value, int ljust, int len, int zpad, int precision );
-static void fmtnum( long value, int base, int dosign,
+ union value {
+#if defined(HAVE_QUAD_T)
+ quad_t qvalue;
+#endif
+#if defined(HAVE_LONG_LONG)
+ long long value;
+#else
+ long value;
+#endif
+ double dvalue;
+};
+
+#undef CVAL
+#define CVAL(s) (*((unsigned char *)s))
+#define safestrlen(s) ((s)?strlen(s):0)
+
+
+ static char * plp_Errormsg ( int err, char *buffer );
+ static void dopr( int visible_control, char **buffer, int *left,
+ const char *format, va_list args );
+ static void fmtstr( int visible_control, char **buffer, int *left,
+ char *value, int ljust, int len, int zpad, int precision );
+ static void fmtnum( char **buffer, int *left,
+ union value *value, int base, int dosign,
+ int ljust, int len, int zpad, int precision );
+#if defined(HAVE_QUAD_T)
+ static void fmtquad( char **buffer, int *left,
+ union value *value, int base, int dosign,
int ljust, int len, int zpad, int precision );
-static void fmtdouble( int fmt, double value,
+#endif
+ static void fmtdouble( char **bufer, int *left,
+ int fmt, double value,
int ljust, int len, int zpad, int precision );
-static void dostr( char * );
-static char *output;
-static void dopr_outch( int c );
-static char *end;
-int visible_control = 1;
-
-/**************************************************************
- * Original:
- * Patrick Powell Tue Apr 11 09:48:21 PDT 1995
- * A bombproof version of doprnt (dopr) included.
- * Sigh. This sort of thing is always nasty do deal with. Note that
- * the version here does not include floating point...
- *
- * plp_snprintf() is used instead of sprintf() as it does limit checks
- * for string length. This covers a nasty loophole.
- *
- * The other functions are there to prevent NULL pointers from
- * causing nast effects.
- **************************************************************/
-
-int vsnprintf(char *str, size_t count, const char *fmt, va_list args)
+ static void dostr( char **buffer, int *left, char *str );
+ static void dopr_outch( char **buffer, int *left, int c );
+/* VARARGS3 */
+#ifdef HAVE_STDARGS
+ int plp_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
+#else
+ int plp_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
+#endif
+
+{
+ int left;
+ char *buffer;
+ if( (int)count < 0 ) count = 0;
+ left = count;
+ if( count == 0 ) str = 0;
+ buffer = str;
+ dopr( 1, &buffer, &left, fmt, args );
+ /* fprintf(stderr,"str 0x%x, buffer 0x%x, count %d, left %d\n",
+ (int)str, (int)buffer, count, left ); */
+ if( str && count > 0 ){
+ if( left > 0 ){
+ str[count-left] = 0;
+ } else {
+ str[count-1] = 0;
+ }
+ }
+ return(count - left);
+}
+
+/* VARARGS3 */
+#ifdef HAVE_STDARGS
+ int plp_unsafe_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
+#else
+ int plp_unsafe_vsnprintf(char *str, size_t count, const char *fmt, va_list args)
+#endif
{
- str[0] = 0;
- end = str+count-1;
- dopr( str, fmt, args );
- if( count>0 ){
- end[0] = 0;
+ int left;
+ char *buffer;
+ if( (int)count < 0 ) count = 0;
+ left = count;
+ if( count == 0 ) str = 0;
+ buffer = str;
+ dopr( 0, &buffer, &left, fmt, args );
+ /* fprintf(stderr,"str 0x%x, buffer 0x%x, count %d, left %d\n",
+ (int)str, (int)buffer, count, left ); */
+ if( str && count > 0 ){
+ if( left > 0 ){
+ str[count-left] = 0;
+ } else {
+ str[count-1] = 0;
+ }
}
- return(strlen(str));
+ return(count - left);
}
/* VARARGS3 */
#ifdef HAVE_STDARGS
-int snprintf (char *str,size_t count,const char *fmt,...)
+ int snprintf (char *str,size_t count,const char *fmt,...)
#else
-int snprintf (va_alist) va_dcl
+ int snprintf (va_alist) va_dcl
#endif
{
#ifndef HAVE_STDARGS
@@ -183,22 +619,48 @@ int snprintf (va_alist) va_dcl
size_t count;
char *fmt;
#endif
+ int n = 0;
VA_LOCAL_DECL
VA_START (fmt);
VA_SHIFT (str, char *);
VA_SHIFT (count, size_t );
VA_SHIFT (fmt, char *);
- (void) vsnprintf ( str, count, fmt, ap);
+ n = plp_vsnprintf ( str, count, fmt, ap);
VA_END;
- return( strlen( str ) );
+ return( n );
}
-static void dopr( char *buffer, const char *format, va_list args )
+
+/* VARARGS3 */
+#ifdef HAVE_STDARGS
+ int plp_unsafe_snprintf (char *str,size_t count,const char *fmt,...)
+#else
+ int plp_unsafe_snprintf (va_alist) va_dcl
+#endif
+{
+#ifndef HAVE_STDARGS
+ char *str;
+ size_t count;
+ char *fmt;
+#endif
+ int n = 0;
+ VA_LOCAL_DECL
+
+ VA_START (fmt);
+ VA_SHIFT (str, char *);
+ VA_SHIFT (count, size_t );
+ VA_SHIFT (fmt, char *);
+ n = plp_unsafe_vsnprintf ( str, count, fmt, ap);
+ VA_END;
+ return( n );
+}
+ static void dopr( int visible_control, char **buffer, int *left, const char *format, va_list args )
{
int ch;
- long value;
+ union value value;
int longflag = 0;
+ int quadflag = 0;
char *strvalue;
int ljust;
int len;
@@ -207,22 +669,30 @@ static void dopr( char *buffer, const char *format, va_list args )
int set_precision;
double dval;
int err = errno;
+ int base = 0;
+ int signed_val = 0;
- output = buffer;
while( (ch = *format++) ){
switch( ch ){
case '%':
- ljust = len = zpad = 0;
+ longflag = quadflag =
+ ljust = len = zpad = base = signed_val = 0;
precision = -1; set_precision = 0;
- nextch:
+ nextch:
ch = *format++;
switch( ch ){
case 0:
- dostr( "**end of format**" );
+ dostr( buffer, left, "**end of format**" );
return;
case '-': ljust = 1; goto nextch;
case '.': set_precision = 1; precision = 0; goto nextch;
- case '*': len = va_arg( args, int ); goto nextch;
+ case '*':
+ if( set_precision ){
+ precision = va_arg( args, int );
+ } else {
+ len = va_arg( args, int );
+ }
+ goto nextch;
case '0': /* set zero padding if len not set */
if(len==0 && set_precision == 0 ) zpad = '0';
case '1': case '2': case '3':
@@ -234,76 +704,91 @@ static void dopr( char *buffer, const char *format, va_list args )
len = len*10 + ch - '0';
}
goto nextch;
- case 'l': longflag = 1; goto nextch;
+ case 'l': ++longflag; goto nextch;
+ case 'q':
+#if !defined( HAVE_QUAD_T )
+ dostr( buffer, left, "*no quad_t support *");
+ return;
+#endif
+ quadflag = 1;
+ goto nextch;
case 'u': case 'U':
- /*fmtnum(value,base,dosign,ljust,len, zpad, precision) */
- if( longflag ){
- value = va_arg( args, long );
- } else {
- value = va_arg( args, int );
- }
- fmtnum( value, 10,0, ljust, len, zpad, precision ); break;
+ if( base == 0 ){ base = 10; signed_val = 0; }
case 'o': case 'O':
- /*fmtnum(value,base,dosign,ljust,len, zpad, precision) */
- if( longflag ){
- value = va_arg( args, long );
- } else {
- value = va_arg( args, int );
- }
- fmtnum( value, 8,0, ljust, len, zpad, precision ); break;
+ if( base == 0 ){ base = 8; signed_val = 0; }
case 'd': case 'D':
- if( longflag ){
- value = va_arg( args, long );
- } else {
- value = va_arg( args, int );
- }
- fmtnum( value, 10,1, ljust, len, zpad, precision ); break;
+ if( base == 0 ){ base = 10; signed_val = 1; }
case 'x':
- if( longflag ){
- value = va_arg( args, long );
- } else {
- value = va_arg( args, int );
- }
- fmtnum( value, 16,0, ljust, len, zpad, precision ); break;
+ if( base == 0 ){ base = 16; signed_val = 0; }
case 'X':
- if( longflag ){
- value = va_arg( args, long );
+ if( base == 0 ){ base = -16; signed_val = 0; }
+#if defined( HAVE_QUAD_T )
+ if( quadflag ){
+ value.qvalue = va_arg( args, quad_t );
+ fmtquad( buffer, left, &value,base,signed_val, ljust, len, zpad, precision );
+ break;
+ } else
+#endif
+ if( longflag > 1 ){
+#if defined(HAVE_LONG_LONG)
+ if( signed_val ){
+ value.value = va_arg( args, long long );
+ } else {
+ value.value = va_arg( args, unsigned long long );
+ }
+#else
+ if( signed_val ){
+ value.value = va_arg( args, long );
+ } else {
+ value.value = va_arg( args, unsigned long );
+ }
+#endif
+ } else if( longflag ){
+ if( signed_val ){
+ value.value = va_arg( args, long );
+ } else {
+ value.value = va_arg( args, unsigned long );
+ }
} else {
- value = va_arg( args, int );
+ if( signed_val ){
+ value.value = va_arg( args, int );
+ } else {
+ value.value = va_arg( args, unsigned int );
+ }
}
- fmtnum( value,-16,0, ljust, len, zpad, precision ); break;
+ fmtnum( buffer, left, &value,base,signed_val, ljust, len, zpad, precision ); break;
case 's':
strvalue = va_arg( args, char *);
- fmtstr( strvalue,ljust,len, zpad, precision );
+ fmtstr( visible_control, buffer, left, strvalue,ljust,len, zpad, precision );
break;
case 'c':
ch = va_arg( args, int );
{ char b[2];
- int vsb = visible_control;
b[0] = ch;
b[1] = 0;
- visible_control = 0;
- fmtstr( b,ljust,len, zpad, precision );
- visible_control = vsb;
+ fmtstr( 0, buffer, left, b,ljust,len, zpad, precision );
}
break;
- case 'f': case 'g':
+ case 'f': case 'g': case 'e':
dval = va_arg( args, double );
- fmtdouble( ch, dval,ljust,len, zpad, precision ); break;
+ fmtdouble( buffer, left, ch, dval,ljust,len, zpad, precision ); break;
case 'm':
- fmtstr( plp_Errormsg(err),ljust,len, zpad, precision ); break;
- case '%': dopr_outch( ch ); continue;
+ { char shortbuffer[32];
+ fmtstr( visible_control, buffer, left,
+ plp_Errormsg(err, shortbuffer),ljust,len, zpad, precision );
+ }
+ break;
+ case '%': dopr_outch( buffer, left, ch ); continue;
default:
- dostr( "???????" );
+ dostr( buffer, left, "???????" );
}
longflag = 0;
break;
default:
- dopr_outch( ch );
+ dopr_outch( buffer, left, ch );
break;
}
}
- *output = 0;
}
/*
@@ -312,63 +797,69 @@ static void dopr( char *buffer, const char *format, va_list args )
* len = minimum length
* precision = numbers of chars in string to use
*/
-static void
-fmtstr( char *value, int ljust, int len, int zpad, int precision )
+ static void
+ fmtstr( int visible_control, char **buffer, int *left,
+ char *value, int ljust, int len, int zpad, int precision )
{
- int padlen, strlen, i, c; /* amount to pad */
+ int padlen, strlenv, i, c; /* amount to pad */
if( value == 0 ){
value = "<NULL>";
}
- if( precision > 0 ){
- strlen = precision;
- } else {
- /* cheap strlen so you do not have library call */
- for( strlen = 0; (c=value[strlen]); ++ strlen ){
- if( visible_control && iscntrl( c ) && !isspace( c ) ){
- ++strlen;
- }
+ /* cheap strlen so you do not have library call */
+ for( strlenv = i = 0; (c=CVAL(value+i)); ++i ){
+ if( visible_control && iscntrl( c ) && c != '\t' && c != '\n' ){
+ ++strlenv;
}
+ ++strlenv;
+ }
+ if( precision > 0 && strlenv > precision ){
+ strlenv = precision;
}
- padlen = len - strlen;
+ padlen = len - strlenv;
if( padlen < 0 ) padlen = 0;
if( ljust ) padlen = -padlen;
while( padlen > 0 ) {
- dopr_outch( ' ' );
+ dopr_outch( buffer, left, ' ' );
--padlen;
}
/* output characters */
- for( i = 0; (c = value[i]); ++i ){
- if( visible_control && iscntrl( c ) && !isspace( c ) ){
- dopr_outch('^');
+ for( i = 0; i < strlenv && (c = CVAL(value+i)); ++i ){
+ if( visible_control && iscntrl( c ) && c != '\t' && c != '\n' ){
+ dopr_outch(buffer, left, '^');
c = ('@' | (c & 0x1F));
}
- dopr_outch(c);
+ dopr_outch(buffer, left, c);
}
while( padlen < 0 ) {
- dopr_outch( ' ' );
+ dopr_outch( buffer, left, ' ' );
++padlen;
}
}
-static void
-fmtnum( long value, int base, int dosign, int ljust,
+ static void
+ fmtnum( char **buffer, int *left,
+ union value *value, int base, int dosign, int ljust,
int len, int zpad, int precision )
{
int signvalue = 0;
+#if defined(HAVE_LONG_LONG)
+ unsigned long long uvalue;
+#else
unsigned long uvalue;
- char convert[20];
+#endif
+ char convert[sizeof( union value) * 8 + 16];
int place = 0;
int padlen = 0; /* amount to pad */
int caps = 0;
- /* DEBUGP(("value 0x%x, base %d, dosign %d, ljust %d, len %d, zpad %d\n",
- value, base, dosign, ljust, len, zpad )); */
- uvalue = value;
+ /* fprintf(stderr,"value 0x%x, base %d, dosign %d, ljust %d, len %d, zpad %d\n",
+ value, base, dosign, ljust, len, zpad );/ **/
+ uvalue = value->value;
if( dosign ){
- if( value < 0 ) {
+ if( value->value < 0 ) {
signvalue = '-';
- uvalue = -value;
+ uvalue = -value->value;
}
}
if( base < 0 ){
@@ -385,71 +876,148 @@ fmtnum( long value, int base, int dosign, int ljust,
padlen = len - place;
if( padlen < 0 ) padlen = 0;
if( ljust ) padlen = -padlen;
- /* DEBUGP(( "str '%s', place %d, sign %c, padlen %d\n",
- convert,place,signvalue,padlen)); */
+ /* fprintf( stderr, "str '%s', place %d, sign %c, padlen %d\n",
+ convert,place,signvalue,padlen); / **/
if( zpad && padlen > 0 ){
if( signvalue ){
- dopr_outch( signvalue );
+ dopr_outch( buffer, left, signvalue );
--padlen;
signvalue = 0;
}
while( padlen > 0 ){
- dopr_outch( zpad );
+ dopr_outch( buffer, left, zpad );
--padlen;
}
}
while( padlen > 0 ) {
- dopr_outch( ' ' );
+ dopr_outch( buffer, left, ' ' );
--padlen;
}
- if( signvalue ) dopr_outch( signvalue );
- while( place > 0 ) dopr_outch( convert[--place] );
+ if( signvalue ) dopr_outch( buffer, left, signvalue );
+ while( place > 0 ) dopr_outch( buffer, left, convert[--place] );
while( padlen < 0 ){
- dopr_outch( ' ' );
+ dopr_outch( buffer, left, ' ' );
++padlen;
}
}
-static void
-fmtdouble( int fmt, double value, int ljust, int len, int zpad, int precision )
+#if defined(HAVE_QUAD_T)
+
+ static void
+ fmtquad( char **buffer, int *left,
+ union value *value, int base, int dosign, int ljust,
+ int len, int zpad, int precision )
{
- char convert[128];
- char fmtstr[128];
- int l;
+ int signvalue = 0;
+ int place = 0;
+ int padlen = 0; /* amount to pad */
+ int caps = 0;
+ int i, c;
+ union {
+ quad_t qvalue;
+ unsigned char qconvert[sizeof(quad_t)];
+ } vvalue;
+ char convert[2*sizeof(quad_t)+1];
+
+ /* fprintf(stderr,"value 0x%x, base %d, dosign %d, ljust %d, len %d, zpad %d\n",
+ value, base, dosign, ljust, len, zpad );/ **/
+ vvalue.qvalue = value->qvalue;
+
+ if( base < 0 ){
+ caps = 1;
+ }
- if( len == 0 ) len = 10;
- if( len > sizeof(convert) - 10 ){
- len = sizeof(convert) - 10;
+ for( i = 0; i < (int)sizeof(quad_t); ++i ){
+ c = vvalue.qconvert[i];
+ convert[2*i] =
+ (caps? "0123456789ABCDEF":"0123456789abcdef")[ (c >> 4) & 0xF];
+ convert[2*i+1] =
+ (caps? "0123456789ABCDEF":"0123456789abcdef")[ c & 0xF];
}
- if( precision > sizeof(convert) - 10 ){
- precision = sizeof(convert) - 10;
+ convert[2*i] = 0;
+
+ place = strlen(convert);
+ padlen = len - place;
+ if( padlen < 0 ) padlen = 0;
+ if( ljust ) padlen = -padlen;
+ /* fprintf( stderr, "str '%s', place %d, sign %c, padlen %d\n",
+ convert,place,signvalue,padlen); / **/
+ if( zpad && padlen > 0 ){
+ if( signvalue ){
+ dopr_outch( buffer, left, signvalue );
+ --padlen;
+ signvalue = 0;
+ }
+ while( padlen > 0 ){
+ dopr_outch( buffer, left, zpad );
+ --padlen;
+ }
}
- if( precision > len ) precision = len;
- strcpy( fmtstr, "%" );
- if( ljust ) strcat(fmtstr, "-" );
- if( len ){
- sprintf( fmtstr+strlen(fmtstr), "%d", len );
+ while( padlen > 0 ) {
+ dopr_outch( buffer, left, ' ' );
+ --padlen;
}
- if( precision > 0 ){
- sprintf( fmtstr+strlen(fmtstr), ".%d", precision );
+ if( signvalue ) dopr_outch( buffer, left, signvalue );
+ while( place > 0 ) dopr_outch( buffer, left, convert[--place] );
+ while( padlen < 0 ){
+ dopr_outch( buffer, left, ' ' );
+ ++padlen;
}
- l = strlen( fmtstr );
- fmtstr[l] = fmt;
- fmtstr[l+1] = 0;
- sprintf( convert, fmtstr, value );
- dostr( convert );
}
-static void dostr( char *str )
+#endif
+
+ static void mystrcat(char *dest, char *src )
{
- while(*str) dopr_outch(*str++);
+ if( dest && src ){
+ dest += safestrlen(dest);
+ strcpy(dest,src);
+ }
+}
+
+ static void
+ fmtdouble( char **buffer, int *left,
+ int fmt, double value, int ljust, int len, int zpad, int precision )
+{
+ char convert[sizeof( union value) * 8 + 512];
+ char formatstr[128];
+
+ /* fprintf(stderr,"len %d, precision %d\n", len, precision ); */
+ if( len > 255 ){
+ len = 255;
+ }
+ if( precision > 255 ){
+ precision = 255;
+ }
+ if( precision >= 0 && len > 0 && precision > len ) precision = len;
+ strcpy( formatstr, "%" ); /* 1 */
+ if( ljust ) mystrcat(formatstr, "-" ); /* 1 */
+ if( zpad ) mystrcat(formatstr, "0" ); /* 1 */
+ if( len >= 0 ){
+ sprintf( formatstr+strlen(formatstr), "%d", len ); /* 3 */
+ }
+ if( precision >= 0 ){
+ sprintf( formatstr+strlen(formatstr), ".%d", precision ); /* 3 */
+ }
+ /* format string will be at most 10 chars long ... */
+ sprintf( formatstr+strlen(formatstr), "%c", fmt );
+ /* this is easier than trying to do the portable dtostr */
+ /* fprintf(stderr,"format string '%s'\n", formatstr); */
+ sprintf( convert, formatstr, value );
+ dostr( buffer, left, convert );
+}
+
+ static void dostr( char **buffer, int *left, char *str )
+{
+ if(str)while(*str) dopr_outch( buffer, left, *str++ );
}
-static void dopr_outch( int c )
+ static void dopr_outch( char **buffer, int *left, int c )
{
- if( end == 0 || output < end ){
- *output++ = c;
+ if( *left > 0 ){
+ *(*buffer)++ = c;
}
+ *left -= 1;
}
@@ -461,29 +1029,26 @@ static void dopr_outch( int c )
* Patrick Powell Tue Apr 11 08:05:05 PDT 1995
****************************************************************************/
/****************************************************************************/
-#if !defined(HAVE_STRERROR)
-
-# if defined(HAVE_SYS_NERR)
-# if !defined(HAVE_SYS_NERR_DEF)
- extern int sys_nerr;
-# endif
-# define num_errors (sys_nerr)
-# else
-# define num_errors (-1) /* always use "errno=%d" */
-# endif
+#if !defined(HAVE_STRERROR)
+# undef num_errors
# if defined(HAVE_SYS_ERRLIST)
-# if !defined(HAVE_SYS_ERRLIST_DEF)
+# if !defined(HAVE_DECL_SYS_ERRLIST)
extern const char *const sys_errlist[];
# endif
-# else
-# undef num_errors
-# define num_errors (-1) /* always use "errno=%d" */
+# if defined(HAVE_SYS_NERR)
+# if !defined(HAVE_DECL_SYS_NERR)
+ extern int sys_nerr;
+# endif
+# define num_errors (sys_nerr)
+# endif
+# endif
+# if !defined(num_errors)
+# define num_errors (-1) /* always use "errno=%d" */
# endif
-
#endif
-static char * plp_Errormsg ( int err )
+ static char * plp_Errormsg ( int err, char *buffer /* int maxlen = 32 */)
{
char *cp;
@@ -496,10 +1061,8 @@ static char * plp_Errormsg ( int err )
} else
# endif
{
- static char msgbuf[32]; /* holds "errno=%d". */
- /* SAFE use of sprintf */
- (void) sprintf (msgbuf, "errno=%d", err);
- cp = msgbuf;
+ (void) sprintf (buffer, "errno=%d", err);
+ cp = buffer;
}
#endif
return (cp);
@@ -507,23 +1070,47 @@ static char * plp_Errormsg ( int err )
#if defined(TEST)
#include <stdio.h>
-int main( void )
+ int main( void )
{
char buffer[128];
char *t;
char *test1 = "01234";
+ int n;
errno = 1;
- plp_snprintf( buffer, sizeof(buffer), (t="errno '%m'")); printf( "%s = '%s'\n", t, buffer );
- plp_snprintf( buffer, sizeof(buffer), (t = "%s"), test1 ); printf( "%s = '%s'\n", t, buffer );
- plp_snprintf( buffer, sizeof(buffer), (t = "%12s"), test1 ); printf( "%s = '%s'\n", t, buffer );
- plp_snprintf( buffer, sizeof(buffer), (t = "%-12s"), test1 ); printf( "%s = '%s'\n", t, buffer );
- plp_snprintf( buffer, sizeof(buffer), (t = "%12.2s"), test1 ); printf( "%s = '%s'\n", t, buffer );
- plp_snprintf( buffer, sizeof(buffer), (t = "%-12.2s"), test1 ); printf( "%s = '%s'\n", t, buffer );
- plp_snprintf( buffer, sizeof(buffer), (t = "%g"), 1.25 ); printf( "%s = '%s'\n", t, buffer );
- plp_snprintf( buffer, sizeof(buffer), (t = "%g"), 1.2345 ); printf( "%s = '%s'\n", t, buffer );
- plp_snprintf( buffer, sizeof(buffer), (t = "%12g"), 1.25 ); printf( "%s = '%s'\n", t, buffer );
- plp_snprintf( buffer, sizeof(buffer), (t = "%12.2g"), 1.25 ); printf( "%s = '%s'\n", t, buffer );
- plp_snprintf( buffer, sizeof(buffer), (t = "%0*d"), 6, 1 ); printf( "%s = '%s'\n", t, buffer );
+ buffer[0] = 0;
+ n = snprintf( buffer, 0, (t="test")); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t="errno '%m'")); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%s"), test1 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%12s"), test1 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%-12s"), test1 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%12.2s"), test1 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%-12.2s"), test1 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%g"), 1.25 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%g"), 1.2345 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%12g"), 1.25 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%12.1g"), 1.25 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%12.2g"), 1.25 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%12.3g"), 1.25 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%0*d"), 6, 1 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+#if defined(HAVE_LONG_LONG)
+ n = snprintf( buffer, sizeof(buffer), (t = "%llx"), 1, 2, 3, 4 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%llx"), (long long)1, (long long)2 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%qx"), 1, 2, 3, 4 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%qx"), (quad_t)1, (quad_t)2 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+#endif
+ n = snprintf( buffer, sizeof(buffer), (t = "0%x, 0%x"), (char *)(0x01234567), (char *)0, 0, 0, 0); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "0%x, 0%x"), (char *)(0x01234567), (char *)0x89ABCDEF, 0, 0, 0); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "0%x, 0%x"), t, 0, 0, 0, 0); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%f"), 1.25 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%f"), 1.2345 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%12f"), 1.25 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%12.2f"), 1.25 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%f"), 1.0 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%.0f"), 1.0 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%0.0f"), 1.0 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%1.0f"), 1.0 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%1.5f"), 1.0 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
+ n = snprintf( buffer, sizeof(buffer), (t = "%5.5f"), 1.0 ); printf( "[%d] %s = '%s'\n", n, t, buffer );
return(0);
}
#endif
diff --git a/po/LINGUAS b/po/LINGUAS
index bd8718f..1342011 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -10,6 +10,7 @@ es
fi
fr
gl
+hu
it
ja
nb
diff --git a/po/Makefile.am b/po/Makefile.am
index c79b149..d757b11 100644
--- a/po/Makefile.am
+++ b/po/Makefile.am
@@ -69,7 +69,7 @@ clean-local:
$(GETTEXT_PACKAGE).pot: $(SRC_FILES)
@echo "creating $@ from $^"
- @$(XGETTEXT) -d$(GETTEXT_PACKAGE) -kSANE_I18N --flag=SANE_I18N:1:no-c-format -f POTFILES
+ @$(XGETTEXT) -d$(GETTEXT_PACKAGE) -kSANE_I18N --flag=SANE_I18N:1:no-c-format -f $(srcdir)/POTFILES -D$(srcdir)
@mv $(GETTEXT_PACKAGE).po $(GETTEXT_PACKAGE).pot
update: $(GETTEXT_PACKAGE).pot
diff --git a/po/Makefile.in b/po/Makefile.in
index c9a984d..5cfb684 100644
--- a/po/Makefile.in
+++ b/po/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -208,6 +208,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -219,11 +220,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -527,7 +531,7 @@ clean-local:
$(GETTEXT_PACKAGE).pot: $(SRC_FILES)
@echo "creating $@ from $^"
- @$(XGETTEXT) -d$(GETTEXT_PACKAGE) -kSANE_I18N --flag=SANE_I18N:1:no-c-format -f POTFILES
+ @$(XGETTEXT) -d$(GETTEXT_PACKAGE) -kSANE_I18N --flag=SANE_I18N:1:no-c-format -f $(srcdir)/POTFILES -D$(srcdir)
@mv $(GETTEXT_PACKAGE).po $(GETTEXT_PACKAGE).pot
update: $(GETTEXT_PACKAGE).pot
diff --git a/po/bg.po b/po/bg.po
index 8cef432..25a8401 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends 1.0.11\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2007-12-17 22:59+0100\n"
"Last-Translator: Pavel Constantinov <pavelconstantinov@bigfoot.com>\n"
"Language-Team: <>\n"
@@ -25,17 +25,17 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -44,25 +44,25 @@ msgid "Geometry"
msgstr "Геометрия"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Повишение"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Разширено"
@@ -87,8 +87,8 @@ msgstr "Наложи монохромно превю"
msgid "Bit depth"
msgstr "Дълбочина на бита"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Режим на сканиране"
@@ -128,7 +128,8 @@ msgstr "Долен десен x"
msgid "Bottom-right y"
msgstr "Долен десен y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Резолюция на сканиране"
@@ -296,7 +297,7 @@ msgstr "Вържи резолюцията по X и Y"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -968,7 +969,7 @@ msgstr "Висящи опции"
msgid "Set default values for enhancement controls."
msgstr "Нагласи висящи опции за повишителните контроли."
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Калибрация"
@@ -1009,63 +1010,63 @@ msgstr ""
msgid "Button state"
msgstr ""
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Номер на кадъра за сканиране"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Избира номера на кадъра за сканиране"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, fuzzy, no-c-format
msgid "Duplex scan"
msgstr "Дуплексно"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr ""
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Калибрирай скенера"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Задължителна калибрация преди сканиране"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Сканиране в сива скала"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Направи сканиране в сива скала, не цветно"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Аналогово увеличение"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Повиши или намали аналоговото увеличение на CCD матрицата"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Корекция на гамата"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Избира кривата на коригираната гама"
@@ -1077,8 +1078,8 @@ msgstr ""
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr ""
@@ -1129,598 +1130,608 @@ msgstr "2х2 нормално"
msgid "1/3 normal speed"
msgstr "3х3 нормално"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, fuzzy, no-c-format
msgid "rounded parameter"
msgstr "Параметри за мъглявост"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr ""
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, fuzzy, no-c-format
msgid "ADF jam"
msgstr "ADF"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr ""
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, fuzzy, no-c-format
msgid "lamp failure"
msgstr "Стойност на гамата"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr ""
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr ""
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr ""
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr ""
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr ""
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, fuzzy, no-c-format
msgid "transparency unit lamp failure"
msgstr "Прозрачност"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr ""
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr ""
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr ""
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr ""
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr ""
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr ""
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr ""
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr ""
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr ""
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr ""
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr ""
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr ""
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr ""
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr ""
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr ""
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr ""
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr ""
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr ""
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr ""
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, fuzzy, no-c-format
msgid "transparency unit shading error"
msgstr "Прозрачност"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr ""
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr ""
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, fuzzy, no-c-format
msgid "film scanner"
msgstr "flatbed скенер"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "flatbed скенер"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Тип екран (film)"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr ""
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, fuzzy, no-c-format
msgid "Negative film type"
msgstr "Негативен филм"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, fuzzy, no-c-format
msgid "Selects the negative film type"
msgstr "Избира картинка за тестване"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, fuzzy, no-c-format
msgid "Hardware resolution"
msgstr "Резолюция на сканиране"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, fuzzy, no-c-format
msgid "Use only hardware resolutions"
msgstr "Покажи кратък списък с резолюции"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr ""
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, fuzzy, no-c-format
msgid "Auto focus"
msgstr "Авто изваждане"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, fuzzy, no-c-format
msgid "Enable/disable auto focus"
msgstr "Забрани предв. фокус"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr ""
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr ""
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, fuzzy, no-c-format
msgid "Manual focus position"
msgstr "Фиксирай позиция на фокуса"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr ""
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr ""
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr ""
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Огледален образ"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, fuzzy, no-c-format
msgid "Mirror the image horizontally"
msgstr "Прави хоризонтален огледален образ."
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, fuzzy, no-c-format
msgid "Auto exposure"
msgstr "Установи време за експониране"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, fuzzy, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Позволи избор на време за експонация"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, fuzzy, no-c-format
msgid "Calibration now"
msgstr "Калибрация"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, fuzzy, no-c-format
msgid "Execute calibration *now*"
msgstr "Дефинирай режима на калибрация"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr ""
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr ""
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, fuzzy, no-c-format
msgid "Reset scanner"
msgstr "скенер с sheetfeed"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, fuzzy, no-c-format
msgid "Reset the scanner"
msgstr "скенер с sheetfeed"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr ""
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, fuzzy, no-c-format
msgid "Eject film after each scan"
msgstr "Извади документа след сканиране"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr ""
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr ""
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr ""
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr ""
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr ""
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, fuzzy, no-c-format
msgid "Document feeder extras"
msgstr "Feeder за документи"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, fuzzy, no-c-format
msgid "Flatbed only"
msgstr "Flatbed"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, fuzzy, no-c-format
msgid "Transparency unit"
msgstr "Прозрачност"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, fuzzy, no-c-format
msgid "Negative film"
msgstr "Негативен филм"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, fuzzy, no-c-format
msgid "Positive or negative film"
msgstr "Позитивен екран"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr ""
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr ""
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, fuzzy, no-c-format
msgid "Transparency ratio"
msgstr "Прозрачност"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, fuzzy, no-c-format
msgid "Select film type"
msgstr "Тип екран (film)"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, fuzzy, no-c-format
msgid "Select the film type"
msgstr "Избира полутона"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Flatbed"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr ""
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, fuzzy, no-c-format
msgid "ADF Back"
msgstr "ADF"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, fuzzy, no-c-format
msgid "ADF Duplex"
msgstr "Дуплексно"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Печат"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Дуплексно"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Червено"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Зелено"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Синьо"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Повишение"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Повишение"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Повишение"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Нищо"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Симплексно"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Дуплексно"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Прозрачност"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Автоматично подаване на документи"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Позитивен екран"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Негативен филм"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Фокус върху стъклото"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Фокус 2,5 мм над стъклото"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Полутон A (Твърд тон)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Полутон B (Мек тон)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Полутон C (Net Screen)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Dither A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Dither B (4x4 Spiral)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Dither C (4x4 Net Screen)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Dither D (8x4 Net Screen)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Технология за оконтрастиране на текста"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Свали десен B"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Свали десен B"
@@ -1730,7 +1741,7 @@ msgstr "Свали десен B"
msgid "No Correction"
msgstr "Без корекция"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "По потребителска дефиниция"
@@ -1755,33 +1766,33 @@ msgstr "Мастиленоструйни принтери"
msgid "CRT monitors"
msgstr "CRT монитори"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "По подразбиране"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Принтиране с висока гъстота"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Принтиране с ниска гъстота"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Принтиране с висок контраст"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "По потребителска дефиниция (Гама=1,0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "По потребителска дефиниция (Гама=1,8)"
@@ -1821,232 +1832,232 @@ msgstr "A4"
msgid "Max"
msgstr "Макс."
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Режим на сканиране"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Избира полутона"
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Dropout"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Избира dropout-а."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Избира яркостта."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Острота"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Цветова корекция."
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
"Наглася таблицата за цветова корекция на избраното изходно устройство."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Коефициенти на цветова корекция"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Матрично умножаване на RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Измести зелено към червено"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Измести зелено към синьо"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Измести червено към зелено"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Измести червено към синьо"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Измести синьо към зелено"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Измести синьо към червено"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Наглася степента на зелено"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Добавя към червеното според степента на зелено"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Добавя към синьото според степента на зелено"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Добавя към зеленото според степента на червено"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Наглася степента на червено"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Добавя към синьото според степента на червено"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Добавя към зеленото според степента на синьо"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Добавя към червеното според степента на синьо"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Наглася степента на синьо"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Направи огледален образ на изображението"
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Бързо превю"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Автоматична сегментация на площ"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Кратък списък резолюции"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Покажи кратък списък с резолюции"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Увеличение"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Определя фактора на увеличение за скенера"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Бързо форматиране"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Оборудване по избор"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Извади"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Извади листа от ADF"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Авто изваждане"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Извади документа след сканиране"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr ""
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr ""
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, fuzzy, no-c-format
msgid "Bay"
msgstr "Bay"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, fuzzy, no-c-format
msgid "Select bay to scan"
msgstr "Избор на bay за сканиране"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2056,24 +2067,24 @@ msgstr ""
"или таблицата, определена от потребителя, която може да се свали на "
"скенера."
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Позиция на фокуса"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr ""
"Наглася позицията на фокуса или върху стъклото, или 2,5 мм над него"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Изчакай натискане на бутона"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2082,262 +2093,340 @@ msgstr ""
"След изпращане на команда за сканиране, изчакай, докато бутонът на "
"скенера не е натиснат, преди да започнеш самото сканиране."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, fuzzy, no-c-format
msgid "Positive Slide"
msgstr "Позитивен екран"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, fuzzy, no-c-format
msgid "Negative Slide"
msgstr "Негативен филм"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "По потребителска дефиниция"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Вкл."
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Изкл."
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Dither"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, fuzzy, no-c-format
msgid "Diffusion"
msgstr "Разсейка на грешките"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Степен на бялото"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Степен на черното"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, fuzzy, no-c-format
msgid "Continue"
msgstr "Кондиционално"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Хоризонтално"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "Хоризонтално"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "Хоризонтално"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "8x8 вертикална черта"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "8x8 вертикална черта"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, fuzzy, no-c-format
msgid "Front"
msgstr "Печат"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, fuzzy, no-c-format
msgid "Extras"
msgstr "Екстра бързо"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Праг"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, fuzzy, no-c-format
msgid "Disable interpolation"
msgstr "Забрани връщане на главата"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
"than the vertical resolution this disables horizontal interpolation."
msgstr ""
-#: ../backend/genesys.c:6235
+#: ../backend/genesys.c:5869
#, fuzzy, no-c-format
-msgid "Color Filter"
+msgid "Color filter"
msgstr "Цветно Lineart"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Калибрация"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Дефинирай режима на калибрация"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Режим калибрация"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, fuzzy, no-c-format
msgid "Lamp off time"
msgstr "Изкл. лампа"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
"of 0 means, that the lamp won't be turned off."
msgstr ""
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Груба калибрация"
+
+#: ../backend/genesys.c:5941
+#, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr ""
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, fuzzy, no-c-format
msgid "File button"
msgstr "Изчакай натискане на бутона"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, fuzzy, no-c-format
msgid "Power button"
msgstr "Изчакай натискане на бутона"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Изчакай натискане на бутона"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Груба калибрация"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Задължителна калибрация преди сканиране"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr ""
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Калибриране"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, fuzzy, no-c-format
msgid "Start calibration using special sheet"
msgstr "Започване на калибрацията."
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, fuzzy, no-c-format
msgid "Clear calibration"
msgstr "Груба калибрация"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, fuzzy, no-c-format
msgid "Clear calibration cache"
msgstr "Режим калибрация"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Адаптиране на прозрачността"
@@ -2465,7 +2554,7 @@ msgstr "Режим на сканиране"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2606,12 +2695,12 @@ msgstr ""
msgid "This option reflects a front panel scanner button"
msgstr ""
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Изображение"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr ""
@@ -2636,17 +2725,17 @@ msgstr "Офсет"
msgid "Hardware internal Y position of the scanning area."
msgstr "Горна лява x позиция на площта за сканиране."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr ""
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Включва/изключва лампата."
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr ""
@@ -2754,8 +2843,8 @@ msgstr "По-бавно"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Нормално"
@@ -3092,9 +3181,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3393,7 +3482,7 @@ msgstr "Наглася подчертаването на образа"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Гама"
@@ -3460,16 +3549,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3480,16 +3559,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3558,7 +3627,7 @@ msgstr "Повишение"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3726,7 +3795,7 @@ msgstr "Увеличение - сиво"
msgid "Sets gray channel gain"
msgstr "Наглася увеличение на сивия канал"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3737,7 +3806,7 @@ msgstr "Увеличение - червено"
msgid "Sets red channel gain"
msgstr "Наглася увеличение на червения канал"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3748,7 +3817,7 @@ msgstr "Увеличение - зелено"
msgid "Sets green channel gain"
msgstr "Наглася увеличение на зеления канал"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3840,7 +3909,7 @@ msgstr "Една страница"
msgid "All pages"
msgstr "Всички страници"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, fuzzy, no-c-format
msgid "sheetfed scanner"
msgstr "скенер с sheetfeed"
@@ -3913,12 +3982,12 @@ msgstr "Използвай адаптера за 35мм светлинна ка
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "Тази опция изключва лампата на flatbed-а по време на сканиране"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Качествено сканиране"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Най-високо качество, по-ниска скорост"
@@ -4343,12 +4412,39 @@ msgstr ""
"Загрявай, докато яркостта на лампата е постоянна, вместо да настояваш за "
"40 секундно загряване."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Негативен филм"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Негатив"
+
+#: ../backend/pixma.c:396
+#, no-c-format
+msgid "48 bits color"
+msgstr ""
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr ""
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4356,198 +4452,218 @@ msgid ""
"cancel, press \"GRAY\" button."
msgstr ""
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
msgstr ""
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr ""
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr ""
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Прозрачност"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr ""
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr ""
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr ""
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, fuzzy, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Груба калибрация"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr ""
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, fuzzy, no-c-format
msgid "Calibration data cache"
msgstr "Режим калибрация"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr ""
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, fuzzy, no-c-format
msgid "Performs calibration"
msgstr "Груба калибрация"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr ""
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr ""
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, fuzzy, no-c-format
msgid "Warmup-time"
msgstr "Загрей лампата"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, fuzzy, no-c-format
msgid "Warmup-time in seconds."
msgstr "Загрей лампата"
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, fuzzy, no-c-format
msgid "Lampoff-time"
msgstr "Изкл. лампа"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, fuzzy, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Загрей лампата"
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, fuzzy, no-c-format
msgid "Analog frontend"
msgstr "Аналогова гама - червено"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Офсет - червено"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Офсет - зелено"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Офсет - синьо"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, fuzzy, no-c-format
msgid "Red lamp off"
msgstr "Включва/изключва лампата"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, fuzzy, no-c-format
msgid "Green lamp off"
msgstr "Включва/изключва лампата"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, fuzzy, no-c-format
msgid "Blue lamp off"
msgstr "Включва/изключва лампата"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr ""
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Цвят 36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr ""
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr ""
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Направи произволно"
@@ -4596,7 +4712,7 @@ msgstr "Симулация на ръчен скенер"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Симулира ръчен скенер. Ръчните скенери често не знаят височината на "
"образа а приори. Вместо това, те връщат стойност от -1. Пускането на "
@@ -4737,29 +4853,29 @@ msgstr ""
"Накарай бекенда да върне статус-кода SANE_STATUS_ACCESS_DENIED след "
"повикване на sane_read()."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr ""
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Вкл. лампа"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Включи лампата на скенера"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Изкл. лампа"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4780,42 +4896,42 @@ msgstr ""
msgid "Threshold value for lineart mode"
msgstr ""
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Feeder за документи"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 (инча)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8х10 (инча)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8,5х11 (инча)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Няма поддръжка на полутонове"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "DispersedDot8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "DispersedDot16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4831,12 +4947,27 @@ msgstr ""
"висок, X-базираните четци могат да спрат да отговарят на събитията по X "
"и системата ви може да увисне."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Извади документа след сканиране"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Режим на превю"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4845,12 +4976,12 @@ msgstr ""
"Избира режима на превю. Превю по сива скала обикновено дава най-добро "
"съотношение между скорост и детайлност."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Предефинирани настройки"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4859,12 +4990,42 @@ msgstr ""
"Осигурява стандартни площи за сканиране за снимки, принтирани страници и "
"подобни."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "flatbed скенер"
+
+#: ../backend/snapscan-options.c:897
+#, no-c-format
+msgid "Focus-mode"
+msgstr ""
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Авто изваждане"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Позиция на фокуса"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Позиция на фокуса"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Цветни линии на четене"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Линии на четене по сива скала"
@@ -4938,7 +5099,7 @@ msgstr "Симулация на ръчен скенер"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Симулира ръчен скенер. Ръчните скенери не знаят височината на "
@@ -5032,8 +5193,8 @@ msgstr "Лимит на четене"
#, no-c-format
msgid "Limit the amount of data transferred with each call to sane_read()."
msgstr ""
-"Ограничава количеството данни, предадени с всяко повикване на sane_read"
-"()."
+"Ограничава количеството данни, предадени с всяко повикване на "
+"sane_read()."
#: ../backend/test.c:498
#, no-c-format
@@ -5045,8 +5206,8 @@ msgstr "Размер на лимита на четене"
msgid ""
"The (maximum) amount of data transferred with each call to sane_read()."
msgstr ""
-"(Максималното) количество данни, предадени с всяко повикване на sane_read"
-"()."
+"(Максималното) количество данни, предадени с всяко повикване на "
+"sane_read()."
#: ../backend/test.c:514
#, no-c-format
diff --git a/po/cs.po b/po/cs.po
index 20dd87a..c7c3e7c 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends.cs\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2007-12-17 22:59+0100\n"
"Last-Translator: Josef <joeprusa@volny.cz>\n"
"Language-Team: \n"
@@ -26,17 +26,17 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -45,25 +45,25 @@ msgid "Geometry"
msgstr "Geometrie"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Vylepšení"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Pokročilé"
@@ -88,8 +88,8 @@ msgstr "Vynutit monochromatický náhled"
msgid "Bit depth"
msgstr "Bitová hloubka"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Režim skenu"
@@ -129,7 +129,8 @@ msgstr "Pravý dolní roh x"
msgid "Bottom-right y"
msgstr "Pravý dolní roh y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Rozlišení"
@@ -297,7 +298,7 @@ msgstr "Svázat rozlišení X a Y"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -969,7 +970,7 @@ msgstr "Standardní nastavení"
msgid "Set default values for enhancement controls."
msgstr "Nastavit standardní hodnoty prvků pro vylepšení obrázku"
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Kalibrace"
@@ -1009,63 +1010,63 @@ msgstr ""
msgid "Button state"
msgstr "Stav tlačítek"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Číslo políčka pro sken"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Zvolí číslo políčka, které bude naskenováno"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, fuzzy, no-c-format
msgid "Duplex scan"
msgstr "Oboustraně"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr ""
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Kalibrovat skener"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Vynutit kalibraci skeneru před skenováním"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Stupně šedé"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Skenovat ve stupních šedé místo v barvě"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Analogový zisk"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Zvýšit nebo snížit analogový zisk CCD pole"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Korekce gama"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Nastaví gama korekci přenosové křivky"
@@ -1077,8 +1078,8 @@ msgstr ""
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr ""
@@ -1129,598 +1130,608 @@ msgstr "2x2 normální"
msgid "1/3 normal speed"
msgstr "3x3 normální"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, fuzzy, no-c-format
msgid "rounded parameter"
msgstr "Nepřesné (fuzzy) parametry"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr ""
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr ""
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr ""
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, fuzzy, no-c-format
msgid "lamp failure"
msgstr "Hodnota gama"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr ""
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr ""
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr ""
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr ""
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr ""
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, fuzzy, no-c-format
msgid "transparency unit lamp failure"
msgstr "Prosvětlovací jednotka"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr ""
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr ""
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr ""
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr ""
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr ""
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr ""
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr ""
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr ""
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr ""
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr ""
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr ""
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr ""
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr ""
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr ""
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr ""
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr ""
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr ""
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr ""
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr ""
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, fuzzy, no-c-format
msgid "transparency unit shading error"
msgstr "Prosvětlovací jednotka"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr ""
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr ""
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, fuzzy, no-c-format
msgid "film scanner"
msgstr "Stolní skener"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "Stolní skener"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Typ filmu"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr ""
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, fuzzy, no-c-format
msgid "Negative film type"
msgstr "Negativní film"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, fuzzy, no-c-format
msgid "Selects the negative film type"
msgstr "Zvolit testovací obrázek"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, fuzzy, no-c-format
msgid "Hardware resolution"
msgstr "Rozlišení"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, fuzzy, no-c-format
msgid "Use only hardware resolutions"
msgstr "Zobrazí zkrácený seznam rozlišení"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr ""
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, fuzzy, no-c-format
msgid "Auto focus"
msgstr "Automaticky vysunout"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, fuzzy, no-c-format
msgid "Enable/disable auto focus"
msgstr "Vyřadit předběžné zaostření"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr ""
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr ""
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, fuzzy, no-c-format
msgid "Manual focus position"
msgstr "Pozice pevného zaostření"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr ""
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr ""
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr ""
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Zrcadlit obrázek"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, fuzzy, no-c-format
msgid "Mirror the image horizontally"
msgstr "Zrcadlit obrázek"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, fuzzy, no-c-format
msgid "Auto exposure"
msgstr "Nastavit expoziční čas"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, fuzzy, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Povolit volbu expozičních časů"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, fuzzy, no-c-format
msgid "Calibration now"
msgstr "Kalibrace"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, fuzzy, no-c-format
msgid "Execute calibration *now*"
msgstr "Definovat režim kalibrace"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr ""
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr ""
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, fuzzy, no-c-format
msgid "Reset scanner"
msgstr "skener s podavačem"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, fuzzy, no-c-format
msgid "Reset the scanner"
msgstr "skener s podavačem"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr ""
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, fuzzy, no-c-format
msgid "Eject film after each scan"
msgstr "Vysunout dokument po naskenování"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr ""
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr ""
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr ""
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr ""
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr ""
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, fuzzy, no-c-format
msgid "Document feeder extras"
msgstr "Podavač dokumentů"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, fuzzy, no-c-format
msgid "Flatbed only"
msgstr "Stolní"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, fuzzy, no-c-format
msgid "Transparency unit"
msgstr "Prosvětlovací jednotka"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, fuzzy, no-c-format
msgid "Negative film"
msgstr "Negativní film"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, fuzzy, no-c-format
msgid "Positive or negative film"
msgstr "Pozitivní film"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr ""
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr ""
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, fuzzy, no-c-format
msgid "Transparency ratio"
msgstr "Prosvětlovací jednotka"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, fuzzy, no-c-format
msgid "Select film type"
msgstr "Typ filmu"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, fuzzy, no-c-format
msgid "Select the film type"
msgstr "Zvolit polotóny"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Stolní"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr ""
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
msgstr ""
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, fuzzy, no-c-format
msgid "ADF Duplex"
msgstr "Oboustraně"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, no-c-format
+msgid "Card Front"
+msgstr ""
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Oboustraně"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Červená"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Zelená"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Modrá"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Vylepšení"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Vylepšení"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Vylepšení"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Žádné"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Jednostraně"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Oboustraně"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Prosvětlovací jednotka"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Automatický podavač dokumentů"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Pozitivní film"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Negativní film"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Zaostření na sklo"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Zaostření 2,5 mm nad sklo"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Polotón A (ostrý)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Polotón B (měkký)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Polotón C (síť - \"Net Screen\")"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Rozptyl A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Rozptyl B (4x4 Spirálový)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Rozptyl C (4x4 Síťový)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Rozptyl D (8x4 Síťový)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Technika vylepšení textu"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Download vzor A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Download vzor B"
@@ -1730,7 +1741,7 @@ msgstr "Download vzor B"
msgid "No Correction"
msgstr "Bez korekce"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Uživatelské nastavení"
@@ -1755,33 +1766,33 @@ msgstr "Inkoustové tiskárny"
msgid "CRT monitors"
msgstr "CRT monitory"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Standard"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Tisk ve vysoké kvalitě"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Tisk v nízké kvalitě"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Tisk s vysokým kontrastem"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Uživatelsky definováno (Gama=1,0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Uživatelsky definováno (Gama=1,8)"
@@ -1821,231 +1832,231 @@ msgstr "A4"
msgid "Max"
msgstr "Max"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Režim skenování"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Zvolit polotóny"
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Výpadek"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Nastaví výpadek."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Nastaví jas."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Zaostření"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Barevná korekce"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr "Nastaví tabulku barevných korekcí pro vybrané výstupní zařízení."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Koeficienty barevných korekcí"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Násobící matice RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Posun zelená-červená"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Posun zelená-modrá"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Posun červená-zelená"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Posun červená-modrá"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Posun modrá-zelená"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Posun modrá-červená"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Ovládá úroveň zelené"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Přidává červenou v závislosti na úrovni zelené"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Přidává modrou v závislosti na úrovni zelené"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Přidává zelenou v závislosti na úrovni červené"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Ovládá úroveň červené"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Přidává modrou v závislosti na úrovni červené"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Přidává zelenou v závislosti na úrovni modré"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Přidává červenou v závislosti na úrovni modré"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Ovládá úroveň modré"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Zrcadlí obrázek."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Rychlý náhled"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Automatické rozložení plochy"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Zkrácený seznam rozlišení"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Zobrazí zkrácený seznam rozlišení"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Přiblížení"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Nastaví faktor přiblížení, který skener použije"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Rychlý formát"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Volitelné příslušenství"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Vysunout"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Vysunout papír z automatického podavače"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Automaticky vysunout"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Vysunout dokument po naskenování"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr ""
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr ""
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Pozice"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Zvolte pozici pro sken"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2054,23 +2065,23 @@ msgstr ""
"Zvolit gama korekci ze seznamu předdefinovaných zařízení nebo "
"uživatelské tabulky, kterou lze nahrát do skeneru"
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Pozice zaostření"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr "Nastaví pozici zaostření buď na sklo nebo 2,5 mm nad sklo"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Čekat na tlačítko"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2079,262 +2090,340 @@ msgstr ""
"Po odeslání příkazu ke skenování se s vlastním skenem čeká až na stisk "
"tlačítka na skeneru."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, fuzzy, no-c-format
msgid "Positive Slide"
msgstr "Pozitivní film"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, fuzzy, no-c-format
msgid "Negative Slide"
msgstr "Negativní film"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "Uživatelské nastavení"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr ""
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr ""
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Rozptyl"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, fuzzy, no-c-format
msgid "Diffusion"
msgstr "Chybový rozptyl"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Úroveň bílé"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Úroveň černé"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, no-c-format
msgid "Continue"
msgstr ""
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Horizontální"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "Horizontální"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "Horizontální"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Vertikální"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "Vertikální"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, no-c-format
msgid "Front"
msgstr ""
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, fuzzy, no-c-format
msgid "Extras"
msgstr "Velmi rychlý"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Prahová hodnota"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, fuzzy, no-c-format
msgid "Disable interpolation"
msgstr "Vyřadit zpětný chod"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
"than the vertical resolution this disables horizontal interpolation."
msgstr ""
-#: ../backend/genesys.c:6235
+#: ../backend/genesys.c:5869
#, fuzzy, no-c-format
-msgid "Color Filter"
+msgid "Color filter"
msgstr "Barevná perokresba"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Kalibrace"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Definovat režim kalibrace"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Režim kalibrace"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, fuzzy, no-c-format
msgid "Lamp off time"
msgstr "Vypnout lampu"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
"of 0 means, that the lamp won't be turned off."
msgstr ""
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Hrubá kalibrace"
+
+#: ../backend/genesys.c:5941
+#, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr ""
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, fuzzy, no-c-format
msgid "File button"
msgstr "Čekat na tlačítko"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, fuzzy, no-c-format
msgid "Power button"
msgstr "Čekat na tlačítko"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Čekat na tlačítko"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Hrubá kalibrace"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Vynutit kalibraci skeneru před skenováním"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, fuzzy, no-c-format
msgid "Buttons"
msgstr "Stav tlačítek"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Kalibrovat"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, fuzzy, no-c-format
msgid "Start calibration using special sheet"
msgstr "Hrubá kalibrace"
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, fuzzy, no-c-format
msgid "Clear calibration"
msgstr "Hrubá kalibrace"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, fuzzy, no-c-format
msgid "Clear calibration cache"
msgstr "Režim kalibrace"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Prosvětlovací adaptér"
@@ -2462,7 +2551,7 @@ msgstr "Režim skenu"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2603,12 +2692,12 @@ msgstr ""
msgid "This option reflects a front panel scanner button"
msgstr ""
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Obrázek"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Různé"
@@ -2633,17 +2722,17 @@ msgstr "Odstup"
msgid "Hardware internal Y position of the scanning area."
msgstr "Levý horní roh x skenované plochy."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Stav lampy"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Zapíná a vypíná lampu."
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Kalibruje úrovně černé a bílé."
@@ -2751,8 +2840,8 @@ msgstr "Pomalý"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normální"
@@ -3083,9 +3172,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, no-c-format
msgid "continuous"
@@ -3384,7 +3473,7 @@ msgstr "Nastaví zvýraznění obrázku"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gama"
@@ -3451,16 +3540,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3471,16 +3550,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3549,7 +3618,7 @@ msgstr "Vylepšení"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3717,7 +3786,7 @@ msgstr "Zisk šedé"
msgid "Sets gray channel gain"
msgstr "Nastavuje zisk šedého kanálu"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3728,7 +3797,7 @@ msgstr "Zisk červené"
msgid "Sets red channel gain"
msgstr "Nastavuje zisk červeného kanálu"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3739,7 +3808,7 @@ msgstr "Zisk zelené"
msgid "Sets green channel gain"
msgstr "Nastavuje zisk zeleného kanálu"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3831,7 +3900,7 @@ msgstr "Jedna strana"
msgid "All pages"
msgstr "Všechny strany"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "skener s podavačem"
@@ -3902,12 +3971,12 @@ msgstr "Použít prosvětlovací adaptér pro film 35mm"
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "Tato volba vypne během skenu lampu plochého skeneru"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Sken v plné kvalitě"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Vysoká kvalita ale nižší rychlost"
@@ -4331,12 +4400,39 @@ msgstr ""
"Zahřát lampu dokud její jas není konstantní namísto standardního 40ti "
"sekundového zahřívání."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Negativní film"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negativ"
+
+#: ../backend/pixma.c:396
+#, no-c-format
+msgid "48 bits color"
+msgstr ""
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr ""
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4344,198 +4440,218 @@ msgid ""
"cancel, press \"GRAY\" button."
msgstr ""
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, fuzzy, no-c-format
msgid "Update button state"
msgstr "Stav tlačítek"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, fuzzy, no-c-format
msgid "Button 1"
msgstr "Stav tlačítek"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, fuzzy, no-c-format
msgid "Button 2"
msgstr "Stav tlačítek"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Průsvitná předloha"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr ""
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr ""
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr ""
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, fuzzy, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Hrubá kalibrace"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr ""
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, fuzzy, no-c-format
msgid "Calibration data cache"
msgstr "Režim kalibrace"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr ""
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, fuzzy, no-c-format
msgid "Performs calibration"
msgstr "Hrubá kalibrace"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr ""
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr ""
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, fuzzy, no-c-format
msgid "Warmup-time"
msgstr "Zahřát lampu"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, fuzzy, no-c-format
msgid "Warmup-time in seconds."
msgstr "Zahřát lampu"
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, fuzzy, no-c-format
msgid "Lampoff-time"
msgstr "Vypnout lampu"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, fuzzy, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Zahřát lampu"
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, fuzzy, no-c-format
msgid "Analog frontend"
msgstr "Analogová korekce gama pro červenou"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Odstup červené"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Odstup zelené"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Odstup modré"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, fuzzy, no-c-format
msgid "Red lamp off"
msgstr "Zapíná/vypíná lampu"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, fuzzy, no-c-format
msgid "Green lamp off"
msgstr "Zapíná/vypíná lampu"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, fuzzy, no-c-format
msgid "Blue lamp off"
msgstr "Zapíná/vypíná lampu"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr ""
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Barva 36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Rozptyl 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Rozptyl 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Náhodný"
@@ -4584,7 +4700,7 @@ msgstr "Simulace ručního skeneru"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Simuluje ruční skener. Ruční skenery obvykle neznají výšku obrázku "
"předem. Proto vracejí výšku 1. Tato volba umožnuje otestovat, jestli se "
@@ -4725,29 +4841,29 @@ msgstr ""
"Přinutit backend, aby po volání sane_read() vrátil stavový kód "
"SANE_STATUS_ACCESS_DENIED."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr ""
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Zapnout lampu"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Zapnout lampu skeneru"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Vypnout lampu"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4768,42 +4884,42 @@ msgstr ""
msgid "Threshold value for lineart mode"
msgstr ""
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Podavač dokumentů"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "15 x 10 (cm)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "20x24 (cm)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "22x28 (cm)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Polotón není podporován"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "Bodový rozptyl 8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "Bodový rozptyl 16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4818,12 +4934,27 @@ msgstr ""
"skenování zastavovat, pokud je příliš vysoké, skenovací rozhraní v "
"prostředí X mohou přestat reagovat a systém může zkolabovat."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Vysunout dokument po naskenování"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Režim náhledu"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4832,12 +4963,12 @@ msgstr ""
"Volí režim náhledu. Náhled ve stupních šedé obvykle nabízí nejlepší "
"kombinaci rychlosti a detailu."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Přednastavené hodnoty"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4846,12 +4977,42 @@ msgstr ""
"Poskytuje standardní skenovací plochu pro fotografie, vytištěné stránky "
"apod."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "Stolní skener"
+
+#: ../backend/snapscan-options.c:897
+#, no-c-format
+msgid "Focus-mode"
+msgstr ""
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Automaticky vysunout"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Pozice zaostření"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Pozice zaostření"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Počet barevných čar na jedno čtení"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Počet čar ve stupních šedi na jedno čtení"
@@ -4925,7 +5086,7 @@ msgstr "Simulace ručního skeneru"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Simuluje ruční skener. Ruční skenery obvykle neznají výšku obrázku "
diff --git a/po/da.po b/po/da.po
index 4eb40ea..8d0a644 100644
--- a/po/da.po
+++ b/po/da.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends 1.0.17\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2007-12-17 22:59+0100\n"
"Last-Translator: Mogens Jaeger <mogensjaeger@get2net.dk>\n"
"Language-Team: Danish <dansk@klid.dk>\n"
@@ -31,17 +31,17 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -50,25 +50,25 @@ msgid "Geometry"
msgstr "Skanområde"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Forbedring"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Avanceret"
@@ -93,8 +93,8 @@ msgstr "Gennemtving monokrom smugkig"
msgid "Bit depth"
msgstr "Bit dybde"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Skannertilstand"
@@ -134,7 +134,8 @@ msgstr "Nederst-højre x"
msgid "Bottom-right y"
msgstr "Nederst-højre y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Skanningsopløsning"
@@ -302,7 +303,7 @@ msgstr "Sammenbind X- og Y-opløsning"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -972,7 +973,7 @@ msgstr "Standard"
msgid "Set default values for enhancement controls."
msgstr "Anvend standardværdier for forbedringskontroller."
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Kalibrering"
@@ -1013,63 +1014,63 @@ msgstr ""
msgid "Button state"
msgstr "Knap tilstand"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Billednummer der skal skannes"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Vælger nummeret på det billede der skal skannes"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Duplex skan"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr "Duplex skan, skanner begge sider af dokumentet"
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Kalibrér skanner"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Gennemtving kalibrering før skanning"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Gråskalaskanning"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Udfør en gråskalaskanning fremfor en farveskanning"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Analog forstærkning"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Forøg eller formindsk CCD sensorens analoge forstærkning"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Gammakorrektion"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Vælger gammakorrigeret overføringskurve"
@@ -1081,8 +1082,8 @@ msgstr ""
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr ""
@@ -1133,598 +1134,608 @@ msgstr "2x2 normal"
msgid "1/3 normal speed"
msgstr "3x3 normal"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, fuzzy, no-c-format
msgid "rounded parameter"
msgstr "Uklare parametre"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr ""
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, fuzzy, no-c-format
msgid "ADF jam"
msgstr "ADF"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr ""
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, fuzzy, no-c-format
msgid "lamp failure"
msgstr "Gamma værdi"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr ""
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr ""
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr ""
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr ""
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr ""
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, fuzzy, no-c-format
msgid "transparency unit lamp failure"
msgstr "Filmenhed"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr ""
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr ""
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr ""
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr ""
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr ""
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr ""
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr ""
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr ""
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr ""
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr ""
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr ""
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr ""
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr ""
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr ""
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr ""
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr ""
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr ""
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr ""
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr ""
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, fuzzy, no-c-format
msgid "transparency unit shading error"
msgstr "Filmenhed"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr ""
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr ""
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, fuzzy, no-c-format
msgid "film scanner"
msgstr "Flatbed skanner"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "Flatbed skanner"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Filmtype"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr ""
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, fuzzy, no-c-format
msgid "Negative film type"
msgstr "Negativ film"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, fuzzy, no-c-format
msgid "Selects the negative film type"
msgstr "Vælg testbillede"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, fuzzy, no-c-format
msgid "Hardware resolution"
msgstr "Skanningsopløsning"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, fuzzy, no-c-format
msgid "Use only hardware resolutions"
msgstr "Vis kort liste med mulige opløsninger"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr ""
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, fuzzy, no-c-format
msgid "Auto focus"
msgstr "Automatisk skub ud"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, fuzzy, no-c-format
msgid "Enable/disable auto focus"
msgstr "Deaktiver pre-fokusering"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr ""
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr ""
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, fuzzy, no-c-format
msgid "Manual focus position"
msgstr "Fast fokusposition"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr ""
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr ""
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr ""
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Spejl billedet"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, fuzzy, no-c-format
msgid "Mirror the image horizontally"
msgstr "Spejlvend billedet vandret."
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, fuzzy, no-c-format
msgid "Auto exposure"
msgstr "Fastsæt eksponeringstid"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, fuzzy, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Aktiver valg af belysningstid"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, fuzzy, no-c-format
msgid "Calibration now"
msgstr "Kalibrering"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, fuzzy, no-c-format
msgid "Execute calibration *now*"
msgstr "Definer kalibreringstilstand"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr ""
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr ""
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, fuzzy, no-c-format
msgid "Reset scanner"
msgstr "arkføder skanner"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, fuzzy, no-c-format
msgid "Reset the scanner"
msgstr "arkføder skanner"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr ""
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, fuzzy, no-c-format
msgid "Eject film after each scan"
msgstr "Skub dokumentet ud efter skanning"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr ""
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr ""
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr ""
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr ""
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr ""
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, fuzzy, no-c-format
msgid "Document feeder extras"
msgstr "Dokument føder"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, fuzzy, no-c-format
msgid "Flatbed only"
msgstr "Flatbed"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, fuzzy, no-c-format
msgid "Transparency unit"
msgstr "Filmenhed"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, fuzzy, no-c-format
msgid "Negative film"
msgstr "Negativ film"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, fuzzy, no-c-format
msgid "Positive or negative film"
msgstr "Positiv film"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr ""
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr ""
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, fuzzy, no-c-format
msgid "Transparency ratio"
msgstr "Filmenhed"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, fuzzy, no-c-format
msgid "Select film type"
msgstr "Filmtype"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, fuzzy, no-c-format
msgid "Select the film type"
msgstr "Vælger halvtone."
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Flatbed"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr ""
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, fuzzy, no-c-format
msgid "ADF Back"
msgstr "ADF"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, fuzzy, no-c-format
msgid "ADF Duplex"
msgstr "Dobbeltsidet"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Print"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Dobbeltsidet"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Rød"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Grøn"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Blå"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Forbedring"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Forbedring"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Forbedring"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Ingen"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Enkeltsidet"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Dobbeltsidet"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Filmenhed"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Automatisk dokumentføder"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Positiv film"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Negativ film"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Fokusér på glaspladen"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Fokusér 2,5 mm over glaspladen"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Halvtone A (hård tone)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Halvtone B (blød tone)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Halvtone C (net/skærm)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Dithering A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Dithering B (4x4 spiral)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Dithering C (4x4 net/skærm)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Dithering D (8x4 net/skærm)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Tekstforbedringsteknologi"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Hent mønster A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Hent mønster B"
@@ -1734,7 +1745,7 @@ msgstr "Hent mønster B"
msgid "No Correction"
msgstr "Ingen korrektion"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Brugerdefineret"
@@ -1759,33 +1770,33 @@ msgstr "Blæk printere"
msgid "CRT monitors"
msgstr "CRT skærme"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Standard"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Udskrift med høj opløsning"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Udskrift med lav opløsning"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Udskrift med høj kontrast"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Brugerdefineret (gamma=1,0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Brugerdefineret (gamma=1,8)"
@@ -1825,231 +1836,231 @@ msgstr "A4"
msgid "Max"
msgstr "Maks"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Skanner tilstand"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Vælger halvtone."
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Udfald"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Vælger udfaldet."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Vælger lyshed."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Skarphed"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Farvekorrektion"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr "Fastsætter farvekorrektiontabellen for den valgte uddataenhed."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Farvekorrektionskoefficienter"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Matrix multiplikation af RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Forskyder grøn mod rød"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Forskyder grøn mod blå"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Forskyder rød mod grøn"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Forskyder rød mod blå"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Forskyder blå mod grøn"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Forskyder blå mod rød"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Kontrollerer grønt niveau"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Øger det røde, baseret på grønt niveau"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Øger det blå, baseret på grønt niveau"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Øger det grønne, baseret på rødt niveau"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Fastsætter rødt niveau"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Øger det blå, baseret på rødt niveau"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Øger det grønne, baseret på blåt niveau"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Øger det røde, baseret på blåt niveau"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Fastsætter blåt niveau"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Spejlvend billedet."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Hurtig forhåndsvisning"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Automatisk områdeopdeling"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Kort opløsningsliste"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Vis kort liste med mulige opløsninger"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Forstørrelse"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Angiver zoomfaktoren som skanneren skal bruge"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Hurtig format"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Tilvalgsudstyr"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Skub ud"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Skub arket i den automatiske arkføder ud"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Automatisk skub ud"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Skub dokumentet ud efter skanning"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "ADF-tilstand"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Vælger ADF tilstand (enkeltsidet/dobbeltsidet)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Skuffe"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Vælg fra hvilken skuffe der skal skannes"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2058,24 +2069,24 @@ msgstr ""
"Vælger gammakorrektionsværdi fra en liste med foruddefinerede enheder "
"eller en brugerdefineret tabel, som kan hentes til skanneren"
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Fokuseringspunkt"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr ""
"Fastsætter fokuseringen enten på glaspladen eller 2,5 mm over denne"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Vent på knap"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2084,200 +2095,263 @@ msgstr ""
"Når skankommando er sendt, starter skanningen først når der er trykket "
"på knappen på skanneren."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, fuzzy, no-c-format
msgid "Positive Slide"
msgstr "Positiv film"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, fuzzy, no-c-format
msgid "Negative Slide"
msgstr "Negativ film"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "Brugerdefineret"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Tændt"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Slukket"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Dither"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, fuzzy, no-c-format
msgid "Diffusion"
msgstr "Fejlspredning"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Hvid niveau"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Sort niveau"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, fuzzy, no-c-format
msgid "Continue"
msgstr "Betinget"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Vandret"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "Vandret"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "Vandret"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Lodret"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "Lodret"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, fuzzy, no-c-format
msgid "Front"
msgstr "Print"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Ekstra"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Tærskelværdi"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, fuzzy, no-c-format
msgid "Disable interpolation"
msgstr "Deaktiver bagudrettet sporing"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
"than the vertical resolution this disables horizontal interpolation."
msgstr ""
-#: ../backend/genesys.c:6235
+#: ../backend/genesys.c:5869
#, fuzzy, no-c-format
-msgid "Color Filter"
+msgid "Color filter"
msgstr "Farve stregtegning"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Kalibrering"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Definer kalibreringstilstand"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Kalibreringsdatacache"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Sluk-lampe tid"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2286,62 +2360,77 @@ msgstr ""
"Lampen bliver slukket efter den angivne tid (i minutter). Værdien 0 "
"bevirker, at lampen ikke bliver slukket."
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Grovkalibrering"
+
+#: ../backend/genesys.c:5941
+#, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr ""
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, fuzzy, no-c-format
msgid "File button"
msgstr "Vent på knap"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, fuzzy, no-c-format
msgid "Power button"
msgstr "Vent på knap"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Vent på knap"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Grovkalibrering"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Gennemtving kalibrering før skanning"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Knapper"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Kalibrering"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, fuzzy, no-c-format
msgid "Start calibration using special sheet"
msgstr "Begynd kalibreringsprocessen."
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, fuzzy, no-c-format
msgid "Clear calibration"
msgstr "Grovkalibrering"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, fuzzy, no-c-format
msgid "Clear calibration cache"
msgstr "Kalibreringsdatacache"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Filmadapter"
@@ -2475,7 +2564,7 @@ msgstr "Skannertilstand"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2616,12 +2705,12 @@ msgstr ""
msgid "This option reflects a front panel scanner button"
msgstr "Denne indstilling reflekterer skannerknappernes status."
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Billede"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Diverse"
@@ -2646,17 +2735,17 @@ msgstr "Forskydning"
msgid "Hardware internal Y position of the scanning area."
msgstr "Øverste-venstre x position af skanområde."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Lampe status"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Tænder/slukker for lampen"
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Kalibrerer for sort og hvidt niveau."
@@ -2764,8 +2853,8 @@ msgstr "Langsom"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normal"
@@ -3101,9 +3190,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3402,7 +3491,7 @@ msgstr "Fastsætter billedbetoning"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gamma"
@@ -3469,16 +3558,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3489,16 +3568,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3567,7 +3636,7 @@ msgstr "Forbedring"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3735,7 +3804,7 @@ msgstr "Grå-forstærkning"
msgid "Sets gray channel gain"
msgstr "Fastsætter grå-kanals forstærkning"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3746,7 +3815,7 @@ msgstr "Rød forstærkning"
msgid "Sets red channel gain"
msgstr "Fastsætter rød-kanals forstærkning"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3757,7 +3826,7 @@ msgstr "Grøn forstærkning"
msgid "Sets green channel gain"
msgstr "Fastsætter grøn-kanals forstærkning"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3849,7 +3918,7 @@ msgstr "En side"
msgid "All pages"
msgstr "Alle sider"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "arkføder skanner"
@@ -3920,12 +3989,12 @@ msgstr "Anvend lightlid-35 mm-adapteren"
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "Denne indstilling slukker lampen i flatbed'en under skanning"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Kvalitets skanning"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Højeste kvalitet men lavere hastighed"
@@ -4351,12 +4420,39 @@ msgstr ""
"Varm op indtil lampens lyshed er konstant, i stedet for at insistere på "
"40 sekunders opvarmningstid."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Negativ film"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negativ"
+
+#: ../backend/pixma.c:396
+#, no-c-format
+msgid "48 bits color"
+msgstr ""
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr ""
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4364,198 +4460,218 @@ msgid ""
"cancel, press \"GRAY\" button."
msgstr ""
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, fuzzy, no-c-format
msgid "Update button state"
msgstr "Knap tilstand"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr "Knap 1"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr "Knap 2"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Film"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr "Enhedsindstillinger"
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr "Lampe afbryder"
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr "Manuelt tænd/sluk for lampen(lamperne)."
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, fuzzy, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Grovkalibrering"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr ""
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, no-c-format
msgid "Calibration data cache"
msgstr "Kalibreringsdatacache"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr "Aktivér eller deaktivér kalibreringsdatacache."
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, fuzzy, no-c-format
msgid "Performs calibration"
msgstr "Grovkalibrering"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr "Hastighedsøgnings sensor"
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr "Til/fra for øgning af sensors hastighed."
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr "Opvarmningstid"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr "Opvarmningstid i sekunder."
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr "Sluk lampe tid"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Sluk lampe tid i sekunder."
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr "Analog forende"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr "Rød forstærkningsværdi for den analoge forende"
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Rød forskydning"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr "Rød forskydningsværdi for den analoge forende"
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr "Grøn forstærkningsværdi for den analoge forende"
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Grøn forskydning"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr "Grøn forskydningsværdi for den analoge forende"
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr "Blå forstærkningsværdi for den analoge forende"
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Blå forskydning"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr "Blå forskydningsværdi for den analoge forende"
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr "Rød lampe slukket"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr "Fastsætter parametre for slukning af rød lampe"
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr "Grøn lampe slukket"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr "Fastsætter parametre for slukning af grøn lampe"
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr "Blå lampe slukket"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr "Fastsætter parametre for slukning af blå lampe"
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr "Denne indstilling reflekterer skannerknappernes status."
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Farve 36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Ditheringsmønster 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Ditheringsmønster 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Udvælge tilfældigt"
@@ -4604,7 +4720,7 @@ msgstr "Håndskanner simulering"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Simulerer en håndskanner. Oftest kender en håndskanner ikke billedhøjden "
"i forvejen. I stedet for returnerer de en højde på -1. Sættes denne "
@@ -4745,29 +4861,29 @@ msgstr ""
"Tving bagenden til at returnere statuskoden SANE_STATUS_ACCESS_DENIED "
"efter sane_read() er blevet kaldt."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, fuzzy, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Denne indstilling reflekterer skannerknappernes status."
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Lampe tændt"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Tænd for skannerlampen"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Sluk lampe"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4788,42 +4904,42 @@ msgstr ""
msgid "Threshold value for lineart mode"
msgstr ""
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Dokument føder"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 (tommer)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 (tommer)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11 (tommer)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Halvtone er ikke understøttet"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "Spredte punkter 8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "Spredte punkter 16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4839,12 +4955,27 @@ msgstr ""
"baserede forender stoppe med at reagere på X begivenheder, og dit system "
"går ned."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Skub dokumentet ud efter skanning"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Smugkigtilstand"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4853,24 +4984,54 @@ msgstr ""
"Vælg tilstand for forhåndsvisning. Gråskala smugkig er normalt det "
"bedste kompromis mellem hastighed og detaljerigdom."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Foruddefinerede indstillinger"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
"like."
msgstr "Giver standard skanområde for fotografier, tryk o.l."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "Flatbed skanner"
+
+#: ../backend/snapscan-options.c:897
+#, no-c-format
+msgid "Focus-mode"
+msgstr ""
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Automatisk skub ud"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Fokuseringspunkt"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Fokuseringspunkt"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Farvelinier pr. læsning"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Gråskalalinier pr. læsning"
@@ -4944,7 +5105,7 @@ msgstr "Håndskanner simulering"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Simulerer en håndskanner. Håndskannere kender ikke forud billedhøjden. I "
diff --git a/po/de.po b/po/de.po
index 77d2eec..11be186 100644
--- a/po/de.po
+++ b/po/de.po
@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-07-18 22:34+0200\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2010-08-06 17:17+0100\n"
"Last-Translator: Rolf Bensch <rolf at bensch hyphen online dot de>\n"
"Language-Team: German <kde-i18n-de@kde.org>\n"
@@ -36,8 +36,8 @@ msgid "Standard"
msgstr "Standard"
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:5530 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
@@ -55,13 +55,13 @@ msgid "Geometry"
msgstr "Scanbereich"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1498 ../backend/genesys.c:5590
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:854
+#: ../backend/niash.c:754 ../backend/plustek.c:854
#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
@@ -70,9 +70,9 @@ msgstr "Scanbereich"
msgid "Enhancement"
msgstr "Farbverbesserung"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2825
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
@@ -1041,22 +1041,22 @@ msgstr ""
msgid "Button state"
msgstr "Schalter Status"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Nummer des zu scannenden Bildes"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Wählt die Nummer des zu scannenden Bildes aus"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Duplexscan"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
@@ -1338,8 +1338,8 @@ msgstr "Filmscanner"
msgid "flatbed scanner"
msgstr "Flachbettscanner"
-#: ../backend/canon.c:1183 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Filmtyp"
@@ -1415,8 +1415,8 @@ msgstr "Scan Seitenrand"
msgid "Extra color adjustments"
msgstr "Erweiterte Farbeinstellungen"
-#: ../backend/canon.c:1538 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
@@ -1564,12 +1564,12 @@ msgstr "Filmtyp auswählen"
msgid "Select the film type"
msgstr "Wählt den Filmtyp aus"
-#: ../backend/canon_dr.c:340 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:114 ../backend/fujitsu.c:604
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:167 ../backend/mustek.c:156
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
@@ -1577,71 +1577,86 @@ msgstr "Wählt den Filmtyp aus"
msgid "Flatbed"
msgstr "Flachbett"
-#: ../backend/canon_dr.c:341 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:605 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr "Automatischer Dokumenteneinzug vorne"
-#: ../backend/canon_dr.c:342 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:606 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
msgstr "Automatischer Dokumenteneinzug hinten"
-#: ../backend/canon_dr.c:343 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:607 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "ADF-Duplex"
-#: ../backend/canon_dr.c:350 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:200
-#: ../backend/fujitsu.c:624 ../backend/genesys.c:89
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Vorne"
+
+#: ../backend/canon_dr.c:393
+#, fuzzy, no-c-format
+msgid "Card Back"
+msgstr "Hinten"
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Duplex"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Rot"
-#: ../backend/canon_dr.c:351 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:201
-#: ../backend/fujitsu.c:625 ../backend/genesys.c:90
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Grün"
-#: ../backend/canon_dr.c:352 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:202
-#: ../backend/fujitsu.c:626 ../backend/genesys.c:91
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Blau"
-#: ../backend/canon_dr.c:353
+#: ../backend/canon_dr.c:404
#, no-c-format
msgid "Enhance Red"
msgstr "Rot verstärken"
-#: ../backend/canon_dr.c:354
+#: ../backend/canon_dr.c:405
#, no-c-format
msgid "Enhance Green"
msgstr "Grün verstärken"
-#: ../backend/canon_dr.c:355
+#: ../backend/canon_dr.c:406
#, no-c-format
msgid "Enhance Blue"
msgstr "Blau verstärken"
-#: ../backend/canon_dr.c:357 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:164
-#: ../backend/epson2.c:172 ../backend/epson2.c:184 ../backend/epson2.c:199
-#: ../backend/epson2.c:213 ../backend/fujitsu.c:630
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
@@ -1650,109 +1665,109 @@ msgstr "Blau verstärken"
msgid "None"
msgstr "Kein"
-#: ../backend/canon_dr.c:358 ../backend/fujitsu.c:631
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr "JPEG"
-#: ../backend/epson.c:491 ../backend/epson2.c:107
-#: ../backend/magicolor.c:160
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Einseitig"
-#: ../backend/epson.c:492 ../backend/epson2.c:108 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:161 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Duplex"
-#: ../backend/epson.c:502 ../backend/epson2.c:115 ../backend/pixma.c:908
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Durchlichtaufsatz"
-#: ../backend/epson.c:503 ../backend/epson2.c:117
-#: ../backend/magicolor.c:168 ../backend/mustek.c:160
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Autom. Dokumenteneinzug"
-#: ../backend/epson.c:523 ../backend/epson2.c:133
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Filmpositiv"
-#: ../backend/epson.c:524 ../backend/epson2.c:134
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Filmnegativ"
-#: ../backend/epson.c:529 ../backend/epson2.c:141
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Fokus auf dem Glas"
-#: ../backend/epson.c:530 ../backend/epson2.c:142
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Fokus 2.5mm über dem Glas"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:165 ../backend/epson2.c:173 ../backend/epson2.c:185
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Halbton A (hart)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Halbton B (weich)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Halbton C"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:176
-#: ../backend/epson2.c:188
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Dithering A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:177
-#: ../backend/epson2.c:189
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Dithering B (4x4 Spiral)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:178
-#: ../backend/epson2.c:190
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Dithering C (4x4 Net Screen)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:179
-#: ../backend/epson2.c:191
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Dithering D (8x4 Net Screen)"
-#: ../backend/epson.c:584 ../backend/epson2.c:192
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Technik zur Textverbesserung"
-#: ../backend/epson.c:585 ../backend/epson2.c:193
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Übertrage Muster A"
-#: ../backend/epson.c:586 ../backend/epson2.c:194
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Übertrage Muster B"
@@ -1762,7 +1777,7 @@ msgstr "Übertrage Muster B"
msgid "No Correction"
msgstr "Keine Korrektur"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:254
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Benutzerdefiniert"
@@ -1787,33 +1802,33 @@ msgstr "Tintenstrahldrucker"
msgid "CRT monitors"
msgstr "CRT-Monitore"
-#: ../backend/epson.c:656 ../backend/epson2.c:253 ../backend/fujitsu.c:614
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Standardeinstellung"
-#: ../backend/epson.c:658 ../backend/epson2.c:255
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Drucken mit hoher Auflösung"
-#: ../backend/epson.c:659 ../backend/epson2.c:256
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Drucken mit geringer Auflösung"
-#: ../backend/epson.c:660 ../backend/epson2.c:257
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Drucken mit hohem Kontrast"
-#: ../backend/epson.c:678 ../backend/epson2.c:275
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Benutzerdefiniert (Gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:276
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Benutzerdefiniert (Gamma=1.8)"
@@ -1853,14 +1868,14 @@ msgstr "A4"
msgid "Max"
msgstr "Maximal"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5447 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:721
+#: ../backend/niash.c:734 ../backend/plustek.c:721
#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
@@ -1869,210 +1884,210 @@ msgstr "Maximal"
msgid "Scan Mode"
msgstr "Scanmodus"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Wählt den Halbton aus."
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Blindfarbe"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Wählt die Blindfarbe."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Wählt die Helligkeit."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Schärfe"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Farbkorrektur"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr "Setzt die Farbkorrekturtabelle für das ausgewählte Ausgabegerät"
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Farbkorrekturkoeffizienten"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Matritzenmultiplikation der RGB-Werte"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Verschiebt Grün nach Rot"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Verschiebt Grün nach Blau"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Verschiebt Rot nach Grün"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Verschiebt Rot nach Blau"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Verschiebt Blau nach Grün"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Verschiebt Blau nach Rot"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Legt den den Grünanteil fest"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Erhöhe den Rotanteil basierend auf dem Grünwert"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Erhöhe den Blauanteil basierend auf dem Grünwert"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Erhöhe den Grünanteil basierend auf dem Rotwert"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Legt den Rotanteil fest"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Erhöhe den Blauanteil basierend auf dem Rotwert"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Erhöhe den Grünanteil basierend auf dem Blauwert"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Erhöhe den Rotanteil basierend auf dem Blauwert"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Legt den Blauwert fest"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Das Bild spiegeln"
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Schnelle Vorschau"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Automatische Auswahl des Scanbereichs"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Kurze Auflösungsliste"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Zeige eine kurze Auflösungsliste an"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Vergrösserung"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Definiert den Vergrösserungsfaktor, der vom Scanner benutzt wird"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Schnellformat"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Optionales Zubehör"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "auswerfen"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Wirft das Blatt aus dem automatischen Dokumenteinzug aus"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Automatischer Auswurf"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Auswurf des Dokuments nach dem Scannen"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2399
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "ADF-Modus"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2401
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Wählt den ADF-Modus aus (einseitig/doppelseitig)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Schacht"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Wähle den Schacht zum Scannen aus"
@@ -2112,208 +2127,208 @@ msgstr ""
"Beginne mit dem Scannen erst, wenn nach dem Senden des Scankommandos der "
"Knopf am Scanner gedrückt wird."
-#: ../backend/epson2.c:101 ../backend/pixma.c:390
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr "Infrarot"
-#: ../backend/epson2.c:116
+#: ../backend/epson2.c:117
#, no-c-format
msgid "TPU8x10"
msgstr ""
-#: ../backend/epson2.c:135
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Diapositiv"
-#: ../backend/epson2.c:136
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Dianegativ"
-#: ../backend/epson2.c:214
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr "Eingebautes CCT-Profil"
-#: ../backend/epson2.c:215
+#: ../backend/epson2.c:216
#, no-c-format
msgid "User defined CCT profile"
msgstr "Benutzerdefiniertes CCT-Profil"
-#: ../backend/fujitsu.c:615 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "An"
-#: ../backend/fujitsu.c:616 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Aus"
-#: ../backend/fujitsu.c:618
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr "DTC"
-#: ../backend/fujitsu.c:619
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr "SDTC"
-#: ../backend/fujitsu.c:621 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Halbton"
-#: ../backend/fujitsu.c:622
+#: ../backend/fujitsu.c:667
#, no-c-format
msgid "Diffusion"
msgstr "Diffusion"
-#: ../backend/fujitsu.c:627
+#: ../backend/fujitsu.c:672
#, no-c-format
msgid "White"
msgstr "Weiß"
-#: ../backend/fujitsu.c:628
+#: ../backend/fujitsu.c:673
#, no-c-format
msgid "Black"
msgstr "Schwarz"
-#: ../backend/fujitsu.c:633
+#: ../backend/fujitsu.c:678
#, no-c-format
msgid "Continue"
msgstr "Fortfahren"
-#: ../backend/fujitsu.c:634
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr "Stopp"
-#: ../backend/fujitsu.c:636
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr "10mm"
-#: ../backend/fujitsu.c:637
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr "15mm"
-#: ../backend/fujitsu.c:638
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr "20mm"
-#: ../backend/fujitsu.c:640 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:641
+#: ../backend/fujitsu.c:686
#, no-c-format
msgid "Horizontal bold"
msgstr "horizontal breit"
-#: ../backend/fujitsu.c:642
+#: ../backend/fujitsu.c:687
#, no-c-format
msgid "Horizontal narrow"
msgstr "horizontal schmal"
-#: ../backend/fujitsu.c:643 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Vertikal"
-#: ../backend/fujitsu.c:644
+#: ../backend/fujitsu.c:689
#, no-c-format
msgid "Vertical bold"
msgstr "vertikal breit"
-#: ../backend/fujitsu.c:646
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr "Oben nach unten"
-#: ../backend/fujitsu.c:647
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr "Unten nach oben"
-#: ../backend/fujitsu.c:649
+#: ../backend/fujitsu.c:694
#, no-c-format
msgid "Front"
msgstr "Vorne"
-#: ../backend/fujitsu.c:650
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr "Hinten"
-#: ../backend/fujitsu.c:3858 ../backend/genesys.c:5681
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
#: ../backend/kvs1025_opt.c:911
#, no-c-format
msgid "Software blank skip percentage"
msgstr ""
-#: ../backend/fujitsu.c:3859
+#: ../backend/fujitsu.c:4056
#, no-c-format
msgid "Request driver to discard pages with low percentage of dark pixels"
msgstr ""
-#: ../backend/genesys.c:5672
+#: ../backend/genesys.c:5757
#, no-c-format
msgid "Software crop"
msgstr ""
-#: ../backend/genesys.c:5673
+#: ../backend/genesys.c:5758
#, no-c-format
msgid "Request backend to remove border from pages digitally"
msgstr ""
-#: ../backend/genesys.c:5682 ../backend/kvs1025_opt.c:913
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
#, no-c-format
msgid "Request driver to discard pages with low numbers of dark pixels"
msgstr ""
-#: ../backend/genesys.c:5692 ../backend/kvs1025_opt.c:893
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
#, no-c-format
msgid "Software derotate"
msgstr ""
-#: ../backend/genesys.c:5693 ../backend/kvs1025_opt.c:895
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
#, no-c-format
msgid "Request driver to detect and correct 90 degree image rotation"
msgstr ""
-#: ../backend/genesys.c:5700 ../backend/pixma_sane_options.c:312
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Extras"
-#: ../backend/genesys.c:5719 ../backend/pixma_sane_options.c:333
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, no-c-format
msgid "Threshold curve"
msgstr "Schwellwertkurve"
-#: ../backend/genesys.c:5720 ../backend/pixma_sane_options.c:334
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
"Dynamische Schwellwertkurve, von hell zu dunkel, nomalerweise 50-65"
-#: ../backend/genesys.c:5729
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr "dynamische Strichzeichnung abschalten"
-#: ../backend/genesys.c:5731
+#: ../backend/genesys.c:5841
#, fuzzy, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
@@ -2322,12 +2337,12 @@ msgstr ""
"Abschalten um einen Software angepassten Algorithmus zur Erstellung von "
"Strichzeichnungen zu verwenden anstatt die Hardwarefunktion zu nutzen"
-#: ../backend/genesys.c:5747
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Interpolation abschalten"
-#: ../backend/genesys.c:5750
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2337,24 +2352,46 @@ msgstr ""
"kleiner ist als die vertikale, schaltet dies die horizontale "
"Interpolation aus"
-#: ../backend/genesys.c:5759
-#, no-c-format
-msgid "Color Filter"
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
msgstr "Farbfilter"
-#: ../backend/genesys.c:5762
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
"Wenn Graustufen oder Strichzeichnung verwendet wird, wählt diese Option "
"die Farbe"
-#: ../backend/genesys.c:5788
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Kalibrierung"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Kalibriermodus definieren"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Kalibrierungsdatenspeicher"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Lampenausschaltzeit"
-#: ../backend/genesys.c:5791
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2363,72 +2400,72 @@ msgstr ""
"Die Lampe wird nach der angegebenen Zeit (in Minuten) ausgeschaltet. Ein "
"Wert von 0 bedeutet, dass die Lampe nich ausgeschaltet wird."
-#: ../backend/genesys.c:5801
+#: ../backend/genesys.c:5940
#, fuzzy, no-c-format
msgid "Lamp off during scan"
msgstr "Lampe aus während Schwarzkalibrierung"
-#: ../backend/genesys.c:5802
+#: ../backend/genesys.c:5941
#, fuzzy, no-c-format
msgid "The lamp will be turned off during scan. "
msgstr "Anzahl der Minuten, bis die Lampe nach dem Scan ausgeschaltet wird"
-#: ../backend/genesys.c:5830 ../backend/genesys.c:5831
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
msgstr "Datei-Knopf"
-#: ../backend/genesys.c:5883 ../backend/genesys.c:5884
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr "OCR-Knopf"
-#: ../backend/genesys.c:5897 ../backend/genesys.c:5898
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
msgstr "Einschaltknopf"
-#: ../backend/genesys.c:5911 ../backend/genesys.c:5912
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
#, fuzzy, no-c-format
msgid "Extra button"
msgstr "E-Mail-Knopf"
-#: ../backend/genesys.c:5925 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, no-c-format
msgid "Need calibration"
msgstr "benötigt Kalibirierung"
-#: ../backend/genesys.c:5926 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr ""
"Der Scanner benötigt eine Kalibrierung für die momentanen Einstellungen"
-#: ../backend/genesys.c:5938 ../backend/gt68xx.c:787
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Knöpfe"
-#: ../backend/genesys.c:5947 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:941
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Kalibrierung"
-#: ../backend/genesys.c:5949 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, no-c-format
msgid "Start calibration using special sheet"
msgstr "Starte den Kalibrierungsprozess mit einem Spezialblatt"
-#: ../backend/genesys.c:5963 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, no-c-format
msgid "Clear calibration"
msgstr "Kalibrierung zurücksetzen"
-#: ../backend/genesys.c:5964 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, no-c-format
msgid "Clear calibration cache"
msgstr "Löscht den Kalibrierungsspeicher"
@@ -2570,8 +2607,8 @@ msgid "Scanner model"
msgstr "Scannermodell"
#: ../backend/hp3900_sane.c:1408
-#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+#, fuzzy, no-c-format
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
"Erlaubt Geräteverhalten mit anderen unterstützten Modellen zu testen"
@@ -2721,12 +2758,12 @@ msgstr "Aktualisiert alle Informationnen über das Gerät"
msgid "This option reflects a front panel scanner button"
msgstr "Diese Option spiegelt den vorderen Scannerknopf wieder"
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Bild"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Verschiedenes"
@@ -2751,17 +2788,17 @@ msgstr "Y-Abstand"
msgid "Hardware internal Y position of the scanning area."
msgstr "hardwareinterne Y-Position des Scanbereichs"
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Lampenstatus"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Schaltet die Lampe an oder aus"
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Kalibriert Schwarz- und Weisswert."
@@ -4758,7 +4795,7 @@ msgstr "Handscanner Simulation"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Simuliere einen Handscanner. Bei Handscannern steht meistens die "
"Bildhöhe nicht von vornherein fest. Stattdessen geben sie eine Höhe von "
@@ -4901,29 +4938,29 @@ msgstr ""
"Zwinge das Backend dazu, nach einem Aufruf von sane_read() den "
"Statuscode SANE_STATUS_ACCESS_DENIED zurückzuliefern."
-#: ../backend/rts8891.c:2803
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Diese Option zeigt den Zustand eines Scannerknopfes an."
-#: ../backend/rts8891.c:2834 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Lampe an"
-#: ../backend/rts8891.c:2835 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Schalte Scannerlampe ein"
-#: ../backend/rts8891.c:2845 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Lampe aus"
-#: ../backend/rts8891.c:2846 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -5148,7 +5185,7 @@ msgstr "Handscanner-Simulation"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Simuliere einen Handscanner. Bei Handscannern steht meistens die "
diff --git a/po/en_GB.po b/po/en_GB.po
index e5548c3..1bb0a52 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2009-04-25 00:19+0100\n"
"Last-Translator: Andrew Coles <andrew_coles@yahoo.co.uk>\n"
"Language-Team: British English <kde-i18n-doc@kde.org>\n"
@@ -28,17 +28,17 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -47,25 +47,25 @@ msgid "Geometry"
msgstr "Geometry"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Enhancement"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Advanced"
@@ -90,8 +90,8 @@ msgstr "Force monochrome preview"
msgid "Bit depth"
msgstr "Bit depth"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Scan mode"
@@ -131,7 +131,8 @@ msgstr "Bottom-right x"
msgid "Bottom-right y"
msgstr "Bottom-right y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Scan resolution"
@@ -299,7 +300,7 @@ msgstr "Bind X and Y resolution"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -967,7 +968,7 @@ msgstr "Defaults"
msgid "Set default values for enhancement controls."
msgstr "Set default values for enhancement controls."
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Calibration"
@@ -1007,64 +1008,64 @@ msgstr ""
msgid "Button state"
msgstr "Button state"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Number of the frame to scan"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Selects the number of the frame to scan"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Duplex scan"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr ""
"Duplex scan provide a scan of the front and back side of the document"
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Calibrate Scanner"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Force scanner calibration before scan"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Greyscale scan"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Do a greyscale rather than colour scan"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Analogue Gain"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Increase or decrease the analogue gain of the CCD array"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Gamma Correction"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Selects the gamma corrected transfer curve"
@@ -1076,8 +1077,8 @@ msgstr "Raw"
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr "Fine colour"
@@ -1128,599 +1129,609 @@ msgstr "1/2 normal speed"
msgid "1/3 normal speed"
msgstr "1/3 normal speed"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, no-c-format
msgid "rounded parameter"
msgstr "rounded parameter"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr "unknown"
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr "ADF jam"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr "ADF cover open"
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, no-c-format
msgid "lamp failure"
msgstr "lamp failure"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr "scan head positioning error"
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr "CPU check error"
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr "RAM check error"
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr "ROM check error"
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr "hardware check error"
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, no-c-format
msgid "transparency unit lamp failure"
msgstr "transparency unit lamp failure"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr "transparency unit scan head positioning failure"
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr "parameter list length error"
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr "invalid command operation code"
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr "invalid field in CDB"
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr "unsupported LUN"
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr "invalid field in parameter list"
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr "command sequence error"
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr "too many windows specified"
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr "medium not present"
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr "invalid bit IDENTIFY message"
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr "option not connect"
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr "power on reset / bus device reset"
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr "parameter changed by another initiator"
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr "no additional sense information"
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr "reselect failure"
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr "SCSI parity error"
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr "initiator detected error message received"
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr "invalid message error"
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr "timeout error"
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, no-c-format
msgid "transparency unit shading error"
msgstr "transparency unit shading error"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr "lamp not stabilised"
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr "problem not analysed (unknown SCSI class)"
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, no-c-format
msgid "film scanner"
msgstr "film scanner"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "flatbed scanner"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Film type"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr "Selects the film type, i.e. negatives or slides"
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, no-c-format
msgid "Negative film type"
msgstr "Negative film type"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, no-c-format
msgid "Selects the negative film type"
msgstr "Selects the negative film type"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, no-c-format
msgid "Hardware resolution"
msgstr "Hardware resolution"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, no-c-format
msgid "Use only hardware resolutions"
msgstr "Use only hardware resolutions"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr "Focus"
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, no-c-format
msgid "Auto focus"
msgstr "Auto focus"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, no-c-format
msgid "Enable/disable auto focus"
msgstr "Enable/disable auto focus"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr "Auto focus only once"
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr "Do auto focus only once between ejects"
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, no-c-format
msgid "Manual focus position"
msgstr "Manual focus position"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr "Set the optical system's focus position by hand (default: 128)."
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr "Scan margins"
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr "Extra colour adjustments"
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Mirror image"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, no-c-format
msgid "Mirror the image horizontally"
msgstr "Mirror the image horizontally"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, no-c-format
msgid "Auto exposure"
msgstr "Auto exposure"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Enable/disable the auto exposure feature"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, no-c-format
msgid "Calibration now"
msgstr "Calibration now"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, no-c-format
msgid "Execute calibration *now*"
msgstr "Execute calibration *now*"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr "Self diagnosis"
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr "Perform scanner self diagnosis"
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, no-c-format
msgid "Reset scanner"
msgstr "Reset scanner"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, no-c-format
msgid "Reset the scanner"
msgstr "Reset the scanner"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr "Medium handling"
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, no-c-format
msgid "Eject film after each scan"
msgstr "Eject film after each scan"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr "Automatically eject the film from the device after each scan"
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr "Eject film before exit"
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr ""
"Automatically eject the film from the device before exiting the program"
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr "Eject film now"
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr "Eject the film *now*"
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, no-c-format
msgid "Document feeder extras"
msgstr "Document feeder extras"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, no-c-format
msgid "Flatbed only"
msgstr "Flatbed only"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr "Disable auto document feeder and use flatbed only"
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, no-c-format
msgid "Transparency unit"
msgstr "Transparency unit"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr "Switch on/off the transparency unit (FAU, film adapter unit)"
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, no-c-format
msgid "Negative film"
msgstr "Negative film"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, no-c-format
msgid "Positive or negative film"
msgstr "Positive or negative film"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr "Density control"
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr "Set density control mode"
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, no-c-format
msgid "Transparency ratio"
msgstr "Transparency ratio"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, no-c-format
msgid "Select film type"
msgstr "Select film type"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, no-c-format
msgid "Select the film type"
msgstr "Select the film type"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Flatbed"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, fuzzy, no-c-format
msgid "ADF Front"
msgstr "ADF cover open"
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, fuzzy, no-c-format
msgid "ADF Back"
msgstr "ADF jam"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "ADF Duplex"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Print"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Duplex"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Red"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Green"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Blue"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Enhancement"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Enhancement"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Enhancement"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "None"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Simplex"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Duplex"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Transparency Unit"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Automatic Document Feeder"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Positive Film"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Negative Film"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Focus on glass"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Focus 2.5mm above glass"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Halftone A (Hard Tone)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Halftone B (Soft Tone)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Halftone C (Net Screen)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Dither A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Dither B (4x4 Spiral)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Dither C (4x4 Net Screen)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Dither D (8x4 Net Screen)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Text Enhanced Technology"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Download pattern A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Download pattern B"
@@ -1730,7 +1741,7 @@ msgstr "Download pattern B"
msgid "No Correction"
msgstr "No Correction"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "User defined"
@@ -1755,33 +1766,33 @@ msgstr "Ink-jet printers"
msgid "CRT monitors"
msgstr "CRT monitors"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Default"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "High density printing"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Low density printing"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "High contrast printing"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "User defined (Gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "User defined (Gamma=1.8)"
@@ -1821,231 +1832,231 @@ msgstr "A4"
msgid "Max"
msgstr "Max"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Scan Mode"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Selects the halftone."
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Dropout"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Selects the dropout."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Selects the brightness."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Sharpness"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Colour correction"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr "Sets the colour correction table for the selected output device."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Colour correction coefficients"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Matrix multiplication of RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Shift green to red"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Shift green to blue"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Shift red to green"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Shift red to blue"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Shift blue to green"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Shift blue to red"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Controls green level"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Adds to red based on green level"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Adds to blue based on green level"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Adds to green based on red level"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Controls red level"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Adds to blue based on red level"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Adds to green based on blue level"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Adds to red based on blue level"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Controls blue level"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Mirror the image."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Fast preview"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Auto area segmentation"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Short resolution list"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Display short resolution list"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Zoom"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Defines the zoom factor the scanner will use"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Quick format"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Optional equipment"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Eject"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Eject the sheet in the ADF"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Auto eject"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Eject document after scanning"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "ADF Mode"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Selects the ADF mode (simplex/duplex)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Bay"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Select bay to scan"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2054,24 +2065,24 @@ msgstr ""
"Selects the gamma correction value from a list of pre-defined devices or "
"the user defined table, which can be downloaded to the scanner"
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Focus Position"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr ""
"Sets the focus position to either the glass or 2.5mm above the glass"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Wait for Button"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2080,178 +2091,219 @@ msgstr ""
"After sending the scan command, wait until the button on the scanner is "
"pressed to actually start the scan process."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Positive Slide"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Negative Slide"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "User defined"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "On"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Off"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Dither"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, fuzzy, no-c-format
msgid "Diffusion"
msgstr "Error Diffusion"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "White level"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Black level"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, fuzzy, no-c-format
msgid "Continue"
msgstr "Conditional"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Vertical"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "Vertical"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, fuzzy, no-c-format
msgid "Front"
msgstr "Print"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Extras"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Threshold"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Disable interpolation"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2260,22 +2312,44 @@ msgstr ""
"When using high resolutions where the horizontal resolution is smaller "
"than the vertical resolution this disables horizontal interpolation."
-#: ../backend/genesys.c:6235
-#, no-c-format
-msgid "Color Filter"
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
msgstr "Colour Filter"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr "When using grey or lineart this option selects the used colour."
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Calibration"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Define calibration mode"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Calibration data cache"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Lamp off time"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2284,62 +2358,77 @@ msgstr ""
"The lamp will be turned off after the given time (in minutes). A value "
"of 0 means, that the lamp won't be turned off."
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Lamp off during dark calibration"
+
+#: ../backend/genesys.c:5941
+#, fuzzy, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr "Minutes until lamp is turned off after scan"
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, fuzzy, no-c-format
msgid "File button"
msgstr "Wait for button"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, fuzzy, no-c-format
msgid "Power button"
msgstr "Wait for button"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Wait for button"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Coarse calibration"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Force scanner calibration before scan"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Buttons"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Calibrate"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, fuzzy, no-c-format
msgid "Start calibration using special sheet"
msgstr "Start calibration process."
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, fuzzy, no-c-format
msgid "Clear calibration"
msgstr "Coarse calibration"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, fuzzy, no-c-format
msgid "Clear calibration cache"
msgstr "Calibration data cache"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Transparency Adapter"
@@ -2470,8 +2559,8 @@ msgid "Scanner model"
msgstr "Scanner model"
#: ../backend/hp3900_sane.c:1408
-#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+#, fuzzy, no-c-format
+msgid "Allows one to test device behaviour with other supported models"
msgstr "Allows to test device behaviour with other supported models"
#: ../backend/hp3900_sane.c:1422
@@ -2620,12 +2709,12 @@ msgstr "Updates information about device"
msgid "This option reflects a front panel scanner button"
msgstr "This option reflects a front panel scanner button"
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Image"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Miscellaneous"
@@ -2650,17 +2739,17 @@ msgstr "offset Y"
msgid "Hardware internal Y position of the scanning area."
msgstr "Hardware internal Y position of the scanning area."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Lamp status"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Switches the lamp on or off."
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr " "
@@ -2768,8 +2857,8 @@ msgstr "Slow"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normal"
@@ -3105,9 +3194,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3406,7 +3495,7 @@ msgstr "Sets the image emphasis"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gamma"
@@ -3473,16 +3562,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3493,16 +3572,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3571,7 +3640,7 @@ msgstr "Enhancement"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3739,7 +3808,7 @@ msgstr "Grey gain"
msgid "Sets gray channel gain"
msgstr "Sets grey channel gain"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3750,7 +3819,7 @@ msgstr "Red gain"
msgid "Sets red channel gain"
msgstr "Sets red channel gain"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3761,7 +3830,7 @@ msgstr "Green gain"
msgid "Sets green channel gain"
msgstr "Sets green channel gain"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3853,7 +3922,7 @@ msgstr "One page"
msgid "All pages"
msgstr "All pages"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "sheetfed scanner"
@@ -3925,12 +3994,12 @@ msgstr "Use the lightlid-35mm adapter"
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "This option turns off the lamp of the flatbed during a scan"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Quality scan"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Highest quality but lower speed"
@@ -4355,12 +4424,39 @@ msgstr ""
"Warm-up until the lamp's brightness is constant instead of insisting on "
"40 seconds warm-up time."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Negative film"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negative"
+
+#: ../backend/pixma.c:396
+#, fuzzy, no-c-format
+msgid "48 bits color"
+msgstr "Fine colour"
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, fuzzy, no-c-format
msgid "Button-controlled scan"
msgstr "Button-controlled scan (experimental)"
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4371,198 +4467,218 @@ msgstr ""
"\"SCAN\" button (for MP150) or \"COLOUR\" button (for other models). To "
"cancel, press \"GREY\" button."
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
msgstr "Update button state"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr "Button 1"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr "Button 2"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Transparency"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr "Device-Settings"
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr "Lampswitch"
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr "Manually switching the lamp(s)."
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Lamp off during dark calibration"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr "Always switches lamp off when doing dark calibration."
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, no-c-format
msgid "Calibration data cache"
msgstr "Calibration data cache"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr "Enables or disables calibration data cache."
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, no-c-format
msgid "Performs calibration"
msgstr "Performs calibration"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr "Speedup sensor"
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr "Enables or disables speeding up sensor movement."
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr "Warmup-time"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr "Warmup-time in seconds."
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr "Lampoff-time"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Lampoff-time in seconds."
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr "Analogue frontend"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr "Red gain value of the AFE"
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Red offset"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr "Red offset value of the AFE"
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr "Green gain value of the AFE"
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Green offset"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr "Green offset value of the AFE"
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr "Blue gain value of the AFE"
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Blue offset"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr "Blue offset value of the AFE"
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr "Red lamp off"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr "Defines red lamp off parameter"
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr "Green lamp off"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr "Defines green lamp off parameter"
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr "Blue lamp off"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr "Defines blue lamp off parameter"
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr "This option reflects the status of the scanner buttons."
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Colour36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Dithermap 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Dithermap 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Randomise"
@@ -4611,11 +4727,11 @@ msgstr "Hand-Scanner Simulation"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
#: ../backend/pnm.c:283
#, no-c-format
@@ -4752,29 +4868,29 @@ msgstr ""
"Force the backend to return the status code SANE_STATUS_ACCESS_DENIED "
"after sane_read() has been called."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, fuzzy, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "This option reflects the status of the scanner buttons."
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Lamp on"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Turn on scanner lamp"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Lamp off"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4795,42 +4911,42 @@ msgstr "Minutes until lamp is turned off after scan"
msgid "Threshold value for lineart mode"
msgstr "Threshold value for lineart mode"
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Document Feeder"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 (inch)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 (inch)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11 (inch)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Halftoning Unsupported"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "DispersedDot8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "DispersedDot16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4845,12 +4961,27 @@ msgstr ""
"periodically in the middle of a scan; if it's set too high, X-based "
"frontends may stop responding to X events and your system could bog down."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Eject document after scanning"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Preview mode"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4859,12 +4990,12 @@ msgstr ""
"Select the mode for previews. Greyscale previews usually give the best "
"combination of speed and detail."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Predefined settings"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4873,12 +5004,42 @@ msgstr ""
"Provides standard scanning areas for photographs, printed pages and the "
"like."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "flatbed scanner"
+
+#: ../backend/snapscan-options.c:897
+#, fuzzy, no-c-format
+msgid "Focus-mode"
+msgstr "Focus"
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Auto focus"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Focus Position"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Focus Position"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Colour lines per read"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Greyscale lines per read"
@@ -4952,12 +5113,12 @@ msgstr "Hand-scanner simulation"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
#: ../backend/test.c:366
@@ -5574,6 +5735,9 @@ msgstr "Sets green channel offset"
msgid "Sets blue channel offset"
msgstr "Sets blue channel offset"
+#~ msgid "problem not analyzed (unknown SCSI class)"
+#~ msgstr "problem not analysed (unknown SCSI class)"
+
#~ msgid "Grayscale"
#~ msgstr "Greyscale"
diff --git a/po/eo.po b/po/eo.po
index 13b536d..aa0bcef 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -10,7 +10,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends.eo\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2007-12-08 13:28+0100\n"
"Last-Translator: A.C.Codazzi\n"
"Language-Team: <it@li.org>\n"
@@ -31,17 +31,17 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -50,25 +50,25 @@ msgid "Geometry"
msgstr "Geometrio"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Plibonigo"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Avana"
@@ -93,8 +93,8 @@ msgstr "Perfortu monokromatan antaŭmontron"
msgid "Bit depth"
msgstr "Profundeco en bitoj"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Moduso de skanado"
@@ -134,7 +134,8 @@ msgstr "Sube-dekstre X"
msgid "Bottom-right y"
msgstr "Sube-dekstre Y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Difino de skanado"
@@ -302,7 +303,7 @@ msgstr "Bindu distindon de X kaj Y"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -985,7 +986,7 @@ msgstr "Defaŭltaj valoroj"
msgid "Set default values for enhancement controls."
msgstr "Uzu la defaŭltajn valorojn por la regilojn de plibonigo."
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Kalibrigo"
@@ -1025,63 +1026,63 @@ msgstr ""
msgid "Button state"
msgstr "Stato de butono"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Nombro da skanendaj filmeroj"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Elektu nombron da skanendaj filmeroj"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Fronta-dorsa skanado"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr "Ĝi plenumas frontan-dorsan skanadon de la dokumento"
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Kalibrigu Skanilon"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Ĝi devigas kalibrigon de skanilon antaŭ la skanado"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Grizgama skanado"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Ĝi plenumas grizgaman anstataŭ kolora skanadon"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Analoga Gajno"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Ĝi pliigas aŭ malpliigas la analogan gajnon de la CCD-sentilo"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Korektado de Gama"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Ĝi elektas la kurbon de korektado de gama"
@@ -1093,8 +1094,8 @@ msgstr "Kruda"
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr "Fajna koloro"
@@ -1145,600 +1146,610 @@ msgstr "Duono de la normala radipeco"
msgid "1/3 normal speed"
msgstr "Triono de la normala radipeco"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, no-c-format
msgid "rounded parameter"
msgstr "rondigitaj parametroj"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr "nekonata"
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr "ADF estas blokita"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr "Kovrilo de ADF estas malfermita"
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, no-c-format
msgid "lamp failure"
msgstr "lampo malfunkcias"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr "eraro de lokiĝo de skan-kapeto"
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr "Eraro de kontrolo de CPU"
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr "Eraro de kontrolo de RAM"
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr "Eraro de kontrolo de ROM"
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr "Eraro de kontrolo de la aparataro"
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, no-c-format
msgid "transparency unit lamp failure"
msgstr "la lampo de diafanecoj malfunkcias"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr "eraro de lokiĝo de la skan-kapeto por diafanecoj"
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr "eraro de longo de listo pri parametroj"
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr "nevalida kodo de komando"
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr "nevalida kampo en CDB"
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr "nesubtenita LUN"
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr "nevalida kampo en la listo pri parametroj"
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr "eraro en la vico de komandoj"
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr "la difinitaj fenestroj estas troaj"
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr "la aparato estas neĉeestanta"
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr "mesaĝo kun nevalida IDENTIFY-bito"
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr "opcio de ne-konektado"
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr "re-agordo de nutro / re-agordo de buso de aparatoj"
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr "parametro estis ŝanĝita de alia pravaloranto"
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr "neniu alia aldona informo pri «senso»"
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr "re-elektado malsukcesis"
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr "eraro de pareco de SCSI"
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr "oni ricevis mesaĝon pri eraro rekonita de pravaloranto"
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr "eraro de nevalida mesaĝo"
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr "eraro de tempofino"
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, no-c-format
msgid "transparency unit shading error"
msgstr "eraro de vualo de diafaneco"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr "nestabiligita lampo"
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr "la problemo ne estis analizita (nekonata SCSI-klaso)"
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, no-c-format
msgid "film scanner"
msgstr "skanilo por negativoj"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "plata skanilo"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Filmo"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr "Ĝi elektas specon de filmo: negativoj aŭ lumbildoj"
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, no-c-format
msgid "Negative film type"
msgstr "Speco de negativa filmo"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, no-c-format
msgid "Selects the negative film type"
msgstr "Ĝi elektas la specon de negativa filmo"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, no-c-format
msgid "Hardware resolution"
msgstr "Hardvara difino"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, no-c-format
msgid "Use only hardware resolutions"
msgstr "Uzu nur hardvarajn difinojn"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr "Fokuso"
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, no-c-format
msgid "Auto focus"
msgstr "Mem-fokusigo"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, no-c-format
msgid "Enable/disable auto focus"
msgstr "Ĝi ebligas/malebligas aŭtomatan fokusigon"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr "Memfokusigo nur unu-foje"
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr "Ĝi plenumas memfokusigon nur unu-foje por ĉiu enigo de filmo"
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, no-c-format
msgid "Manual focus position"
msgstr "Lokado de mana fokusigo"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr "Ĝi mane agordas lokadon de optika fokusigo (defaŭto: 128)."
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr "Marĝenoj por skanado"
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr "Aliaj aranĝoj de koloro"
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Spegula bildo"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, no-c-format
msgid "Mirror the image horizontally"
msgstr "Ĝi reflektas bildon horizontale"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, no-c-format
msgid "Auto exposure"
msgstr "Mem-ekspono"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Ĝi ebligas/malebligas aŭtomatan eksponon"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, no-c-format
msgid "Calibration now"
msgstr "Tuja kalibrigo"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, no-c-format
msgid "Execute calibration *now*"
msgstr "Ĝi plenumas kalibrigon tuj"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr "Mem-diagnozo"
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr "Ĝi plenumas aŭtomatajn kontrolojn"
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, no-c-format
msgid "Reset scanner"
msgstr "Re-agordu skanilon"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, no-c-format
msgid "Reset the scanner"
msgstr "Ĝi ree agordas la skanilon"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr "Mastrumado de aparato"
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, no-c-format
msgid "Eject film after each scan"
msgstr "Elpelu filmon post ĉiu skanado"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr "Ĝi aŭtomate elpelas filmon post ĉiu skanado"
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr "Elpelu filmon antaŭ eliri"
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr "Ĝi aŭtomate elpelas filmon antaŭ la eliro de la programo"
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr "Elpelu filmon nun"
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr "Ĝi elpelas filmon *nun*"
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, no-c-format
msgid "Document feeder extras"
msgstr "Aliaj agordoj pri provizilo de dokumentoj"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, no-c-format
msgid "Flatbed only"
msgstr "Nur fiksa ebeno"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr "Ĝi malebligas provizilon de dokumentoj kaj uzas nur fiksan ebeno"
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, no-c-format
msgid "Transparency unit"
msgstr "Reguligilo de diafaneco"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
"Ĝi evligas/malebligas la reguligilon de diafaneco (FAU, «film adapter "
"unit»)"
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, no-c-format
msgid "Negative film"
msgstr "Negativa filmo"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, no-c-format
msgid "Positive or negative film"
msgstr "Pozitiva aŭ negativa filmo"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr "Regilo de denseco"
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr "Ĝi ebligas moduson de la regado de denseco"
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, no-c-format
msgid "Transparency ratio"
msgstr "Rejŝo de diafaneco"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, no-c-format
msgid "Select film type"
msgstr "Elektu specon de filmo"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, no-c-format
msgid "Select the film type"
msgstr "Ĝi elektas specon de filmo"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Fiksa ebeno"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, fuzzy, no-c-format
msgid "ADF Front"
msgstr "Kovrilo de ADF estas malfermita"
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, fuzzy, no-c-format
msgid "ADF Back"
msgstr "ADF estas blokita"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "Fronta-dorsa ADF"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Presu"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Fronta-dorsa"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Ruĝo"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Verdo"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Bluo"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Plibonigo"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Plibonigo"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Plibonigo"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Nenio"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Unuopa"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Fronta-dorsa"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Reguligilo de Diafaneco"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Aŭtomata Provizilo de Dokumentoj"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Pozitiva filmo"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Negativa filmo"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Fokusigo sur la vitro"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Fokusigo je 2.5mm super la vitro"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Meznuanco A (Duraj tonoj)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Meznuanco B (Delikataj tonoj)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Meznuanco C (Reta ekrano)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Punktismo A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Punktismo B (4x4 Spiralo)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Punktismo C (4x4 Reta ekrano)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Punktismo D (8x4 Reta ekrano)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Teknologio por Plibonigo de Teksto"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Elŝutu modelon A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Elŝutu modelon B"
@@ -1748,7 +1759,7 @@ msgstr "Elŝutu modelon B"
msgid "No Correction"
msgstr "Neniu korektado"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Agordita de la uzanto"
@@ -1773,33 +1784,33 @@ msgstr "Inkoŝprucaj printiloj"
msgid "CRT monitors"
msgstr "CRT ekranoj"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Defaŭlto"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Altdensa printado"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Malaltdensa printado"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Altkontrasta printado"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Agordita de la uzanto (Gama=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Agordita de la uzanto (Gama=1.8)"
@@ -1839,232 +1850,232 @@ msgstr "A4"
msgid "Max"
msgstr "Maks"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Moduso de Skanado"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Elektu meznuancojn."
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Eskludado"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Ĝi elektas la eskludadon."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Ĝi elektas la helecon."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Neteco"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Korektado de koloro"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
"Ĝi ebligas la tabelon de la korektado de koloro por la elektita aparato."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Koeficientoj de korektado de koloro"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Matrica multipliko de RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Ŝovu verdon al ruĝo"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Ŝovu verdon al bluo"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Ŝovu ruĝon al verdo"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Ŝovu ruĝon al bluo"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Ŝovu bluon al verdo"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Ŝovu bluon al ruĝo"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Mastrumu nivelon de verdo"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Aldonu ruĝon surbaze de nivelo de verdo"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Aldonu bluon surbaze de nivelo de verdo"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Aldonu verdon surbaze de nivelo de ruĝo"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Mastrumu nivelon de ruĝo"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Aldonu bluon surbaze de nivelo de ruĝo"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Aldonu verdon surbaze de nivelo de bluo"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Aldonu ruĝon surbaze de nivelo de bluo"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Mastrumu nivelon de bluo"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Spegulu bildon"
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Tuja antaŭmontro"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Aŭtomata segmentado de areo"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Listeto pri distingoj"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Vidigu etan liston pri disponeblaj distingoj"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Zomo"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Ĝi agordas la faktoron de zomo kiun la skanilo uzos"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Formato rapido"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Akcesora ekipaĵo"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Elpelo"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Ĝi elpelas la folion el aŭtomata provizilo"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Mem-elpelo"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Ĝi elpelas la dokumento post la skanado"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "Moduso por ADF"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Ĝi elektas la ADF-moduso (unuopa/fronta-dorsa)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Kesto"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Ĝi elektas la keston por skani"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2073,24 +2084,24 @@ msgstr ""
"Ĝi elektas korektadon de gama el listo de antaŭdifinitaj aparatoj aŭ el "
"la personigita tabelo, kiu esti alŝutebla en skanilon scanner"
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Lokiĝo de Fokusigo"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr ""
"Ĝi agordas la lokiĝon de la fokusigo aŭ sur la vitro aŭ je 2,5mm super ĝi"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Atendu Butonon"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2099,178 +2110,219 @@ msgstr ""
"Post la sendo de la skan-komando, ĝi atendas la premon de la butono de "
"la skanilo por startigi la skanadon."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Pozitiva lumbildo"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Negativa lumbildo"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "Agordita de la uzanto"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Kondukta"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Elkluda"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Punktismo"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, fuzzy, no-c-format
msgid "Diffusion"
msgstr "Difuzo de Eraro"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Nivelo de blanko"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Nivelo de nigro"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, fuzzy, no-c-format
msgid "Continue"
msgstr "Kondiĉa"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Horizontala"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "Horizontala"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "Horizontala"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Vertikala"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "Vertikala"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, fuzzy, no-c-format
msgid "Front"
msgstr "Presu"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Ekstraĵoj"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Sojlo"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Malebligu interpoladon"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2279,23 +2331,45 @@ msgstr ""
"Kiam oni uzas altajn distingojn kun la horizontala malpli alta ol la "
"verticala, la horizontala interpolado estas malebligata."
-#: ../backend/genesys.c:6235
-#, no-c-format
-msgid "Color Filter"
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
msgstr "Filtrilo de Koloro"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
"Kiam oni uzas grizan aŭ duuman kolorojn, tiu elektas uzatan koloron."
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Kalibrigo"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Difinu moduson de kalibrigo"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Kaŝmemoro por kalibrigo"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Ripozo de lampo"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2304,62 +2378,78 @@ msgstr ""
"La lampo estos elŝaltata post la fiksita tempo (en minutoj). La valoro "
"signifas ke la lampo neniam ripozos."
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Elŝaltita lampo dum kalibrigo de nigro"
+
+#: ../backend/genesys.c:5941
+#, fuzzy, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr ""
+"Nombro da minutoj pasantaj inter la skanado kaj la elŝalto de la lampo"
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, fuzzy, no-c-format
msgid "File button"
msgstr "Atendu butonon"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, fuzzy, no-c-format
msgid "Power button"
msgstr "Atendu butonon"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Atendu butonon"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Grajneca kalibrigo"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Ĝi devigas kalibrigon de skanilon antaŭ la skanado"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Butonoj"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Kalibrigu"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, fuzzy, no-c-format
msgid "Start calibration using special sheet"
msgstr "Startigu kalibrigadon."
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, fuzzy, no-c-format
msgid "Clear calibration"
msgstr "Grajneca kalibrigo"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, fuzzy, no-c-format
msgid "Clear calibration cache"
msgstr "Kaŝmemoro por kalibrigo"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "reguligilo de Diafaneco"
@@ -2493,7 +2583,7 @@ msgstr "Moduso de skanado"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2634,12 +2724,12 @@ msgstr ""
msgid "This option reflects a front panel scanner button"
msgstr "Tiuj ĉi opcioj agas sur la stato de la butonoj de la skanilo."
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Bildo"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Diversaĵoj"
@@ -2664,17 +2754,17 @@ msgstr "deŝovo Y"
msgid "Hardware internal Y position of the scanning area."
msgstr "Hardvara interna pozicio de Y en la skanada areo."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Stato de la lampo"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Ŝaltu aŭ elŝaltu la lampon."
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Kalibrigu la nivelojn de nigro kaj blanko."
@@ -2784,8 +2874,8 @@ msgstr "Malrapida"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normala"
@@ -3120,9 +3210,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3425,7 +3515,7 @@ msgstr "Ĝiu ebligas emfazon de bildo"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gama"
@@ -3492,16 +3582,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3512,16 +3592,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3590,7 +3660,7 @@ msgstr "Plibonigo"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3758,7 +3828,7 @@ msgstr "Gajno laŭ grizo"
msgid "Sets gray channel gain"
msgstr "Ĝi agordas la gajnon de la griza kanalo"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3769,7 +3839,7 @@ msgstr "Gajno laŭ ruĝo"
msgid "Sets red channel gain"
msgstr "Ĝi agordas la gajnon de la ruĝa kanalo"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3780,7 +3850,7 @@ msgstr "Gajno laŭ verdo"
msgid "Sets green channel gain"
msgstr "Ĝi agordas la gajnon de la verda kanalo"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3872,7 +3942,7 @@ msgstr "Unu paĝo"
msgid "All pages"
msgstr "Ĉiuj paĝoj"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "skaner kun aŭtomata provizilo"
@@ -3945,12 +4015,12 @@ msgstr "Uzu adaptilon de lumbildoj je 35mm"
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "Ĝi elŝaltas la lampon de la skanilo dum la skanado"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Kvalito de skanado"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Maks. kvalito sed min. rapideco"
@@ -4379,12 +4449,39 @@ msgstr ""
"Ĝi varmigas la lampon tiel ke ĝia heleco estas sensanĝa anstataŭ ĉiufoja "
"varmigo je 40 sekundoj."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Negativa filmo"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negativo"
+
+#: ../backend/pixma.c:396
+#, fuzzy, no-c-format
+msgid "48 bits color"
+msgstr "Fajna koloro"
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr "Skanado mastrumita de butono"
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4395,198 +4492,218 @@ msgstr ""
"butonon \"SCAN\" (por ML150) aŭ \"COLOR\" (por aliaj modeloj). Por "
"refuzi, premu la butonon \"GRAY\"."
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
msgstr "Ĝisdatigu staton de butono"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr "Butono 1"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr "Butono 2"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Diafaneco"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr "Agordoj de aparato"
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr "Butono de lampo"
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr "Mane ŝalto de la lampo(j)."
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Elŝaltita lampo dum kalibrigo de nigro"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr "Ĝi ĉiam elŝaltas la lampon dum la kalibrigo de nigro."
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, no-c-format
msgid "Calibration data cache"
msgstr "Kaŝmemoro por kalibrigo"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr "Ĝi ebligas aŭ malebligas kaŝmemoron por kalibrigo."
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, no-c-format
msgid "Performs calibration"
msgstr "Plenumu kalibrigon"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr "Sentilo de akcelo"
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr "Ĝi ebligas aŭ malebligas movadon de la sentilo de akcelo."
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr "Tempo de varmigo"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr "Tempo en sekundoj por varmigi la lampon."
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr "Ripoztempo de lampo"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Tempo en sekundoj dum kiu la lampo restas elŝaltata."
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr "Analoga fasado"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr "Valoro de gajno laŭ ruĝo de la analoga fasado"
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Deŝovo laŭ ruĝo"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr "Valoro de deŝovo laŭ ruĝo de la analoga fasado"
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr "Valoro de gajno laŭ verdo de la analoga fasado"
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Deŝovo laŭ verdo"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr "Valoro de deŝovo laŭ verdo de la analoga fasado"
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr "Valoro de gajno laŭ bluo de la analoga fasado"
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Deŝovo laŭ bluo"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr "Valoro de deŝovo laŭ bluo de la analoga fasado"
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr "Ruĝa lampo elŝaltita"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr "Ĝi agordas la parametron pri elŝaltado de la ruĝa lampo"
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr "Ruĝa lampo elŝaltita"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr "Ĝi agordas la parametron pri elŝaltado de la verda lampo"
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr "Ruĝa lampo elŝaltita"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr "Ĝi agordas la parametron pri elŝaltado de la blua lampo"
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr "Tiuj ĉi opcioj agas sur la stato de la butonoj de la skanilo."
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Koloro je 36 bitoj"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Punktismmapo 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Punktismmapo 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Aleatorigu"
@@ -4635,7 +4752,7 @@ msgstr "Simulado de mana skanilo"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Ĝi simulas akiradon per mana skanilo. La manaj skaniloj ofte ne rekonas "
"la alton de la bildon apriore, do ili revenigas alton kun valoro -1. Per "
@@ -4776,29 +4893,29 @@ msgstr ""
"Ĝi perfortas la internan interfacon revenigi la valoron pri stato "
"SANE_STATUS_ACCESS_DENIED post la alvoko de la funkcio sane_read()."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, fuzzy, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Tiuj ĉi opcioj agas sur la stato de la butonoj de la skanilo."
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Ŝaltu lampon"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Ĝi ŝaltas la lampon de la skanilo"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Elŝaltu lampon"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4820,42 +4937,42 @@ msgstr ""
msgid "Threshold value for lineart mode"
msgstr "Valoro de sojlo por duuma moduso"
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Provizilo por dokumentoj"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 coloj (~15x10 cm)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 coloj (~20x25 cm)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11 coloj (~21x28 cm)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Mez-nuancoj Nesubtenitaj"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "DispersedDot8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "DispersedDot16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4871,12 +4988,27 @@ msgstr ""
"estas tro alta, X-bazitaj fasadoj povus halti respondante al X-eventoj, "
"kaj do tiu povus kraŝi aŭ bloki la sistemon."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Ĝi elpelas la dokumento post la skanado"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Moduso de antaŭmontro"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4885,12 +5017,12 @@ msgstr ""
"Ĝi elektas la moduson de la antaŭmontro: grizgama antaŭmontro kutime "
"donas la plej bonan kompromison inter rapideco kaj detaleco."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Antaŭdeterminitaj valoroj"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4898,12 +5030,42 @@ msgid ""
msgstr ""
"Ĝi havigas standartajn areojn de skanado por fotoj, presitaj paĝoj k.t.p."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "plata skanilo"
+
+#: ../backend/snapscan-options.c:897
+#, fuzzy, no-c-format
+msgid "Focus-mode"
+msgstr "Fokuso"
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Mem-fokusigo"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Lokiĝo de Fokusigo"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Lokiĝo de Fokusigo"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Koloraj linioj por ĉiu legado"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Ĝrizgamaj linioj por ĉiu legado"
@@ -4977,7 +5139,7 @@ msgstr "Simulado de mana skanilo"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Ĝi simulas akiradon per mana skanilo. La manaj skaniloj ofte ne rekonas "
@@ -5072,8 +5234,8 @@ msgstr "Limo de legado"
#, no-c-format
msgid "Limit the amount of data transferred with each call to sane_read()."
msgstr ""
-"Ĝi limigas la kvanton da datumoj transigitan kun ĉiu alvoko al sane_read"
-"()."
+"Ĝi limigas la kvanton da datumoj transigitan kun ĉiu alvoko al "
+"sane_read()."
#: ../backend/test.c:498
#, no-c-format
@@ -5085,8 +5247,8 @@ msgstr "Grando de la legadlimo"
msgid ""
"The (maximum) amount of data transferred with each call to sane_read()."
msgstr ""
-"La (maksimuma) kvanto da datumoj transigita kun ĉiu alvoko al sane_read"
-"()."
+"La (maksimuma) kvanto da datumoj transigita kun ĉiu alvoko al "
+"sane_read()."
#: ../backend/test.c:514
#, no-c-format
@@ -5232,10 +5394,10 @@ msgid ""
"advanced) capabilities. That means the option can't be set by the "
"frontend but by the user (e.g. by pressing a button at the device)."
msgstr ""
-"(2/6) Bulea test-opcio kiu havas rekta-elektantan kaj simbola-rekonantan"
-"(kaj avanajn) kapablojn. Tio signifas ke la opcio ne estas agordebla de "
-"la fasado, sed nur de la uzanto mem (t.e. per premo de butono sur la "
-"aparato).dispositivo)."
+"(2/6) Bulea test-opcio kiu havas rekta-elektantan kaj simbola-"
+"rekonantan(kaj avanajn) kapablojn. Tio signifas ke la opcio ne estas "
+"agordebla de la fasado, sed nur de la uzanto mem (t.e. per premo de "
+"butono sur la aparato).dispositivo)."
#: ../backend/test.c:762
#, no-c-format
@@ -5611,6 +5773,9 @@ msgstr "Ĝi agordas la deŝovon de la verda kanalo"
msgid "Sets blue channel offset"
msgstr "Ĝi agordas la deŝovon de la blua kanalo"
+#~ msgid "problem not analyzed (unknown SCSI class)"
+#~ msgstr "la problemo ne estis analizita (nekonata SCSI-klaso)"
+
#~ msgid "Grayscale"
#~ msgstr "Grizgamo"
diff --git a/po/es.po b/po/es.po
index b71b23f..00339e2 100644
--- a/po/es.po
+++ b/po/es.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2009-06-25 10:22+0100\n"
"Last-Translator: Miguel Anxo Bouzada <mbouzada@gmail.com>\n"
"Language-Team: GALPon MiniNo <minino@galpon.org>\n"
@@ -30,17 +30,17 @@ msgid "Standard"
msgstr "Estándar"
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -49,25 +49,25 @@ msgid "Geometry"
msgstr "Geometría"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Mejora"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Avanzado"
@@ -92,8 +92,8 @@ msgstr "Forzar vista previa monocroma"
msgid "Bit depth"
msgstr "Bit de profundidad"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Modo de escaneo"
@@ -133,7 +133,8 @@ msgstr "Abajo-derecha X"
msgid "Bottom-right y"
msgstr "Abajo-derecha Y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Resolución de escaneo"
@@ -301,7 +302,7 @@ msgstr "Enlazar resoluciones X e Y"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -987,7 +988,7 @@ msgstr "Predeterminados"
msgid "Set default values for enhancement controls."
msgstr "Ajustar valores predeterminados para los controles de mejora."
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Calibración"
@@ -1029,22 +1030,22 @@ msgstr ""
msgid "Button state"
msgstr "Botón de estado"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Número de muestra a escanear"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Selecciona el número de muestra a escanear"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Escaneo a dos caras"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
@@ -1052,42 +1053,42 @@ msgstr ""
"El escaneo a dos caras proporciona un escaneo del anverso y el reverso "
"del documento"
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Calibrar el escáner"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Fuerza la calibración del escáner antes de realizar el escaneo"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Escaneo en escala de grises"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Escanea en escala de grises, no en color"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Ganancia analógica"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Aumenta o disminuye la ganancia analógica de la gama CCD"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Corrección gamma"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Selecciona la curva de transferencia de la corrección gamma"
@@ -1099,8 +1100,8 @@ msgstr "En bruto"
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr "Color fino"
@@ -1151,339 +1152,334 @@ msgstr "1/2 de la velocidad normal"
msgid "1/3 normal speed"
msgstr "1/3 de la velocidad normal"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, no-c-format
msgid "rounded parameter"
msgstr "parámetro redondeado"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr "desconocido/a"
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr "atasco en el alimentador"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr "la tapa del alimentador está abierta"
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, no-c-format
msgid "lamp failure"
msgstr "fallo de lámpara"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr "error en el posicionamiento del cabezal de escaneo"
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr "Error de verificación de CPU"
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr "Error de verificación de RAM"
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr "Error de verificación de ROM"
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr "error de verificación de hardware"
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, no-c-format
msgid "transparency unit lamp failure"
msgstr "fallo de la lámpara de unidad de transparencias"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr ""
"fallo de posición del cabezal de escaneo de la unidad de transparencias"
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr "error en la longitud de la lista de parámetros"
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr "código de orden de operación incorrecto"
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr "campo incorrecto en CDB"
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr "LUN no soportado"
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr "campo incorrecto en la lista de parámetros"
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr "error en la secuencia de ordenes"
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr "se especificaron demasiadas ventanas"
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr "no se encuentra el soporte"
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr "mensaje de bit de IDENTIFICACIÓN incorrecto"
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr "la opción no conecta"
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr "reiniciar el encendido / reiniciar el bus del dispositivo"
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr "parámetro cambiado por otro iniciador"
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr "sin información adicional"
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr "fallo al volver a escoger"
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr "error de paridad SCSI"
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr "el iniciador detectó la recepción deun mensaje de error"
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr "mensaje de error incorrecto"
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr "error de límite de tiempo"
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, no-c-format
msgid "transparency unit shading error"
msgstr "error de sombreado en la unidad de transparencias"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr "lámpara no estabilizada"
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr "problema no analizado (clase de SCSI desconocido)"
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, no-c-format
msgid "film scanner"
msgstr "escáner de películas"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "escáner plano"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Tipo de película"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr "Seleccionar el tipo de película, p.e. negativo o diapositiva"
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, no-c-format
msgid "Negative film type"
msgstr "Tipo de película negativo"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, no-c-format
msgid "Selects the negative film type"
msgstr "Selecciona el tipo de negativo de película"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, no-c-format
msgid "Hardware resolution"
msgstr "Resolución del hardware"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, no-c-format
msgid "Use only hardware resolutions"
msgstr "Usar sólo resoluciones de hardware"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr "Enfoque"
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, no-c-format
msgid "Auto focus"
msgstr "Enfoque automático"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, no-c-format
msgid "Enable/disable auto focus"
msgstr "Activar/desactivar enfoque automático"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr "Enfoque automático solo una vez"
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr "Hacer enfoque automático solo una vez entre expulsiones"
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, no-c-format
msgid "Manual focus position"
msgstr "Posición de foco manual"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr ""
"Ajustar el sistema óptico de foco en la posición manual (predeterminado: "
"128)."
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr "Márgenes de escaneo"
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr "Ajustes de color extra"
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Invertir imagen"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, no-c-format
msgid "Mirror the image horizontally"
msgstr "Invierte la imagen horizontalmente"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, no-c-format
msgid "Auto exposure"
msgstr "Exposición automática"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Activar/desactivar la característica de exposición automática"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, no-c-format
msgid "Calibration now"
msgstr "Calibrar ahora"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, no-c-format
msgid "Execute calibration *now*"
msgstr "Ejecutar calibración *ahora*"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr "Autodiagnóstico"
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr "Realizar autodiagnóstico del escáner"
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, no-c-format
msgid "Reset scanner"
msgstr "Reiniciar escáner"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, no-c-format
msgid "Reset the scanner"
msgstr "Reiniciar el escáner"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr "Manejar el soporte"
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, no-c-format
msgid "Eject film after each scan"
msgstr "Expulsar la película después de cada escaneo"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr ""
"Expulsar automáticamente la película del dispositivo después de cada "
"escaneo"
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr "Expulsar la película antes de salir"
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
@@ -1491,268 +1487,283 @@ msgstr ""
"Expulsar automáticamente la película del dispositivo antes de salir del "
"programa"
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr "Expulsar película ahora"
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr "Expulsar la película *ahora*"
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, no-c-format
msgid "Document feeder extras"
msgstr "Alimentador de documentos extras"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, no-c-format
msgid "Flatbed only"
msgstr "Sólo plano"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
"Desactivar el alimentador automático de documentos y usar sólo el plano"
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, no-c-format
msgid "Transparency unit"
msgstr "Unidad de transparencias"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
"Activar/desactivar la unidad de transparencias (FAU, unidad adaptadora "
"de película)"
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, no-c-format
msgid "Negative film"
msgstr "Película en negativo"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, no-c-format
msgid "Positive or negative film"
msgstr "Película en positivo o en negativo"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr "Control de densidad"
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr "Ajustar el modo de control de densidad"
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, no-c-format
msgid "Transparency ratio"
msgstr "Tasa de transparencia"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, no-c-format
msgid "Select film type"
msgstr "Seleccionar tipo de película"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, no-c-format
msgid "Select the film type"
msgstr "Seleccionar el tipo de película"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Plana"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, fuzzy, no-c-format
msgid "ADF Front"
msgstr "la tapa del alimentador está abierta"
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, fuzzy, no-c-format
msgid "ADF Back"
msgstr "atasco en el alimentador"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "Alimentador a dos caras"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Imprimir"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Dos caras"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Rojo"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Verde"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Azul"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Mejora"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Mejora"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Mejora"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Ninguno"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Una cara"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Dos caras"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Unidad de transparencias"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Alimentador automático de documentos (ADF)"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Película en positivo"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Película en negativo"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Enfoque en el cristal"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Enfoque a 2.5mm sobre el cristal"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Medios tonos A (tonos duros)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Medios tonos B (tonos suaves)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Medios tonos C (matizado)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Trama A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Trama B (4x4 espiral)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Trama C (4x4 matizado)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Trama D (8x4 matizado)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Tecnología de mejora de texto"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Descargar patrón A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Descargar patrón B"
@@ -1762,7 +1773,7 @@ msgstr "Descargar patrón B"
msgid "No Correction"
msgstr "Sin corrección"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Definida por el usuario"
@@ -1787,33 +1798,33 @@ msgstr "Impresoras de inyección de tinta"
msgid "CRT monitors"
msgstr "Monitores CRT"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Predeterminado"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Impresión de alta densidad"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Impresión de baja densidad"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Impresión de alto contraste"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Definido por el usuario (gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Definido por el usuario (gamma=1.8)"
@@ -1853,233 +1864,233 @@ msgstr "A4"
msgid "Max"
msgstr "Máx"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Modo de escaneo"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Selecciona medios tonos"
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Exclusión"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Seleccionar lo que se va a excluir."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Selecciona el brillo."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Enfoque"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Corrección de color"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
"Ajusta la tabla de corrección del color para el dispositivo de salida "
"seleccionado."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Coeficientes de corrección de color"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Matriz de multiplicación de RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Cambiar de verde a rojo"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Cambiar de verde a azul"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Cambiar de rojo a verde"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Cambiar de rojo a azul"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Cambiar de azul a verde"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Cambiar de azul a rojo"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Controla el nivel de verde"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Añade rojo basándose en el nivel de verde"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Añade azul basándose en el nivel de verde"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Añade verde basándose en el nivel de rojo"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Controla el nivel de rojo"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Añade azul basándose en el nivel de rojo"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Añade verde basándose en el nivel de azul"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Añade rojo basándose en el nivel de azul."
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Controla el nivel de azul"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Invertir la imagen."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Vista previa rápida"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Segmentación automática de área"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Lista corta de resoluciones"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Mostrar lista corta de resoluciones"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Acercamiento"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Define el factor de zoom que usará el escáner"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Formato rápido"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Equipamiento opcional"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Expulsar"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Expulsar la hoja del alimentador"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Expulsión automática"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Expulsar el documento después del escaneo"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "Modo alimentador"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Seleccionar el modo del alimentador (una cara/dos caras)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Bahía"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Seleccione la bahía para escanear"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2089,12 +2100,12 @@ msgstr ""
"predefinidos o de una tabla definida por el usuario, que puede ser "
"descargada al escáner."
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Posición del foco"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
@@ -2102,12 +2113,12 @@ msgstr ""
"Ajusta la posición del foco, ya sea al cristal o a 2.5mm por encima del "
"cristal"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Esperar por el botón"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2116,178 +2127,219 @@ msgstr ""
"Después de enviar la orden de escanear, esperar hasta que se presione el "
"botón del escáner para empezar realmente el proceso de escaneo."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Diapositiva en positivo"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Diapositiva en negativo"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "Definida por el usuario"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Activo"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Apagado"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Difuminado"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, fuzzy, no-c-format
msgid "Diffusion"
msgstr "Difusión de error"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Nivel de blanco"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Nivel de negro"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, fuzzy, no-c-format
msgid "Continue"
msgstr "Condicional"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Vertical"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "Vertical"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, fuzzy, no-c-format
msgid "Front"
msgstr "Imprimir"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Extras"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Umbral"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Desactivar interpolación"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2296,23 +2348,45 @@ msgstr ""
"Cuando se usan altas resoluciones en las que la resolución horizontal es "
"más pequeña que la vertical, esto desactiva la interpolación horizontal."
-#: ../backend/genesys.c:6235
-#, no-c-format
-msgid "Color Filter"
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
msgstr "Filtro de color"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
"Cuando se usa gris o línea de arte esta opción selecciona el color usado."
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Calibración"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Define el modo de calibración"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Caché de datos de calibración"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Tiempo de espera de la lámpara"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2321,62 +2395,77 @@ msgstr ""
"La lámpara será apagada después del tiempo dado (en minutos). Un valor "
"de 0 significa que la lámpara no será apagada"
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Apagar la lámpara durante la calibración de oscuridad"
+
+#: ../backend/genesys.c:5941
+#, fuzzy, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr "Minutos que tardará la lámpara en apagarse tras el escaneo"
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
msgstr "Botón de archivo"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr "Botón de OCR"
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
msgstr "Botón de energía"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Botón de correo-e"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Limpiar la calibración"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Fuerza la calibración del escáner antes de realizar el escaneo"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Botones"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Calibrar"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, no-c-format
msgid "Start calibration using special sheet"
msgstr "Iniciar calibración usando una hoja especial"
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, no-c-format
msgid "Clear calibration"
msgstr "Limpiar la calibración"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, no-c-format
msgid "Clear calibration cache"
msgstr "Limpiar la caché de datos de calibración"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Adaptador de transparencias"
@@ -2510,8 +2599,8 @@ msgid "Scanner model"
msgstr "Modelo de escáner"
#: ../backend/hp3900_sane.c:1408
-#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+#, fuzzy, no-c-format
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
"Permite comprobar el comportamiento del dispositivo con otros modelos "
"soportados"
@@ -2662,12 +2751,12 @@ msgstr "Actualiza la información acerca del dispositivo"
msgid "This option reflects a front panel scanner button"
msgstr "Esta opción refleja un botón del panel frontal del escáner"
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Imagen"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Varios"
@@ -2692,17 +2781,17 @@ msgstr "posición Y"
msgid "Hardware internal Y position of the scanning area."
msgstr "Posición Y interna en el hardware de la zona de escaneo."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Estado de la lámpara"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Enciende o apaga la lámpara"
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Calibrar el nivel de blanco y negro."
@@ -2811,8 +2900,8 @@ msgstr "Lento"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normal"
@@ -3151,9 +3240,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3452,7 +3541,7 @@ msgstr "Ajusta el resalte de la imagen"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gamma"
@@ -3519,16 +3608,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3539,16 +3618,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3617,7 +3686,7 @@ msgstr "Mejora"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3785,7 +3854,7 @@ msgstr "Ganancia de gris"
msgid "Sets gray channel gain"
msgstr "Ajusta la ganancia del canal de gris"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3796,7 +3865,7 @@ msgstr "Ganancia de rojo"
msgid "Sets red channel gain"
msgstr "Ajusta la ganancia del canal de rojo"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3807,7 +3876,7 @@ msgstr "Ganancia de Verde"
msgid "Sets green channel gain"
msgstr "Ajusta la ganancia del canal de verde"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3899,7 +3968,7 @@ msgstr "Una página"
msgid "All pages"
msgstr "Todas las páginas"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "escáner con cargador automático"
@@ -3972,12 +4041,12 @@ msgstr "Usar el adaptador de diapositivas de 35mm"
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "Esta opción apaga la lámpara del plano durante el escaneo"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Escaneo de calidad"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "La mejor calidad, pero a velocidad lenta"
@@ -4410,12 +4479,39 @@ msgstr ""
"Calentar hasta que el brillo de la lámpara sea constante en vez de "
"esperar por los 40 segundos de calentamiento."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Película en negativo"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negativo"
+
+#: ../backend/pixma.c:396
+#, fuzzy, no-c-format
+msgid "48 bits color"
+msgstr "Color fino"
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr "Botón de control de escaneo"
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4426,198 +4522,218 @@ msgstr ""
"proceder, haga clic en el botón \"SCAN\" (para MP150) o \"COLOR\" (para "
"otros modelos). Para cancelar, haga clic en el botón \"GRAY\"."
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
msgstr "Actualizar estado del botón"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr "Botón 1"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr "Botón 2"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Transparencia"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr "Ajustes del dispositivo"
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr "Interruptor de lámpara"
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr "Cambiar la(s) lámpara(s) manualmente."
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Apagar la lámpara durante la calibración de oscuridad"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr "Apagar siempre la lámpara cuando se calibra la oscuridad."
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, no-c-format
msgid "Calibration data cache"
msgstr "Caché de datos de calibración"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr "Activa o desactiva la caché de datos de calibración"
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, no-c-format
msgid "Performs calibration"
msgstr "Calibración de precisión"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr "Acelerar el sensor"
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr "Activa o desactiva la aceleración de movimiento del sensor."
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr "Tiempo de calentamiento"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr "Tiempo de calentamiento en segundos."
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr "Tiempo de apagado de lámpara"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Tiempo de apagado de lámpara en segundos."
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr "Interfaz analógica (AFE)"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr "Valor de ganancia de rojo en el AFE"
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Desviación rojo"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr "Valor de la desviación de rojo en el AFE"
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr "Valor de ganancia de verde en el AFE"
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Desviación verde"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr "Valor de la desviación de verde en el AFE"
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr "Valor de ganancia de azul en el AFE"
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Desviación azul"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr "Valor de la desviación de azul en el AFE"
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr "Apagar lámpara roja"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr "Define los parámetros de apagado de lámpara roja"
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr "Apagar lámpara verde"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr "Define los parámetros de apagado de lámpara verde"
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr "Apagar lámpara azul"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr "Define los parámetros de apagado de lámpara azul"
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr "Esta opción refleja el estado de los botones del escáner"
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Color 36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Mapa de trama 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Mapa de trama 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Aleatorio"
@@ -4666,7 +4782,7 @@ msgstr "Simulación de escáner manual"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Simula un escáner de mano. Los escáneres de mano a menudo no conocen a "
"priori la distancia a la imagen. En su lugar utiliza una altura de "
@@ -4809,29 +4925,29 @@ msgstr ""
"Forzar al motor a devolver el código de estado de "
"SANE_STATUS_ACCESS_DENIED después de haber sido llamado sane_read()."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Esta opción refleja el estado de los botones del escáner"
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Encender lámpara"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Enciende la lámpara del escáner"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Apagar lámpara"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4852,42 +4968,42 @@ msgstr "Minutos que tardará la lámpara en apagarse tras el escaneo"
msgid "Threshold value for lineart mode"
msgstr "Valor de umbral para el modo de línea de arte"
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Alimentador de documentos"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 (pulg.)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 (pulg.)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11 (pulg.)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Medios tonos no compatibles"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "Punto disperso 8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "Punto disperso 16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4903,12 +5019,27 @@ msgstr ""
"demasiado alto, basado en interfaces X puede dejar de responder a "
"eventos de X y su sistema se podría atascar."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Expulsar el documento después del escaneo"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Modo de vista previa"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4918,12 +5049,12 @@ msgstr ""
"grises proporciona en general, la mejor relación entre velocidad y "
"detalle."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Ajustes predefinidos"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4932,12 +5063,42 @@ msgstr ""
"Proporciona superficies de escaneo estándar para fotografías, páginas "
"impresas, etc."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "escáner plano"
+
+#: ../backend/snapscan-options.c:897
+#, fuzzy, no-c-format
+msgid "Focus-mode"
+msgstr "Enfoque"
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Enfoque automático"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Posición del foco"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Posición del foco"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Color, líneas por lectura"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Escala de grises, líneas de por lectura"
@@ -5011,7 +5172,7 @@ msgstr "Simulación de escaneo manual"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Simula un escáner de mano. Los escáneres de mano a menudo no conocen a "
@@ -5649,6 +5810,9 @@ msgstr "Ajusta el desplazamiento del canal de verde"
msgid "Sets blue channel offset"
msgstr "Ajusta el desplazamiento del canal de azul"
+#~ msgid "problem not analyzed (unknown SCSI class)"
+#~ msgstr "problema no analizado (clase de SCSI desconocido)"
+
#~ msgid "Grayscale"
#~ msgstr "Escala de grises"
diff --git a/po/fi.po b/po/fi.po
index ecb51c4..6d73c2f 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends 1.0.11\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2007-12-17 23:00+0100\n"
"Last-Translator: Harri Järvi <harri.jarvi@tut.fi>\n"
"Language-Team: Debian l10n Finnish <debian-l10n-finnish@lists.debian."
@@ -27,17 +27,17 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -46,25 +46,25 @@ msgid "Geometry"
msgstr "Geometria"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Parannus"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Lisäasetukset"
@@ -89,8 +89,8 @@ msgstr "Pakota yksiväriset esikatselut"
msgid "Bit depth"
msgstr "Bittisyvyys"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Lukutapa"
@@ -130,7 +130,8 @@ msgstr "Oikea alakulma x"
msgid "Bottom-right y"
msgstr "Oikea alakulma y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Kuvanluvun tarkkuus"
@@ -298,7 +299,7 @@ msgstr "Sido X- ja Y-tarkkuus"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -965,7 +966,7 @@ msgstr "Oletukset"
msgid "Set default values for enhancement controls."
msgstr "Aseta oletusasetukset parantimille."
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Kalibrointi"
@@ -1005,63 +1006,63 @@ msgstr ""
msgid "Button state"
msgstr "Painikkeen tila"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Luettavan kehyksen numero"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Valitsee luettavan kehyksen numeron"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, fuzzy, no-c-format
msgid "Duplex scan"
msgstr "Kaksipuolinen"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr ""
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Kalibroi kuvanlukija"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Pakottaa kalibroinnin ennen kuvanlukua."
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Harmaasävy"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Lue harmaasävykuva värikuvan sijaan"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Analoginen vahvistus"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Kasvattaa tai vähentää analogista vahvistusta CCD-kennossa."
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Gamma-korjaus"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Valitsee gamma-korjauskäyrän"
@@ -1073,8 +1074,8 @@ msgstr ""
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr ""
@@ -1125,598 +1126,608 @@ msgstr "2x2 normaali"
msgid "1/3 normal speed"
msgstr "3x3 normaali"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, fuzzy, no-c-format
msgid "rounded parameter"
msgstr "Epämääräiset parametrit"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr ""
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, fuzzy, no-c-format
msgid "ADF jam"
msgstr "ADF"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr ""
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, fuzzy, no-c-format
msgid "lamp failure"
msgstr "Gamma"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr ""
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr ""
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr ""
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr ""
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr ""
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, fuzzy, no-c-format
msgid "transparency unit lamp failure"
msgstr "Läpinäkyvyysyksikkö"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr ""
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr ""
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr ""
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr ""
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr ""
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr ""
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr ""
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr ""
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr ""
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr ""
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr ""
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr ""
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr ""
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr ""
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr ""
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr ""
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr ""
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr ""
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr ""
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, fuzzy, no-c-format
msgid "transparency unit shading error"
msgstr "Läpinäkyvyysyksikkö"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr ""
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr ""
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, fuzzy, no-c-format
msgid "film scanner"
msgstr "Tasokuvanlukija"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "Tasokuvanlukija"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Filmin tyyppi"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr ""
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, fuzzy, no-c-format
msgid "Negative film type"
msgstr "Negatiivifilmi"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, fuzzy, no-c-format
msgid "Selects the negative film type"
msgstr "Valitse koekuva"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, fuzzy, no-c-format
msgid "Hardware resolution"
msgstr "Kuvanluvun tarkkuus"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, fuzzy, no-c-format
msgid "Use only hardware resolutions"
msgstr "Näyttää lyhyen tarkkuuslistan"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr ""
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, fuzzy, no-c-format
msgid "Auto focus"
msgstr "Automaattinen poisto"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, fuzzy, no-c-format
msgid "Enable/disable auto focus"
msgstr "Poista esitarkennus"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr ""
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr ""
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, fuzzy, no-c-format
msgid "Manual focus position"
msgstr "Korjaa tarkennuspiste"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr ""
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr ""
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr ""
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Peilikuva"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, fuzzy, no-c-format
msgid "Mirror the image horizontally"
msgstr "Peilaa kuvan vaakasuunnassa"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, fuzzy, no-c-format
msgid "Auto exposure"
msgstr "Aseta valotusaika"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, fuzzy, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Valotusajan asettaminen"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, fuzzy, no-c-format
msgid "Calibration now"
msgstr "Kalibrointi"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, fuzzy, no-c-format
msgid "Execute calibration *now*"
msgstr "Määrää kalibraatiotavan"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr ""
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr ""
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, fuzzy, no-c-format
msgid "Reset scanner"
msgstr "arkkisyöttöinen"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, fuzzy, no-c-format
msgid "Reset the scanner"
msgstr "arkkisyöttöinen"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr ""
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, fuzzy, no-c-format
msgid "Eject film after each scan"
msgstr "Poista kohde kuvanluvun jälkeen"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr ""
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr ""
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr ""
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr ""
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr ""
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, fuzzy, no-c-format
msgid "Document feeder extras"
msgstr "Asiakirjan syöttäjä"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, fuzzy, no-c-format
msgid "Flatbed only"
msgstr "Taso"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, fuzzy, no-c-format
msgid "Transparency unit"
msgstr "Läpinäkyvyysyksikkö"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, fuzzy, no-c-format
msgid "Negative film"
msgstr "Negatiivifilmi"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, fuzzy, no-c-format
msgid "Positive or negative film"
msgstr "Positiivifilmi"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr ""
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr ""
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, fuzzy, no-c-format
msgid "Transparency ratio"
msgstr "Läpinäkyvyysyksikkö"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, fuzzy, no-c-format
msgid "Select film type"
msgstr "Filmin tyyppi"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, fuzzy, no-c-format
msgid "Select the film type"
msgstr "Valitsee rasterin"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Taso"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr ""
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, fuzzy, no-c-format
msgid "ADF Back"
msgstr "ADF"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, fuzzy, no-c-format
msgid "ADF Duplex"
msgstr "Kaksipuolinen"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Tulosta"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Kaksipuolinen"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Punainen"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Vihreä"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Sininen"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Parannus"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Parannus"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Parannus"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Ei mikään"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Yksipuolinen"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Kaksipuolinen"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Läpinäkyvyysyksikkö"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Automaattinen syöttö"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Positiivifilmi"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Negatiivifilmi"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Kohdistus lasissa"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Kohdistus 2,5 mm lasin yläpuolella"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Rasteri A (Hard Tone)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Rasteri B (Soft Tone)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Rasteri C (Net Screen)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Rasteri A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Rasteri B (4x4 Spiral)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Rasteri C (4x4 Net Screen)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Rasteri D (8x4 Net Screen)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Tekstin parannusmenetelmä"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Ladattu kuvio A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Ladattu kuvio B"
@@ -1726,7 +1737,7 @@ msgstr "Ladattu kuvio B"
msgid "No Correction"
msgstr "Ei korjausta"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Käyttäjän määrittelemä"
@@ -1751,33 +1762,33 @@ msgstr "Mustesuihkutulostimet"
msgid "CRT monitors"
msgstr "Loisteputkinäytöt"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Oletus"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Korkeatarkkuuksinen tulostus"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Matalatarkkuuksinen tulostus"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Suuri kontrastinen tulostus"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Käyttäjän määrittelemä (Gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Käyttäjän määrittelemä (Gamma=1.8)"
@@ -1817,231 +1828,231 @@ msgstr "A4"
msgid "Max"
msgstr "Koko alue"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Lukutapa"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Valitsee rasterin"
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr ""
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr ""
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Valitsee kirkkauden."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Terävyys"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Värikorjaus"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr "Valitsee värikorjaustaulukon valitulle tuloslaitteelle."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Värikorjauskertoimet"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Matriisikerroin RGB:lle"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Vihreän siirtymä punaiseen"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Vihreän siirtymä siniseen"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Punaisen siirtymä virheään"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Punaisen siirtymä siniseen"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Sinisen siirtymä vihreään"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Sinisen siirtymä punaiseen"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Määrää vihreän määrän"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Lisää punaista vihreän määrän perusteella"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Lisää sinistä vihreän määrän perusteella"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Lisää vihreää punaisen määrän perusteella"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Määrää punaisen määrän"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Lisää sinistä punaisen määrän perusteella"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Lisää vihreää sinisen määrän perusteella"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Lisää punaista sinisen määrän perusteella"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Määrää sinisen määrän"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Peilaa kuvan."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Nopea esikatselu"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Automaattinen osittelu"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Lyhyt tarkkuuslista"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Näyttää lyhyen tarkkuuslistan"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Suurennus"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Määrää kuvanlukijan käyttämän zoom-kertoimen"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Nopea formaatti"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Lisävaruste"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Poista"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Poista kohde syöttölaitteesta"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Automaattinen poisto"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Poista kohde kuvanluvun jälkeen"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "Syötttapa"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Valitsee syöttötavan (yksi-/kaksipuolinen)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Taso"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Valitsee kuvanluvun tasolta"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2050,23 +2061,23 @@ msgstr ""
"Valitsee gamma-korjauksen esiasetettujen laitteiden listalta tai "
"käyttäjän määrämän taulukon, joka voidaan siirtää kuvanlukijaan"
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Kohdistuspiste"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr "Asettaa kohdistuspisteen joko lasiin tai 2,5 mm sen yläpuolelle"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Odota painiketta"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2075,262 +2086,340 @@ msgstr ""
"Kuvanlukukomennon lähettämisen jälkeen, odota kunnes kuvanlukijan "
"painiketta todella painetaan, ennen kuvanluvun aloittamista."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, fuzzy, no-c-format
msgid "Positive Slide"
msgstr "Positiivifilmi"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, fuzzy, no-c-format
msgid "Negative Slide"
msgstr "Negatiivifilmi"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "Käyttäjän määrittelemä"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Päällä"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Poissa"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Rasteri"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, no-c-format
msgid "Diffusion"
msgstr ""
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Valkotaso"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Mustataso"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, fuzzy, no-c-format
msgid "Continue"
msgstr "Ehdollinen"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Vaaka"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "Vaaka"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "Vaaka"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Pysty"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "Pysty"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, fuzzy, no-c-format
msgid "Front"
msgstr "Tulosta"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, fuzzy, no-c-format
msgid "Extras"
msgstr "Hyvin nopea"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Kynnys"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, fuzzy, no-c-format
msgid "Disable interpolation"
msgstr "Poista peruutus."
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
"than the vertical resolution this disables horizontal interpolation."
msgstr ""
-#: ../backend/genesys.c:6235
+#: ../backend/genesys.c:5869
#, fuzzy, no-c-format
-msgid "Color Filter"
+msgid "Color filter"
msgstr "Väriviivapiirros"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Kalibrointi"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Määrää kalibraatiotavan"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Kalibrointitila"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, fuzzy, no-c-format
msgid "Lamp off time"
msgstr "Valo pois"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
"of 0 means, that the lamp won't be turned off."
msgstr ""
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Raakakalibrointi"
+
+#: ../backend/genesys.c:5941
+#, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr ""
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, fuzzy, no-c-format
msgid "File button"
msgstr "Odota painiketta"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, fuzzy, no-c-format
msgid "Power button"
msgstr "Odota painiketta"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Odota painiketta"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Raakakalibrointi"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Pakottaa kalibroinnin ennen kuvanlukua."
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, fuzzy, no-c-format
msgid "Buttons"
msgstr "Painikkeen tila"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Kalibroi"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, fuzzy, no-c-format
msgid "Start calibration using special sheet"
msgstr "Aloita kalibrointi."
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, fuzzy, no-c-format
msgid "Clear calibration"
msgstr "Raakakalibrointi"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, fuzzy, no-c-format
msgid "Clear calibration cache"
msgstr "Kalibrointitila"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Läpinäkyvyysyksikkö"
@@ -2459,7 +2548,7 @@ msgstr "Lukutapa"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2600,12 +2689,12 @@ msgstr ""
msgid "This option reflects a front panel scanner button"
msgstr ""
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr ""
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr ""
@@ -2630,17 +2719,17 @@ msgstr "Siirtymä"
msgid "Hardware internal Y position of the scanning area."
msgstr "Kuva-alueen vasemman yläkulman x-koordinaatti."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr ""
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, fuzzy, no-c-format
msgid "Switches the lamp on or off."
msgstr "Asettaa valon päälle/pois"
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr ""
@@ -2748,8 +2837,8 @@ msgstr "Hidas"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normaali"
@@ -3087,9 +3176,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3388,7 +3477,7 @@ msgstr "Asettaa kuvan korostuksen"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gamma"
@@ -3455,16 +3544,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3475,16 +3554,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3553,7 +3622,7 @@ msgstr "Parannus"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3721,7 +3790,7 @@ msgstr "Harmaan vahvistus"
msgid "Sets gray channel gain"
msgstr "Asettaa harmaan kanavan vahvistusta"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3732,7 +3801,7 @@ msgstr "Punaisen vahvistus"
msgid "Sets red channel gain"
msgstr "Asettaa punaisen kanavan vahvistusta"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3743,7 +3812,7 @@ msgstr "Vihreän vahvistus"
msgid "Sets green channel gain"
msgstr "Asettaa vihreän kanavan vahvistusta"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3835,7 +3904,7 @@ msgstr "Yksi sivu"
msgid "All pages"
msgstr "Kaikki sivut"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "arkkisyöttöinen"
@@ -3906,12 +3975,12 @@ msgstr "Käytä lightlid-35mm sovitinta"
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "Tämä asetus sulkee kuvanlukijan lampun kuvanluvun ajaksi"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Paras laatu"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Paras laatu, mutta hitain"
@@ -4333,12 +4402,39 @@ msgstr ""
"Lämmittää kunnes lampun kirkkaus tasaantuu. Muuten lämmitetään 40 "
"sekuntia."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Negatiivifilmi"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negatiivi"
+
+#: ../backend/pixma.c:396
+#, no-c-format
+msgid "48 bits color"
+msgstr ""
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr ""
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4346,198 +4442,218 @@ msgid ""
"cancel, press \"GRAY\" button."
msgstr ""
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, fuzzy, no-c-format
msgid "Update button state"
msgstr "Painikkeen tila"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, fuzzy, no-c-format
msgid "Button 1"
msgstr "Painikkeen tila"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, fuzzy, no-c-format
msgid "Button 2"
msgstr "Painikkeen tila"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Läpinäkyvyys"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr ""
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr ""
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr ""
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, fuzzy, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Raakakalibrointi"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr ""
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, fuzzy, no-c-format
msgid "Calibration data cache"
msgstr "Kalibrointitila"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr ""
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, fuzzy, no-c-format
msgid "Performs calibration"
msgstr "Raakakalibrointi"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr ""
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr ""
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, fuzzy, no-c-format
msgid "Warmup-time"
msgstr "Lämmitä lamppu"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr ""
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, fuzzy, no-c-format
msgid "Lampoff-time"
msgstr "Valo pois"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr ""
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, fuzzy, no-c-format
msgid "Analog frontend"
msgstr "Analoginen gamma (punainen)"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Punaisen siirtymä"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Vihreän siirtymä"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Sinisen siirtymä"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, fuzzy, no-c-format
msgid "Red lamp off"
msgstr "Asettaa valon päälle/pois"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, fuzzy, no-c-format
msgid "Green lamp off"
msgstr "Asettaa valon päälle/pois"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, fuzzy, no-c-format
msgid "Blue lamp off"
msgstr "Asettaa valon päälle/pois"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr ""
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Väri 36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Rasteri 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Rasteri 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Satunnaista"
@@ -4586,7 +4702,7 @@ msgstr "Käsikuvanlukijasimulaatio"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Simuloi käsiskanneria. Käsiskannerit eivät yleensä tiedä kuvan kokoa "
"etukäteen. Sen sijaan, ne palauttavat kuvan korkeudeksi -1. Tällä "
@@ -4681,8 +4797,8 @@ msgid ""
"Force the backend to return the status code SANE_STATUS_COVER_OPEN after "
"sane_read() has been called."
msgstr ""
-"Pakota ajuri palauttamaan paluuarvo SANE_STATUS_COVER_OPEN, kun sane_read"
-"() on kutsuttu."
+"Pakota ajuri palauttamaan paluuarvo SANE_STATUS_COVER_OPEN, kun "
+"sane_read() on kutsuttu."
#: ../backend/pnm.c:456
#, no-c-format
@@ -4695,8 +4811,8 @@ msgid ""
"Force the backend to return the status code SANE_STATUS_IO_ERROR after "
"sane_read() has been called."
msgstr ""
-"Pakota ajuri palauttamaan paluuarvo SANE_STATUS_IO_ERROR, kun sane_read"
-"() on kutsuttu."
+"Pakota ajuri palauttamaan paluuarvo SANE_STATUS_IO_ERROR, kun "
+"sane_read() on kutsuttu."
#: ../backend/pnm.c:469
#, no-c-format
@@ -4726,29 +4842,29 @@ msgstr ""
"Pakota ajuri palauttamaan paluuarvo SANE_STATUS_ACCESS_DENIED, kun "
"sane_read() on kutsuttu."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr ""
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Valo päälle"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Laittaa kuvanlukijan valon päälle"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Valo pois"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4769,42 +4885,42 @@ msgstr ""
msgid "Threshold value for lineart mode"
msgstr ""
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Asiakirjan syöttäjä"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 (tuumaa)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 (tuumaa)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11 (tuumaa)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Rasterointi ei ole tuettu"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "Hajapisteet 8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "Hajapisteet 16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4820,12 +4936,27 @@ msgstr ""
"käyttöliittymät voivat lakata vastaamasta X-tapahtumiin ja järjestelmä "
"saattaa kaatua."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Poista kohde kuvanluvun jälkeen"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Esikatselutila"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4834,12 +4965,12 @@ msgstr ""
"Valitse esikatselutila. Harmaasävy antaa yleensä parhaan yhdistelmän "
"nopeutta ja yksityiskohtia"
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Esimääritetyt asetukset"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4847,12 +4978,42 @@ msgid ""
msgstr ""
"Tarjoaa vakioalueet valokuville ja tulostetuille sivuille ja vastaaville."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "Tasokuvanlukija"
+
+#: ../backend/snapscan-options.c:897
+#, no-c-format
+msgid "Focus-mode"
+msgstr ""
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Automaattinen poisto"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Kohdistuspiste"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Kohdistuspiste"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Väririvejä / luku"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Harmaasävyrivejä / luku"
@@ -4926,7 +5087,7 @@ msgstr "Käsikuvanlukijasimulaatio"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Simuloi käsikuvnalukijaa. Käsikuvanlukijat eivät tiedä kuvan korkeutta "
diff --git a/po/fr.po b/po/fr.po
index 5fe9ed3..80459bb 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -44,7 +44,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends 1.0.19\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2008-01-17 22:25+0100\n"
"Last-Translator: Yann E. MORIN <yann dot morin dot 1998 at anciens dot "
"enib dot fr>\n"
@@ -66,17 +66,17 @@ msgid "Standard"
msgstr "Général"
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -85,25 +85,25 @@ msgid "Geometry"
msgstr "Aire de numérisation"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Réglages fins"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Avancé"
@@ -128,8 +128,8 @@ msgstr "Force l'aperçu en noir et blanc"
msgid "Bit depth"
msgstr "Profondeur"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Mode de numérisation"
@@ -169,7 +169,8 @@ msgstr "X bas-droit"
msgid "Bottom-right y"
msgstr "Y bas-droit"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Echantillonnage"
@@ -337,7 +338,7 @@ msgstr "Lier les échantillonnage X et Y"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -1034,7 +1035,7 @@ msgstr "Valeurs par défaut"
msgid "Set default values for enhancement controls."
msgstr "Valeurs par défaut pour les réglages fins."
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Calibration"
@@ -1076,22 +1077,22 @@ msgstr ""
msgid "Button state"
msgstr "Etat du bouton"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Numéro de la trame à numériser"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Sélectionner le numéro de la trame à numériser"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Numérisation recto-verso"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
@@ -1099,42 +1100,42 @@ msgstr ""
"La numérisation recto-verso permet de numériser les deux cotés d'un "
"document"
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Calibrer le scanner"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Forcer la calibration du scanner avant la numérisation"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Niveaux de gris"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Effectue une numérisation en niveaux de gris plutôt qu'en couleurs"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Gain analogique"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Augmenter/diminuer le gain analogique du capteur CCD"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Correction gamma"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Sélectionne la courbe de correction gamma"
@@ -1146,8 +1147,8 @@ msgstr "Brut"
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr "Couleurs précises"
@@ -1198,601 +1199,611 @@ msgstr "Vitesse 1/2"
msgid "1/3 normal speed"
msgstr "Vitesse 1/3"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, no-c-format
msgid "rounded parameter"
msgstr "Paramètres arrondis"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr "inconnu(e)"
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr "Bourrage du chargeur automatique"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr "Couvercle du chargeur automatique ouvert"
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, no-c-format
msgid "lamp failure"
msgstr "lampe défectueuse"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr "erreur de positionnement du capteur"
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr "erreur de test du processeur (CPU)"
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr "erreur de test de la mémoire RAM"
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr "erreur de test de la mémoire ROM"
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr "erreur de test du matériel"
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, no-c-format
msgid "transparency unit lamp failure"
msgstr "lampe de l'adaptateur de transparent défectueuse"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr "erreur de positionnement du capteur pour transparents"
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr "longueur de la liste de paramètres incorrecte"
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr "code commande invalide"
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr "champ du bloc de description de commande (CDB) invalide"
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr "Numéro d'unité logique (LUN) non supporté"
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr "champ invalide dans la liste des paramètres"
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr "erreur dans la séquence de commandes"
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr "trop de fenêtres spécifiées"
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr "document absent"
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr "message d'identification (IDENTIFY) invalide"
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr "option non connectée"
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr "Réinitialisation au démarrage / du bus"
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr "paramètre modifié par un autre maître"
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr "pas d'information supplémentaire"
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr "échec de re-sélection"
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr "erreur de parité SCSI"
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr "message d'erreur détecté "
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr "message d'erreur invalide"
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr "erreur de dépassement de temps"
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, no-c-format
msgid "transparency unit shading error"
msgstr "erreur de l'adaptateur pour transparents"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr "lampe non stabilisée"
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr "problème non traité (classe SCSI inconnue)"
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, no-c-format
msgid "film scanner"
msgstr "numériseur de transparents"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "numériseur à plat"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Type de film"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr "Sélectionne le type de transparents (négatifs ou diapositives)"
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, no-c-format
msgid "Negative film type"
msgstr "Film négatif"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, no-c-format
msgid "Selects the negative film type"
msgstr "Sélectionne l'utilisation de film négatif"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, no-c-format
msgid "Hardware resolution"
msgstr "Echantillonnage matériel"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, no-c-format
msgid "Use only hardware resolutions"
msgstr "Utilise seulement les valeurs d'échantillonnage matériel"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr "Mise au point"
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, no-c-format
msgid "Auto focus"
msgstr "Mise au point automatique"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, no-c-format
msgid "Enable/disable auto focus"
msgstr "Activer/désactiver la mise au point automatique"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr "Une seule mise au point automatique"
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr ""
"Effectuer la mise au point automatique une seule fois entre chaque "
"éjection"
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, no-c-format
msgid "Manual focus position"
msgstr "Mise au point manuelle"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr "Effectuer manuellement la mise au point (128 par défaut)"
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr "Marges"
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr "Plus de réglages de couleur"
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Image miroir"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, no-c-format
msgid "Mirror the image horizontally"
msgstr "Image miroir horizontal"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, no-c-format
msgid "Auto exposure"
msgstr "Temps d'exposition automatique"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Activer/désactiver le temps d'exposition automatique"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, no-c-format
msgid "Calibration now"
msgstr "Calibrer maintenant"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, no-c-format
msgid "Execute calibration *now*"
msgstr "Effectue la calibration *maintenant*"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr "Diagnostic automatique"
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr "Effectue le diagnostic automatique du scanner"
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, no-c-format
msgid "Reset scanner"
msgstr "Réinitialiser le scanner"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, no-c-format
msgid "Reset the scanner"
msgstr "Réinitialiser le scanner"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr "Maniement des documents"
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, no-c-format
msgid "Eject film after each scan"
msgstr "Ejecte le film après chaque numérisation"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr "Ejecte automatiquement le film après chaque numérisation"
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr "Ejecte le film avant de quitter"
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr "Ejecte automatiquement le film avant de quitter le programme"
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr "Ejecte le film maintenant"
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr "Ejecte le film *maintenant*"
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, no-c-format
msgid "Document feeder extras"
msgstr "Chargeur automatique de document, options avancées"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, no-c-format
msgid "Flatbed only"
msgstr "A plat seulement"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
"Ne pas utiliser le chargeur automatique, seulement le scanner à plat"
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, no-c-format
msgid "Transparency unit"
msgstr "Adaptateur pour transparents"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr "Allumer/éteindre l'adaptateur pour transparents"
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, no-c-format
msgid "Negative film"
msgstr "Film négatif"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, no-c-format
msgid "Positive or negative film"
msgstr "Film positif ou négatif"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr "Contrôle de densité"
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr "Positionne le mode de contrôle de la densité"
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, no-c-format
msgid "Transparency ratio"
msgstr "Rapport de transparence"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, no-c-format
msgid "Select film type"
msgstr "Type de film"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, no-c-format
msgid "Select the film type"
msgstr "Sélectionne le type de film"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "A plat"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr "Chargeur automatique de documents, recto"
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
msgstr "Chargeur automatique de documents, verso"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "Chargeur automatique de documents, recto-verso"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Avant"
+
+#: ../backend/canon_dr.c:393
+#, fuzzy, no-c-format
+msgid "Card Back"
+msgstr "Arrière"
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Recto-verso"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Rouge"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Vert"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Bleu"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, no-c-format
msgid "Enhance Red"
msgstr "Augmente le rouge"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, no-c-format
msgid "Enhance Green"
msgstr "Augmente le vert"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, no-c-format
msgid "Enhance Blue"
msgstr "Augmente le bleu"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Aucun(e)"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr "JPEG"
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Recto"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Recto-verso"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Adaptateur pour transparents"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Chargeur automatique de document"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Positif"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Négatif"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Mettre au point sur la vitre"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Mettre au point 2,5 mm au-dessus de la vitre"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Motif demi-teinte A (teinte dure)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Motif demi-teinte B (teinte douce)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Motif demi-teinte C"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "/wiki/Filmstrip A (Bayer 4x4)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "'Dither' B (Spiral 4x4)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "'Dither' C ('Net Screen' 4x4)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "'Dither' C ('Net Screen' 4x4)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Technologie d'amélioration du texte"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Télécharger le motif A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Télécharger le motif B"
@@ -1802,7 +1813,7 @@ msgstr "Télécharger le motif B"
msgid "No Correction"
msgstr "Pas de correction"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Spécifié par l'utilisateur"
@@ -1827,33 +1838,33 @@ msgstr "Imprimantes à jet d'encre"
msgid "CRT monitors"
msgstr "Moniteurs à tube cathodique"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Valeur par défaut"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Impression haute définition"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Impression basse définition"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Impression avec contraste élevé"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Spécifié par l'utilisateur (gamma=1,0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Spécifié par l'utilisateur (gamma=1,8)"
@@ -1893,28 +1904,28 @@ msgstr "A4"
msgid "Max"
msgstr "Max"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Mode de numérisation"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Sélectionne la demi-teinte."
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Exclusion"
@@ -1922,209 +1933,209 @@ msgstr "Exclusion"
# Dictionnary gives me 'marginal' for dropout. Sounds like
# a part of the scan area is 'droped out', I mean excluded.
# No, it is one of the colours that is excluded.
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Sélectionne le couleur exclu."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Sélectionne la brillance."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Netteté"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Correction de couleur"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
"Remplit la table de correction de couleur pour le périphérique de "
"destination sélectionné."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Coefficients de correction de couleur"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Matrice de multiplication RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Décalage vert -> rouge"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Décalage vert -> bleu"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Décalage rouge -> vert"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Décalage rouge -> bleu"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Décalage bleu -> vert"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Décalage bleu -> rouge"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Contrôle le niveau de vert"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Ajoute au rouge en fonction du niveau de vert"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Ajoute au bleu en fonction du niveau de vert"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Ajoute au vert en fonction du niveau de rouge"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Contrôle le niveau de rouge"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Ajoute au bleu en fonction du niveau de rouge"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Ajoute au vert en fonction du niveau de bleu"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Ajoute au rouge en fonction du niveau de bleu"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Contrôle le niveau de bleu"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Effectue une symétrie verticale de l'image."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Aperçu rapide"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Séparation automatique"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Liste réduite de résolutions"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Affiche une liste réduite d'échantillonnage"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Zoom"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Définit le facteur de zoom utilisé par le scanner"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Format rapide"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Equipement optionnel"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Ejecter"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Ejecter la feuille du chargeur automatique"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Ejection automatique"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Ejecte le document après la numérisation"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "Mode du chargeur automatique de documents"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr ""
"Sélectionne le mode du chargeur automatique de documents (recto/recto-"
"verso)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Baie"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Sélectionne la baie contenant le document à numériser"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2134,23 +2145,23 @@ msgstr ""
"pré-configurés ou de la table utilisateur, et qui sera téléchargée dans "
"le scanner"
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Mise-au-point"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr "Effectue la mise-au-point soit sur la vitre, soit 2,5 mm au-dessus"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Attendre le bouton"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2159,167 +2170,208 @@ msgstr ""
"Aprés avoir envoyé la commande de numérisation, attendre l'appui du "
"bouton avant de commencer la numérisation."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr "Infra-rouge"
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Diapositive positive"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Diapositive négative"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr "Profil de température de couleurs interne"
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, no-c-format
msgid "User defined CCT profile"
msgstr "Profil de température de couleurs utilsateur"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Activé"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Aucun"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr "Seuil dynamique (DTC)"
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr "Seuil dynamique simplifié (SDTC)"
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Tramage"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, no-c-format
msgid "Diffusion"
msgstr "Diffusion d'erreur"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, no-c-format
msgid "White"
msgstr "Blanc"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, no-c-format
msgid "Black"
msgstr "Noir"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, no-c-format
msgid "Continue"
msgstr "Continuer"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr "Arréter"
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr "10mm"
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr "15mm"
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr "20mm"
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, no-c-format
msgid "Horizontal bold"
msgstr "Horizontal large"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, no-c-format
msgid "Horizontal narrow"
msgstr "Horizontal étroit"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Vertical"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, no-c-format
msgid "Vertical bold"
msgstr "Vertical large"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr "De haut en bas"
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr "De bas en haut"
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, no-c-format
msgid "Front"
msgstr "Avant"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr "Arrière"
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Extras"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, no-c-format
msgid "Threshold curve"
msgstr "Courbe du seuil"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
"Courbe dynamique de seuil, de clair à foncé, normallement entre 50-65"
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr "Désactiver le mode Trait dynamique"
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
@@ -2328,12 +2380,12 @@ msgstr ""
"Utilise le mode Trait du matériel, au lieu d'utiliser un algorithme "
"logiciel adaptatif."
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Désactiver l'interpolation"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2343,23 +2395,45 @@ msgstr ""
"plus faible que la résolution verticale, ne pas faire d'interpolation "
"horizontale."
-#: ../backend/genesys.c:6235
-#, no-c-format
-msgid "Color Filter"
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
msgstr "Filtre de couleur"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
"En niveaux de gris ou en mode trait, sélectionne la couleur à utiliser."
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Calibration"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Définit le mode de calibration"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Cache des données de calibration"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Temps avant extinction de la lampe"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2368,62 +2442,77 @@ msgstr ""
"La lampe sera éteinte après ce laps de temps (en minutes). Entrer 0 pour "
"ne pas éteindre la lampe automatiquement."
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Eteindre la lampe durant la calibration des noirs"
+
+#: ../backend/genesys.c:5941
+#, fuzzy, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr "Délai en minutes avant d'éteindre la lampe après une numérisation."
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
msgstr "Bouton 'fichier'"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr "Bouton 'reconnaissance de caractères (OCR)'"
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
msgstr "Bouton 'marche'"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Bouton 'courrier électronique'"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, no-c-format
msgid "Need calibration"
msgstr "Calibration requise"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Le scanner a besoin d'être calibré avec les paramètres actuels"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Boutons"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Calibration"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, no-c-format
msgid "Start calibration using special sheet"
msgstr "Démarrer la calibration avec la feuille spéciale"
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, no-c-format
msgid "Clear calibration"
msgstr "Effacer la calibration"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, no-c-format
msgid "Clear calibration cache"
msgstr "Efface le cache des données de calibration"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Adaptateur pour transparents"
@@ -2559,8 +2648,8 @@ msgid "Scanner model"
msgstr "Modèle de scanner"
#: ../backend/hp3900_sane.c:1408
-#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+#, fuzzy, no-c-format
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
"Permet de tester le comportement du périphérique en l'utilisant comme un "
"autre modèle compatible"
@@ -2712,12 +2801,12 @@ msgstr "Rafraîchit les informations du périphérique"
msgid "This option reflects a front panel scanner button"
msgstr "Cette option reflète l'état d'un bouton de la façade du scanner"
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Image"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Divers"
@@ -2742,17 +2831,17 @@ msgstr "décalage en Y"
msgid "Hardware internal Y position of the scanning area."
msgstr "Position Y en haut à gauche de l'aire de numérisation"
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Etat de la lampe"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Allume/éteint la lampe."
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Calibration des niveaux noir et blanc."
@@ -2862,8 +2951,8 @@ msgstr "Lent"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normal"
@@ -3201,9 +3290,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3502,7 +3591,7 @@ msgstr "Sélectionne l'accentuation de l'image"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gamma"
@@ -3569,16 +3658,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3589,16 +3668,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3667,7 +3736,7 @@ msgstr "Réglages fins"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3835,7 +3904,7 @@ msgstr "Gain des gris"
msgid "Sets gray channel gain"
msgstr "Fixe le gain pour le gris"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3846,7 +3915,7 @@ msgstr "Gain des rouges"
msgid "Sets red channel gain"
msgstr "Fixe le gain pour le rouge"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3857,7 +3926,7 @@ msgstr "Gain des verts"
msgid "Sets green channel gain"
msgstr "Fixe le gain pour le vert"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3949,7 +4018,7 @@ msgstr "Une page"
msgid "All pages"
msgstr "Toutes les pages"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "scanner avec chargeur automatique"
@@ -4023,12 +4092,12 @@ msgstr "Utiliser l'adaptateur de diapositives"
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "Cette option éteint la lampe pendant la numérisation"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Numérisation de qualité"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Qualité maximale, mais vitesse réduite"
@@ -4457,12 +4526,39 @@ msgstr ""
"Préchauffer jusqu'à ce que l'intensité de la lampe soit constante, au "
"lieu d'attendre 40 secondes."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Film négatif"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Négatif"
+
+#: ../backend/pixma.c:396
+#, fuzzy, no-c-format
+msgid "48 bits color"
+msgstr "Couleurs précises"
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr "Numérisation contrôlée par le bouton du scanner"
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4473,198 +4569,218 @@ msgstr ""
"\" (MP150), ou du bouton \"COLOR\" (autres modèles). Appuyez sur le "
"bouton \"GRAY\" pour annuler la numérisation."
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
msgstr "Rafraîchir l'état du bouton"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr "Bouton 1"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr "Bouton 2"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Transparence"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr "Paramètres du périphérique"
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr "Eteindre/allumer la (les) lampes"
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr "Eteindre/allumer la (les) lampes manuellement."
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Eteindre la lampe durant la calibration des noirs"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr "Toujours éteindre la lampe durant la calibration des noirs"
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, no-c-format
msgid "Calibration data cache"
msgstr "Cache des données de calibration"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr "Active/désactive le cache des données de calibration"
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, no-c-format
msgid "Performs calibration"
msgstr "Effectue la calibration"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr "Accélérer le capteur"
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr "Active l'accélération du mouvement du capteur."
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr "Temps de préchauffage"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr "Temps de préchauffage en secondes."
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr "Temps avant extinction de la lampe"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Temps avant extinction de la lampe en secondes."
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr "Frontal analogique (AFE)"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr "Gain des rouges du frontal analogique (AFE)"
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Décalage des rouges"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr "Décalage des rouges du frontal analogique (AFE)"
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr "Gain des verts du frontal analogique (AFE)"
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Décalage des verts"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr "Décalage des verts du frontal analogique (AFE)"
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr "Gain des bleus du frontal analogique (AFE)"
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Décalage des bleus"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr "Décalage des bleus du frontal analogique (AFE)"
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr "Délai avant extinction de la lampe rouge."
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr "Définit le délai avant extinction de la lampe rouge."
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr "Délai avant extinction de la lampe verte."
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr "Définit le délai avant extinction de la lampe verte."
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr "Délai avant extinction de la lampe bleue."
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr "Définit le délai avant extinction de la lampe bleue."
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr "Cette option affiche l'état des boutons du scanner."
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Couleur 36 bits"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Carte de 'dither' 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Carte de 'dither' 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Aléatoire"
@@ -4713,7 +4829,7 @@ msgstr "Simulation de scanner à main."
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Simule une numérisation avec un scanner à main. Les scanners à main ne "
"connaissent pas à priori la hauteur de l'image. A la place, ils "
@@ -4856,29 +4972,29 @@ msgstr ""
"Oblige le pilote à renvoyer le code SANE_STATUS_ACCESS_DENIED (acces "
"refusé) après un appel à sane_read()."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Cette option affiche l'état d'un bouton du scanner."
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Lampe allumée"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Allume la lampe du scanner"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Lampe éteinte"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4899,42 +5015,42 @@ msgstr "Délai en minutes avant d'éteindre la lampe après une numérisation."
msgid "Threshold value for lineart mode"
msgstr "Seuil pour le mode trait"
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Chargeur automatique de document"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6\"x4\" (~15x10 cm)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8\"x10\" (~20x25 cm)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5\"x11\" (~21x28 cm)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Demi-teinte non-supportée"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "Points dispersés 8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "Points dispersés 16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4950,12 +5066,27 @@ msgstr ""
"pourrait empécher les applications Xwindow de traiter les évènements X, "
"et votre système pourrait s'écrouler."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Ejecte le document après la numérisation"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Aperçu"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4964,12 +5095,12 @@ msgstr ""
"Sélectionne le mode de prévisualisation. Les aperçus en niveaux de gris "
"donnent habituellement le meilleur compromis entre vitesse et détails."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Valeurs prédéfinies"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4978,12 +5109,42 @@ msgstr ""
"Fournit des emplacements standards pour la numérisation de photos, de "
"pages imprimées, etc..."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "numériseur à plat"
+
+#: ../backend/snapscan-options.c:897
+#, fuzzy, no-c-format
+msgid "Focus-mode"
+msgstr "Mise au point"
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Mise au point automatique"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Mise-au-point"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Mise-au-point"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Nombre de lignes en couleurs par cycle de lecture"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Nombre de lignes en niveaux de gris par cycle de lecture"
@@ -5057,7 +5218,7 @@ msgstr "Simulation de scanner à main"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Simule un scanner à main. Les scanners à main ne connaissent pas à "
@@ -5690,6 +5851,9 @@ msgstr "Fixe le décalage pour le vert"
msgid "Sets blue channel offset"
msgstr "Fixe le décalage pour le bleu"
+#~ msgid "problem not analyzed (unknown SCSI class)"
+#~ msgstr "problème non traité (classe SCSI inconnue)"
+
#~ msgid "Grayscale"
#~ msgstr "Niveaux de gris"
diff --git a/po/gl.po b/po/gl.po
index 7eb520a..c96487c 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2009-06-25 10:22+0100\n"
"Last-Translator: Miguel Anxo Bouzada <mbouzada@gmail.com>\n"
"Language-Team: Galician <proxecto@trasno.net>\n"
@@ -31,17 +31,17 @@ msgid "Standard"
msgstr "Estándar"
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -50,25 +50,25 @@ msgid "Geometry"
msgstr "Xeometría"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Optimización"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Avanzado"
@@ -93,8 +93,8 @@ msgstr "Forzar vista previa monocroma"
msgid "Bit depth"
msgstr "Bit de profundidade"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Modo de escaneo"
@@ -134,7 +134,8 @@ msgstr "Abaixo-dereita X"
msgid "Bottom-right y"
msgstr "Abaixo-dereita Y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Resolución de escaneo"
@@ -302,7 +303,7 @@ msgstr "Ligar resolucións X e Y"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -994,7 +995,7 @@ msgstr "Predeterminados"
msgid "Set default values for enhancement controls."
msgstr "Axustar valores predeterminados para os controis de optimización."
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Calibración"
@@ -1035,64 +1036,64 @@ msgstr ""
msgid "Button state"
msgstr "Botón de estado"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Número de mostra a escanear"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Escolle o número de mostra a escanear"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Escaneo dúplex"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr ""
"O escaneo dúplex fornece un escaneo do anverso e o reverso do documento"
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Calibrar o escáner"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Forza a calibrar o escáner antes de facer o escaneo"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Escaneo en escala de grises"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Escanea en escala de grises, non en cores"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Ganancia analóxica"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Aumenta o diminúe a ganancia analóxica da gama CCD"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Corrección gamma"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Selecciona a curva de transferencia da corrección gamma"
@@ -1104,8 +1105,8 @@ msgstr "En bruto"
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr "Cor fina"
@@ -1156,606 +1157,616 @@ msgstr "1/2 da velocidade normal"
msgid "1/3 normal speed"
msgstr "1/3 da velocidade normal"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, no-c-format
msgid "rounded parameter"
msgstr "parámetro redondeado"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr "descoñecido"
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr "Atoamento no alimentador"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr "A tapa do alimentador está aberta"
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, no-c-format
msgid "lamp failure"
msgstr "fallo de lámpada"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr "erro no posicionamento do cabezal de escaneo"
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr "erro de verificación de CPU"
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr "erro de verificación de RAM"
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr "erro de verificación de ROM"
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr "erro de verificación de hardware"
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, no-c-format
msgid "transparency unit lamp failure"
msgstr "fallo da lámpada da unidade de transparencias"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr ""
"fallo de posición do cabezal de escaneo da unidade de transparencias"
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr "erro na lonxitude da lista de parámetros"
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr "código de orde de operación incorrecto"
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr "campo incorrecto en CDB"
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr "LUN non é compatíbel"
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr "campo incorrecto na lista de parámetros"
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr "erro na secuencia de ordes"
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr "especifícanse demasiadas xanelas"
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr "non se atopa o soporte"
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr "mensaxe de bit de IDENTIFICACIÓN incorrecta"
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr "a opción non conecta"
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr "reiniciar o acendido / reiniciar o bus do dispositivo"
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr "parámetro cambiado por outro iniciador"
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr "información sen senso adicional"
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr "Fallou a volta a escoller"
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr "erro de paridade SCSI"
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr "o iniciador detectou a recepción dunha mensaxe de erro"
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr "mensaxe de erro incorrecta"
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr "erro de límite de tempo"
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, no-c-format
msgid "transparency unit shading error"
msgstr "erro de sombreado na unidade de transparencias"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr "lámpada non estabilizada"
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr "problema sen analizar (clase de SCSI descoñecida)"
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, no-c-format
msgid "film scanner"
msgstr "escáner de filmes"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "escáner plano"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Tipo de filme"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr "Escoller o tipo de filme, p.e. negativo ou diapositiva"
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, no-c-format
msgid "Negative film type"
msgstr "Tipo de filme negativo"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, no-c-format
msgid "Selects the negative film type"
msgstr "Selecciona o tipo de negativo de filme"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, no-c-format
msgid "Hardware resolution"
msgstr "Resolución do hardware"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, no-c-format
msgid "Use only hardware resolutions"
msgstr "Usar só resolucións do hardware"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr "Enfoque"
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, no-c-format
msgid "Auto focus"
msgstr "Enfoque automático"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, no-c-format
msgid "Enable/disable auto focus"
msgstr "Activar/desactivar enfoque automático"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr "Enfoque automático só unha vez"
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr "Facer enfoque automático só unha vez entre expulsións"
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, no-c-format
msgid "Manual focus position"
msgstr "Posición de foco manual"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr ""
"Axustar o sistema óptico de foco na posición manual (predeterminado: "
"128)."
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr "Marxes de escaneo"
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr "Axustes de cor extra"
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Reflectir a imaxe horizontalmente"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, no-c-format
msgid "Mirror the image horizontally"
msgstr "Inverter a imaxe horizontalmente"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, no-c-format
msgid "Auto exposure"
msgstr "Exposición automática"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Activar/desactivar a característica de exposición automática"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, no-c-format
msgid "Calibration now"
msgstr "Calibrar agora"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, no-c-format
msgid "Execute calibration *now*"
msgstr "Executar a calibración *agora*"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr "Diagnose automatica"
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr "Facer unha diagnose automatica do escáner"
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, no-c-format
msgid "Reset scanner"
msgstr "Reiniciar o escáner"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, no-c-format
msgid "Reset the scanner"
msgstr "Reiniciar o escáner"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr "Manexar o soporte"
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, no-c-format
msgid "Eject film after each scan"
msgstr "Expulsar o filme despois de cada escaneo"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr ""
"Expulsar automaticamente o filme do dispositivo despois de cada escaneo"
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr "Expulsar o filme antes de saír"
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr ""
"Expulsar automaticamente o filme do dispositivo antes de saír do programa"
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr "Expulsar o filme agora"
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr "Expulsar o filme *agora*"
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, no-c-format
msgid "Document feeder extras"
msgstr "Alimentador de documentos extras"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, no-c-format
msgid "Flatbed only"
msgstr "Só plano"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
"Desactivar o alimentador automático de documentos e usar só o plano"
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, no-c-format
msgid "Transparency unit"
msgstr "Unidade de transparencias"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
"Activar/desactivar a unidade de transparencias (FAU, unidade adaptadora "
"de filme)"
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, no-c-format
msgid "Negative film"
msgstr "Filme en negativo"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, no-c-format
msgid "Positive or negative film"
msgstr "Filme en positivo ou en negativo"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr "Control de densidade"
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr "Axustar o modo de control de densidade"
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, no-c-format
msgid "Transparency ratio"
msgstr "Taxa de transparencia"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, no-c-format
msgid "Select film type"
msgstr "Escoller tipo de filme"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, no-c-format
msgid "Select the film type"
msgstr "Escoller o tipo de filme"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Plano"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, fuzzy, no-c-format
msgid "ADF Front"
msgstr "A tapa do alimentador está aberta"
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, fuzzy, no-c-format
msgid "ADF Back"
msgstr "Atoamento no alimentador"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "Alimentador dúplex"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Imprimir"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Duas caras"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Vermello"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Verde"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Azul"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Optimización"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Optimización"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Optimización"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Ningún"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Unha cara"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Duas caras"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Unidade de transparencias"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Alimentador automático de documentos (ADF)"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Filme en positivo"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Filme en negativo"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Enfoque no cristal"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Enfoque a 2.5mm sobre o cristal"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Medios tons A (tons duros)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Medios tons B (tons suaves)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Medios tons C (matizado)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Trama A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Trama B (4x4 espiral)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Trama C (4x4 matizado)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Trama D (8x4 matizado)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Tecnoloxia de optimización de texto"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Descargar patrón A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Descargar patrón B"
@@ -1765,7 +1776,7 @@ msgstr "Descargar patrón B"
msgid "No Correction"
msgstr "Sen corrección"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Definida polo usuario"
@@ -1790,33 +1801,33 @@ msgstr "Impresoras de inxección de tinta"
msgid "CRT monitors"
msgstr "Monitores CRT"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Predeterminado"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Impresión de alta densidade"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Impresión de baixa densidade"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Impresión de alto contraste"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Definido polo usuario (gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Definido polo usuario (gamma=1.8)"
@@ -1856,233 +1867,233 @@ msgstr "A4"
msgid "Max"
msgstr "Máx"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Modo de escaneo"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Escolle o medios tons"
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Exclusión"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Escoller o que se vai a excluir"
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Escoller o brillo"
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Nitidez"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Corrección da cor"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
"Axusta a táboa de corrección da cor para o dispositivo de saída "
"seleccionado."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Coeficientes de corrección da cor"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Matriz de multiplicación de RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Cambiar de verde a vermello"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Cambiar de verde a azul"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Cambiar de vermello a verde"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Cambiar de vermello a azul"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Cambiar de azul a verde"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Cambiar de azul a vermello"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Controla o nivel de verde"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Engade vermello baseándose no nivel de verde"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Engade azul baseándose no nivel de verde"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Engade verde baseándose no nivel de vermello"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Controla o nivel de vermello"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Engade azul baseándose no nivel de vermello"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Engade verde baseándose no nivel de azul"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Engade vermello baseándose no nivel de azul"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Controla o nivel de azul"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Reflectir a imaxe."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Vista previa rápida"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Segmentación automática da área"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Lista curta de resolucións"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Amosar lista curta de resolucións"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Zoom"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Define o factor de zoom que vai usar o escáner"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Formato rápido"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Equipamento opcional"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Expulsar"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Expulsar a folla do alimentador"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Expulsión automática"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Expulsar o documento despois do escaneo"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "Modo alimentador"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Escoller o modo do alimentador (unha cara/duas caras)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Badía"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Escolla a badía para escanear"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2092,12 +2103,12 @@ msgstr ""
"predefinidos ou dunha táboa definida polo usuario, que pode ser "
"descargada ao escáner."
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Posición do foco"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
@@ -2105,12 +2116,12 @@ msgstr ""
"Axusta a posición do foco, xa sexa ao cristal ou a 2.5mm por riba do "
"cristal"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Agardar ao botón"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2119,178 +2130,219 @@ msgstr ""
"Despois de enviar a orde de escaneo, agardar até que se prema no botón "
"do escáner para comezar verdadeiramente o proceso de escaneo."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Diapositiva en positivo"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Diapositiva en negativo"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "Definida polo usuario"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Activado"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Desactivado"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Esfumado"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, fuzzy, no-c-format
msgid "Diffusion"
msgstr "Difusión de erro"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Nivel do branco"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Nivel do negro"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, fuzzy, no-c-format
msgid "Continue"
msgstr "Condicional"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "Horizontal"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Vertical"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "Vertical"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, fuzzy, no-c-format
msgid "Front"
msgstr "Imprimir"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Extras"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Limiar"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Desactivar interpolación"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2299,23 +2351,45 @@ msgstr ""
"Cando se usan altas resolucións nas que a resolución horizontal é máis "
"pequena que a vertical, isto desactiva a interpolación horizontal."
-#: ../backend/genesys.c:6235
-#, no-c-format
-msgid "Color Filter"
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
msgstr "Filtro de cor"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
"Cando se usa gris ou liña de arte esta opción selecciona a cor a usar."
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Calibración"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Definir o modo de calibración"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Caché de datos de calibración"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Tempo para apagado da lámpada"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2324,62 +2398,77 @@ msgstr ""
"A lámpada vai ser apagada despois do tempo indicado (en minutos). Un "
"valor de 0 significa que a lámpada no vai ser apagada."
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Apagar a lámpada durante a calibración de escuridade"
+
+#: ../backend/genesys.c:5941
+#, fuzzy, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr "Minutos que tardará a lámpada en apagarse despois do escaneo"
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
msgstr "Botón de ficheiro"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr "Botón de OCR"
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
msgstr "Botón de enerxía"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Botón de correo-e"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Limpar a calibración"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Forza a calibrar o escáner antes de facer o escaneo"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Botóns"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Calibrar"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, no-c-format
msgid "Start calibration using special sheet"
msgstr "Iniciar a calibración usando unha folla especial"
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, no-c-format
msgid "Clear calibration"
msgstr "Limpar a calibración"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, no-c-format
msgid "Clear calibration cache"
msgstr "Limpar a caché de datos de calibración"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Adaptador de transparencias"
@@ -2516,8 +2605,8 @@ msgid "Scanner model"
msgstr "Modelo de escáner"
#: ../backend/hp3900_sane.c:1408
-#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+#, fuzzy, no-c-format
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
"Permite comprobar o comportamento do dispositivo con outros modelos "
"compatíbeisPermite comprobar o comportamento do dispositivo con outros "
@@ -2669,12 +2758,12 @@ msgstr "Actualiza a información acerca do dispositivo"
msgid "This option reflects a front panel scanner button"
msgstr "Esta opción reflicte un botón do panel frontal do escáner"
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Imaxe"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Miscelánea"
@@ -2699,17 +2788,17 @@ msgstr "posición Y"
msgid "Hardware internal Y position of the scanning area."
msgstr "Posición Y interna no hardware da zona de escaneo."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Estado da lámpada"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Acende ou apaga a lámpada"
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Calibrar o nivel de branco e negro."
@@ -2817,8 +2906,8 @@ msgstr "Lento"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normal"
@@ -3157,9 +3246,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3458,7 +3547,7 @@ msgstr "Axusta o destaque da imaxe"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gamma"
@@ -3525,16 +3614,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3545,16 +3624,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3623,7 +3692,7 @@ msgstr "Optimización"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3791,7 +3860,7 @@ msgstr "Ganancia de gris"
msgid "Sets gray channel gain"
msgstr "Axusta a ganancia da canle de gris"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3802,7 +3871,7 @@ msgstr "Ganancia vermella"
msgid "Sets red channel gain"
msgstr "Axustar a ganancia da canle vermella"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3813,7 +3882,7 @@ msgstr "Ganancia verde"
msgid "Sets green channel gain"
msgstr "Axusta a ganancia da canle verde"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3905,7 +3974,7 @@ msgstr "Unha páxina"
msgid "All pages"
msgstr "Todas as páxinas"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "escáner con cargador automático"
@@ -3977,12 +4046,12 @@ msgstr "Usar o adaptador de diapositivas de 35mm"
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "Esta opción apaga a lámpada do plano durante o escaneo"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Escaneo de calidade"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "A mellor calidade, pero a velocidade lenta"
@@ -4412,12 +4481,39 @@ msgstr ""
"Quecer até que o brillo da lámpada sexa constante no canto de agardar "
"polos 40 segundos de quecemento."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Filme en negativo"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negativo"
+
+#: ../backend/pixma.c:396
+#, fuzzy, no-c-format
+msgid "48 bits color"
+msgstr "Cor fina"
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr "Botón de control de escaneo"
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4428,198 +4524,218 @@ msgstr ""
"proceder, faga clic no botón «SCAN» (para MP150) ou «COLOR» (para outros "
"modelos). Para cancelar, prema no botón «GRAY»."
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
msgstr "Actualizar estado do botón"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr "Botón 1"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr "Botón 2"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Transparencia"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr "Axustes do dispositivo"
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr "Interruptor de lámpada"
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr "Cambiar a(s) lámpada(s) manualmente."
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Apagar a lámpada durante a calibración de escuridade"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr "Apagar sempre a lámpada cando se calibra a escuridade."
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, no-c-format
msgid "Calibration data cache"
msgstr "Caché de datos de calibración"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr "Activa ou desactiva a caché de datos de calibración"
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, no-c-format
msgid "Performs calibration"
msgstr "Calibración de precisión"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr "Acelerar o sensor"
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr "Activa ou desactiva a aceleración de movimento do sensor."
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr "Tempo de quecemento"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr "Tempo de quecemento en segundos"
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr "Tempo de apagado da lámpada"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Tempo de apagado da lámpada en segundos"
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr "Interface analóxica (AFE)"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr "Valor de ganancia vermella no AFE"
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Desviación vermella"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr "Valor da desviación vermella no AFE"
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr "Valor de ganancia verde no AFE"
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Desviación verde"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr "Valor da desviación verde no AFE"
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr "Valor de ganancia azul no AFE"
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Desviación azul"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr "Valor da desviación azul no AFE"
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr "Apagar alámpada vermella"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr "Define os parámetros de apagado da lámpada vermella"
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr "Apagar lámpada verde"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr "Define os parámetros de apagado da lámpada verde"
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr "Apagar lámpada azul"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr "Define os parámetros de apagado da lámpada azul"
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr "Esta opción reflicte o estado dos botóns do escáner"
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Color36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Mapa de trama 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Mapa de trama 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Aleatorio"
@@ -4668,7 +4784,7 @@ msgstr "Simulación de escáner de man"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Semella un escáner de man. Os escáneres de man adoitan descoñecer a "
"priori a distancia á imaxe. Na súa vez utiliza unha altura de retorno "
@@ -4811,29 +4927,29 @@ msgstr ""
"Forzar o motor a devolver o código de estado de "
"SANE_STATUS_ACCESS_DENIED despois de ter sido chamado sane_read()."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Esta opción reflicte o estado dos botóns do escáner"
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Acender lámpada"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Acende a lámpada do escáner"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Apagar lámpada"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4854,42 +4970,42 @@ msgstr "Minutos que tardará a lámpada en apagarse despois do escaneo"
msgid "Threshold value for lineart mode"
msgstr "Valor do limiar para o modo de liña de arte"
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Alimentador de documentos"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 (polg.)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 (polg.)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11 (polg.)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Medios tons non compatíbeis"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "Punto disperso 8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "Punto disperso 16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4905,12 +5021,27 @@ msgstr ""
"demasiado alto, baseado en interfaces X pode deixar de responder a "
"eventos de X e o seu sistema poderíase atoar."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Expulsar o documento despois do escaneo"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Modo de previsualización"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4919,12 +5050,12 @@ msgstr ""
"Escolle o modo para previsualización. A previsualización en escala de "
"grises fornece en xeral, a mellor relación entre velocidade e detalle."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Axustes predefinidos"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4933,12 +5064,42 @@ msgstr ""
"Fornece superficies de escaneado estándar para fotografías, páxinas "
"impresas, etc."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "escáner plano"
+
+#: ../backend/snapscan-options.c:897
+#, fuzzy, no-c-format
+msgid "Focus-mode"
+msgstr "Enfoque"
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Enfoque automático"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Posición do foco"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Posición do foco"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Cor, liñas por lectura"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Escala de grises, liñas por lectura"
@@ -5012,7 +5173,7 @@ msgstr "Simulación de escáner manual"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Semella un escáner de man. Os escáneres de man adoitan descoñecer a "
@@ -5644,6 +5805,9 @@ msgstr "Axusta o desprazamento da canle verde"
msgid "Sets blue channel offset"
msgstr "Axusta o desprazamento da canle azul"
+#~ msgid "problem not analyzed (unknown SCSI class)"
+#~ msgstr "problema sen analizar (clase de SCSI descoñecida)"
+
#~ msgid "Grayscale"
#~ msgstr "Escala de grises"
diff --git a/po/hu.po b/po/hu.po
new file mode 100644
index 0000000..5e63a72
--- /dev/null
+++ b/po/hu.po
@@ -0,0 +1,5570 @@
+# Hungarian translation for sane-backends
+# Copyright (C) 2011 SANE Project.
+# This file is distributed under the same license as the sane-backends package.
+# Gabor Sari <saga@chello.hu>, 2003, 2004.
+# Németh Tamás <ntomasz@uhuklub.hu>, 2011.
+msgid ""
+msgstr ""
+"Project-Id-Version: sane-backends\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
+"PO-Revision-Date: 2011-04-06 19:50+0200\n"
+"Last-Translator: Németh Tamás <ntomasz@uhuklub.hu>\n"
+"Language-Team: Hungarian <NONE>\n"
+"Language: hu\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: ../include/sane/saneopts.h:154
+#, no-c-format
+msgid "Number of options"
+msgstr ""
+
+#: ../include/sane/saneopts.h:156
+#, no-c-format
+msgid "Standard"
+msgstr "Általános"
+
+#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
+#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
+#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
+#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
+#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
+#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
+#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
+#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
+#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
+#: ../backend/umax_pp.c:580
+#, no-c-format
+msgid "Geometry"
+msgstr "Geometria"
+
+#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
+#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
+#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
+#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
+#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
+#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
+#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
+#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
+#, no-c-format
+msgid "Enhancement"
+msgstr "Haladó"
+
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
+#, no-c-format
+msgid "Advanced"
+msgstr "Haladó"
+
+#: ../include/sane/saneopts.h:160
+#, no-c-format
+msgid "Sensors"
+msgstr "Szenzorok"
+
+#: ../include/sane/saneopts.h:162
+#, no-c-format
+msgid "Preview"
+msgstr "Előnézet"
+
+#: ../include/sane/saneopts.h:163
+#, no-c-format
+msgid "Force monochrome preview"
+msgstr "Monokróm előnézet"
+
+#: ../include/sane/saneopts.h:164
+#, no-c-format
+msgid "Bit depth"
+msgstr "Színmélység"
+
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
+#, no-c-format
+msgid "Scan mode"
+msgstr "Szkennelési üzemmód"
+
+#: ../include/sane/saneopts.h:166
+#, no-c-format
+msgid "Scan speed"
+msgstr "Szkennelési sebesség"
+
+#: ../include/sane/saneopts.h:167
+#, no-c-format
+msgid "Scan source"
+msgstr ""
+
+#: ../include/sane/saneopts.h:168
+#, no-c-format
+msgid "Force backtracking"
+msgstr ""
+
+#: ../include/sane/saneopts.h:169
+#, no-c-format
+msgid "Top-left x"
+msgstr "Bal-felső x"
+
+#: ../include/sane/saneopts.h:170
+#, no-c-format
+msgid "Top-left y"
+msgstr "Bal-felső y"
+
+#: ../include/sane/saneopts.h:171
+#, no-c-format
+msgid "Bottom-right x"
+msgstr "Jobb-alsó x"
+
+#: ../include/sane/saneopts.h:172
+#, no-c-format
+msgid "Bottom-right y"
+msgstr "Jobb-alsó y"
+
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
+#, no-c-format
+msgid "Scan resolution"
+msgstr "Szkennelés felbontása"
+
+#: ../include/sane/saneopts.h:174
+#, no-c-format
+msgid "X-resolution"
+msgstr "X felbontás"
+
+#: ../include/sane/saneopts.h:175
+#, no-c-format
+msgid "Y-resolution"
+msgstr "Y felbontás"
+
+#: ../include/sane/saneopts.h:176
+#, no-c-format
+msgid "Page width"
+msgstr "Lapszélesség"
+
+#: ../include/sane/saneopts.h:177
+#, no-c-format
+msgid "Page height"
+msgstr "Lapmagasság"
+
+#: ../include/sane/saneopts.h:178
+#, no-c-format
+msgid "Use custom gamma table"
+msgstr ""
+
+#: ../include/sane/saneopts.h:179
+#, no-c-format
+msgid "Image intensity"
+msgstr ""
+
+#: ../include/sane/saneopts.h:180
+#, no-c-format
+msgid "Red intensity"
+msgstr "Vörös intenzitás"
+
+#: ../include/sane/saneopts.h:181
+#, no-c-format
+msgid "Green intensity"
+msgstr "Zöld intenzitás"
+
+#: ../include/sane/saneopts.h:182
+#, no-c-format
+msgid "Blue intensity"
+msgstr "Kék intenzitás"
+
+#: ../include/sane/saneopts.h:183
+#, no-c-format
+msgid "Brightness"
+msgstr "Fényerő"
+
+#: ../include/sane/saneopts.h:184
+#, no-c-format
+msgid "Contrast"
+msgstr "Kontraszt"
+
+#: ../include/sane/saneopts.h:185
+#, no-c-format
+msgid "Grain size"
+msgstr "Szemcseméret"
+
+#: ../include/sane/saneopts.h:186
+#, no-c-format
+msgid "Halftoning"
+msgstr ""
+
+#: ../include/sane/saneopts.h:187
+#, no-c-format
+msgid "Black level"
+msgstr "Feketeszint"
+
+#: ../include/sane/saneopts.h:188
+#, no-c-format
+msgid "White level"
+msgstr "Fehérszint"
+
+#: ../include/sane/saneopts.h:189
+#, fuzzy, no-c-format
+msgid "White level for red"
+msgstr "Fehérszint"
+
+#: ../include/sane/saneopts.h:190
+#, fuzzy, no-c-format
+msgid "White level for green"
+msgstr "Fehérszint"
+
+#: ../include/sane/saneopts.h:191
+#, fuzzy, no-c-format
+msgid "White level for blue"
+msgstr "Fehérszint"
+
+#: ../include/sane/saneopts.h:192
+#, no-c-format
+msgid "Shadow"
+msgstr "Árnyék"
+
+#: ../include/sane/saneopts.h:193
+#, no-c-format
+msgid "Shadow for red"
+msgstr ""
+
+#: ../include/sane/saneopts.h:194
+#, no-c-format
+msgid "Shadow for green"
+msgstr ""
+
+#: ../include/sane/saneopts.h:195
+#, no-c-format
+msgid "Shadow for blue"
+msgstr ""
+
+#: ../include/sane/saneopts.h:196
+#, no-c-format
+msgid "Highlight"
+msgstr "Kiemelés"
+
+#: ../include/sane/saneopts.h:197
+#, no-c-format
+msgid "Highlight for red"
+msgstr ""
+
+#: ../include/sane/saneopts.h:198
+#, no-c-format
+msgid "Highlight for green"
+msgstr ""
+
+#: ../include/sane/saneopts.h:199
+#, no-c-format
+msgid "Highlight for blue"
+msgstr ""
+
+#: ../include/sane/saneopts.h:200
+#, no-c-format
+msgid "Hue"
+msgstr "Árnyalat"
+
+#: ../include/sane/saneopts.h:201
+#, no-c-format
+msgid "Saturation"
+msgstr "Telítettség"
+
+#: ../include/sane/saneopts.h:202
+#, no-c-format
+msgid "Filename"
+msgstr "Fájlnév"
+
+#: ../include/sane/saneopts.h:203
+#, no-c-format
+msgid "Halftone pattern size"
+msgstr ""
+
+#: ../include/sane/saneopts.h:204
+#, no-c-format
+msgid "Halftone pattern"
+msgstr ""
+
+#: ../include/sane/saneopts.h:205
+#, no-c-format
+msgid "Bind X and Y resolution"
+msgstr ""
+
+#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
+#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
+#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
+#: ../backend/u12.c:157
+#, no-c-format
+msgid "Negative"
+msgstr "Negatív"
+
+#: ../include/sane/saneopts.h:207
+#, no-c-format
+msgid "Quality calibration"
+msgstr "Precíz beállítás"
+
+#: ../include/sane/saneopts.h:208
+#, no-c-format
+msgid "Double Optical Resolution"
+msgstr ""
+
+#: ../include/sane/saneopts.h:209
+#, no-c-format
+msgid "Bind RGB"
+msgstr ""
+
+#: ../include/sane/saneopts.h:210 ../backend/sm3840.c:770
+#, no-c-format
+msgid "Threshold"
+msgstr "Küszöb"
+
+#: ../include/sane/saneopts.h:211
+#, no-c-format
+msgid "Analog gamma correction"
+msgstr ""
+
+#: ../include/sane/saneopts.h:212
+#, no-c-format
+msgid "Analog gamma red"
+msgstr ""
+
+#: ../include/sane/saneopts.h:213
+#, no-c-format
+msgid "Analog gamma green"
+msgstr ""
+
+#: ../include/sane/saneopts.h:214
+#, no-c-format
+msgid "Analog gamma blue"
+msgstr ""
+
+#: ../include/sane/saneopts.h:215
+#, no-c-format
+msgid "Bind analog gamma"
+msgstr ""
+
+#: ../include/sane/saneopts.h:216
+#, no-c-format
+msgid "Warmup lamp"
+msgstr ""
+
+#: ../include/sane/saneopts.h:217
+#, no-c-format
+msgid "Cal. exposure-time"
+msgstr ""
+
+#: ../include/sane/saneopts.h:218
+#, no-c-format
+msgid "Cal. exposure-time for red"
+msgstr ""
+
+#: ../include/sane/saneopts.h:219
+#, no-c-format
+msgid "Cal. exposure-time for green"
+msgstr ""
+
+#: ../include/sane/saneopts.h:221
+#, no-c-format
+msgid "Cal. exposure-time for blue"
+msgstr ""
+
+#: ../include/sane/saneopts.h:222
+#, no-c-format
+msgid "Scan exposure-time"
+msgstr ""
+
+#: ../include/sane/saneopts.h:223
+#, no-c-format
+msgid "Scan exposure-time for red"
+msgstr ""
+
+#: ../include/sane/saneopts.h:224
+#, no-c-format
+msgid "Scan exposure-time for green"
+msgstr ""
+
+#: ../include/sane/saneopts.h:226
+#, no-c-format
+msgid "Scan exposure-time for blue"
+msgstr ""
+
+#: ../include/sane/saneopts.h:227
+#, no-c-format
+msgid "Set exposure-time"
+msgstr ""
+
+#: ../include/sane/saneopts.h:228
+#, no-c-format
+msgid "Cal. lamp density"
+msgstr ""
+
+#: ../include/sane/saneopts.h:229
+#, no-c-format
+msgid "Scan lamp density"
+msgstr ""
+
+#: ../include/sane/saneopts.h:230
+#, no-c-format
+msgid "Set lamp density"
+msgstr ""
+
+#: ../include/sane/saneopts.h:231 ../backend/umax.c:5829
+#, no-c-format
+msgid "Lamp off at exit"
+msgstr ""
+
+#: ../include/sane/saneopts.h:245
+#, no-c-format
+msgid ""
+"Read-only option that specifies how many options a specific devices "
+"supports."
+msgstr ""
+
+#: ../include/sane/saneopts.h:248
+#, fuzzy, no-c-format
+msgid "Source, mode and resolution options"
+msgstr "Szkennelés felbontása"
+
+#: ../include/sane/saneopts.h:249
+#, no-c-format
+msgid "Scan area and media size options"
+msgstr ""
+
+#: ../include/sane/saneopts.h:250
+#, no-c-format
+msgid "Image modification options"
+msgstr ""
+
+#: ../include/sane/saneopts.h:251
+#, fuzzy, no-c-format
+msgid "Hardware specific options"
+msgstr "Speciális beállítások"
+
+#: ../include/sane/saneopts.h:252
+#, no-c-format
+msgid "Scanner sensors and buttons"
+msgstr ""
+
+#: ../include/sane/saneopts.h:255
+#, no-c-format
+msgid "Request a preview-quality scan."
+msgstr ""
+
+#: ../include/sane/saneopts.h:258
+#, no-c-format
+msgid ""
+"Request that all previews are done in monochrome mode. On a three-pass "
+"scanner this cuts down the number of passes to one and on a one-pass "
+"scanner, it reduces the memory requirements and scan-time of the preview."
+msgstr ""
+
+#: ../include/sane/saneopts.h:264
+#, no-c-format
+msgid ""
+"Number of bits per sample, typical values are 1 for \"line-art\" and 8 "
+"for multibit scans."
+msgstr ""
+
+#: ../include/sane/saneopts.h:268
+#, no-c-format
+msgid "Selects the scan mode (e.g., lineart, monochrome, or color)."
+msgstr ""
+
+#: ../include/sane/saneopts.h:271
+#, no-c-format
+msgid "Determines the speed at which the scan proceeds."
+msgstr ""
+
+#: ../include/sane/saneopts.h:274
+#, no-c-format
+msgid "Selects the scan source (such as a document-feeder)."
+msgstr ""
+
+#: ../include/sane/saneopts.h:277
+#, no-c-format
+msgid "Controls whether backtracking is forced."
+msgstr ""
+
+#: ../include/sane/saneopts.h:280
+#, no-c-format
+msgid "Top-left x position of scan area."
+msgstr "A beolvasási terület bal-felső x pozíciója"
+
+#: ../include/sane/saneopts.h:283
+#, no-c-format
+msgid "Top-left y position of scan area."
+msgstr "A beolvasási terület bal-felső y pozíciója"
+
+#: ../include/sane/saneopts.h:286
+#, no-c-format
+msgid "Bottom-right x position of scan area."
+msgstr "A beolvasási terület jobb-alsó x pozíciója"
+
+#: ../include/sane/saneopts.h:289
+#, no-c-format
+msgid "Bottom-right y position of scan area."
+msgstr "A beolvasási terület jobb-alsó y pozíciója"
+
+#: ../include/sane/saneopts.h:292
+#, no-c-format
+msgid "Sets the resolution of the scanned image."
+msgstr ""
+
+#: ../include/sane/saneopts.h:295
+#, no-c-format
+msgid "Sets the horizontal resolution of the scanned image."
+msgstr ""
+
+#: ../include/sane/saneopts.h:298
+#, no-c-format
+msgid "Sets the vertical resolution of the scanned image."
+msgstr ""
+
+#: ../include/sane/saneopts.h:301
+#, no-c-format
+msgid ""
+"Specifies the width of the media. Required for automatic centering of "
+"sheet-fed scans."
+msgstr ""
+
+#: ../include/sane/saneopts.h:305
+#, no-c-format
+msgid "Specifies the height of the media."
+msgstr ""
+
+#: ../include/sane/saneopts.h:308
+#, no-c-format
+msgid ""
+"Determines whether a builtin or a custom gamma-table should be used."
+msgstr ""
+
+#: ../include/sane/saneopts.h:312
+#, no-c-format
+msgid ""
+"Gamma-correction table. In color mode this option equally affects the "
+"red, green, and blue channels simultaneously (i.e., it is an intensity "
+"gamma table)."
+msgstr ""
+
+#: ../include/sane/saneopts.h:317
+#, no-c-format
+msgid "Gamma-correction table for the red band."
+msgstr ""
+
+#: ../include/sane/saneopts.h:320
+#, no-c-format
+msgid "Gamma-correction table for the green band."
+msgstr ""
+
+#: ../include/sane/saneopts.h:323
+#, no-c-format
+msgid "Gamma-correction table for the blue band."
+msgstr ""
+
+#: ../include/sane/saneopts.h:326
+#, no-c-format
+msgid "Controls the brightness of the acquired image."
+msgstr ""
+
+#: ../include/sane/saneopts.h:329
+#, no-c-format
+msgid "Controls the contrast of the acquired image."
+msgstr ""
+
+#: ../include/sane/saneopts.h:332
+#, no-c-format
+msgid ""
+"Selects the \"graininess\" of the acquired image. Smaller values result "
+"in sharper images."
+msgstr ""
+
+#: ../include/sane/saneopts.h:336
+#, no-c-format
+msgid "Selects whether the acquired image should be halftoned (dithered)."
+msgstr ""
+
+#: ../include/sane/saneopts.h:339 ../include/sane/saneopts.h:354
+#, no-c-format
+msgid "Selects what radiance level should be considered \"black\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:342 ../include/sane/saneopts.h:363
+#, no-c-format
+msgid "Selects what radiance level should be considered \"white\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:345
+#, no-c-format
+msgid "Selects what red radiance level should be considered \"white\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:348
+#, no-c-format
+msgid "Selects what green radiance level should be considered \"white\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:351
+#, no-c-format
+msgid "Selects what blue radiance level should be considered \"white\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:356
+#, no-c-format
+msgid "Selects what red radiance level should be considered \"black\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:358
+#, no-c-format
+msgid "Selects what green radiance level should be considered \"black\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:360
+#, no-c-format
+msgid "Selects what blue radiance level should be considered \"black\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:365
+#, no-c-format
+msgid "Selects what red radiance level should be considered \"full red\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:367
+#, no-c-format
+msgid ""
+"Selects what green radiance level should be considered \"full green\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:370
+#, no-c-format
+msgid ""
+"Selects what blue radiance level should be considered \"full blue\"."
+msgstr ""
+
+#: ../include/sane/saneopts.h:374
+#, no-c-format
+msgid "Controls the \"hue\" (blue-level) of the acquired image."
+msgstr ""
+
+#: ../include/sane/saneopts.h:377
+#, no-c-format
+msgid ""
+"The saturation level controls the amount of \"blooming\" that occurs "
+"when acquiring an image with a camera. Larger values cause more blooming."
+msgstr ""
+
+#: ../include/sane/saneopts.h:382
+#, no-c-format
+msgid "The filename of the image to be loaded."
+msgstr ""
+
+#: ../include/sane/saneopts.h:385
+#, no-c-format
+msgid ""
+"Sets the size of the halftoning (dithering) pattern used when scanning "
+"halftoned images."
+msgstr ""
+
+#: ../include/sane/saneopts.h:389
+#, no-c-format
+msgid ""
+"Defines the halftoning (dithering) pattern for scanning halftoned images."
+msgstr ""
+
+#: ../include/sane/saneopts.h:393
+#, no-c-format
+msgid "Use same values for X and Y resolution"
+msgstr ""
+
+#: ../include/sane/saneopts.h:395
+#, no-c-format
+msgid "Swap black and white"
+msgstr "A fekete és fehér felcserélése"
+
+#: ../include/sane/saneopts.h:397
+#, no-c-format
+msgid "Do a quality white-calibration"
+msgstr ""
+
+#: ../include/sane/saneopts.h:399
+#, no-c-format
+msgid "Use lens that doubles optical resolution"
+msgstr ""
+
+#: ../include/sane/saneopts.h:401 ../include/sane/saneopts.h:413
+#, no-c-format
+msgid "In RGB-mode use same values for each color"
+msgstr ""
+
+#: ../include/sane/saneopts.h:403
+#, no-c-format
+msgid "Select minimum-brightness to get a white point"
+msgstr ""
+
+#: ../include/sane/saneopts.h:405
+#, no-c-format
+msgid "Analog gamma-correction"
+msgstr ""
+
+#: ../include/sane/saneopts.h:407
+#, no-c-format
+msgid "Analog gamma-correction for red"
+msgstr ""
+
+#: ../include/sane/saneopts.h:409
+#, no-c-format
+msgid "Analog gamma-correction for green"
+msgstr ""
+
+#: ../include/sane/saneopts.h:411
+#, no-c-format
+msgid "Analog gamma-correction for blue"
+msgstr ""
+
+#: ../include/sane/saneopts.h:415
+#, no-c-format
+msgid "Warmup lamp before scanning"
+msgstr ""
+
+#: ../include/sane/saneopts.h:417
+#, no-c-format
+msgid "Define exposure-time for calibration"
+msgstr ""
+
+#: ../include/sane/saneopts.h:419
+#, no-c-format
+msgid "Define exposure-time for red calibration"
+msgstr ""
+
+#: ../include/sane/saneopts.h:421
+#, no-c-format
+msgid "Define exposure-time for green calibration"
+msgstr ""
+
+#: ../include/sane/saneopts.h:423
+#, no-c-format
+msgid "Define exposure-time for blue calibration"
+msgstr ""
+
+#: ../include/sane/saneopts.h:425
+#, no-c-format
+msgid "Define exposure-time for scan"
+msgstr ""
+
+#: ../include/sane/saneopts.h:427
+#, no-c-format
+msgid "Define exposure-time for red scan"
+msgstr ""
+
+#: ../include/sane/saneopts.h:429
+#, no-c-format
+msgid "Define exposure-time for green scan"
+msgstr ""
+
+#: ../include/sane/saneopts.h:431
+#, no-c-format
+msgid "Define exposure-time for blue scan"
+msgstr ""
+
+#: ../include/sane/saneopts.h:433
+#, no-c-format
+msgid "Enable selection of exposure-time"
+msgstr ""
+
+#: ../include/sane/saneopts.h:435
+#, no-c-format
+msgid "Define lamp density for calibration"
+msgstr ""
+
+#: ../include/sane/saneopts.h:437
+#, no-c-format
+msgid "Define lamp density for scan"
+msgstr ""
+
+#: ../include/sane/saneopts.h:439
+#, no-c-format
+msgid "Enable selection of lamp density"
+msgstr ""
+
+#: ../include/sane/saneopts.h:441 ../backend/umax.c:5830
+#, no-c-format
+msgid "Turn off lamp when program exits"
+msgstr ""
+
+#: ../include/sane/saneopts.h:444
+#, no-c-format
+msgid "Scan button"
+msgstr "Szkennel gomb"
+
+#: ../include/sane/saneopts.h:445
+#, no-c-format
+msgid "Email button"
+msgstr "Email gomb"
+
+#: ../include/sane/saneopts.h:446
+#, no-c-format
+msgid "Fax button"
+msgstr "Fax gomb"
+
+#: ../include/sane/saneopts.h:447
+#, no-c-format
+msgid "Copy button"
+msgstr "Másol gomb"
+
+#: ../include/sane/saneopts.h:448
+#, no-c-format
+msgid "PDF button"
+msgstr "PDF gomb"
+
+#: ../include/sane/saneopts.h:449
+#, no-c-format
+msgid "Cancel button"
+msgstr "Mégse gomb"
+
+#: ../include/sane/saneopts.h:450
+#, no-c-format
+msgid "Page loaded"
+msgstr "Oldal betöltve"
+
+#: ../include/sane/saneopts.h:451
+#, no-c-format
+msgid "Cover open"
+msgstr "Fedél nyitás"
+
+#: ../include/sane/saneopts.h:454
+#, no-c-format
+msgid "Color"
+msgstr "Színes"
+
+#: ../include/sane/saneopts.h:455
+#, no-c-format
+msgid "Color Lineart"
+msgstr ""
+
+#: ../include/sane/saneopts.h:456
+#, no-c-format
+msgid "Color Halftone"
+msgstr ""
+
+#: ../include/sane/saneopts.h:457
+#, no-c-format
+msgid "Gray"
+msgstr "Szürke"
+
+#: ../include/sane/saneopts.h:458
+#, no-c-format
+msgid "Halftone"
+msgstr ""
+
+#: ../include/sane/saneopts.h:459
+#, no-c-format
+msgid "Lineart"
+msgstr "Vonalas"
+
+#: ../backend/sane_strstatus.c:59
+#, no-c-format
+msgid "Success"
+msgstr ""
+
+#: ../backend/sane_strstatus.c:62
+#, no-c-format
+msgid "Operation not supported"
+msgstr "A művelet nem támogatott"
+
+#: ../backend/sane_strstatus.c:65
+#, no-c-format
+msgid "Operation was cancelled"
+msgstr "A művelet megszakítva"
+
+#: ../backend/sane_strstatus.c:68
+#, no-c-format
+msgid "Device busy"
+msgstr ""
+
+#: ../backend/sane_strstatus.c:71
+#, no-c-format
+msgid "Invalid argument"
+msgstr ""
+
+#: ../backend/sane_strstatus.c:74
+#, no-c-format
+msgid "End of file reached"
+msgstr ""
+
+#: ../backend/sane_strstatus.c:77
+#, no-c-format
+msgid "Document feeder jammed"
+msgstr ""
+
+#: ../backend/sane_strstatus.c:80
+#, no-c-format
+msgid "Document feeder out of documents"
+msgstr ""
+
+#: ../backend/sane_strstatus.c:83
+#, no-c-format
+msgid "Scanner cover is open"
+msgstr ""
+
+#: ../backend/sane_strstatus.c:86
+#, no-c-format
+msgid "Error during device I/O"
+msgstr ""
+
+#: ../backend/sane_strstatus.c:89
+#, no-c-format
+msgid "Out of memory"
+msgstr "Nincs elég memória"
+
+#: ../backend/sane_strstatus.c:92
+#, no-c-format
+msgid "Access to resource has been denied"
+msgstr ""
+
+#: ../backend/sane_strstatus.c:96
+#, no-c-format
+msgid "Lamp not ready, please retry"
+msgstr ""
+
+#: ../backend/sane_strstatus.c:101
+#, no-c-format
+msgid "Scanner mechanism locked for transport"
+msgstr ""
+
+#: ../backend/artec_eplus48u.c:2874 ../backend/pnm.c:282
+#, no-c-format
+msgid "Defaults"
+msgstr "Alapértelmezett"
+
+#: ../backend/artec_eplus48u.c:2876
+#, no-c-format
+msgid "Set default values for enhancement controls."
+msgstr ""
+
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
+#, no-c-format
+msgid "Calibration"
+msgstr "Kalibráció"
+
+#: ../backend/artec_eplus48u.c:2941
+#, no-c-format
+msgid "Calibrate before next scan"
+msgstr "Kalibrálás a következő szkennelés előtt"
+
+#: ../backend/artec_eplus48u.c:2943
+#, no-c-format
+msgid ""
+"If enabled, the device will be calibrated before the next scan. "
+"Otherwise, calibration is performed only before the first start."
+msgstr ""
+
+#: ../backend/artec_eplus48u.c:2954
+#, no-c-format
+msgid "Only perform shading-correction"
+msgstr ""
+
+#: ../backend/artec_eplus48u.c:2956
+#, no-c-format
+msgid ""
+"If enabled, only the shading correction is performed during calibration. "
+"The default values for gain, offset and exposure time, either build-in "
+"or from the configuration file, are used."
+msgstr ""
+
+#: ../backend/artec_eplus48u.c:2967
+#, no-c-format
+msgid "Button state"
+msgstr ""
+
+#: ../backend/avision.h:777
+#, no-c-format
+msgid "Number of the frame to scan"
+msgstr ""
+
+#: ../backend/avision.h:778
+#, no-c-format
+msgid "Selects the number of the frame to scan"
+msgstr ""
+
+#: ../backend/avision.h:781
+#, fuzzy, no-c-format
+msgid "Duplex scan"
+msgstr "Teljes szkennelés"
+
+#: ../backend/avision.h:782
+#, no-c-format
+msgid ""
+"Duplex scan provide a scan of the front and back side of the document"
+msgstr ""
+
+#: ../backend/canon630u.c:159
+#, no-c-format
+msgid "Calibrate Scanner"
+msgstr "Szkenner kalibrálása"
+
+#: ../backend/canon630u.c:160
+#, no-c-format
+msgid "Force scanner calibration before scan"
+msgstr ""
+
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
+#, no-c-format
+msgid "Grayscale scan"
+msgstr "Szürkeskálás szkennelés"
+
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
+#, no-c-format
+msgid "Do a grayscale rather than color scan"
+msgstr ""
+
+#: ../backend/canon630u.c:306
+#, no-c-format
+msgid "Analog Gain"
+msgstr "Analóg erősítés"
+
+#: ../backend/canon630u.c:307
+#, no-c-format
+msgid "Increase or decrease the analog gain of the CCD array"
+msgstr ""
+
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
+#, no-c-format
+msgid "Gamma Correction"
+msgstr "Gamma korrekció"
+
+#: ../backend/canon630u.c:348
+#, no-c-format
+msgid "Selects the gamma corrected transfer curve"
+msgstr ""
+
+#: ../backend/canon.c:149 ../backend/canon-sane.c:1323
+#, no-c-format
+msgid "Raw"
+msgstr "Nyers"
+
+#: ../backend/canon.c:157 ../backend/canon-sane.c:732
+#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
+#, no-c-format
+msgid "Fine color"
+msgstr ""
+
+#: ../backend/canon.c:169
+#, fuzzy, no-c-format
+msgid "No transparency correction"
+msgstr "Erősítés korrekció"
+
+#: ../backend/canon.c:170 ../backend/canon-sane.c:680
+#, no-c-format
+msgid "Correction according to film type"
+msgstr ""
+
+#: ../backend/canon.c:171 ../backend/canon-sane.c:674
+#, no-c-format
+msgid "Correction according to transparency ratio"
+msgstr ""
+
+#: ../backend/canon.c:176 ../backend/canon-sane.c:776
+#, fuzzy, no-c-format
+msgid "Negatives"
+msgstr "Negatív"
+
+#: ../backend/canon.c:176
+#, fuzzy, no-c-format
+msgid "Slides"
+msgstr "Lassabb"
+
+#: ../backend/canon.c:186 ../backend/kvs1025_opt.c:181
+#: ../backend/kvs40xx_opt.c:272 ../backend/matsushita.c:178
+#, no-c-format
+msgid "Automatic"
+msgstr "Automata"
+
+#: ../backend/canon.c:186
+#, fuzzy, no-c-format
+msgid "Normal speed"
+msgstr "Normál"
+
+#: ../backend/canon.c:187
+#, no-c-format
+msgid "1/2 normal speed"
+msgstr ""
+
+#: ../backend/canon.c:187
+#, no-c-format
+msgid "1/3 normal speed"
+msgstr ""
+
+#: ../backend/canon.c:365
+#, no-c-format
+msgid "rounded parameter"
+msgstr ""
+
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
+#, no-c-format
+msgid "unknown"
+msgstr "ismeretlen"
+
+#: ../backend/canon.c:378
+#, fuzzy, no-c-format
+msgid "ADF jam"
+msgstr "ADF"
+
+#: ../backend/canon.c:381
+#, no-c-format
+msgid "ADF cover open"
+msgstr ""
+
+#: ../backend/canon.c:394
+#, fuzzy, no-c-format
+msgid "lamp failure"
+msgstr "Gamma érték"
+
+#: ../backend/canon.c:397
+#, no-c-format
+msgid "scan head positioning error"
+msgstr ""
+
+#: ../backend/canon.c:400
+#, no-c-format
+msgid "CPU check error"
+msgstr ""
+
+#: ../backend/canon.c:403
+#, no-c-format
+msgid "RAM check error"
+msgstr ""
+
+#: ../backend/canon.c:406
+#, no-c-format
+msgid "ROM check error"
+msgstr ""
+
+#: ../backend/canon.c:409
+#, no-c-format
+msgid "hardware check error"
+msgstr ""
+
+#: ../backend/canon.c:412
+#, no-c-format
+msgid "transparency unit lamp failure"
+msgstr ""
+
+#: ../backend/canon.c:415
+#, no-c-format
+msgid "transparency unit scan head positioning failure"
+msgstr ""
+
+#: ../backend/canon.c:429
+#, no-c-format
+msgid "parameter list length error"
+msgstr ""
+
+#: ../backend/canon.c:433
+#, no-c-format
+msgid "invalid command operation code"
+msgstr ""
+
+#: ../backend/canon.c:437
+#, no-c-format
+msgid "invalid field in CDB"
+msgstr ""
+
+#: ../backend/canon.c:441
+#, no-c-format
+msgid "unsupported LUN"
+msgstr ""
+
+#: ../backend/canon.c:445
+#, no-c-format
+msgid "invalid field in parameter list"
+msgstr ""
+
+#: ../backend/canon.c:449
+#, no-c-format
+msgid "command sequence error"
+msgstr ""
+
+#: ../backend/canon.c:453
+#, no-c-format
+msgid "too many windows specified"
+msgstr ""
+
+#: ../backend/canon.c:457
+#, no-c-format
+msgid "medium not present"
+msgstr ""
+
+#: ../backend/canon.c:461
+#, no-c-format
+msgid "invalid bit IDENTIFY message"
+msgstr ""
+
+#: ../backend/canon.c:465
+#, no-c-format
+msgid "option not connect"
+msgstr ""
+
+#: ../backend/canon.c:479
+#, no-c-format
+msgid "power on reset / bus device reset"
+msgstr ""
+
+#: ../backend/canon.c:483
+#, no-c-format
+msgid "parameter changed by another initiator"
+msgstr ""
+
+#: ../backend/canon.c:497
+#, no-c-format
+msgid "no additional sense information"
+msgstr ""
+
+#: ../backend/canon.c:501
+#, no-c-format
+msgid "reselect failure"
+msgstr ""
+
+#: ../backend/canon.c:505
+#, no-c-format
+msgid "SCSI parity error"
+msgstr ""
+
+#: ../backend/canon.c:509
+#, no-c-format
+msgid "initiator detected error message received"
+msgstr ""
+
+#: ../backend/canon.c:514
+#, no-c-format
+msgid "invalid message error"
+msgstr ""
+
+#: ../backend/canon.c:518
+#, no-c-format
+msgid "timeout error"
+msgstr ""
+
+#: ../backend/canon.c:522
+#, no-c-format
+msgid "transparency unit shading error"
+msgstr ""
+
+#: ../backend/canon.c:526
+#, no-c-format
+msgid "lamp not stabilized"
+msgstr ""
+
+#: ../backend/canon.c:852 ../backend/canon.c:867
+#, fuzzy, no-c-format
+msgid "film scanner"
+msgstr "lapolvasó"
+
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
+#, no-c-format
+msgid "flatbed scanner"
+msgstr "síkágyas lapolvasó"
+
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
+#, no-c-format
+msgid "Film type"
+msgstr "Filmtípus"
+
+#: ../backend/canon.c:1184
+#, no-c-format
+msgid "Selects the film type, i.e. negatives or slides"
+msgstr ""
+
+#: ../backend/canon.c:1196
+#, fuzzy, no-c-format
+msgid "Negative film type"
+msgstr "Negatív film"
+
+#: ../backend/canon.c:1197
+#, no-c-format
+msgid "Selects the negative film type"
+msgstr ""
+
+#: ../backend/canon.c:1236
+#, no-c-format
+msgid "Hardware resolution"
+msgstr "Eszköz felbontása"
+
+#: ../backend/canon.c:1237
+#, no-c-format
+msgid "Use only hardware resolutions"
+msgstr ""
+
+#: ../backend/canon.c:1318
+#, no-c-format
+msgid "Focus"
+msgstr ""
+
+#: ../backend/canon.c:1328
+#, no-c-format
+msgid "Auto focus"
+msgstr ""
+
+#: ../backend/canon.c:1329
+#, no-c-format
+msgid "Enable/disable auto focus"
+msgstr ""
+
+#: ../backend/canon.c:1336
+#, no-c-format
+msgid "Auto focus only once"
+msgstr ""
+
+#: ../backend/canon.c:1337
+#, no-c-format
+msgid "Do auto focus only once between ejects"
+msgstr ""
+
+#: ../backend/canon.c:1345
+#, no-c-format
+msgid "Manual focus position"
+msgstr ""
+
+#: ../backend/canon.c:1346
+#, no-c-format
+msgid "Set the optical system's focus position by hand (default: 128)."
+msgstr ""
+
+#: ../backend/canon.c:1356
+#, no-c-format
+msgid "Scan margins"
+msgstr ""
+
+#: ../backend/canon.c:1403
+#, no-c-format
+msgid "Extra color adjustments"
+msgstr ""
+
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
+#: ../backend/kvs40xx_opt.c:825
+#, no-c-format
+msgid "Mirror image"
+msgstr "Kép tükrözése"
+
+#: ../backend/canon.c:1539
+#, fuzzy, no-c-format
+msgid "Mirror the image horizontally"
+msgstr "A kép vízszintes tükrözése."
+
+#: ../backend/canon.c:1608
+#, no-c-format
+msgid "Auto exposure"
+msgstr ""
+
+#: ../backend/canon.c:1609
+#, no-c-format
+msgid "Enable/disable the auto exposure feature"
+msgstr ""
+
+#: ../backend/canon.c:1625
+#, fuzzy, no-c-format
+msgid "Calibration now"
+msgstr "Kalibráció"
+
+#: ../backend/canon.c:1626
+#, fuzzy, no-c-format
+msgid "Execute calibration *now*"
+msgstr "Precíz beállítás"
+
+#: ../backend/canon.c:1636
+#, no-c-format
+msgid "Self diagnosis"
+msgstr ""
+
+#: ../backend/canon.c:1637
+#, no-c-format
+msgid "Perform scanner self diagnosis"
+msgstr ""
+
+#: ../backend/canon.c:1648
+#, fuzzy, no-c-format
+msgid "Reset scanner"
+msgstr "lapolvasó"
+
+#: ../backend/canon.c:1649
+#, fuzzy, no-c-format
+msgid "Reset the scanner"
+msgstr "lapolvasó"
+
+#: ../backend/canon.c:1659
+#, no-c-format
+msgid "Medium handling"
+msgstr ""
+
+#: ../backend/canon.c:1668
+#, no-c-format
+msgid "Eject film after each scan"
+msgstr ""
+
+#: ../backend/canon.c:1669
+#, no-c-format
+msgid "Automatically eject the film from the device after each scan"
+msgstr ""
+
+#: ../backend/canon.c:1680
+#, no-c-format
+msgid "Eject film before exit"
+msgstr ""
+
+#: ../backend/canon.c:1681
+#, no-c-format
+msgid ""
+"Automatically eject the film from the device before exiting the program"
+msgstr ""
+
+#: ../backend/canon.c:1690
+#, no-c-format
+msgid "Eject film now"
+msgstr ""
+
+#: ../backend/canon.c:1691
+#, no-c-format
+msgid "Eject the film *now*"
+msgstr ""
+
+#: ../backend/canon.c:1700
+#, no-c-format
+msgid "Document feeder extras"
+msgstr ""
+
+#: ../backend/canon.c:1707
+#, no-c-format
+msgid "Flatbed only"
+msgstr "Csak síkágyas"
+
+#: ../backend/canon.c:1708
+#, no-c-format
+msgid "Disable auto document feeder and use flatbed only"
+msgstr ""
+
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
+#, fuzzy, no-c-format
+msgid "Transparency unit"
+msgstr "Átlátszó"
+
+#: ../backend/canon.c:1729
+#, no-c-format
+msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
+msgstr ""
+
+#: ../backend/canon.c:1739
+#, fuzzy, no-c-format
+msgid "Negative film"
+msgstr "Negatív film"
+
+#: ../backend/canon.c:1740
+#, fuzzy, no-c-format
+msgid "Positive or negative film"
+msgstr "Pozitív film"
+
+#: ../backend/canon.c:1749
+#, no-c-format
+msgid "Density control"
+msgstr ""
+
+#: ../backend/canon.c:1750
+#, no-c-format
+msgid "Set density control mode"
+msgstr ""
+
+#: ../backend/canon.c:1761
+#, fuzzy, no-c-format
+msgid "Transparency ratio"
+msgstr "Átlátszó"
+
+#: ../backend/canon.c:1775
+#, fuzzy, no-c-format
+msgid "Select film type"
+msgstr "Filmtípus"
+
+#: ../backend/canon.c:1776
+#, no-c-format
+msgid "Select the film type"
+msgstr ""
+
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
+#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
+#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
+#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
+#: ../backend/test.c:192 ../backend/umax.c:181
+#, no-c-format
+msgid "Flatbed"
+msgstr "Síkágyas"
+
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
+#, no-c-format
+msgid "ADF Front"
+msgstr ""
+
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
+#, no-c-format
+msgid "ADF Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
+#, no-c-format
+msgid "ADF Duplex"
+msgstr ""
+
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Nyomtatás"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, no-c-format
+msgid "Card Duplex"
+msgstr ""
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
+#: ../backend/hp-option.c:3093
+#, no-c-format
+msgid "Red"
+msgstr "Vörös"
+
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
+#: ../backend/hp-option.c:3094
+#, no-c-format
+msgid "Green"
+msgstr "Zöld"
+
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
+#: ../backend/hp-option.c:3095
+#, no-c-format
+msgid "Blue"
+msgstr "Kék"
+
+#: ../backend/canon_dr.c:404
+#, fuzzy, no-c-format
+msgid "Enhance Red"
+msgstr "Haladó"
+
+#: ../backend/canon_dr.c:405
+#, fuzzy, no-c-format
+msgid "Enhance Green"
+msgstr "Haladó"
+
+#: ../backend/canon_dr.c:406
+#, fuzzy, no-c-format
+msgid "Enhance Blue"
+msgstr "Haladó"
+
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
+#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
+#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
+#: ../backend/snapscan-options.c:91
+#, no-c-format
+msgid "None"
+msgstr "Nincs"
+
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
+#, no-c-format
+msgid "JPEG"
+msgstr ""
+
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
+#, no-c-format
+msgid "Simplex"
+msgstr ""
+
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
+#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
+#, no-c-format
+msgid "Duplex"
+msgstr ""
+
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
+#, no-c-format
+msgid "Transparency Unit"
+msgstr ""
+
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
+#, no-c-format
+msgid "Automatic Document Feeder"
+msgstr "Automatikus dokumentum adagoló"
+
+#: ../backend/epson.c:523 ../backend/epson2.c:134
+#, no-c-format
+msgid "Positive Film"
+msgstr "Pozitív film"
+
+#: ../backend/epson.c:524 ../backend/epson2.c:135
+#, no-c-format
+msgid "Negative Film"
+msgstr "Negatív film"
+
+#: ../backend/epson.c:529 ../backend/epson2.c:142
+#, no-c-format
+msgid "Focus on glass"
+msgstr "Fókusz az üvegen"
+
+#: ../backend/epson.c:530 ../backend/epson2.c:143
+#, no-c-format
+msgid "Focus 2.5mm above glass"
+msgstr "Fókusz 2,5mm-el az üveg felett"
+
+#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
+#, no-c-format
+msgid "Halftone A (Hard Tone)"
+msgstr ""
+
+#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
+#, no-c-format
+msgid "Halftone B (Soft Tone)"
+msgstr ""
+
+#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
+#, no-c-format
+msgid "Halftone C (Net Screen)"
+msgstr ""
+
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
+#, no-c-format
+msgid "Dither A (4x4 Bayer)"
+msgstr ""
+
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
+#, no-c-format
+msgid "Dither B (4x4 Spiral)"
+msgstr ""
+
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
+#, no-c-format
+msgid "Dither C (4x4 Net Screen)"
+msgstr ""
+
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
+#, no-c-format
+msgid "Dither D (8x4 Net Screen)"
+msgstr ""
+
+#: ../backend/epson.c:584 ../backend/epson2.c:193
+#, no-c-format
+msgid "Text Enhanced Technology"
+msgstr ""
+
+#: ../backend/epson.c:585 ../backend/epson2.c:194
+#, no-c-format
+msgid "Download pattern A"
+msgstr ""
+
+#: ../backend/epson.c:586 ../backend/epson2.c:195
+#, no-c-format
+msgid "Download pattern B"
+msgstr ""
+
+#: ../backend/epson.c:631
+#, no-c-format
+msgid "No Correction"
+msgstr "Nincs korrekció"
+
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
+#, no-c-format
+msgid "User defined"
+msgstr ""
+
+#: ../backend/epson.c:633
+#, no-c-format
+msgid "Impact-dot printers"
+msgstr ""
+
+#: ../backend/epson.c:634
+#, no-c-format
+msgid "Thermal printers"
+msgstr "Hőnyomtató"
+
+#: ../backend/epson.c:635
+#, no-c-format
+msgid "Ink-jet printers"
+msgstr "Tintasugaras nyomtató"
+
+#: ../backend/epson.c:636
+#, no-c-format
+msgid "CRT monitors"
+msgstr "CRT monitor"
+
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
+#: ../backend/hp-option.c:3226 ../backend/test.c:143
+#, no-c-format
+msgid "Default"
+msgstr "Alapértelmezett"
+
+#: ../backend/epson.c:658 ../backend/epson2.c:256
+#, no-c-format
+msgid "High density printing"
+msgstr ""
+
+#: ../backend/epson.c:659 ../backend/epson2.c:257
+#, no-c-format
+msgid "Low density printing"
+msgstr ""
+
+#: ../backend/epson.c:660 ../backend/epson2.c:258
+#, no-c-format
+msgid "High contrast printing"
+msgstr ""
+
+#: ../backend/epson.c:678 ../backend/epson2.c:276
+#, no-c-format
+msgid "User defined (Gamma=1.0)"
+msgstr ""
+
+#: ../backend/epson.c:679 ../backend/epson2.c:277
+#, no-c-format
+msgid "User defined (Gamma=1.8)"
+msgstr ""
+
+#: ../backend/epson.c:757
+#, no-c-format
+msgid "CD"
+msgstr ""
+
+#: ../backend/epson.c:758
+#, no-c-format
+msgid "A5 portrait"
+msgstr "A% álló"
+
+#: ../backend/epson.c:759
+#, no-c-format
+msgid "A5 landscape"
+msgstr "A5 fekvő"
+
+#: ../backend/epson.c:760 ../backend/kvs1025_opt.c:103
+#: ../backend/kvs20xx_opt.c:76 ../backend/kvs40xx_opt.c:130
+#: ../backend/kvs40xx_opt.c:147
+#, no-c-format
+msgid "Letter"
+msgstr "Letter"
+
+#: ../backend/epson.c:761 ../backend/kvs1025_opt.c:100
+#: ../backend/kvs20xx_opt.c:73 ../backend/kvs20xx_opt.c:301
+#: ../backend/kvs40xx_opt.c:127 ../backend/kvs40xx_opt.c:144
+#: ../backend/kvs40xx_opt.c:525
+#, no-c-format
+msgid "A4"
+msgstr "A4"
+
+#: ../backend/epson.c:762
+#, no-c-format
+msgid "Max"
+msgstr "Max"
+
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
+#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
+#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
+#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
+#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
+#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
+#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
+#: ../backend/umax.c:5054
+#, no-c-format
+msgid "Scan Mode"
+msgstr " Szkennelési üzemmód "
+
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
+#, no-c-format
+msgid "Selects the halftone."
+msgstr ""
+
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
+#, no-c-format
+msgid "Dropout"
+msgstr ""
+
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
+#, no-c-format
+msgid "Selects the dropout."
+msgstr ""
+
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
+#, no-c-format
+msgid "Selects the brightness."
+msgstr ""
+
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
+#, no-c-format
+msgid "Sharpness"
+msgstr ""
+
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
+#, no-c-format
+msgid "Color correction"
+msgstr "Színkorrekció"
+
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
+#, no-c-format
+msgid "Sets the color correction table for the selected output device."
+msgstr ""
+
+#: ../backend/epson.c:3075
+#, no-c-format
+msgid "Color correction coefficients"
+msgstr ""
+
+#: ../backend/epson.c:3076
+#, no-c-format
+msgid "Matrix multiplication of RGB"
+msgstr ""
+
+#: ../backend/epson.c:3093
+#, no-c-format
+msgid "Shift green to red"
+msgstr ""
+
+#: ../backend/epson.c:3094
+#, no-c-format
+msgid "Shift green to blue"
+msgstr ""
+
+#: ../backend/epson.c:3095
+#, no-c-format
+msgid "Shift red to green"
+msgstr ""
+
+#: ../backend/epson.c:3097
+#, no-c-format
+msgid "Shift red to blue"
+msgstr ""
+
+#: ../backend/epson.c:3098
+#, no-c-format
+msgid "Shift blue to green"
+msgstr ""
+
+#: ../backend/epson.c:3099
+#, no-c-format
+msgid "Shift blue to red"
+msgstr ""
+
+#: ../backend/epson.c:3102
+#, no-c-format
+msgid "Controls green level"
+msgstr ""
+
+#: ../backend/epson.c:3103
+#, no-c-format
+msgid "Adds to red based on green level"
+msgstr ""
+
+#: ../backend/epson.c:3104
+#, no-c-format
+msgid "Adds to blue based on green level"
+msgstr ""
+
+#: ../backend/epson.c:3105
+#, no-c-format
+msgid "Adds to green based on red level"
+msgstr ""
+
+#: ../backend/epson.c:3106
+#, no-c-format
+msgid "Controls red level"
+msgstr ""
+
+#: ../backend/epson.c:3107
+#, no-c-format
+msgid "Adds to blue based on red level"
+msgstr ""
+
+#: ../backend/epson.c:3108
+#, no-c-format
+msgid "Adds to green based on blue level"
+msgstr ""
+
+#: ../backend/epson.c:3109
+#, no-c-format
+msgid "Adds to red based on blue level"
+msgstr ""
+
+#: ../backend/epson.c:3110
+#, fuzzy, no-c-format
+msgid "Controls blue level"
+msgstr "A kék csatorna kontrasztja"
+
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
+#, no-c-format
+msgid "Mirror the image."
+msgstr "Kép tükrözése."
+
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
+#, no-c-format
+msgid "Fast preview"
+msgstr "Gyors előnézet"
+
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
+#, no-c-format
+msgid "Auto area segmentation"
+msgstr ""
+
+#: ../backend/epson.c:3258
+#, no-c-format
+msgid "Short resolution list"
+msgstr ""
+
+#: ../backend/epson.c:3260
+#, no-c-format
+msgid "Display short resolution list"
+msgstr ""
+
+#: ../backend/epson.c:3267
+#, no-c-format
+msgid "Zoom"
+msgstr "Nagyítás"
+
+#: ../backend/epson.c:3269
+#, no-c-format
+msgid "Defines the zoom factor the scanner will use"
+msgstr ""
+
+#: ../backend/epson.c:3349
+#, no-c-format
+msgid "Quick format"
+msgstr ""
+
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
+#, no-c-format
+msgid "Optional equipment"
+msgstr ""
+
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
+#, no-c-format
+msgid "Eject"
+msgstr ""
+
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
+#, no-c-format
+msgid "Eject the sheet in the ADF"
+msgstr ""
+
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
+#, no-c-format
+msgid "Auto eject"
+msgstr ""
+
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
+#, no-c-format
+msgid "Eject document after scanning"
+msgstr ""
+
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
+#, no-c-format
+msgid "ADF Mode"
+msgstr ""
+
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
+#, no-c-format
+msgid "Selects the ADF mode (simplex/duplex)"
+msgstr ""
+
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
+#, no-c-format
+msgid "Bay"
+msgstr ""
+
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
+#, no-c-format
+msgid "Select bay to scan"
+msgstr ""
+
+#: ../backend/epson.h:69 ../backend/epson2.h:75
+#, no-c-format
+msgid ""
+"Selects the gamma correction value from a list of pre-defined devices or "
+"the user defined table, which can be downloaded to the scanner"
+msgstr ""
+
+#: ../backend/epson.h:72 ../backend/epson2.h:78
+#, no-c-format
+msgid "Focus Position"
+msgstr ""
+
+#: ../backend/epson.h:73 ../backend/epson2.h:79
+#, no-c-format
+msgid ""
+"Sets the focus position to either the glass or 2.5mm above the glass"
+msgstr ""
+
+#: ../backend/epson.h:75 ../backend/epson2.h:81
+#, no-c-format
+msgid "Wait for Button"
+msgstr ""
+
+#: ../backend/epson.h:76 ../backend/epson2.h:82
+#, no-c-format
+msgid ""
+"After sending the scan command, wait until the button on the scanner is "
+"pressed to actually start the scan process."
+msgstr ""
+
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
+#, no-c-format
+msgid "Infrared"
+msgstr ""
+
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
+#, fuzzy, no-c-format
+msgid "Positive Slide"
+msgstr "Pozitív film"
+
+#: ../backend/epson2.c:137
+#, fuzzy, no-c-format
+msgid "Negative Slide"
+msgstr "Negatív film"
+
+#: ../backend/epson2.c:215
+#, no-c-format
+msgid "Built in CCT profile"
+msgstr ""
+
+#: ../backend/epson2.c:216
+#, no-c-format
+msgid "User defined CCT profile"
+msgstr ""
+
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
+#: ../backend/hp-option.c:3340
+#, no-c-format
+msgid "On"
+msgstr "Be"
+
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
+#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
+#, no-c-format
+msgid "Off"
+msgstr "Ki"
+
+#: ../backend/fujitsu.c:663
+#, no-c-format
+msgid "DTC"
+msgstr "DTC"
+
+#: ../backend/fujitsu.c:664
+#, no-c-format
+msgid "SDTC"
+msgstr "SDTC"
+
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
+#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
+#: ../backend/teco3.c:977 ../backend/teco3.c:978
+#, no-c-format
+msgid "Dither"
+msgstr ""
+
+#: ../backend/fujitsu.c:667
+#, no-c-format
+msgid "Diffusion"
+msgstr ""
+
+#: ../backend/fujitsu.c:672
+#, fuzzy, no-c-format
+msgid "White"
+msgstr "Fehérszint"
+
+#: ../backend/fujitsu.c:673
+#, fuzzy, no-c-format
+msgid "Black"
+msgstr "Feketeszint"
+
+#: ../backend/fujitsu.c:678
+#, no-c-format
+msgid "Continue"
+msgstr "Folytatás"
+
+#: ../backend/fujitsu.c:679
+#, no-c-format
+msgid "Stop"
+msgstr "Megállít"
+
+#: ../backend/fujitsu.c:681
+#, no-c-format
+msgid "10mm"
+msgstr "10mm"
+
+#: ../backend/fujitsu.c:682
+#, no-c-format
+msgid "15mm"
+msgstr "15mm"
+
+#: ../backend/fujitsu.c:683
+#, no-c-format
+msgid "20mm"
+msgstr "20mm"
+
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
+#, no-c-format
+msgid "Horizontal"
+msgstr "Vízszintes"
+
+#: ../backend/fujitsu.c:686
+#, fuzzy, no-c-format
+msgid "Horizontal bold"
+msgstr "Vízszintes"
+
+#: ../backend/fujitsu.c:687
+#, fuzzy, no-c-format
+msgid "Horizontal narrow"
+msgstr "Vízszintes"
+
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
+#, no-c-format
+msgid "Vertical"
+msgstr "Függőleges"
+
+#: ../backend/fujitsu.c:689
+#, fuzzy, no-c-format
+msgid "Vertical bold"
+msgstr "Függőleges"
+
+#: ../backend/fujitsu.c:691
+#, no-c-format
+msgid "Top to bottom"
+msgstr ""
+
+#: ../backend/fujitsu.c:692
+#, no-c-format
+msgid "Bottom to top"
+msgstr ""
+
+#: ../backend/fujitsu.c:694
+#, fuzzy, no-c-format
+msgid "Front"
+msgstr "Nyomtatás"
+
+#: ../backend/fujitsu.c:695
+#, no-c-format
+msgid "Back"
+msgstr ""
+
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
+#, fuzzy, no-c-format
+msgid "Extras"
+msgstr "Extra gyors"
+
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
+#, no-c-format
+msgid "Threshold curve"
+msgstr ""
+
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
+#, no-c-format
+msgid "Dynamic threshold curve, from light to dark, normally 50-65"
+msgstr ""
+
+#: ../backend/genesys.c:5839
+#, no-c-format
+msgid "Disable dynamic lineart"
+msgstr ""
+
+#: ../backend/genesys.c:5841
+#, no-c-format
+msgid ""
+"Disable use of a software adaptive algorithm to generate lineart relying "
+"instead on hardware lineart."
+msgstr ""
+
+#: ../backend/genesys.c:5857
+#, fuzzy, no-c-format
+msgid "Disable interpolation"
+msgstr "Tesztbeállítások engedélyezése"
+
+#: ../backend/genesys.c:5860
+#, no-c-format
+msgid ""
+"When using high resolutions where the horizontal resolution is smaller "
+"than the vertical resolution this disables horizontal interpolation."
+msgstr ""
+
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
+msgstr "Színmátrix"
+
+#: ../backend/genesys.c:5872
+#, no-c-format
+msgid "When using gray or lineart this option selects the used color."
+msgstr ""
+
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Kalibráció"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Precíz beállítás"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Kalibráció"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
+#, no-c-format
+msgid "Lamp off time"
+msgstr ""
+
+#: ../backend/genesys.c:5930
+#, no-c-format
+msgid ""
+"The lamp will be turned off after the given time (in minutes). A value "
+"of 0 means, that the lamp won't be turned off."
+msgstr ""
+
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Finom beállítás"
+
+#: ../backend/genesys.c:5941
+#, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr ""
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
+#, no-c-format
+msgid "File button"
+msgstr "Fájl gomb"
+
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
+#, no-c-format
+msgid "OCR button"
+msgstr "OCR gomb"
+
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
+#, no-c-format
+msgid "Power button"
+msgstr ""
+
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Email gomb"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
+#, fuzzy, no-c-format
+msgid "Need calibration"
+msgstr "Finom beállítás"
+
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
+#, no-c-format
+msgid "The scanner needs calibration for the current settings"
+msgstr ""
+
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
+#, no-c-format
+msgid "Buttons"
+msgstr "Gombok"
+
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
+#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
+#: ../backend/niash.c:726 ../backend/plustek.c:941
+#, no-c-format
+msgid "Calibrate"
+msgstr "Kalibrálás"
+
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
+#, fuzzy, no-c-format
+msgid "Start calibration using special sheet"
+msgstr "Kalibrálási folyamat indítása."
+
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
+#, fuzzy, no-c-format
+msgid "Clear calibration"
+msgstr "Finom beállítás"
+
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
+#, fuzzy, no-c-format
+msgid "Clear calibration cache"
+msgstr "Finom beállítás"
+
+#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
+#, no-c-format
+msgid "Transparency Adapter"
+msgstr ""
+
+#: ../backend/gt68xx.c:477
+#, no-c-format
+msgid "Gray mode color"
+msgstr ""
+
+#: ../backend/gt68xx.c:479
+#, no-c-format
+msgid "Selects which scan color is used gray mode (default: green)."
+msgstr ""
+
+#: ../backend/gt68xx.c:560 ../backend/hp3900_sane.c:1392
+#: ../backend/mustek_usb2.c:410
+#, no-c-format
+msgid "Debugging Options"
+msgstr " Nyomkövetési beállítások "
+
+#: ../backend/gt68xx.c:571 ../backend/mustek_usb2.c:419
+#, no-c-format
+msgid "Automatic warmup"
+msgstr ""
+
+#: ../backend/gt68xx.c:573
+#, no-c-format
+msgid ""
+"Warm-up until the lamp's brightness is constant instead of insisting on "
+"60 seconds warm-up time."
+msgstr ""
+
+#: ../backend/gt68xx.c:585
+#, no-c-format
+msgid "Full scan"
+msgstr "Teljes szkennelés"
+
+#: ../backend/gt68xx.c:587
+#, no-c-format
+msgid ""
+"Scan the complete scanning area including calibration strip. Be careful. "
+"Don't select the full height. For testing only."
+msgstr ""
+
+#: ../backend/gt68xx.c:598
+#, no-c-format
+msgid "Coarse calibration"
+msgstr "Finom beállítás"
+
+#: ../backend/gt68xx.c:600
+#, no-c-format
+msgid ""
+"Setup gain and offset for scanning automatically. If this option is "
+"disabled, options for setting the analog frontend parameters manually "
+"are provided. This option is enabled by default. For testing only."
+msgstr ""
+
+#: ../backend/gt68xx.c:619
+#, no-c-format
+msgid "Coarse calibration for first scan only"
+msgstr "Finom beállítás csak az első szkeneléskor"
+
+#: ../backend/gt68xx.c:621
+#, no-c-format
+msgid ""
+"Coarse calibration is only done for the first scan. Works with most "
+"scanners and can save scanning time. If the image brightness is "
+"different with each scan, disable this option. For testing only."
+msgstr ""
+
+#: ../backend/gt68xx.c:654
+#, no-c-format
+msgid "Backtrack lines"
+msgstr ""
+
+#: ../backend/gt68xx.c:656
+#, no-c-format
+msgid ""
+"Number of lines the scan slider moves back when backtracking occurs. "
+"That happens when the scanner scans faster than the computer can receive "
+"the data. Low values cause faster scans but increase the risk of "
+"omitting lines."
+msgstr ""
+
+#: ../backend/gt68xx.c:681 ../backend/mustek_usb2.c:452
+#, no-c-format
+msgid "Gamma value"
+msgstr "Gamma érték"
+
+#: ../backend/gt68xx.c:683 ../backend/mustek_usb2.c:454
+#, no-c-format
+msgid "Sets the gamma value of all channels."
+msgstr ""
+
+#: ../backend/hp3500.c:1004
+#, fuzzy, no-c-format
+msgid "Geometry Group"
+msgstr "Geometria"
+
+#: ../backend/hp3500.c:1057 ../backend/hp3500.c:1058
+#, fuzzy, no-c-format
+msgid "Scan Mode Group"
+msgstr " Szkennelési üzemmód "
+
+#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1019
+#: ../backend/hp-option.c:3174
+#, no-c-format
+msgid "Slide"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1405
+#, fuzzy, no-c-format
+msgid "Scanner model"
+msgstr "Szkennelési üzemmód"
+
+#: ../backend/hp3900_sane.c:1408
+#, no-c-format
+msgid "Allows one to test device behaviour with other supported models"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1422
+#, no-c-format
+msgid "Image colours will be inverted"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1436
+#, fuzzy, no-c-format
+msgid "Disable gamma correction"
+msgstr "Gamma korrekció"
+
+#: ../backend/hp3900_sane.c:1437
+#, fuzzy, no-c-format
+msgid "Gamma correction will be disabled"
+msgstr "Gamma korrekció"
+
+#: ../backend/hp3900_sane.c:1451
+#, no-c-format
+msgid "Disable white shading correction"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1453
+#, no-c-format
+msgid "White shading correction will be disabled"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1467
+#, no-c-format
+msgid "Skip warmup process"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1468
+#, no-c-format
+msgid "Warmup process will be disabled"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1482
+#, no-c-format
+msgid "Force real depth"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1485
+#, no-c-format
+msgid ""
+"If gamma is enabled, scans are always made in 16 bits depth to improve "
+"image quality and then converted to the selected depth. This option "
+"avoids depth emulation."
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1499
+#, fuzzy, no-c-format
+msgid "Emulate Grayscale"
+msgstr "Szürkeárnyalatos"
+
+#: ../backend/hp3900_sane.c:1502
+#, no-c-format
+msgid ""
+"If enabled, image will be scanned in color mode and then converted to "
+"grayscale by software. This may improve image quality in some "
+"circumstances."
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1516
+#, no-c-format
+msgid "Save debugging images"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1519
+#, no-c-format
+msgid ""
+"If enabled, some images involved in scanner processing are saved to "
+"analyze them."
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1533
+#, no-c-format
+msgid "Reset chipset"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1534
+#, no-c-format
+msgid "Resets chipset data"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1547
+#, no-c-format
+msgid "Information"
+msgstr "Információ"
+
+#: ../backend/hp3900_sane.c:1560
+#, no-c-format
+msgid "Chipset name"
+msgstr "Chipset név"
+
+#: ../backend/hp3900_sane.c:1561
+#, no-c-format
+msgid "Shows chipset name used in device."
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1565
+#, no-c-format
+msgid "Unknown"
+msgstr "Ismeretlen"
+
+#: ../backend/hp3900_sane.c:1571
+#, no-c-format
+msgid "Chipset ID"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1572
+#, no-c-format
+msgid "Shows the chipset ID"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1582
+#, fuzzy, no-c-format
+msgid "Scan counter"
+msgstr " Szkennelési üzemmód "
+
+#: ../backend/hp3900_sane.c:1584
+#, no-c-format
+msgid "Shows the number of scans made by scanner"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1594
+#, no-c-format
+msgid "Update information"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1595
+#, no-c-format
+msgid "Updates information about device"
+msgstr ""
+
+#: ../backend/hp3900_sane.c:1635
+#, no-c-format
+msgid "This option reflects a front panel scanner button"
+msgstr ""
+
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
+#, no-c-format
+msgid "Image"
+msgstr "Kép"
+
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
+#, no-c-format
+msgid "Miscellaneous"
+msgstr "Egyéb"
+
+#: ../backend/hp5400_sane.c:358
+#, no-c-format
+msgid "offset X"
+msgstr ""
+
+#: ../backend/hp5400_sane.c:359
+#, fuzzy, no-c-format
+msgid "Hardware internal X position of the scanning area."
+msgstr "A beolvasási terület bal-felső x pozíciója"
+
+#: ../backend/hp5400_sane.c:368
+#, no-c-format
+msgid "offset Y"
+msgstr ""
+
+#: ../backend/hp5400_sane.c:369
+#, fuzzy, no-c-format
+msgid "Hardware internal Y position of the scanning area."
+msgstr "A beolvasási terület bal-felső x pozíciója"
+
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
+#, no-c-format
+msgid "Lamp status"
+msgstr ""
+
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
+#, no-c-format
+msgid "Switches the lamp on or off."
+msgstr ""
+
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
+#, no-c-format
+msgid "Calibrates for black and white level."
+msgstr ""
+
+#: ../backend/hp5590.c:83 ../backend/hp-option.c:3253
+#, no-c-format
+msgid "ADF"
+msgstr "ADF"
+
+#: ../backend/hp5590.c:85
+#, no-c-format
+msgid "TMA Slides"
+msgstr ""
+
+#: ../backend/hp5590.c:86
+#, fuzzy, no-c-format
+msgid "TMA Negatives"
+msgstr "Negatív"
+
+#: ../backend/hp5590.c:89
+#, fuzzy, no-c-format
+msgid "Color (48 bits)"
+msgstr "Színes 42/48"
+
+#: ../backend/hp5590.c:92
+#, no-c-format
+msgid "Extend lamp timeout"
+msgstr ""
+
+#: ../backend/hp5590.c:93
+#, no-c-format
+msgid "Extends lamp timeout (from 15 minutes to 1 hour)"
+msgstr ""
+
+#: ../backend/hp5590.c:95
+#, no-c-format
+msgid "Wait for button"
+msgstr ""
+
+#: ../backend/hp5590.c:96
+#, no-c-format
+msgid "Waits for button before scanning"
+msgstr ""
+
+#: ../backend/hp-option.c:2984
+#, fuzzy, no-c-format
+msgid "Advanced Options"
+msgstr "Haladó"
+
+#: ../backend/hp-option.c:3041
+#, no-c-format
+msgid "Coarse"
+msgstr ""
+
+#: ../backend/hp-option.c:3042
+#, no-c-format
+msgid "Fine"
+msgstr ""
+
+#: ../backend/hp-option.c:3043
+#, no-c-format
+msgid "Bayer"
+msgstr ""
+
+#: ../backend/hp-option.c:3046 ../backend/hp-option.c:3097
+#, no-c-format
+msgid "Custom"
+msgstr "Egyedi"
+
+#: ../backend/hp-option.c:3087 ../backend/hp-option.c:3143
+#: ../backend/hp-option.c:3158
+#, no-c-format
+msgid "Auto"
+msgstr "Automatikus"
+
+#: ../backend/hp-option.c:3088
+#, no-c-format
+msgid "NTSC RGB"
+msgstr "NTSC RGB"
+
+#: ../backend/hp-option.c:3089
+#, no-c-format
+msgid "XPA RGB"
+msgstr "XPA RGB"
+
+#: ../backend/hp-option.c:3090
+#, no-c-format
+msgid "Pass-through"
+msgstr ""
+
+#: ../backend/hp-option.c:3091
+#, no-c-format
+msgid "NTSC Gray"
+msgstr ""
+
+#: ../backend/hp-option.c:3092
+#, no-c-format
+msgid "XPA Gray"
+msgstr ""
+
+#: ../backend/hp-option.c:3144
+#, no-c-format
+msgid "Slow"
+msgstr "Lassú"
+
+#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
+#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
+#, no-c-format
+msgid "Normal"
+msgstr "Normál"
+
+#: ../backend/hp-option.c:3146
+#, no-c-format
+msgid "Fast"
+msgstr "Gyors"
+
+#: ../backend/hp-option.c:3147
+#, no-c-format
+msgid "Extra Fast"
+msgstr "Extra gyors"
+
+#: ../backend/hp-option.c:3160
+#, no-c-format
+msgid "2-pixel"
+msgstr "2-pixel"
+
+#: ../backend/hp-option.c:3161
+#, no-c-format
+msgid "4-pixel"
+msgstr "4-pixel"
+
+#: ../backend/hp-option.c:3162
+#, no-c-format
+msgid "8-pixel"
+msgstr "8-pixel"
+
+#: ../backend/hp-option.c:3173
+#, no-c-format
+msgid "Print"
+msgstr "Nyomtatás"
+
+#: ../backend/hp-option.c:3175
+#, no-c-format
+msgid "Film-strip"
+msgstr ""
+
+#: ../backend/hp-option.c:3254
+#, no-c-format
+msgid "XPA"
+msgstr "XPA"
+
+#: ../backend/hp-option.c:3328 ../backend/hp-option.c:3341
+#, no-c-format
+msgid "Conditional"
+msgstr ""
+
+#: ../backend/hp-option.c:3414
+#, no-c-format
+msgid "Experiment"
+msgstr ""
+
+#: ../backend/hp-option.h:60
+#, no-c-format
+msgid "Sharpening"
+msgstr ""
+
+#: ../backend/hp-option.h:61
+#, no-c-format
+msgid "Set sharpening value."
+msgstr ""
+
+#: ../backend/hp-option.h:66
+#, no-c-format
+msgid "Auto Threshold"
+msgstr ""
+
+#: ../backend/hp-option.h:68
+#, no-c-format
+msgid "Enable automatic determination of threshold for line-art scans."
+msgstr ""
+
+#: ../backend/hp-option.h:73
+#, no-c-format
+msgid "Smoothing"
+msgstr ""
+
+#: ../backend/hp-option.h:74
+#, no-c-format
+msgid "Select smoothing filter."
+msgstr ""
+
+#: ../backend/hp-option.h:79
+#, no-c-format
+msgid "Unload media after scan"
+msgstr ""
+
+#: ../backend/hp-option.h:80
+#, no-c-format
+msgid "Unloads the media after a scan."
+msgstr ""
+
+#: ../backend/hp-option.h:85
+#, no-c-format
+msgid "Change document"
+msgstr ""
+
+#: ../backend/hp-option.h:86
+#, no-c-format
+msgid "Change Document."
+msgstr ""
+
+#: ../backend/hp-option.h:91
+#, no-c-format
+msgid "Unload"
+msgstr ""
+
+#: ../backend/hp-option.h:92
+#, no-c-format
+msgid "Unload Document."
+msgstr ""
+
+#: ../backend/hp-option.h:98
+#, no-c-format
+msgid "Start calibration process."
+msgstr "Kalibrálási folyamat indítása."
+
+#: ../backend/hp-option.h:103
+#, no-c-format
+msgid "Media"
+msgstr ""
+
+#: ../backend/hp-option.h:104
+#, no-c-format
+msgid "Set type of media."
+msgstr ""
+
+#: ../backend/hp-option.h:109
+#, no-c-format
+msgid "Exposure time"
+msgstr ""
+
+#: ../backend/hp-option.h:111
+#, no-c-format
+msgid ""
+"A longer exposure time lets the scanner collect more light. Suggested "
+"use is 175% for prints, 150% for normal slides and \"Negative\" for "
+"negative film. For dark (underexposed) images you can increase this "
+"value."
+msgstr ""
+
+#: ../backend/hp-option.h:119 ../backend/hp-option.h:126
+#, no-c-format
+msgid "Color Matrix"
+msgstr "Színmátrix"
+
+#: ../backend/hp-option.h:121
+#, no-c-format
+msgid "Set the scanners color matrix."
+msgstr ""
+
+#: ../backend/hp-option.h:127
+#, no-c-format
+msgid "Custom color matrix."
+msgstr "Egyéni színmátrix."
+
+#: ../backend/hp-option.h:132
+#, no-c-format
+msgid "Mono Color Matrix"
+msgstr ""
+
+#: ../backend/hp-option.h:133
+#, no-c-format
+msgid "Custom color matrix for grayscale scans."
+msgstr ""
+
+#: ../backend/hp-option.h:138
+#, no-c-format
+msgid "Mirror horizontal"
+msgstr "Vízszintes tükrözés"
+
+#: ../backend/hp-option.h:139
+#, no-c-format
+msgid "Mirror image horizontally."
+msgstr "A kép vízszintes tükrözése."
+
+#: ../backend/hp-option.h:144
+#, no-c-format
+msgid "Mirror vertical"
+msgstr "Függőleges tükrözés"
+
+#: ../backend/hp-option.h:145
+#, no-c-format
+msgid "Mirror image vertically."
+msgstr "A kép függőleges tükrözése."
+
+#: ../backend/hp-option.h:150
+#, no-c-format
+msgid "Update options"
+msgstr ""
+
+#: ../backend/hp-option.h:151
+#, no-c-format
+msgid "Update options."
+msgstr ""
+
+#: ../backend/hp-option.h:156
+#, no-c-format
+msgid "8 bit output"
+msgstr ""
+
+#: ../backend/hp-option.h:158
+#, no-c-format
+msgid "Use bit depth greater eight internally, but output only eight bits."
+msgstr ""
+
+#: ../backend/hp-option.h:164
+#, no-c-format
+msgid "Front button wait"
+msgstr ""
+
+#: ../backend/hp-option.h:165
+#, no-c-format
+msgid "Wait to scan for front-panel button push."
+msgstr ""
+
+#: ../backend/hp-option.h:172
+#, no-c-format
+msgid "Shut off lamp"
+msgstr ""
+
+#: ../backend/hp-option.h:173
+#, no-c-format
+msgid "Shut off scanner lamp."
+msgstr ""
+
+#: ../backend/kvs1025.h:51 ../backend/kvs20xx_opt.c:294
+#: ../backend/kvs40xx_opt.c:515 ../backend/matsushita.h:219
+#, no-c-format
+msgid "Paper size"
+msgstr "Papír mérete"
+
+#: ../backend/kvs1025.h:52 ../backend/kvs1025.h:67
+#: ../backend/matsushita.h:220 ../backend/matsushita.h:227
+#, no-c-format
+msgid "Automatic separation"
+msgstr ""
+
+#: ../backend/kvs1025.h:53 ../backend/kvs20xx_opt.c:306
+#: ../backend/kvs40xx_opt.c:530
+#, fuzzy, no-c-format
+msgid "Landscape"
+msgstr "A5 fekvő"
+
+#: ../backend/kvs1025.h:54 ../backend/kvs40xx_opt.c:692
+#, no-c-format
+msgid "Inverse Image"
+msgstr ""
+
+#: ../backend/kvs1025.h:56 ../backend/kvs40xx_opt.c:403
+#, no-c-format
+msgid "Long paper mode"
+msgstr ""
+
+#: ../backend/kvs1025.h:57 ../backend/kvs20xx_opt.c:229
+#: ../backend/kvs40xx_opt.c:392
+#, no-c-format
+msgid "Length control mode"
+msgstr ""
+
+#: ../backend/kvs1025.h:58 ../backend/kvs20xx_opt.c:241
+#: ../backend/kvs40xx_opt.c:415
+#, no-c-format
+msgid "Manual feed mode"
+msgstr ""
+
+#: ../backend/kvs1025.h:59 ../backend/kvs20xx_opt.c:253
+#: ../backend/kvs40xx_opt.c:427
+#, no-c-format
+msgid "Manual feed timeout"
+msgstr ""
+
+#: ../backend/kvs1025.h:60 ../backend/kvs20xx_opt.c:266
+#: ../backend/kvs40xx_opt.c:440
+#, no-c-format
+msgid "Double feed detection"
+msgstr ""
+
+#: ../backend/kvs1025.h:63 ../backend/kvs20xx_opt.c:204
+#: ../backend/kvs40xx_opt.c:353 ../backend/matsushita.h:223
+#, no-c-format
+msgid "Enable Duplex (Dual-Sided) Scanning"
+msgstr ""
+
+#: ../backend/kvs1025.h:65 ../backend/kvs20xx_opt.c:295
+#: ../backend/kvs40xx_opt.c:516 ../backend/matsushita.h:225
+#, no-c-format
+msgid "Physical size of the paper in the ADF"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:39
+#, no-c-format
+msgid "bw"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:40
+#, no-c-format
+msgid "halftone"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:41
+#, no-c-format
+msgid "gray"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:42
+#, fuzzy, no-c-format
+msgid "color"
+msgstr "Színes"
+
+#: ../backend/kvs1025_opt.c:61 ../backend/kvs40xx_opt.c:107
+#: ../backend/kvs40xx_opt.c:1046
+#, no-c-format
+msgid "adf"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:62 ../backend/kvs40xx_opt.c:49
+#: ../backend/kvs40xx_opt.c:108
+#, no-c-format
+msgid "fb"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:72 ../backend/kvs20xx_opt.c:54
+#: ../backend/kvs40xx_opt.c:100
+#, no-c-format
+msgid "single"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs40xx_opt.c:1086
+#, fuzzy, no-c-format
+msgid "continuous"
+msgstr "Folytatás"
+
+#: ../backend/kvs1025_opt.c:83 ../backend/kvs20xx_opt.c:61
+#: ../backend/kvs40xx_opt.c:114
+#, fuzzy, no-c-format
+msgid "off"
+msgstr "Ki"
+
+#: ../backend/kvs1025_opt.c:84 ../backend/kvs20xx_opt.c:62
+#: ../backend/kvs40xx_opt.c:115
+#, no-c-format
+msgid "wait_doc"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:85 ../backend/kvs20xx_opt.c:63
+#: ../backend/kvs40xx_opt.c:117
+#, no-c-format
+msgid "wait_key"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:96 ../backend/kvs20xx_opt.c:69
+#: ../backend/kvs40xx_opt.c:123 ../backend/kvs40xx_opt.c:140
+#, no-c-format
+msgid "user_def"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:97 ../backend/kvs20xx_opt.c:70
+#: ../backend/kvs40xx_opt.c:124 ../backend/kvs40xx_opt.c:141
+#, no-c-format
+msgid "business_card"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:98 ../backend/kvs40xx_opt.c:125
+#: ../backend/kvs40xx_opt.c:142
+#, no-c-format
+msgid "Check"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:101 ../backend/kvs20xx_opt.c:74
+#: ../backend/kvs40xx_opt.c:128 ../backend/kvs40xx_opt.c:145
+#, no-c-format
+msgid "A5"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:102 ../backend/kvs20xx_opt.c:75
+#: ../backend/kvs40xx_opt.c:129 ../backend/kvs40xx_opt.c:146
+#, no-c-format
+msgid "A6"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:106 ../backend/kvs20xx_opt.c:79
+#: ../backend/kvs40xx_opt.c:133 ../backend/kvs40xx_opt.c:150
+#, no-c-format
+msgid "B5"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:107 ../backend/kvs20xx_opt.c:80
+#: ../backend/kvs40xx_opt.c:134 ../backend/kvs40xx_opt.c:151
+#, no-c-format
+msgid "B6"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:108 ../backend/kvs20xx_opt.c:81
+#: ../backend/kvs40xx_opt.c:135 ../backend/kvs40xx_opt.c:152
+#, no-c-format
+msgid "Legal"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:149 ../backend/kvs40xx_opt.c:238
+#, no-c-format
+msgid "bayer_64"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:150 ../backend/kvs40xx_opt.c:239
+#, no-c-format
+msgid "bayer_16"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:151 ../backend/kvs40xx_opt.c:240
+#, no-c-format
+msgid "halftone_32"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:152 ../backend/kvs40xx_opt.c:241
+#, no-c-format
+msgid "halftone_64"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:153
+#, no-c-format
+msgid "diffusion"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:166 ../backend/kvs1025_opt.c:228
+#: ../backend/kvs1025_opt.c:241 ../backend/kvs20xx_opt.c:128
+#: ../backend/kvs20xx_opt.c:136 ../backend/kvs40xx_opt.c:214
+#: ../backend/kvs40xx_opt.c:222 ../backend/kvs40xx_opt.c:257
+#, fuzzy, no-c-format
+msgid "normal"
+msgstr "Normál"
+
+#: ../backend/kvs1025_opt.c:167 ../backend/kvs40xx_opt.c:258
+#, fuzzy, no-c-format
+msgid "light"
+msgstr "Kiemelés"
+
+#: ../backend/kvs1025_opt.c:168 ../backend/kvs40xx_opt.c:259
+#, no-c-format
+msgid "dark"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:179 ../backend/kvs40xx_opt.c:270
+#, fuzzy, no-c-format
+msgid "From scanner"
+msgstr "lapolvasó"
+
+#: ../backend/kvs1025_opt.c:180 ../backend/kvs40xx_opt.c:271
+#: ../backend/matsushita.c:177
+#, no-c-format
+msgid "From paper"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:192 ../backend/kvs40xx_opt.c:283
+#, fuzzy, no-c-format
+msgid "default"
+msgstr "Alapértelmezett"
+
+#: ../backend/kvs1025_opt.c:211 ../backend/kvs20xx_opt.c:122
+#: ../backend/kvs40xx_opt.c:208
+#, no-c-format
+msgid "smooth"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:212 ../backend/kvs20xx_opt.c:118
+#: ../backend/kvs40xx_opt.c:204
+#, no-c-format
+msgid "none"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:213 ../backend/kvs20xx_opt.c:119
+#: ../backend/kvs40xx_opt.c:205
+#, fuzzy, no-c-format
+msgid "low"
+msgstr "Lassú"
+
+#: ../backend/kvs1025_opt.c:214 ../backend/kvs1025_opt.c:804
+#: ../backend/kvs20xx_opt.c:120 ../backend/kvs40xx_opt.c:206
+#, fuzzy, no-c-format
+msgid "medium"
+msgstr "Közepes"
+
+#: ../backend/kvs1025_opt.c:215 ../backend/kvs20xx_opt.c:121
+#: ../backend/kvs40xx_opt.c:207
+#, no-c-format
+msgid "high"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:229 ../backend/kvs20xx_opt.c:129
+#: ../backend/kvs40xx_opt.c:215
+#, no-c-format
+msgid "crt"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:230
+#, no-c-format
+msgid "linier"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:242 ../backend/kvs20xx_opt.c:137
+#: ../backend/kvs40xx_opt.c:223
+#, fuzzy, no-c-format
+msgid "red"
+msgstr "Vörös"
+
+#: ../backend/kvs1025_opt.c:243 ../backend/kvs20xx_opt.c:138
+#: ../backend/kvs40xx_opt.c:224
+#, fuzzy, no-c-format
+msgid "green"
+msgstr "Zöld"
+
+#: ../backend/kvs1025_opt.c:244 ../backend/kvs20xx_opt.c:139
+#: ../backend/kvs40xx_opt.c:225
+#, no-c-format
+msgid "blue"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:562
+#, fuzzy, no-c-format
+msgid "Sets the scan source"
+msgstr "lapolvasó"
+
+#: ../backend/kvs1025_opt.c:573 ../backend/kvs20xx_opt.c:217
+#: ../backend/kvs40xx_opt.c:366 ../backend/matsushita.c:1126
+#, no-c-format
+msgid "Feeder mode"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:574 ../backend/kvs20xx_opt.c:218
+#: ../backend/kvs40xx_opt.c:367 ../backend/matsushita.c:1127
+#, no-c-format
+msgid "Sets the feeding mode"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:584
+#, no-c-format
+msgid "Enable/Disable long paper mode"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:593
+#, no-c-format
+msgid "Enable/Disable length control mode"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:601 ../backend/kvs20xx_opt.c:242
+#: ../backend/kvs40xx_opt.c:416
+#, no-c-format
+msgid "Sets the manual feed mode"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:612 ../backend/kvs20xx_opt.c:254
+#: ../backend/kvs40xx_opt.c:428
+#, no-c-format
+msgid "Sets the manual feed timeout in seconds"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:625 ../backend/kvs20xx_opt.c:267
+#: ../backend/kvs40xx_opt.c:441
+#, no-c-format
+msgid "Enable/Disable double feed detection"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:631 ../backend/kvs20xx_opt.c:275
+#: ../backend/kvs40xx_opt.c:496
+#, no-c-format
+msgid "fit-to-page"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:632 ../backend/kvs20xx_opt.c:276
+#: ../backend/kvs40xx_opt.c:497
+#, no-c-format
+msgid "Fit to page"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:634 ../backend/kvs20xx_opt.c:277
+#: ../backend/kvs40xx_opt.c:498
+#, no-c-format
+msgid "Scanner shrinks image to fit scanned page"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:661 ../backend/kvs20xx_opt.c:308
+#: ../backend/kvs40xx_opt.c:532
+#, no-c-format
+msgid "Set paper position : true for landscape, false for portrait"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:735 ../backend/matsushita.c:1224
+#, no-c-format
+msgid "Automatic threshold"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:738 ../backend/matsushita.c:1227
+#, no-c-format
+msgid ""
+"Automatically sets brightness, contrast, white level, gamma, noise "
+"reduction and image emphasis"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:783 ../backend/kvs40xx_opt.c:763
+#: ../backend/matsushita.c:1275
+#, no-c-format
+msgid "Noise reduction"
+msgstr "Zajszűrés"
+
+#: ../backend/kvs1025_opt.c:785 ../backend/kvs40xx_opt.c:764
+#: ../backend/matsushita.c:1277
+#, no-c-format
+msgid "Reduce the isolated dot noise"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:796 ../backend/kvs20xx_opt.c:411
+#: ../backend/kvs40xx_opt.c:654 ../backend/matsushita.c:1288
+#, no-c-format
+msgid "Image emphasis"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:797 ../backend/kvs20xx_opt.c:412
+#: ../backend/kvs40xx_opt.c:655 ../backend/matsushita.c:1289
+#, no-c-format
+msgid "Sets the image emphasis"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
+#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
+#: ../backend/pixma_sane_options.c:110
+#, no-c-format
+msgid "Gamma"
+msgstr "Gamma"
+
+#: ../backend/kvs1025_opt.c:818 ../backend/kvs20xx_opt.c:435
+#: ../backend/kvs40xx_opt.c:680
+#, no-c-format
+msgid "Lamp color"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:819 ../backend/kvs20xx_opt.c:436
+#: ../backend/kvs40xx_opt.c:681
+#, no-c-format
+msgid "Sets the lamp color (color dropout)"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:832
+#, no-c-format
+msgid "Inverse image in B/W or halftone mode"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:840
+#, fuzzy, no-c-format
+msgid "Mirror image (left/right flip)"
+msgstr "A kép függőleges tükrözése."
+
+#: ../backend/kvs1025_opt.c:847
+#, no-c-format
+msgid "jpeg compression"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:850
+#, no-c-format
+msgid "JPEG Image Compression with Q parameter, '0' - no compression"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:860
+#, no-c-format
+msgid "Rotate image clockwise"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:862
+#, no-c-format
+msgid "Request driver to rotate pages by a fixed amount"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:872
+#, no-c-format
+msgid "Software deskew"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:874
+#, no-c-format
+msgid "Request driver to rotate skewed pages digitally"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:881
+#, no-c-format
+msgid "Software despeckle diameter"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:883
+#, no-c-format
+msgid "Maximum diameter of lone dots to remove from scan"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:902
+#, no-c-format
+msgid "Software automatic cropping"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:904
+#, no-c-format
+msgid "Request driver to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
+#, no-c-format
+msgid ""
+"Length Control Mode is a mode that the scanner reads up to the shorter "
+"length of actual paper or logical document length."
+msgstr ""
+
+#: ../backend/kvs20xx_opt.c:423 ../backend/kvs20xx_opt.c:424
+#: ../backend/kvs40xx_opt.c:667 ../backend/kvs40xx_opt.c:668
+#: ../backend/microtek2.h:640
+#, no-c-format
+msgid "Gamma correction"
+msgstr "Gamma korrekció"
+
+#: ../backend/kvs40xx_opt.c:116
+#, no-c-format
+msgid "wait_doc_hopper_up"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:126
+#, no-c-format
+msgid "A3"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:131
+#, no-c-format
+msgid "Double letter 11x17 in"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:132
+#, no-c-format
+msgid "B4"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:230
+#, no-c-format
+msgid "High sensivity"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:231
+#, no-c-format
+msgid "Low sensivity"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:242
+#, no-c-format
+msgid "err_diffusion"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:248
+#, fuzzy, no-c-format
+msgid "No detection"
+msgstr "Nincs korrekció"
+
+#: ../backend/kvs40xx_opt.c:249
+#, fuzzy, no-c-format
+msgid "Normal mode"
+msgstr "Normál"
+
+#: ../backend/kvs40xx_opt.c:250
+#, fuzzy, no-c-format
+msgid "Enhanced mode"
+msgstr "Haladó"
+
+#: ../backend/kvs40xx_opt.c:404
+#, no-c-format
+msgid ""
+"Long Paper Mode is a mode that the scanner reads the image after it "
+"divides long paper by the length which is set in Document Size option."
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:448
+#, no-c-format
+msgid "Double feed detector sensitivity"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:449
+#, no-c-format
+msgid "Set the double feed detector sensitivity"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:460 ../backend/kvs40xx_opt.c:461
+#, no-c-format
+msgid "Do not stop after double feed detection"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:469 ../backend/kvs40xx_opt.c:470
+#, no-c-format
+msgid "Ignore left double feed sensor"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:478 ../backend/kvs40xx_opt.c:479
+#, no-c-format
+msgid "Ignore center double feed sensor"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:487 ../backend/kvs40xx_opt.c:488
+#, no-c-format
+msgid "Ignore right double feed sensor"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:641
+#, no-c-format
+msgid "Automatic threshold mode"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:642
+#, no-c-format
+msgid "Sets the automatic threshold mode"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:693
+#, no-c-format
+msgid "Inverse image in B/W mode"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:714
+#, no-c-format
+msgid "JPEG compression"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:717
+#, no-c-format
+msgid "JPEG compression (yours application must be able to uncompress)"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:736 ../backend/kvs40xx_opt.c:737
+#, no-c-format
+msgid "Detect stapled document"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:775
+#, no-c-format
+msgid "chroma of red"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:776
+#, no-c-format
+msgid "Set chroma of red"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:786
+#, no-c-format
+msgid "chroma of blue"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:787
+#, no-c-format
+msgid "Set chroma of blue"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:797 ../backend/kvs40xx_opt.c:798
+#, no-c-format
+msgid "Skew adjustment"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:807
+#, no-c-format
+msgid "Stop scanner when a paper have been skewed"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:808
+#, no-c-format
+msgid "Scanner will be stop when a paper have been skewed"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:815
+#, no-c-format
+msgid "Crop actual image area"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:816
+#, no-c-format
+msgid "Scanner automatically detect image area and crop it"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:826
+#, no-c-format
+msgid "It is right and left reversing"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:833 ../backend/kvs40xx_opt.c:834
+#, no-c-format
+msgid "Addition of space in top position"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:841 ../backend/kvs40xx_opt.c:842
+#, no-c-format
+msgid "Addition of space in bottom position"
+msgstr ""
+
+#: ../backend/leo.c:110
+#, no-c-format
+msgid "Diamond"
+msgstr "Gyémánt"
+
+#: ../backend/leo.c:111
+#, no-c-format
+msgid "8x8 Coarse Fatting"
+msgstr ""
+
+#: ../backend/leo.c:112
+#, no-c-format
+msgid "8x8 Fine Fatting"
+msgstr ""
+
+#: ../backend/leo.c:113
+#, no-c-format
+msgid "8x8 Bayer"
+msgstr ""
+
+#: ../backend/leo.c:114
+#, no-c-format
+msgid "8x8 Vertical Line"
+msgstr ""
+
+#: ../backend/lexmark.c:273 ../backend/umax_pp.c:715
+#, no-c-format
+msgid "Gain"
+msgstr ""
+
+#: ../backend/lexmark.c:274 ../backend/umax_pp.c:716
+#, no-c-format
+msgid "Color channels gain settings"
+msgstr ""
+
+#: ../backend/lexmark.c:283 ../backend/umax_pp.c:723
+#, fuzzy, no-c-format
+msgid "Gray gain"
+msgstr "Szürke"
+
+#: ../backend/lexmark.c:284 ../backend/umax_pp.c:724
+#, no-c-format
+msgid "Sets gray channel gain"
+msgstr ""
+
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
+#: ../backend/umax_pp.c:735
+#, fuzzy, no-c-format
+msgid "Red gain"
+msgstr "Vörös balansz"
+
+#: ../backend/lexmark.c:298 ../backend/umax_pp.c:736
+#, fuzzy, no-c-format
+msgid "Sets red channel gain"
+msgstr "A vörös csatorna kontrasztja"
+
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
+#: ../backend/umax_pp.c:747
+#, fuzzy, no-c-format
+msgid "Green gain"
+msgstr "Zöld balansz"
+
+#: ../backend/lexmark.c:312 ../backend/umax_pp.c:748
+#, fuzzy, no-c-format
+msgid "Sets green channel gain"
+msgstr "A zöld csatorna kontrasztja"
+
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
+#: ../backend/umax_pp.c:759
+#, fuzzy, no-c-format
+msgid "Blue gain"
+msgstr "Kék balansz"
+
+#: ../backend/lexmark.c:326 ../backend/umax_pp.c:760
+#, fuzzy, no-c-format
+msgid "Sets blue channel gain"
+msgstr "A kék csatorna kontrasztja"
+
+#: ../backend/matsushita.c:139
+#, no-c-format
+msgid "Bayer Dither 16"
+msgstr ""
+
+#: ../backend/matsushita.c:140
+#, no-c-format
+msgid "Bayer Dither 64"
+msgstr ""
+
+#: ../backend/matsushita.c:141
+#, no-c-format
+msgid "Halftone Dot 32"
+msgstr ""
+
+#: ../backend/matsushita.c:142
+#, no-c-format
+msgid "Halftone Dot 64"
+msgstr ""
+
+#: ../backend/matsushita.c:143
+#, no-c-format
+msgid "Error Diffusion"
+msgstr ""
+
+#: ../backend/matsushita.c:160
+#, no-c-format
+msgid "Mode 1"
+msgstr "Mode 1"
+
+#: ../backend/matsushita.c:161
+#, no-c-format
+msgid "Mode 2"
+msgstr "Mode 2"
+
+#: ../backend/matsushita.c:162
+#, no-c-format
+msgid "Mode 3"
+msgstr "Mode 3"
+
+#: ../backend/matsushita.c:176
+#, no-c-format
+msgid "From white stick"
+msgstr ""
+
+#: ../backend/matsushita.c:212
+#, no-c-format
+msgid "Smooth"
+msgstr ""
+
+#: ../backend/matsushita.c:214 ../backend/matsushita.c:229
+#, no-c-format
+msgid "Low"
+msgstr "Alacsony"
+
+#: ../backend/matsushita.c:215 ../backend/matsushita.c:230
+#: ../backend/matsushita.c:1296
+#, no-c-format
+msgid "Medium"
+msgstr "Közepes"
+
+#: ../backend/matsushita.c:216 ../backend/matsushita.c:231
+#, no-c-format
+msgid "High"
+msgstr "Magas"
+
+#: ../backend/matsushita.c:245
+#, no-c-format
+msgid "CRT"
+msgstr "CRT"
+
+#: ../backend/matsushita.c:257
+#, no-c-format
+msgid "One page"
+msgstr "Egy oldal"
+
+#: ../backend/matsushita.c:258
+#, no-c-format
+msgid "All pages"
+msgstr "Minden oldal"
+
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
+#, no-c-format
+msgid "sheetfed scanner"
+msgstr ""
+
+#: ../backend/matsushita.h:209
+#, no-c-format
+msgid "Grayscale 4 bits"
+msgstr ""
+
+#: ../backend/matsushita.h:210
+#, no-c-format
+msgid "Grayscale 8 bits"
+msgstr ""
+
+#: ../backend/microtek2.h:601
+#, no-c-format
+msgid "Shadow, midtone, highlight, exposure time"
+msgstr ""
+
+#: ../backend/microtek2.h:603
+#, no-c-format
+msgid "Special options"
+msgstr "Speciális beállítások"
+
+#: ../backend/microtek2.h:604
+#, no-c-format
+msgid "Color balance"
+msgstr ""
+
+#: ../backend/microtek2.h:607
+#, no-c-format
+msgid "Disable backtracking"
+msgstr ""
+
+#: ../backend/microtek2.h:608
+#, no-c-format
+msgid "If checked the scanner does not perform backtracking"
+msgstr ""
+
+#: ../backend/microtek2.h:612
+#, no-c-format
+msgid "Toggle lamp of flatbed"
+msgstr ""
+
+#: ../backend/microtek2.h:613
+#, no-c-format
+msgid "Toggles the lamp of the flatbed"
+msgstr ""
+
+#: ../backend/microtek2.h:616
+#, no-c-format
+msgid "Calibration by backend"
+msgstr ""
+
+#: ../backend/microtek2.h:617
+#, no-c-format
+msgid ""
+"If checked the color calibration before a scan is done by the backend"
+msgstr ""
+
+#: ../backend/microtek2.h:621
+#, no-c-format
+msgid "Use the lightlid-35mm adapter"
+msgstr ""
+
+#: ../backend/microtek2.h:622
+#, no-c-format
+msgid "This option turns off the lamp of the flatbed during a scan"
+msgstr ""
+
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
+#, no-c-format
+msgid "Quality scan"
+msgstr "Minőségi szkennelés"
+
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
+#, no-c-format
+msgid "Highest quality but lower speed"
+msgstr "Minőségi szkennelés alacsony sebességgel"
+
+#: ../backend/microtek2.h:630
+#, no-c-format
+msgid "Fast scan"
+msgstr "Gyors szkennelés"
+
+#: ../backend/microtek2.h:631
+#, no-c-format
+msgid "Highest speed but lower quality"
+msgstr "Gyors sebesség alacsony minőséggel"
+
+#: ../backend/microtek2.h:634
+#, no-c-format
+msgid "Automatic adjustment of threshold"
+msgstr ""
+
+#: ../backend/microtek2.h:635
+#, no-c-format
+msgid ""
+"If checked the backend automatically tries to determine an optimal value "
+"for the threshold."
+msgstr ""
+
+#: ../backend/microtek2.h:641
+#, no-c-format
+msgid "Selects the gamma correction mode."
+msgstr ""
+
+#: ../backend/microtek2.h:644
+#, no-c-format
+msgid "Bind gamma"
+msgstr ""
+
+#: ../backend/microtek2.h:645
+#, no-c-format
+msgid "Use same gamma values for all colour channels."
+msgstr ""
+
+#: ../backend/microtek2.h:649
+#, no-c-format
+msgid "Scalar gamma"
+msgstr ""
+
+#: ../backend/microtek2.h:650
+#, no-c-format
+msgid "Selects a value for scalar gamma correction."
+msgstr ""
+
+#: ../backend/microtek2.h:654
+#, no-c-format
+msgid "Scalar gamma red"
+msgstr ""
+
+#: ../backend/microtek2.h:655
+#, no-c-format
+msgid "Selects a value for scalar gamma correction (red channel)"
+msgstr ""
+
+#: ../backend/microtek2.h:659
+#, no-c-format
+msgid "Scalar gamma green"
+msgstr ""
+
+#: ../backend/microtek2.h:660
+#, no-c-format
+msgid "Selects a value for scalar gamma correction (green channel)"
+msgstr ""
+
+#: ../backend/microtek2.h:664
+#, no-c-format
+msgid "Scalar gamma blue"
+msgstr ""
+
+#: ../backend/microtek2.h:665
+#, no-c-format
+msgid "Selects a value for scalar gamma correction (blue channel)"
+msgstr ""
+
+#: ../backend/microtek2.h:669
+#, no-c-format
+msgid "Channel"
+msgstr "Csatorna"
+
+#: ../backend/microtek2.h:670
+#, no-c-format
+msgid ""
+"Selects the colour band, \"Master\" means that all colours are affected."
+msgstr ""
+
+#: ../backend/microtek2.h:674
+#, no-c-format
+msgid "Midtone"
+msgstr ""
+
+#: ../backend/microtek2.h:675
+#, no-c-format
+msgid "Selects which radiance level should be considered \"50 % gray\"."
+msgstr ""
+
+#: ../backend/microtek2.h:679
+#, no-c-format
+msgid "Midtone for red"
+msgstr ""
+
+#: ../backend/microtek2.h:680
+#, no-c-format
+msgid "Selects which radiance level should be considered \"50 % red\"."
+msgstr ""
+
+#: ../backend/microtek2.h:684
+#, no-c-format
+msgid "Midtone for green"
+msgstr ""
+
+#: ../backend/microtek2.h:685
+#, no-c-format
+msgid "Selects which radiance level should be considered \"50 % green\"."
+msgstr ""
+
+#: ../backend/microtek2.h:689
+#, no-c-format
+msgid "Midtone for blue"
+msgstr ""
+
+#: ../backend/microtek2.h:690
+#, no-c-format
+msgid "Selects which radiance level should be considered \"50 % blue\"."
+msgstr ""
+
+#: ../backend/microtek2.h:694
+#, no-c-format
+msgid "Red balance"
+msgstr "Vörös balansz"
+
+#: ../backend/microtek2.h:695
+#, no-c-format
+msgid "Balance factor for red. A value of 100% means no correction."
+msgstr ""
+
+#: ../backend/microtek2.h:699
+#, no-c-format
+msgid "Green balance"
+msgstr "Zöld balansz"
+
+#: ../backend/microtek2.h:700
+#, no-c-format
+msgid "Balance factor for green. A value of 100% means no correction."
+msgstr ""
+
+#: ../backend/microtek2.h:704
+#, no-c-format
+msgid "Blue balance"
+msgstr "Kék balansz"
+
+#: ../backend/microtek2.h:705
+#, no-c-format
+msgid "Balance factor for blue. A value of 100% means no correction."
+msgstr ""
+
+#: ../backend/microtek2.h:709
+#, no-c-format
+msgid "Firmware balance"
+msgstr ""
+
+#: ../backend/microtek2.h:710
+#, no-c-format
+msgid "Sets the color balance values to the firmware provided values."
+msgstr ""
+
+#: ../backend/mustek.c:149
+#, no-c-format
+msgid "Slowest"
+msgstr "Lassabb"
+
+#: ../backend/mustek.c:149
+#, no-c-format
+msgid "Slower"
+msgstr "Lassú"
+
+#: ../backend/mustek.c:150
+#, no-c-format
+msgid "Faster"
+msgstr "Gyors"
+
+#: ../backend/mustek.c:150
+#, no-c-format
+msgid "Fastest"
+msgstr "Gyorsabb"
+
+#: ../backend/mustek.c:177
+#, no-c-format
+msgid "8x8 coarse"
+msgstr ""
+
+#: ../backend/mustek.c:177
+#, no-c-format
+msgid "8x8 normal"
+msgstr ""
+
+#: ../backend/mustek.c:177
+#, no-c-format
+msgid "8x8 fine"
+msgstr ""
+
+#: ../backend/mustek.c:178
+#, no-c-format
+msgid "8x8 very fine"
+msgstr ""
+
+#: ../backend/mustek.c:178
+#, no-c-format
+msgid "6x6 normal"
+msgstr ""
+
+#: ../backend/mustek.c:179
+#, no-c-format
+msgid "5x5 coarse"
+msgstr ""
+
+#: ../backend/mustek.c:179
+#, no-c-format
+msgid "5x5 fine"
+msgstr ""
+
+#: ../backend/mustek.c:179
+#, no-c-format
+msgid "4x4 coarse"
+msgstr ""
+
+#: ../backend/mustek.c:180
+#, no-c-format
+msgid "4x4 normal"
+msgstr ""
+
+#: ../backend/mustek.c:180
+#, no-c-format
+msgid "4x4 fine"
+msgstr ""
+
+#: ../backend/mustek.c:180
+#, no-c-format
+msgid "3x3 normal"
+msgstr ""
+
+#: ../backend/mustek.c:181
+#, no-c-format
+msgid "2x2 normal"
+msgstr ""
+
+#: ../backend/mustek.c:181
+#, no-c-format
+msgid "8x8 custom"
+msgstr ""
+
+#: ../backend/mustek.c:182
+#, no-c-format
+msgid "6x6 custom"
+msgstr ""
+
+#: ../backend/mustek.c:183
+#, no-c-format
+msgid "5x5 custom"
+msgstr ""
+
+#: ../backend/mustek.c:183
+#, no-c-format
+msgid "4x4 custom"
+msgstr ""
+
+#: ../backend/mustek.c:184
+#, no-c-format
+msgid "3x3 custom"
+msgstr ""
+
+#: ../backend/mustek.c:185
+#, no-c-format
+msgid "2x2 custom"
+msgstr ""
+
+#: ../backend/mustek.c:4237
+#, no-c-format
+msgid "Fast gray mode"
+msgstr ""
+
+#: ../backend/mustek.c:4238
+#, no-c-format
+msgid "Scan in fast gray mode (lower quality)."
+msgstr ""
+
+#: ../backend/mustek.c:4335
+#, no-c-format
+msgid ""
+"Request that all previews are done in the fastest (low-quality) mode. "
+"This may be a non-color mode or a low resolution mode."
+msgstr ""
+
+#: ../backend/mustek.c:4343
+#, no-c-format
+msgid "Lamp off time (minutes)"
+msgstr ""
+
+#: ../backend/mustek.c:4344
+#, no-c-format
+msgid "Set the time (in minutes) after which the lamp is shut off."
+msgstr ""
+
+#: ../backend/mustek.c:4355
+#, no-c-format
+msgid "Turn lamp off"
+msgstr ""
+
+#: ../backend/mustek.c:4356
+#, no-c-format
+msgid "Turns the lamp off immediately."
+msgstr ""
+
+#: ../backend/mustek.c:4433
+#, no-c-format
+msgid "Red brightness"
+msgstr "Vörös fényerő"
+
+#: ../backend/mustek.c:4434
+#, no-c-format
+msgid "Controls the brightness of the red channel of the acquired image."
+msgstr ""
+
+#: ../backend/mustek.c:4446
+#, no-c-format
+msgid "Green brightness"
+msgstr "Zöld fényerő"
+
+#: ../backend/mustek.c:4447
+#, no-c-format
+msgid "Controls the brightness of the green channel of the acquired image."
+msgstr ""
+
+#: ../backend/mustek.c:4459
+#, no-c-format
+msgid "Blue brightness"
+msgstr "Kék fényerő"
+
+#: ../backend/mustek.c:4460
+#, no-c-format
+msgid "Controls the brightness of the blue channel of the acquired image."
+msgstr ""
+
+#: ../backend/mustek.c:4485
+#, no-c-format
+msgid "Contrast red channel"
+msgstr "A vörös csatorna kontrasztja"
+
+#: ../backend/mustek.c:4486
+#, no-c-format
+msgid "Controls the contrast of the red channel of the acquired image."
+msgstr ""
+
+#: ../backend/mustek.c:4498
+#, no-c-format
+msgid "Contrast green channel"
+msgstr "A zöld csatorna kontrasztja"
+
+#: ../backend/mustek.c:4499
+#, no-c-format
+msgid "Controls the contrast of the green channel of the acquired image."
+msgstr ""
+
+#: ../backend/mustek.c:4511
+#, no-c-format
+msgid "Contrast blue channel"
+msgstr "A kék csatorna kontrasztja"
+
+#: ../backend/mustek.c:4512
+#, no-c-format
+msgid "Controls the contrast of the blue channel of the acquired image."
+msgstr ""
+
+#: ../backend/mustek_usb2.c:105
+#, fuzzy, no-c-format
+msgid "Color48"
+msgstr "Színes"
+
+#: ../backend/mustek_usb2.c:106 ../backend/mustek_usb2.c:114
+#, fuzzy, no-c-format
+msgid "Color24"
+msgstr "Színes"
+
+#: ../backend/mustek_usb2.c:107
+#, fuzzy, no-c-format
+msgid "Gray16"
+msgstr "Szürke"
+
+#: ../backend/mustek_usb2.c:108
+#, fuzzy, no-c-format
+msgid "Gray8"
+msgstr "Szürke"
+
+#: ../backend/mustek_usb2.c:119
+#, no-c-format
+msgid "Reflective"
+msgstr ""
+
+#: ../backend/mustek_usb2.c:120
+#, no-c-format
+msgid "Positive"
+msgstr "Pozitív"
+
+#: ../backend/mustek_usb2.c:421
+#, no-c-format
+msgid ""
+"Warm-up until the lamp's brightness is constant instead of insisting on "
+"40 seconds warm-up time."
+msgstr ""
+
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Negatív film"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negatív"
+
+#: ../backend/pixma.c:396
+#, no-c-format
+msgid "48 bits color"
+msgstr ""
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
+#, no-c-format
+msgid "Button-controlled scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:97
+#, no-c-format
+msgid ""
+"When enabled, scan process will not start immediately. To proceed, press "
+"\"SCAN\" button (for MP150) or \"COLOR\" button (for other models). To "
+"cancel, press \"GRAY\" button."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
+#, no-c-format
+msgid "Update button state"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:242
+#, no-c-format
+msgid "Button 1"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:256
+#, no-c-format
+msgid "Button 2"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
+#: ../backend/u12.c:156
+#, no-c-format
+msgid "Transparency"
+msgstr "Átlátszó"
+
+#: ../backend/plustek.c:913
+#, no-c-format
+msgid "Device-Settings"
+msgstr ""
+
+#: ../backend/plustek.c:920
+#, no-c-format
+msgid "Lampswitch"
+msgstr ""
+
+#: ../backend/plustek.c:921
+#, no-c-format
+msgid "Manually switching the lamp(s)."
+msgstr ""
+
+#: ../backend/plustek.c:926
+#, fuzzy, no-c-format
+msgid "Lamp off during dark calibration"
+msgstr "Finom beállítás"
+
+#: ../backend/plustek.c:927
+#, no-c-format
+msgid "Always switches lamp off when doing dark calibration."
+msgstr ""
+
+#: ../backend/plustek.c:935
+#, fuzzy, no-c-format
+msgid "Calibration data cache"
+msgstr "Kalibráció"
+
+#: ../backend/plustek.c:936
+#, no-c-format
+msgid "Enables or disables calibration data cache."
+msgstr ""
+
+#: ../backend/plustek.c:942
+#, fuzzy, no-c-format
+msgid "Performs calibration"
+msgstr "Finom beállítás"
+
+#: ../backend/plustek.c:959
+#, no-c-format
+msgid "Speedup sensor"
+msgstr ""
+
+#: ../backend/plustek.c:960
+#, no-c-format
+msgid "Enables or disables speeding up sensor movement."
+msgstr ""
+
+#: ../backend/plustek.c:974
+#, no-c-format
+msgid "Warmup-time"
+msgstr ""
+
+#: ../backend/plustek.c:975
+#, no-c-format
+msgid "Warmup-time in seconds."
+msgstr ""
+
+#: ../backend/plustek.c:987
+#, no-c-format
+msgid "Lampoff-time"
+msgstr ""
+
+#: ../backend/plustek.c:988
+#, no-c-format
+msgid "Lampoff-time in seconds."
+msgstr ""
+
+#: ../backend/plustek.c:995
+#, fuzzy, no-c-format
+msgid "Analog frontend"
+msgstr "Analóg erősítés"
+
+#: ../backend/plustek.c:1002
+#, no-c-format
+msgid "Red gain value of the AFE"
+msgstr ""
+
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
+#, no-c-format
+msgid "Red offset"
+msgstr ""
+
+#: ../backend/plustek.c:1010
+#, no-c-format
+msgid "Red offset value of the AFE"
+msgstr ""
+
+#: ../backend/plustek.c:1018
+#, no-c-format
+msgid "Green gain value of the AFE"
+msgstr ""
+
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
+#, no-c-format
+msgid "Green offset"
+msgstr ""
+
+#: ../backend/plustek.c:1026
+#, no-c-format
+msgid "Green offset value of the AFE"
+msgstr ""
+
+#: ../backend/plustek.c:1034
+#, no-c-format
+msgid "Blue gain value of the AFE"
+msgstr ""
+
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
+#, no-c-format
+msgid "Blue offset"
+msgstr ""
+
+#: ../backend/plustek.c:1042
+#, no-c-format
+msgid "Blue offset value of the AFE"
+msgstr ""
+
+#: ../backend/plustek.c:1049
+#, no-c-format
+msgid "Red lamp off"
+msgstr ""
+
+#: ../backend/plustek.c:1050
+#, no-c-format
+msgid "Defines red lamp off parameter"
+msgstr ""
+
+#: ../backend/plustek.c:1057
+#, no-c-format
+msgid "Green lamp off"
+msgstr ""
+
+#: ../backend/plustek.c:1058
+#, no-c-format
+msgid "Defines green lamp off parameter"
+msgstr ""
+
+#: ../backend/plustek.c:1065
+#, no-c-format
+msgid "Blue lamp off"
+msgstr ""
+
+#: ../backend/plustek.c:1066
+#, no-c-format
+msgid "Defines blue lamp off parameter"
+msgstr ""
+
+#: ../backend/plustek.c:1096
+#, no-c-format
+msgid "This option reflects the status of the scanner buttons."
+msgstr ""
+
+#: ../backend/plustek_pp.c:197
+#, no-c-format
+msgid "Color36"
+msgstr ""
+
+#: ../backend/plustek_pp.c:211
+#, no-c-format
+msgid "Dithermap 1"
+msgstr ""
+
+#: ../backend/plustek_pp.c:212
+#, no-c-format
+msgid "Dithermap 2"
+msgstr ""
+
+#: ../backend/plustek_pp.c:213
+#, no-c-format
+msgid "Randomize"
+msgstr ""
+
+#: ../backend/pnm.c:168
+#, no-c-format
+msgid "Source Selection"
+msgstr "Forrás kijelölése"
+
+#: ../backend/pnm.c:205
+#, no-c-format
+msgid "Image Enhancement"
+msgstr ""
+
+#: ../backend/pnm.c:241
+#, no-c-format
+msgid "Grayify"
+msgstr ""
+
+#: ../backend/pnm.c:242
+#, no-c-format
+msgid "Load the image as grayscale."
+msgstr ""
+
+#: ../backend/pnm.c:253
+#, no-c-format
+msgid "Three-Pass Simulation"
+msgstr ""
+
+#: ../backend/pnm.c:255
+#, no-c-format
+msgid ""
+"Simulate a three-pass scanner by returning 3 separate frames. For "
+"kicks, it returns green, then blue, then red."
+msgstr ""
+
+#: ../backend/pnm.c:267
+#, no-c-format
+msgid "Hand-Scanner Simulation"
+msgstr ""
+
+#: ../backend/pnm.c:268
+#, no-c-format
+msgid ""
+"Simulate a hand-scanner. Hand-scanners often do not know the image "
+"height a priori. Instead, they return a height of -1. Setting this "
+"option allows one to test whether a frontend can handle this correctly."
+msgstr ""
+
+#: ../backend/pnm.c:283
+#, no-c-format
+msgid ""
+"Set default values for enhancement controls (brightness & contrast)."
+msgstr ""
+
+#: ../backend/pnm.c:295
+#, no-c-format
+msgid "Read only test-option"
+msgstr ""
+
+#: ../backend/pnm.c:296
+#, no-c-format
+msgid "Let's see whether frontends can treat this right"
+msgstr ""
+
+#: ../backend/pnm.c:307
+#, no-c-format
+msgid "Gamma Tables"
+msgstr ""
+
+#: ../backend/pnm.c:379
+#, no-c-format
+msgid "Status Code Simulation"
+msgstr ""
+
+#: ../backend/pnm.c:391
+#, no-c-format
+msgid "Do not force status code"
+msgstr ""
+
+#: ../backend/pnm.c:392
+#, no-c-format
+msgid "Do not force the backend to return a status code."
+msgstr ""
+
+#: ../backend/pnm.c:403
+#, no-c-format
+msgid "Return SANE_STATUS_EOF"
+msgstr ""
+
+#: ../backend/pnm.c:404
+#, no-c-format
+msgid ""
+"Force the backend to return the status code SANE_STATUS_EOF after "
+"sane_read() has been called."
+msgstr ""
+
+#: ../backend/pnm.c:416
+#, no-c-format
+msgid "Return SANE_STATUS_JAMMED"
+msgstr ""
+
+#: ../backend/pnm.c:418
+#, no-c-format
+msgid ""
+"Force the backend to return the status code SANE_STATUS_JAMMED after "
+"sane_read() has been called."
+msgstr ""
+
+#: ../backend/pnm.c:430
+#, no-c-format
+msgid "Return SANE_STATUS_NO_DOCS"
+msgstr ""
+
+#: ../backend/pnm.c:431
+#, no-c-format
+msgid ""
+"Force the backend to return the status code SANE_STATUS_NO_DOCS after "
+"sane_read() has been called."
+msgstr ""
+
+#: ../backend/pnm.c:443
+#, no-c-format
+msgid "Return SANE_STATUS_COVER_OPEN"
+msgstr ""
+
+#: ../backend/pnm.c:444
+#, no-c-format
+msgid ""
+"Force the backend to return the status code SANE_STATUS_COVER_OPEN after "
+"sane_read() has been called."
+msgstr ""
+
+#: ../backend/pnm.c:456
+#, no-c-format
+msgid "Return SANE_STATUS_IO_ERROR"
+msgstr ""
+
+#: ../backend/pnm.c:457
+#, no-c-format
+msgid ""
+"Force the backend to return the status code SANE_STATUS_IO_ERROR after "
+"sane_read() has been called."
+msgstr ""
+
+#: ../backend/pnm.c:469
+#, no-c-format
+msgid "Return SANE_STATUS_NO_MEM"
+msgstr ""
+
+#: ../backend/pnm.c:471
+#, no-c-format
+msgid ""
+"Force the backend to return the status code SANE_STATUS_NO_MEM after "
+"sane_read() has been called."
+msgstr ""
+
+#: ../backend/pnm.c:483
+#, no-c-format
+msgid "Return SANE_STATUS_ACCESS_DENIED"
+msgstr ""
+
+#: ../backend/pnm.c:484
+#, no-c-format
+msgid ""
+"Force the backend to return the status code SANE_STATUS_ACCESS_DENIED "
+"after sane_read() has been called."
+msgstr ""
+
+#: ../backend/rts8891.c:2809
+#, no-c-format
+msgid "This option reflects the status of a scanner button."
+msgstr ""
+
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
+#: ../backend/umax_pp.c:639
+#, no-c-format
+msgid "Lamp on"
+msgstr ""
+
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
+#, no-c-format
+msgid "Turn on scanner lamp"
+msgstr ""
+
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
+#: ../backend/umax.c:5812
+#, no-c-format
+msgid "Lamp off"
+msgstr ""
+
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
+#: ../backend/umax.c:5813
+#, no-c-format
+msgid "Turn off scanner lamp"
+msgstr ""
+
+#: ../backend/sm3840.c:760
+#, no-c-format
+msgid "Lamp timeout"
+msgstr ""
+
+#: ../backend/sm3840.c:762
+#, no-c-format
+msgid "Minutes until lamp is turned off after scan"
+msgstr ""
+
+#: ../backend/sm3840.c:772
+#, no-c-format
+msgid "Threshold value for lineart mode"
+msgstr ""
+
+#: ../backend/snapscan-options.c:88
+#, no-c-format
+msgid "Document Feeder"
+msgstr ""
+
+#: ../backend/snapscan-options.c:92
+#, no-c-format
+msgid "6x4 (inch)"
+msgstr "6x4 (inch)"
+
+#: ../backend/snapscan-options.c:93
+#, no-c-format
+msgid "8x10 (inch)"
+msgstr "8x10 (inch)"
+
+#: ../backend/snapscan-options.c:94
+#, no-c-format
+msgid "8.5x11 (inch)"
+msgstr "8.5x11 (inch)"
+
+#: ../backend/snapscan-options.c:97
+#, no-c-format
+msgid "Halftoning Unsupported"
+msgstr ""
+
+#: ../backend/snapscan-options.c:98
+#, no-c-format
+msgid "DispersedDot8x8"
+msgstr ""
+
+#: ../backend/snapscan-options.c:99
+#, no-c-format
+msgid "DispersedDot16x16"
+msgstr ""
+
+#: ../backend/snapscan-options.c:103
+#, no-c-format
+msgid ""
+"Number of scan lines to request in a SCSI read. Changing this parameter "
+"allows you to tune the speed at which data is read from the scanner "
+"during scans. If this is set too low, the scanner will have to stop "
+"periodically in the middle of a scan; if it's set too high, X-based "
+"frontends may stop responding to X events and your system could bog down."
+msgstr ""
+
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, no-c-format
+msgid "Focus point for scanning."
+msgstr ""
+
+#: ../backend/snapscan-options.c:482
+#, no-c-format
+msgid "Preview mode"
+msgstr "Előnézeti mód"
+
+#: ../backend/snapscan-options.c:484
+#, no-c-format
+msgid ""
+"Select the mode for previews. Greyscale previews usually give the best "
+"combination of speed and detail."
+msgstr ""
+
+#: ../backend/snapscan-options.c:601
+#, no-c-format
+msgid "Predefined settings"
+msgstr ""
+
+#: ../backend/snapscan-options.c:603
+#, no-c-format
+msgid ""
+"Provides standard scanning areas for photographs, printed pages and the "
+"like."
+msgstr ""
+
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "síkágyas lapolvasó"
+
+#: ../backend/snapscan-options.c:897
+#, no-c-format
+msgid "Focus-mode"
+msgstr ""
+
+#: ../backend/snapscan-options.c:898
+#, no-c-format
+msgid "Auto or manual focus"
+msgstr ""
+
+#: ../backend/snapscan-options.c:911
+#, no-c-format
+msgid "Focus-point"
+msgstr ""
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Fókusz az üvegen"
+
+#: ../backend/snapscan-options.c:930
+#, no-c-format
+msgid "Colour lines per read"
+msgstr ""
+
+#: ../backend/snapscan-options.c:942
+#, no-c-format
+msgid "Greyscale lines per read"
+msgstr ""
+
+#: ../backend/stv680.c:974
+#, no-c-format
+msgid "webcam"
+msgstr ""
+
+#: ../backend/stv680.h:115
+#, fuzzy, no-c-format
+msgid "Color RAW"
+msgstr "Színes"
+
+#: ../backend/stv680.h:116
+#, fuzzy, no-c-format
+msgid "Color RGB"
+msgstr "Színes"
+
+#: ../backend/stv680.h:117
+#, no-c-format
+msgid "Color RGB TEXT"
+msgstr ""
+
+#: ../backend/test.c:137
+#, no-c-format
+msgid "Solid black"
+msgstr ""
+
+#: ../backend/test.c:137
+#, no-c-format
+msgid "Solid white"
+msgstr ""
+
+#: ../backend/test.c:138
+#, no-c-format
+msgid "Color pattern"
+msgstr ""
+
+#: ../backend/test.c:138
+#, no-c-format
+msgid "Grid"
+msgstr "Rács"
+
+#: ../backend/test.c:163 ../backend/test.c:171
+#, no-c-format
+msgid "First entry"
+msgstr "Első bejegyzés"
+
+#: ../backend/test.c:163 ../backend/test.c:171
+#, no-c-format
+msgid "Second entry"
+msgstr "Második bejegyzés"
+
+#: ../backend/test.c:165
+#, no-c-format
+msgid ""
+"This is the very long third entry. Maybe the frontend has an idea how to "
+"display it"
+msgstr ""
+
+#: ../backend/test.c:348
+#, no-c-format
+msgid "Hand-scanner simulation"
+msgstr "Kézi szkenner szimuláció"
+
+#: ../backend/test.c:349
+#, no-c-format
+msgid ""
+"Simulate a hand-scanner. Hand-scanners do not know the image height a "
+"priori. Instead, they return a height of -1. Setting this option "
+"allows one to test whether a frontend can handle this correctly. This "
+"option also enables a fixed width of 11 cm."
+msgstr ""
+
+#: ../backend/test.c:366
+#, no-c-format
+msgid "Three-pass simulation"
+msgstr ""
+
+#: ../backend/test.c:367
+#, no-c-format
+msgid ""
+"Simulate a three-pass scanner. In color mode, three frames are "
+"transmitted."
+msgstr ""
+
+#: ../backend/test.c:382
+#, no-c-format
+msgid "Set the order of frames"
+msgstr ""
+
+#: ../backend/test.c:383
+#, no-c-format
+msgid "Set the order of frames in three-pass color mode."
+msgstr ""
+
+#: ../backend/test.c:416
+#, no-c-format
+msgid ""
+"If Automatic Document Feeder is selected, the feeder will be 'empty' "
+"after 10 scans."
+msgstr ""
+
+#: ../backend/test.c:431
+#, no-c-format
+msgid "Special Options"
+msgstr "Speciális beállítások"
+
+#: ../backend/test.c:444
+#, no-c-format
+msgid "Select the test picture"
+msgstr ""
+
+#: ../backend/test.c:446
+#, no-c-format
+msgid ""
+"Select the kind of test picture. Available options:\n"
+"Solid black: fills the whole scan with black.\n"
+"Solid white: fills the whole scan with white.\n"
+"Color pattern: draws various color test patterns depending on the mode.\n"
+"Grid: draws a black/white grid with a width and height of 10 mm per "
+"square."
+msgstr ""
+
+#: ../backend/test.c:467
+#, no-c-format
+msgid "Invert endianness"
+msgstr ""
+
+#: ../backend/test.c:468
+#, no-c-format
+msgid ""
+"Exchange upper and lower byte of image data in 16 bit modes. This option "
+"can be used to test the 16 bit modes of frontends, e.g. if the frontend "
+"uses the correct endianness."
+msgstr ""
+
+#: ../backend/test.c:484
+#, no-c-format
+msgid "Read limit"
+msgstr ""
+
+#: ../backend/test.c:485
+#, no-c-format
+msgid "Limit the amount of data transferred with each call to sane_read()."
+msgstr ""
+
+#: ../backend/test.c:498
+#, no-c-format
+msgid "Size of read-limit"
+msgstr ""
+
+#: ../backend/test.c:499
+#, no-c-format
+msgid ""
+"The (maximum) amount of data transferred with each call to sane_read()."
+msgstr ""
+
+#: ../backend/test.c:514
+#, no-c-format
+msgid "Read delay"
+msgstr ""
+
+#: ../backend/test.c:515
+#, no-c-format
+msgid "Delay the transfer of data to the pipe."
+msgstr ""
+
+#: ../backend/test.c:527
+#, no-c-format
+msgid "Duration of read-delay"
+msgstr ""
+
+#: ../backend/test.c:528
+#, no-c-format
+msgid ""
+"How long to wait after transferring each buffer of data through the pipe."
+msgstr ""
+
+#: ../backend/test.c:543
+#, no-c-format
+msgid "Return-value of sane_read"
+msgstr ""
+
+#: ../backend/test.c:545
+#, no-c-format
+msgid ""
+"Select the return-value of sane_read(). \"Default\" is the normal "
+"handling for scanning. All other status codes are for testing how the "
+"frontend handles them."
+msgstr ""
+
+#: ../backend/test.c:562
+#, no-c-format
+msgid "Loss of pixels per line"
+msgstr ""
+
+#: ../backend/test.c:564
+#, no-c-format
+msgid "The number of pixels that are wasted at the end of each line."
+msgstr ""
+
+#: ../backend/test.c:577
+#, no-c-format
+msgid "Fuzzy parameters"
+msgstr ""
+
+#: ../backend/test.c:578
+#, no-c-format
+msgid ""
+"Return fuzzy lines and bytes per line when sane_parameters() is called "
+"before sane_start()."
+msgstr ""
+
+#: ../backend/test.c:591
+#, no-c-format
+msgid "Use non-blocking IO"
+msgstr ""
+
+#: ../backend/test.c:592
+#, no-c-format
+msgid "Use non-blocking IO for sane_read() if supported by the frontend."
+msgstr ""
+
+#: ../backend/test.c:605
+#, no-c-format
+msgid "Offer select file descriptor"
+msgstr ""
+
+#: ../backend/test.c:606
+#, no-c-format
+msgid ""
+"Offer a select filedescriptor for detecting if sane_read() will return "
+"data."
+msgstr ""
+
+#: ../backend/test.c:619
+#, no-c-format
+msgid "Enable test options"
+msgstr "Tesztbeállítások engedélyezése"
+
+#: ../backend/test.c:620
+#, no-c-format
+msgid ""
+"Enable various test options. This is for testing the ability of "
+"frontends to view and modify all the different SANE option types."
+msgstr ""
+
+#: ../backend/test.c:634
+#, no-c-format
+msgid "Print options"
+msgstr "Nyomtatási beállítások"
+
+#: ../backend/test.c:635
+#, no-c-format
+msgid "Print a list of all options."
+msgstr ""
+
+#: ../backend/test.c:712
+#, no-c-format
+msgid "Bool test options"
+msgstr ""
+
+#: ../backend/test.c:725
+#, no-c-format
+msgid "(1/6) Bool soft select soft detect"
+msgstr ""
+
+#: ../backend/test.c:727
+#, no-c-format
+msgid ""
+"(1/6) Bool test option that has soft select and soft detect (and "
+"advanced) capabilities. That's just a normal bool option."
+msgstr ""
+
+#: ../backend/test.c:743
+#, no-c-format
+msgid "(2/6) Bool hard select soft detect"
+msgstr ""
+
+#: ../backend/test.c:745
+#, no-c-format
+msgid ""
+"(2/6) Bool test option that has hard select and soft detect (and "
+"advanced) capabilities. That means the option can't be set by the "
+"frontend but by the user (e.g. by pressing a button at the device)."
+msgstr ""
+
+#: ../backend/test.c:762
+#, no-c-format
+msgid "(3/6) Bool hard select"
+msgstr ""
+
+#: ../backend/test.c:763
+#, no-c-format
+msgid ""
+"(3/6) Bool test option that has hard select (and advanced) capabilities. "
+"That means the option can't be set by the frontend but by the user (e.g. "
+"by pressing a button at the device) and can't be read by the frontend."
+msgstr ""
+
+#: ../backend/test.c:781
+#, no-c-format
+msgid "(4/6) Bool soft detect"
+msgstr ""
+
+#: ../backend/test.c:782
+#, no-c-format
+msgid ""
+"(4/6) Bool test option that has soft detect (and advanced) capabilities. "
+"That means the option is read-only."
+msgstr ""
+
+#: ../backend/test.c:798
+#, no-c-format
+msgid "(5/6) Bool soft select soft detect emulated"
+msgstr ""
+
+#: ../backend/test.c:799
+#, no-c-format
+msgid ""
+"(5/6) Bool test option that has soft select, soft detect, and emulated "
+"(and advanced) capabilities."
+msgstr ""
+
+#: ../backend/test.c:815
+#, no-c-format
+msgid "(6/6) Bool soft select soft detect auto"
+msgstr ""
+
+#: ../backend/test.c:816
+#, no-c-format
+msgid ""
+"(6/6) Bool test option that has soft select, soft detect, and automatic "
+"(and advanced) capabilities. This option can be automatically set by the "
+"backend."
+msgstr ""
+
+#: ../backend/test.c:833
+#, no-c-format
+msgid "Int test options"
+msgstr ""
+
+#: ../backend/test.c:846
+#, no-c-format
+msgid "(1/6) Int"
+msgstr ""
+
+#: ../backend/test.c:847
+#, no-c-format
+msgid "(1/6) Int test option with no unit and no constraint set."
+msgstr ""
+
+#: ../backend/test.c:862
+#, no-c-format
+msgid "(2/6) Int constraint range"
+msgstr ""
+
+#: ../backend/test.c:863
+#, no-c-format
+msgid ""
+"(2/6) Int test option with unit pixel and constraint range set. Minimum "
+"is 4, maximum 192, and quant is 2."
+msgstr ""
+
+#: ../backend/test.c:879
+#, no-c-format
+msgid "(3/6) Int constraint word list"
+msgstr ""
+
+#: ../backend/test.c:880
+#, no-c-format
+msgid "(3/6) Int test option with unit bits and constraint word list set."
+msgstr ""
+
+#: ../backend/test.c:895
+#, no-c-format
+msgid "(4/6) Int array"
+msgstr ""
+
+#: ../backend/test.c:896
+#, no-c-format
+msgid ""
+"(4/6) Int test option with unit mm and using an array without "
+"constraints."
+msgstr ""
+
+#: ../backend/test.c:911
+#, no-c-format
+msgid "(5/6) Int array constraint range"
+msgstr ""
+
+#: ../backend/test.c:912
+#, no-c-format
+msgid ""
+"(5/6) Int test option with unit dpi and using an array with a range "
+"constraint. Minimum is 4, maximum 192, and quant is 2."
+msgstr ""
+
+#: ../backend/test.c:929
+#, no-c-format
+msgid "(6/6) Int array constraint word list"
+msgstr ""
+
+#: ../backend/test.c:930
+#, no-c-format
+msgid ""
+"(6/6) Int test option with unit percent and using an array with a word "
+"list constraint."
+msgstr ""
+
+#: ../backend/test.c:946
+#, no-c-format
+msgid "Fixed test options"
+msgstr ""
+
+#: ../backend/test.c:959
+#, no-c-format
+msgid "(1/3) Fixed"
+msgstr ""
+
+#: ../backend/test.c:960
+#, no-c-format
+msgid "(1/3) Fixed test option with no unit and no constraint set."
+msgstr ""
+
+#: ../backend/test.c:975
+#, no-c-format
+msgid "(2/3) Fixed constraint range"
+msgstr ""
+
+#: ../backend/test.c:976
+#, no-c-format
+msgid ""
+"(2/3) Fixed test option with unit microsecond and constraint range set. "
+"Minimum is -42.17, maximum 32767.9999, and quant is 2.0."
+msgstr ""
+
+#: ../backend/test.c:992
+#, no-c-format
+msgid "(3/3) Fixed constraint word list"
+msgstr ""
+
+#: ../backend/test.c:993
+#, no-c-format
+msgid "(3/3) Fixed test option with no unit and constraint word list set."
+msgstr ""
+
+#: ../backend/test.c:1008
+#, no-c-format
+msgid "String test options"
+msgstr ""
+
+#: ../backend/test.c:1021
+#, no-c-format
+msgid "(1/3) String"
+msgstr ""
+
+#: ../backend/test.c:1022
+#, no-c-format
+msgid "(1/3) String test option without constraint."
+msgstr ""
+
+#: ../backend/test.c:1039
+#, no-c-format
+msgid "(2/3) String constraint string list"
+msgstr ""
+
+#: ../backend/test.c:1040
+#, no-c-format
+msgid "(2/3) String test option with string list constraint."
+msgstr ""
+
+#: ../backend/test.c:1059
+#, no-c-format
+msgid "(3/3) String constraint long string list"
+msgstr ""
+
+#: ../backend/test.c:1060
+#, no-c-format
+msgid ""
+"(3/3) String test option with string list constraint. Contains some more "
+"entries..."
+msgstr ""
+
+#: ../backend/test.c:1080
+#, no-c-format
+msgid "Button test options"
+msgstr ""
+
+#: ../backend/test.c:1093
+#, no-c-format
+msgid "(1/1) Button"
+msgstr ""
+
+#: ../backend/test.c:1094
+#, no-c-format
+msgid "(1/1) Button test option. Prints some text..."
+msgstr ""
+
+#: ../backend/u12.c:149
+#, fuzzy, no-c-format
+msgid "Color 36"
+msgstr "Színes"
+
+#: ../backend/umax.c:235
+#, no-c-format
+msgid "Use Image Composition"
+msgstr ""
+
+#: ../backend/umax.c:236
+#, no-c-format
+msgid "Bi-level black and white (lineart mode)"
+msgstr ""
+
+#: ../backend/umax.c:237
+#, no-c-format
+msgid "Dithered/halftone black & white (halftone mode)"
+msgstr ""
+
+#: ../backend/umax.c:238
+#, no-c-format
+msgid "Multi-level black & white (grayscale mode)"
+msgstr ""
+
+#: ../backend/umax.c:239
+#, no-c-format
+msgid "Multi-level RGB color (one pass color)"
+msgstr ""
+
+#: ../backend/umax.c:240
+#, no-c-format
+msgid "Ignore calibration"
+msgstr ""
+
+#: ../backend/umax.c:5733
+#, no-c-format
+msgid "Disable pre focus"
+msgstr ""
+
+#: ../backend/umax.c:5734
+#, no-c-format
+msgid "Do not calibrate focus"
+msgstr ""
+
+#: ../backend/umax.c:5745
+#, no-c-format
+msgid "Manual pre focus"
+msgstr ""
+
+#: ../backend/umax.c:5757
+#, no-c-format
+msgid "Fix focus position"
+msgstr ""
+
+#: ../backend/umax.c:5769
+#, no-c-format
+msgid "Lens calibration in doc position"
+msgstr ""
+
+#: ../backend/umax.c:5770
+#, no-c-format
+msgid "Calibrate lens focus in document position"
+msgstr ""
+
+#: ../backend/umax.c:5781
+#, no-c-format
+msgid "Holder focus position 0mm"
+msgstr ""
+
+#: ../backend/umax.c:5782
+#, no-c-format
+msgid "Use 0mm holder focus position instead of 0.6mm"
+msgstr ""
+
+#: ../backend/umax.c:5885
+#, no-c-format
+msgid "Calibration mode"
+msgstr ""
+
+#: ../backend/umax.c:5886
+#, no-c-format
+msgid "Define calibration mode"
+msgstr ""
+
+#: ../backend/umax_pp.c:640
+#, no-c-format
+msgid "Sets lamp on/off"
+msgstr ""
+
+#: ../backend/umax_pp.c:649
+#, no-c-format
+msgid "UTA on"
+msgstr ""
+
+#: ../backend/umax_pp.c:650
+#, no-c-format
+msgid "Sets UTA on/off"
+msgstr ""
+
+#: ../backend/umax_pp.c:771
+#, fuzzy, no-c-format
+msgid "Offset"
+msgstr "Ki"
+
+#: ../backend/umax_pp.c:773
+#, no-c-format
+msgid "Color channels offset settings"
+msgstr ""
+
+#: ../backend/umax_pp.c:780
+#, fuzzy, no-c-format
+msgid "Gray offset"
+msgstr "Szürke kontraszt"
+
+#: ../backend/umax_pp.c:781
+#, no-c-format
+msgid "Sets gray channel offset"
+msgstr ""
+
+#: ../backend/umax_pp.c:793
+#, fuzzy, no-c-format
+msgid "Sets red channel offset"
+msgstr "A vörös csatorna kontrasztja"
+
+#: ../backend/umax_pp.c:805
+#, fuzzy, no-c-format
+msgid "Sets green channel offset"
+msgstr "A zöld csatorna kontrasztja"
+
+#: ../backend/umax_pp.c:817
+#, fuzzy, no-c-format
+msgid "Sets blue channel offset"
+msgstr "A kék csatorna kontrasztja"
diff --git a/po/it.po b/po/it.po
index 06a693a..316a4e5 100644
--- a/po/it.po
+++ b/po/it.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends 1.0.18\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2007-08-28 23:11+0200\n"
"Last-Translator: Giuseppe Sacco <eppesuig@debian.org>\n"
"Language-Team: italian translation project <tp@lists.linux.it>\n"
@@ -26,17 +26,17 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -45,25 +45,25 @@ msgid "Geometry"
msgstr "Geometria"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Miglioramento"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Avanzato"
@@ -88,8 +88,8 @@ msgstr "Forza anteprima in bianco e nero"
msgid "Bit depth"
msgstr "Profondità in bit"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Modalità di scansione"
@@ -129,7 +129,8 @@ msgstr "X in basso a destra"
msgid "Bottom-right y"
msgstr "Y in basso a destra"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Risoluzione della scansione"
@@ -297,7 +298,7 @@ msgstr "Lega la risoluzione X e Y"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -992,7 +993,7 @@ msgstr "Predefiniti"
msgid "Set default values for enhancement controls."
msgstr "Imposta i valori predefiniti per i controlli del miglioramento"
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Calibrazione"
@@ -1034,63 +1035,63 @@ msgstr ""
msgid "Button state"
msgstr "Stato del pulsante"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Numero di fotogrammi da acquisire"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Selezionare il numero di fotogrammi da acquisire"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Scansione Duplex"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr "La scansione duplex è quella di entrambi i lati del documento"
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Calibrare lo scanner"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Forza la calibrazione dello scanner prima della scansione"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Scansione in scala di grigi"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Effettuare una scansione in scala di grigi invece che a colori"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Guadagno analogico"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Aumenta o diminuisce il guadagno analogico del sensore CCD"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Correzione gamma"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Selezionare la curva di correzione gamma"
@@ -1102,8 +1103,8 @@ msgstr "Grezzo"
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr "Colore ad alta qualità"
@@ -1154,604 +1155,614 @@ msgstr "Velocità normale dimezzata"
msgid "1/3 normal speed"
msgstr "1/3 della velocità normale"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, no-c-format
msgid "rounded parameter"
msgstr "parametri arrotondati"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr "sconosciuto"
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr "ADF inceppato"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr "Coperchio ADF aperto"
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, no-c-format
msgid "lamp failure"
msgstr "lampada guasta"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr "errore nel posizionamento della testa di scansione"
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr "Errore nel controllo della CPU"
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr "Error nel controllo della RAM"
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr "Errore nel controllo della ROM"
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr "errore nei controlli hardware"
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, no-c-format
msgid "transparency unit lamp failure"
msgstr "guasto della lampada dell'adattatore per trasparenze"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr ""
"errore durante il posizionamento della testa di scansione per "
"l'adatattore per trasparenze"
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr "errore nella lunghezza della lista di parametri"
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr "codice di comando non valido"
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr "campo non valido in CDB"
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr "LUN non supportato"
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr "campo non valido nella lista di parametri"
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr "errore nella sequenza di comandi"
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr "sono state specificate troppe finestre"
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr "supporto non presente"
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr "messaggio con bit IDENTIFY non valido"
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr "opzione non connesso"
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr "reset dell'alimentazione elettrica / reset del bus dei dispositivi"
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr "parametro cambiato da un altro iniziatore"
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr "nessun altra informazione aggiuntiva sul «sense»"
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr "errore durante la reselezione"
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr "errore di parità SCSI"
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr "ricevuto un messaggio di errore per rilevamento di iniziatore"
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr "errore di messaggio non valido"
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr "errore di timeout"
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, no-c-format
msgid "transparency unit shading error"
msgstr "errore nel mascheramento della unità per la trasparenza"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr "lampada non stabilizzata"
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr "problema non analizzato (classe SCSI sconosciuta)"
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, no-c-format
msgid "film scanner"
msgstr "scanner da negativi"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "scanner piano"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Pellicola"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr "Imposta il tipo di pellicola: negativi o diapositive"
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, no-c-format
msgid "Negative film type"
msgstr "Tipo di pellicola negativa"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, no-c-format
msgid "Selects the negative film type"
msgstr "Seleziona il tipo di pellicola negativa"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, no-c-format
msgid "Hardware resolution"
msgstr "Risoluzione hardware"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, no-c-format
msgid "Use only hardware resolutions"
msgstr "Mostra solo le risoluzioni hardware"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr "Fuoco"
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, no-c-format
msgid "Auto focus"
msgstr "Autofocus"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, no-c-format
msgid "Enable/disable auto focus"
msgstr "Abilita/disabilita la messa a fuoco automatica"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr "Autofocus unico"
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr "Effettua l'autofocus una sola volta per ogni pellicola inserita"
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, no-c-format
msgid "Manual focus position"
msgstr "Posizione di messa a fuoco manuale"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr ""
"Imposta manualmente la posizione del sistema di messa a fuoco "
"(normalmente alla posizione 128)."
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr "Margini di scansione"
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr "Altre impostazioni del colore"
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Immagine riflessa"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, no-c-format
msgid "Mirror the image horizontally"
msgstr "Riflette l'immagine orizzontalmente"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, no-c-format
msgid "Auto exposure"
msgstr "Esposizione automatica"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Abilita/disabilita l'esposizione automatica"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, no-c-format
msgid "Calibration now"
msgstr "Calibrazione immediata"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, no-c-format
msgid "Execute calibration *now*"
msgstr "Esegue adesso la calibrazione"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr "Auto diagnostica"
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr "Effettua i controlli automatici"
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, no-c-format
msgid "Reset scanner"
msgstr "Reimposta scanner"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, no-c-format
msgid "Reset the scanner"
msgstr "Reimposta lo scanner"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr "Gestione del supporto"
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, no-c-format
msgid "Eject film after each scan"
msgstr "Espelle la pellicola dopo ogni scansione"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr "Espelle automaticamente la pellicola dopo ogni scansione"
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr "Espelle la pellicola all'uscita"
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr "Espelle automaticamente la pellicola alla chiusura del programma"
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr "Espulsione della pellicola immediata"
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr "Espelle la pellicola adesso"
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, no-c-format
msgid "Document feeder extras"
msgstr "Opzioni dell'alimentatore automatico"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, no-c-format
msgid "Flatbed only"
msgstr "Solo piano fisso"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr "Disabilita l'alimentatore di fogli e usa solo il piano fisso"
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, no-c-format
msgid "Transparency unit"
msgstr "Adattatore per trasparenze"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
"Abilita/disabilita l'adattatore per le trasparenze (FAU, «film adapter "
"unit»)"
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, no-c-format
msgid "Negative film"
msgstr "Pellicola negativa"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, no-c-format
msgid "Positive or negative film"
msgstr "Pellicola positiva o negativa"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr "Controllo della densità"
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr "Imposta la modalità di controllo della densità"
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, no-c-format
msgid "Transparency ratio"
msgstr "Rapporto per trasparenze"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, no-c-format
msgid "Select film type"
msgstr "Seleziona tipo pellicola"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, no-c-format
msgid "Select the film type"
msgstr "Seleziona il tipo di pellicola"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Piano fisso"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, fuzzy, no-c-format
msgid "ADF Front"
msgstr "Coperchio ADF aperto"
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, fuzzy, no-c-format
msgid "ADF Back"
msgstr "ADF inceppato"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "ADF Duplex"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Stampa"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Fronte e retro"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Rosso"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Verde"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Blu"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Miglioramento"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Miglioramento"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Miglioramento"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Nessuno"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Solo fronte"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Fronte e retro"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Adattatore per trasparenze"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Caricatore automatico fogli"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Pellicola positiva"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Pellicola negativa"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Messa a fuoco sul piano di vetro"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Messa a fuoco 2,5mm sopra piano di vetro"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Mezzi Toni A (hard tone)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Mezzi Toni B (soft tone)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Mezzi Toni C (net screen)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Dither A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Dither B (4x4 Spiral)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Dither C (4x4 Net Screen)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Dither D (8x4 Net Screen)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Tecnologia di miglioramento del testo"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Scarica il modello A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Scarica il modello B"
@@ -1761,7 +1772,7 @@ msgstr "Scarica il modello B"
msgid "No Correction"
msgstr "Nessuna correzione"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Definito dall'utente"
@@ -1786,33 +1797,33 @@ msgstr "Stampanti a getto d'inchiostro"
msgid "CRT monitors"
msgstr "Monitor CRT"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Default"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Stampa ad alta definizione"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Stampa a bassa definizione"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Stampa a contrasto elevato"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Definito dall'utente (gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Definito dall'utente (gamma=1.8)"
@@ -1852,233 +1863,233 @@ msgstr "A4"
msgid "Max"
msgstr "Massimo"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Modalità di scansione"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Seleziona i mezzi toni"
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Esclusione"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Seleziona l'esclusione."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Seleziona la brillantezza."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Nitidezza"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Correzione del colore"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
"Imposta la tabella di correzione dei colori per il dispositivo "
"selezionato."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Coefficienti di correzione del colore"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Moltiplicazione matriciale dei valori RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Spostamento da verde a rosso"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Spostamento da verde a blu"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Spostamento da rosso a verde"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Spostamento da rosso a blu"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Spostamento da blu a verde"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Spostamento da blu a rosso"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Controlla il livello del verde"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Modula il rosso sulla base del livello del verde"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Modula il blu sulla base del livello del verde"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Modula il verde sulla base del livello del rosso"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Controlla il livello del rosso"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Modula il blu sulla base del livello del rosso"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Modula il verde sulla base del livello del blu"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Modula il rosso sulla base del livello del blu"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Controlla del livello del blu"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Effettua una riflessione dell'immagine lungo l'asse verticale"
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Anteprima veloce"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Sezionamento automatico dell'area"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Lista ridotta delle risoluzioni disponibili"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Mostra la lista ridotta delle risoluzioni disponibili"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Zoom"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Definisce il fattore di zoom usato dallo scanner"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Formato rapido"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Dispositivi opzionali"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Espulsione"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Espelle il foglio dall'alimentatore automatico"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Espulsione automatica"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Espelle il documento dopo la sua scansione"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "Modalità ADF"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Seleziona la modalità ADF (solo fronte/fronte-retro)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Cassetto"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Seleziona il cassetto per la scansione"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2088,24 +2099,24 @@ msgstr ""
"oppure dalla tabella personalizzata, con la quale verrà configurato lo "
"scanner"
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Posizione della messa a fuoco"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr ""
"Seleziona la messa a fuoco sul piano di vetro o 2,5mm sopra lo stesso"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Attendi il tasto"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2115,178 +2126,219 @@ msgstr ""
"premuto il tasto dello scanner per fare partire il processo di "
"acquisizione."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Diapositiva positiva"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Diapositiva negativa"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "Definito dall'utente"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Attivo"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Disattivo"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Sfumatura"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, fuzzy, no-c-format
msgid "Diffusion"
msgstr "Diffusione d'errore"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Livello bianco"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Livello nero"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, fuzzy, no-c-format
msgid "Continue"
msgstr "Condizionale"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Orizzontale"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "Orizzontale"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "Orizzontale"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Verticale"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "Verticale"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, fuzzy, no-c-format
msgid "Front"
msgstr "Stampa"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Extra"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Soglia"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Disattiva interpolazione"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2295,24 +2347,46 @@ msgstr ""
"Quando si usano alte risoluzione con quella orizzontale minore della "
"verticale, l'interpolazione orizzontale viene disabilitata."
-#: ../backend/genesys.c:6235
-#, no-c-format
-msgid "Color Filter"
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
msgstr "Filtro colore"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
"Quando si usano i grigi o il binario questa opzione seleziona il colore "
"usato."
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Calibrazione"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Definire la modalità di calibrazione"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Cache per la calibrazione"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Durata spegnimento lampada"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2321,62 +2395,78 @@ msgstr ""
"La lampada verrà spenta allo scadere del tempo impostato (in minuti). Il "
"valore 0 indica che la lampada non deve mai essere spenta."
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Calibrazione granulosa"
+
+#: ../backend/genesys.c:5941
+#, fuzzy, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr ""
+"Numero di minuti prima che la lampada venga spenta dopo la scansione"
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, fuzzy, no-c-format
msgid "File button"
msgstr "Attendi il tasto"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, fuzzy, no-c-format
msgid "Power button"
msgstr "Attendi il tasto"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Attendi il tasto"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Calibrazione granulosa"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Forza la calibrazione dello scanner prima della scansione"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Pulsanti"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Calibrazione"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, fuzzy, no-c-format
msgid "Start calibration using special sheet"
msgstr "Inizia la calibrazione."
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, fuzzy, no-c-format
msgid "Clear calibration"
msgstr "Calibrazione granulosa"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, fuzzy, no-c-format
msgid "Clear calibration cache"
msgstr "Cache per la calibrazione"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Adattatore per trasparenza"
@@ -2513,7 +2603,7 @@ msgstr "Modalità di scansione"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2654,12 +2744,12 @@ msgstr ""
msgid "This option reflects a front panel scanner button"
msgstr "Queste opzioni riflettono lo stato dei pulsanti dello scanner."
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Immagine"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Varie"
@@ -2684,17 +2774,17 @@ msgstr "Scarto Y"
msgid "Hardware internal Y position of the scanning area."
msgstr "Posizione interna Y dell'area di scansione."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Stato della lampada"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Accendi o spegni la lampada"
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Calibrare i livelli del bianco e nero"
@@ -2804,8 +2894,8 @@ msgstr "Lento"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normale"
@@ -3143,9 +3233,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3449,7 +3539,7 @@ msgstr "Imposta l'accentuazione dell'immagine"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gamma"
@@ -3516,16 +3606,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3536,16 +3616,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3614,7 +3684,7 @@ msgstr "Miglioramento"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3782,7 +3852,7 @@ msgstr "Guadagno sul grigio"
msgid "Sets gray channel gain"
msgstr "Imposta il guadagno sul canale grigio"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3793,7 +3863,7 @@ msgstr "Guadagno sul rosso"
msgid "Sets red channel gain"
msgstr "Imposta il guadagno sul canale rosso"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3804,7 +3874,7 @@ msgstr "Guadagno sul verde"
msgid "Sets green channel gain"
msgstr "Imposta il guadagno sul canale verde"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3896,7 +3966,7 @@ msgstr "Pagina singola"
msgid "All pages"
msgstr "Tutte le pagine"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "Scanner con alimentatore automatico dei fogli"
@@ -3969,12 +4039,12 @@ msgstr "Utilizza l'adattatore per diapositive"
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "Questa opzione spegne la lampada del piano durante la scansione"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Qualità di scansione"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Massima qualità/Bassa velocità"
@@ -4405,12 +4475,39 @@ msgstr ""
"Preriscalda fino a che la luminisità della lampada sia costante invece "
"di attendere 40 secondi."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Pellicola negativa"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negativo"
+
+#: ../backend/pixma.c:396
+#, fuzzy, no-c-format
+msgid "48 bits color"
+msgstr "Colore ad alta qualità"
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr "Scansione controllata da pulsante"
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4421,198 +4518,218 @@ msgstr ""
"procedere premere il pulsante \"SCAN\" (per ML150) oppure \"COLOR\" (per "
"altri modelli). Per annullare premere il pulsante \"GRAY\"."
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
msgstr "Aggiorna lo stato del pulsante"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr "Pulsante 1"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr "Pulsante 2"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Trasparenze"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr "Impostazioni-dispositivo"
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr "Pulsante lampada"
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr "Accensione manuale della/e lampada/e."
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, fuzzy, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Calibrazione granulosa"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr ""
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, no-c-format
msgid "Calibration data cache"
msgstr "Cache per la calibrazione"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr "Abilita o disabilita la cache per la calibrazione."
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, no-c-format
msgid "Performs calibration"
msgstr "Effettua calibrazione"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr "Sensore di accelerazione"
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr "Abilita o disabilita il movimento del sensore di accelerazione."
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr "Durata del preriscaldamento"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr "Durata in secondi del preriscaldamento della lampada."
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr "Durata spegnimento lampada"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Durata in secondi dello spegnimento della lampada."
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr "Frontend analogico"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr "Valore del guadagno sul rosso per AFE (Analog FrontEnd)"
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Scarto sul rosso"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr "Valore dello scarto sul rosso per AFE (Analog FrontEnd)"
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr "Valore del guadagno sul verde per AFE (Analog FrontEnd)"
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Scarto sul verde"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr "Valore dello scarto sul verde per AFE (Analog FrontEnd)"
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr "Valore del guadagno sul blu per AFE (Analog FrontEnd)"
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Scarto sul blu"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr "Valore dello scarto sul blu per AFE (Analog FrontEnd)"
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr "Lampada rossa spenta"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr "Imposta il parametro spegnimento della lampada rossa"
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr "Lampada verde spenta"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr "Imposta il parametro spegnimento lampada verde"
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr "Lampada blu spenta"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr "Imposta il parametro spegnimento lampada blu"
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr "Queste opzioni riflettono lo stato dei pulsanti dello scanner."
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Colore a 36 bit"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Mappa dither 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Mappa dither 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Aleatorizzato"
@@ -4661,7 +4778,7 @@ msgstr "Simulazione di uno scanner manuale"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Simula l'acquisizione mediante uno scanner manuale; questi scanner "
"spesso non conoscono l'altezza dell'immagine a priori e restituiscono "
@@ -4760,8 +4877,8 @@ msgid ""
"sane_read() has been called."
msgstr ""
"Obbliga il programma a fornire il valore di ritorno "
-"SANE_STATUS_COVER_OPEN dopo che sia stata chiamata la funzione sane_read"
-"()."
+"SANE_STATUS_COVER_OPEN dopo che sia stata chiamata la funzione "
+"sane_read()."
#: ../backend/pnm.c:456
#, no-c-format
@@ -4806,29 +4923,29 @@ msgstr ""
"SANE_STATUS_ACCESS_DENIED dopo che sia stata chiamata la funzione "
"sane_read()."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, fuzzy, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Queste opzioni riflettono lo stato dei pulsanti dello scanner."
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Lampada accesa"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Accendere la lampada"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Lampada spenta"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4850,42 +4967,42 @@ msgstr ""
msgid "Threshold value for lineart mode"
msgstr "Valore soglia per modalità binaria"
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Alimentatore automatico dei fogli"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 pollici (~15x10 cm)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 pollici (~20x25 cm)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11 pollici (~21x28 cm)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Mezzi-toni non supportati"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "DispersedDot8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "DispersedDot16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4900,12 +5017,27 @@ msgstr ""
"\"a scatti\" dello scanner, un valore troppo grande può bloccare le "
"interfacce X-Window dal rispondere agli eventi X e bloccare il sistema."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Espelle il documento dopo la sua scansione"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Anteprima"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4914,12 +5046,12 @@ msgstr ""
"Determina come eseguire l'anteprima: un'anteprima con scala di grigi "
"fornisce solitamente il miglior rapporto velocità/qualità."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Valori predefiniti"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4928,12 +5060,42 @@ msgstr ""
"Fornisce le aree di scansione standard per fotografie, pagine stampate, "
"etc."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "scanner piano"
+
+#: ../backend/snapscan-options.c:897
+#, fuzzy, no-c-format
+msgid "Focus-mode"
+msgstr "Fuoco"
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Autofocus"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Posizione della messa a fuoco"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Posizione della messa a fuoco"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Numero di linee colore per ciclo di lettura"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Numero di linee in scala di grigi per ciclo di lettura"
@@ -5007,7 +5169,7 @@ msgstr "Simulazione di uno scanner manuale"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Simulazione di acquisizione mediante uno scanner manuale; questi scanner "
@@ -5642,6 +5804,9 @@ msgstr "Imposta lo scarto sul verde"
msgid "Sets blue channel offset"
msgstr "Imposta lo scarto sul blu"
+#~ msgid "problem not analyzed (unknown SCSI class)"
+#~ msgstr "problema non analizzato (classe SCSI sconosciuta)"
+
#~ msgid "Grayscale"
#~ msgstr "Scala di grigi"
diff --git a/po/ja.po b/po/ja.po
index cb78847..fcfe261 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -7,7 +7,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends 1.0.20\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2009-10-31 10:30+0900\n"
"Last-Translator: Hiroshi Miura <miurahr@linux.com>\n"
"Language-Team: Japanese <japanese@li.org>\n"
@@ -30,17 +30,17 @@ msgid "Standard"
msgstr "標準"
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -49,25 +49,25 @@ msgid "Geometry"
msgstr "配置"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "増強"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "上級"
@@ -92,8 +92,8 @@ msgstr "モノクロームプレビューを強制する"
msgid "Bit depth"
msgstr "ビット深度"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "走査モード"
@@ -133,7 +133,8 @@ msgstr "右下のx"
msgid "Bottom-right y"
msgstr "右下のy"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "走査解像度"
@@ -301,7 +302,7 @@ msgstr "XとY解像度を拘束"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -360,12 +361,12 @@ msgstr "ランプの暖機"
#: ../include/sane/saneopts.h:217
#, no-c-format
msgid "Cal. exposure-time"
-msgstr "露出時間を構成"
+msgstr "露出時間を較正"
#: ../include/sane/saneopts.h:218
#, no-c-format
msgid "Cal. exposure-time for red"
-msgstr "赤の露出時間を構成"
+msgstr "赤の露出時間を較正"
#: ../include/sane/saneopts.h:219
#, no-c-format
@@ -951,7 +952,7 @@ msgstr "既定"
msgid "Set default values for enhancement controls."
msgstr "増強制御の既定値を設定する"
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "校正"
@@ -991,63 +992,63 @@ msgstr ""
msgid "Button state"
msgstr "ボタンの状態"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "走査するフレーム数"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "走査するフレームの数を選んでください。"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "両面スキャン"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr "両面スキャンでは、文書の表面と裏面の走査が行われます。"
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "スキャナーの校正"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "走査前にスキャナの校正を強制する"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "グレースケール走査"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "カラーの代わりに、グレースケールで走査します。"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "アナログ利得"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "CCD配列のアナログ利得を増加または減少"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "ガンマ校正"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "ガンマ補正された変換カーブを選択"
@@ -1059,8 +1060,8 @@ msgstr "無加工"
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr "高精彩"
@@ -1111,599 +1112,609 @@ msgstr "半分の速度"
msgid "1/3 normal speed"
msgstr "3分の1の速度"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, no-c-format
msgid "rounded parameter"
msgstr "丸められたパラメター値"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr "不明"
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr "ADFが詰まりました"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr "ADFのカバーが開いています"
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, no-c-format
msgid "lamp failure"
msgstr "ランプ不良"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr "走査ヘッドの位置エラー"
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr "CPUチェックエラー"
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr "RAMチェックエラー"
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr "ROMチェックエラー"
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr "ハードウエアチェックエラー"
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, no-c-format
msgid "transparency unit lamp failure"
msgstr "フィルムユニットのランプ不良"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr "フィルムユニットのヘッド位置不良"
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr "パラメターリストの長さエラー"
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr "不正なコマンド操作コード"
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr "CDBに不正なフィールド"
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr "サポートされないLUN"
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr "パラメターリストに不正なフィールド"
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr "コマンドの順序エラー"
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr "指定されたウインドウが多すぎます"
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr "媒体が存在しません"
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr "IDENTIFYメッセージに不正なビット"
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr "オプションが正しくありません"
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr "電源ONリセット/バスデバイスリセット"
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr "ほかの初期化プログラムによってパラメターが変更されました"
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr "追加センサー情報はありません。"
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr "再選択失敗"
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr "SCSIパリティエラー"
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr "初期化ルーチンがエラーメッセージを受信しました。"
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr "不正なメッセージエラー"
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr "タイムアウトエラー"
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, no-c-format
msgid "transparency unit shading error"
msgstr "透過ユニットのシェーディングエラー"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr "ランプが安定しません"
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr "問題が解析できませんでした(不明なSCSIクラス)"
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, no-c-format
msgid "film scanner"
msgstr "フィルムスキャナー"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "フラットベッド(平台型)スキャナ"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "フィルムの種類"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr "フィルムの種類を選択(例、ネガ、スライド)"
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, no-c-format
msgid "Negative film type"
msgstr "ネガフィルム"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, no-c-format
msgid "Selects the negative film type"
msgstr "ネガフィルムを選択"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, no-c-format
msgid "Hardware resolution"
msgstr "ハードウエア解像度"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, no-c-format
msgid "Use only hardware resolutions"
msgstr "ハードウエア解像度だけを使用"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr "焦点"
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, no-c-format
msgid "Auto focus"
msgstr "自動焦点"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, no-c-format
msgid "Enable/disable auto focus"
msgstr "自動焦点を有効/無効"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr "自動焦点を一回だけ行う"
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr "排出している間に、一度だけ自動焦点補正を行います。"
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, no-c-format
msgid "Manual focus position"
msgstr "手動焦点位置"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr "光学系の焦点位置を手動で設定します(既定値:128)"
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr "走査の余白"
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr "追加色調整"
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "鏡像画像"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, no-c-format
msgid "Mirror the image horizontally"
msgstr "水平に画像の鏡像にする"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, no-c-format
msgid "Auto exposure"
msgstr "自動露出"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "自動露光機能を有効/無効にする"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, no-c-format
msgid "Calibration now"
msgstr "校正中"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, no-c-format
msgid "Execute calibration *now*"
msgstr "較正を「すぐに」実行します"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr "自己診断"
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr "スキャナーの自己診断を実行"
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, no-c-format
msgid "Reset scanner"
msgstr "スキャナーのリセット"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, no-c-format
msgid "Reset the scanner"
msgstr "スキャナーをリセットする"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr "媒体の扱い"
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, no-c-format
msgid "Eject film after each scan"
msgstr "各走査の後フィルムを排出する"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr "自動的に、各走査の後、フィルムを装置から排出する。"
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr "終了前にフィルムを排出する"
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr "自動的に、プログラム終了前に装置からフィルムを排出する"
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr "フィルムを今排出"
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr "フィルムを今すぐ、排出する。"
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, no-c-format
msgid "Document feeder extras"
msgstr "文書供給装置拡張"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, no-c-format
msgid "Flatbed only"
msgstr "フラットベッドのみ"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr "自動書類送りを無効にし、平台だけを使います"
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, no-c-format
msgid "Transparency unit"
msgstr "透過ユニット"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
"透過ユニットのオフ・オンを切り替えます。(FAU,フィルムアダプター装置)"
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, no-c-format
msgid "Negative film"
msgstr "ネガフィルム"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, no-c-format
msgid "Positive or negative film"
msgstr "ポジあるいはネガフィルム"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr "濃度制御"
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr "濃度制御モードを設定"
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, no-c-format
msgid "Transparency ratio"
msgstr "透過率"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, no-c-format
msgid "Select film type"
msgstr "フィルムの種類を選択"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, no-c-format
msgid "Select the film type"
msgstr "フィルムの種類を選ぶ"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "フラットベッド"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr "ADF表面"
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
msgstr "ADF裏面"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "ADF両面"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "ADF表面"
+
+#: ../backend/canon_dr.c:393
+#, fuzzy, no-c-format
+msgid "Card Back"
+msgstr "ADF裏面"
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "両面"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "赤"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "緑"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "青"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "増強"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "増強"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "増強"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr " なし"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "片面"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "両面"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "透過ユニット"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "自動原稿送り装置"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "ポジフィルム"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "ネガフィルム"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "ガラス表面に焦点を合わせる"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "ガラスから2.5mmの場所に焦点を合わせる"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "ハーフトーン A(ハードトーン)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "ハーフトーンB(ソフトトーン)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "ハーフトーンC(ネットトーン)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "ディザーA(4x4バイエル)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "ディザーB(4x4スパイラル)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "ディザーC(4x4網スクリーン)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "ディザーD(8x4の網スクリーン)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "テキスト強調技術"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "パターンAのダウンロード"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "パターンBのダウンロード"
@@ -1713,7 +1724,7 @@ msgstr "パターンBのダウンロード"
msgid "No Correction"
msgstr "補正をしない"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "ユーザ定義"
@@ -1738,33 +1749,33 @@ msgstr "インクジェットプリンタ"
msgid "CRT monitors"
msgstr "CRTモニター"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "既定"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "高密度印刷"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "低密度印刷"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "高コントラスト印刷"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "ユーザ定義(ガンマ=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "ユーザ定義(ガンマ=1.8)"
@@ -1804,254 +1815,254 @@ msgstr "A4"
msgid "Max"
msgstr "最大"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "走査モード"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "ハーフトーンを選択する。"
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "取り出し口"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "取り出し口の選択"
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "輝度の選択"
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "鮮鋭度"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "カラー補正"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr "選択した出力デバイスのための色補正テーブルを設定する。"
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr ""
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "RGBの倍率マトリックス"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "緑を赤にシフト"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "緑を青にシフト"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "赤を緑にシフト"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "赤を青にシフト"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "青を緑にシフト"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "青を赤にシフト"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "緑レベルの制御"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "緑レベルを基準に赤を増加"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "緑レベルを基準に青を増加"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "赤レベルを基準に緑を増加"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "赤レベルの制御"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "赤レベルを基準に青を増加"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "青レベルを基準として緑を増加"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "青レベルを基準として赤を増加"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "青レベルの制御"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "鏡像をとる。"
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "高速プレビュー"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "自動領域分割"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "短い解像度一覧"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "解像度のリストを短く表示"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "ズーム"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "スキャナーが使うべきズーム値を定義"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "簡易フォーマット"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "光学装置"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "排出"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "ADFの書類を排出する"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "自動排出"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "走査後、書類を排出"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "ADFモード"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "ADFモードの選択(片面、両面)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr ""
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr ""
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
"the user defined table, which can be downloaded to the scanner"
msgstr "ガンマ補正値を事前定義のデバイスのリストから選択する。"
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "焦点位置"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr "焦点位置を、ガラス面ないしは、ガラス面から2.5mmの位置に設定"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "ボタンを待つ"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2060,178 +2071,219 @@ msgstr ""
"スキャンコマンドを送信後、実際に走査処理が始まる、スキャナーのボタンが押"
"されるのをまつ。"
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "ポジスライド"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "ネガスライド"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "ユーザ定義"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "オン"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "オフ"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "ディザー"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, fuzzy, no-c-format
msgid "Diffusion"
msgstr "エラー拡散"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "ホワイトレベル"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "黒レベル"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, fuzzy, no-c-format
msgid "Continue"
msgstr "条件付き"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "水平の"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "水平の"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "水平の"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "垂直の"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "垂直の"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, fuzzy, no-c-format
msgid "Front"
msgstr "ADF表面"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, fuzzy, no-c-format
msgid "Back"
msgstr "ADF裏面"
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "追加"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "閾値"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr ""
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2240,22 +2292,44 @@ msgstr ""
"水平解像度が垂直解像度より低いような高解像度を使うときは、水平"
"interpolationを無効にします。"
-#: ../backend/genesys.c:6235
-#, no-c-format
-msgid "Color Filter"
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
msgstr "カラーフィルタ"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "校正"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "較正を「すぐに」実行します"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "較正データのキャッシュ"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "ランプをオフにする時間"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2264,62 +2338,77 @@ msgstr ""
"ランプは指定された時間(分)が経過したらオフにされます。値が0のときは、"
"この機能は働きません。"
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "ダーク補正時にランプをオフにする"
+
+#: ../backend/genesys.c:5941
+#, fuzzy, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr "走査した後、ランプがオフになるまでの時間(分)"
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
msgstr "ファイルボタン"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr "OCRボタン"
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
msgstr "電源ボタン"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "電子メールボタン"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "較正のクリア"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "走査前にスキャナの校正を強制する"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "ボタン"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "較正"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, no-c-format
msgid "Start calibration using special sheet"
msgstr "特殊シートを用いた補正を開始"
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, no-c-format
msgid "Clear calibration"
msgstr "較正のクリア"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, no-c-format
msgid "Clear calibration cache"
msgstr "校正キャッシュを消去する"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "透過アダプター"
@@ -2444,7 +2533,7 @@ msgstr "スキャナーモデル"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2592,12 +2681,12 @@ msgstr "装置の情報を更新"
msgid "This option reflects a front panel scanner button"
msgstr ""
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "画像"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "各種"
@@ -2622,17 +2711,17 @@ msgstr "オフセットY"
msgid "Hardware internal Y position of the scanning area."
msgstr "走査領域のハードウエア内部Y位置"
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "ランプの状態"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "ランプのオフ/オンを切り替え"
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "白黒レベルを較正"
@@ -2740,8 +2829,8 @@ msgstr "遅い"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "普通"
@@ -3072,9 +3161,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3373,7 +3462,7 @@ msgstr "イメージ強調を設定"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "ガンマ"
@@ -3440,16 +3529,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3460,16 +3539,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3538,7 +3607,7 @@ msgstr "増強"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3706,7 +3775,7 @@ msgstr "グレー利得"
msgid "Sets gray channel gain"
msgstr "グレーチャネル利得を設定"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3717,7 +3786,7 @@ msgstr "赤利得"
msgid "Sets red channel gain"
msgstr "赤チャネル利得を設定"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3728,7 +3797,7 @@ msgstr "緑利得"
msgid "Sets green channel gain"
msgstr "緑チャネル利得を設定"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3820,7 +3889,7 @@ msgstr "1ページ"
msgid "All pages"
msgstr "全ページ"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "シートフィーダスキャナー"
@@ -3891,12 +3960,12 @@ msgstr "lightlid-35mmアダプターを使う"
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "このオプションは、走査中に平台のランプをオフにします。"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "品質優先走査"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "最高品質だが、スピードは遅い"
@@ -4314,12 +4383,39 @@ msgid ""
"40 seconds warm-up time."
msgstr ""
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "ネガフィルム"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "ネガ"
+
+#: ../backend/pixma.c:396
+#, fuzzy, no-c-format
+msgid "48 bits color"
+msgstr "高精彩"
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr "ボタン制御走査"
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4327,198 +4423,218 @@ msgid ""
"cancel, press \"GRAY\" button."
msgstr ""
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
msgstr "ボタン状態の更新"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr "ボタン1"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr "ボタン2"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "透過性"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr "装置設定"
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr "ランプのスイッチ"
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr "ランプを手動でオフオンする"
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, no-c-format
msgid "Lamp off during dark calibration"
msgstr "ダーク補正時にランプをオフにする"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr ""
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, no-c-format
msgid "Calibration data cache"
msgstr "較正データのキャッシュ"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr ""
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, no-c-format
msgid "Performs calibration"
msgstr "較正の実行"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr "センサーをスピードアップ"
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr ""
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr "暖機時間"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr "暖機時間を秒で設定。"
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr "ランプオフ時間"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr "ランプオフ時間を秒で設定。"
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr "アナログフロントエンド"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr "AFEの赤の利得値"
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "赤オフセット"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr "AFEの赤のオフセット値"
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr "AFEの緑の利得値"
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "緑オフセット"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr "AFEの緑のオフセット値"
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr "AFEの青の利得値"
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr ""
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr ""
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr "緑ランプをオフ"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr "緑ランプオフパラメータを定義"
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr "青ランプをオフ"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr "青ランプオフパラメータを定義"
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr ""
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "色36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "ディザ マップ1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "ディザ マップ2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "ランダマイズ"
@@ -4567,11 +4683,11 @@ msgstr "ハンドスキャナー シミュレーション"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"ハンドスキャナーをシミュレートします。ハンドスキャナーは、たいていの場"
"合、イメージの高さが事前にはわかりません。その代わり、高さとしてー1を返"
-"します。このオプションを設定すると、フロントエンドが正しくそれを圧あける"
+"します。このオプションを設定すると、フロントエンドが正しくそれを扱える"
"か、テストします。"
#: ../backend/pnm.c:283
@@ -4700,29 +4816,29 @@ msgid ""
"after sane_read() has been called."
msgstr ""
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "このオプションは、スキャナーボタンの状態を反映します。"
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "ランプをオン"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "スキャナーのランプをオンにする。"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "ランプオフ"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4743,42 +4859,42 @@ msgstr "走査した後、ランプがオフになるまでの時間(分)"
msgid "Threshold value for lineart mode"
msgstr "線画モードの閾値"
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "書類送り装置"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4(インチ)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10(インチ)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11(インチ)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "ハーフトーンはサポートされません"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr ""
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr ""
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4788,12 +4904,27 @@ msgid ""
"frontends may stop responding to X events and your system could bog down."
msgstr ""
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "走査後、書類を排出"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "プレビューモード"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4802,24 +4933,54 @@ msgstr ""
"プレビューモードを選択。グレースケールプレビューが通常もっともよい速度と"
"詳細さを提供します。"
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "事前定義された設定"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
"like."
msgstr "写真や印刷物などの標準的な走査領域を提供します。"
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "フラットベッド(平台型)スキャナ"
+
+#: ../backend/snapscan-options.c:897
+#, fuzzy, no-c-format
+msgid "Focus-mode"
+msgstr "焦点"
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "自動焦点"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "焦点位置"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "焦点位置"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr ""
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr ""
@@ -4891,7 +5052,7 @@ msgstr "ハンドスキャナーをシミュレート"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
@@ -5467,6 +5628,9 @@ msgstr ""
msgid "Sets blue channel offset"
msgstr ""
+#~ msgid "problem not analyzed (unknown SCSI class)"
+#~ msgstr "問題が解析できませんでした(不明なSCSIクラス)"
+
#~ msgid "Grayscale"
#~ msgstr "グレースケール"
diff --git a/po/nb.po b/po/nb.po
index 7cff445..6ac30d3 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -5,7 +5,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends 1.0.12\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2007-12-17 23:01+0100\n"
"Last-Translator: Sigurd Stordal <polarbear42@phreaker.net>\n"
"Language-Team: \n"
@@ -25,17 +25,17 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -44,25 +44,25 @@ msgid "Geometry"
msgstr "Geometri"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Forbedring"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Avansert"
@@ -87,8 +87,8 @@ msgstr "Fremtving enfarge forvisning"
msgid "Bit depth"
msgstr "Bit dybde"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr ""
@@ -128,7 +128,8 @@ msgstr "Bunn-høyre x"
msgid "Bottom-right y"
msgstr "Bunn-høyre y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Skanoppløsning"
@@ -296,7 +297,7 @@ msgstr ""
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -944,7 +945,7 @@ msgstr "Standard"
msgid "Set default values for enhancement controls."
msgstr "Velg standard verdier for kontroll av forbedring"
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Kalibrering"
@@ -979,63 +980,63 @@ msgstr ""
msgid "Button state"
msgstr "Knappstatus"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Rammenummer å skanne"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Velger rammenummer å skanne"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, fuzzy, no-c-format
msgid "Duplex scan"
msgstr "Full skan"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr ""
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, fuzzy, no-c-format
msgid "Calibrate Scanner"
msgstr "Kalibrering"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, fuzzy, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Grov kalibrering kun for første skan"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Gråskala scan"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Gjør et gråskala heller enn farge scan"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr ""
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr ""
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Gamma korreksjon"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Velger den gamma korrigerte overførsels kurven"
@@ -1047,8 +1048,8 @@ msgstr ""
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr ""
@@ -1099,598 +1100,608 @@ msgstr ""
msgid "1/3 normal speed"
msgstr ""
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, no-c-format
msgid "rounded parameter"
msgstr ""
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr ""
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr ""
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr ""
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, fuzzy, no-c-format
msgid "lamp failure"
msgstr "Gammaverdi"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr ""
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr ""
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr ""
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr ""
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr ""
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, no-c-format
msgid "transparency unit lamp failure"
msgstr ""
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr ""
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr ""
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr ""
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr ""
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr ""
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr ""
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr ""
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr ""
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr ""
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr ""
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr ""
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr ""
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr ""
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr ""
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr ""
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr ""
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr ""
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr ""
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr ""
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, no-c-format
msgid "transparency unit shading error"
msgstr ""
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr ""
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr ""
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, no-c-format
msgid "film scanner"
msgstr ""
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr ""
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Filmtype"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr ""
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, fuzzy, no-c-format
msgid "Negative film type"
msgstr "Negativ Film"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, fuzzy, no-c-format
msgid "Selects the negative film type"
msgstr "Velger rammenummer å skanne"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, fuzzy, no-c-format
msgid "Hardware resolution"
msgstr "Skanoppløsning"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, fuzzy, no-c-format
msgid "Use only hardware resolutions"
msgstr "Vis kort liste over oppløsninger"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr ""
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, fuzzy, no-c-format
msgid "Auto focus"
msgstr "Automatisk utløsning"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, no-c-format
msgid "Enable/disable auto focus"
msgstr ""
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr ""
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr ""
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, fuzzy, no-c-format
msgid "Manual focus position"
msgstr "Fokuseringposisjon"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr ""
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr ""
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr ""
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Speilbilde"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, fuzzy, no-c-format
msgid "Mirror the image horizontally"
msgstr "Speilbilde"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, fuzzy, no-c-format
msgid "Auto exposure"
msgstr "Automatisk utløsning"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr ""
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, fuzzy, no-c-format
msgid "Calibration now"
msgstr "Kalibrering"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, fuzzy, no-c-format
msgid "Execute calibration *now*"
msgstr "Kvalitets kalibrering"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr ""
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr ""
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, fuzzy, no-c-format
msgid "Reset scanner"
msgstr "Raskt skan"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, no-c-format
msgid "Reset the scanner"
msgstr ""
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr ""
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, fuzzy, no-c-format
msgid "Eject film after each scan"
msgstr "Løs ut dokoment etter skanning"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr ""
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr ""
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr ""
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr ""
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr ""
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, fuzzy, no-c-format
msgid "Document feeder extras"
msgstr "Dokumentmater"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, no-c-format
msgid "Flatbed only"
msgstr ""
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, no-c-format
msgid "Transparency unit"
msgstr ""
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, fuzzy, no-c-format
msgid "Negative film"
msgstr "Negativ Film"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, fuzzy, no-c-format
msgid "Positive or negative film"
msgstr "Lysbilde Film"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr ""
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr ""
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, no-c-format
msgid "Transparency ratio"
msgstr ""
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, fuzzy, no-c-format
msgid "Select film type"
msgstr "Filmtype"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, no-c-format
msgid "Select the film type"
msgstr ""
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr ""
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr ""
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
msgstr ""
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr ""
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, no-c-format
+msgid "Card Front"
+msgstr ""
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, no-c-format
+msgid "Card Duplex"
+msgstr ""
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Rød"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Grønn"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Blå"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Forbedring"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Forbedring"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Forbedring"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Ingen"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr ""
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr ""
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr ""
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr ""
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Lysbilde Film"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Negativ Film"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Fokuser på glasset"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Fokuser 2.5mm over glasset"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr ""
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr ""
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr ""
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr ""
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr ""
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr ""
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr ""
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Tekst Fremhevings Teknologi"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Last ned mønster A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Last ned mønster B"
@@ -1700,7 +1711,7 @@ msgstr "Last ned mønster B"
msgid "No Correction"
msgstr "Ingen korrigering"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Brukerdefinert"
@@ -1725,33 +1736,33 @@ msgstr "Blekkskrivere"
msgid "CRT monitors"
msgstr ""
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Standard"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Høy densitets utskrift"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "lav densitets utskrift"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Høy kontrasts utskrift"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Brukerdefinert (Gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Brukerdefinert (Gamma=1.8)"
@@ -1791,254 +1802,254 @@ msgstr ""
msgid "Max"
msgstr "Maks"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr ""
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr ""
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr ""
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr ""
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr ""
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Skarphet"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Farge korreksjon"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Farge korreksjons koeffisienter"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr ""
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr ""
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr ""
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr ""
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr ""
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr ""
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr ""
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Kontrollerer grønn-nivå"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Legger til rødt basert på grønn-nivå"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Legger til blått basert på grønn-nivå"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Legger til grønt basert på rød-nivå"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Kontrollerer rød-nivå"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Legger til blått basert på rød-nivå"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Legger til grønt basert på blå-nivå"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Legger til rødt basert på blå-nivå"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Kontrollerer blå-nivå"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Speil bildet"
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Rask forvisning"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Automatisk oppdeling av areal i delareal"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Kort liste over oppløsninger"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Vis kort liste over oppløsninger"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr ""
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr ""
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr ""
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Tilleggsutstyr"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Utløs"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Utløs arket i ADF"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Automatisk utløsning"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Løs ut dokoment etter skanning"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr ""
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr ""
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr ""
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr ""
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
"the user defined table, which can be downloaded to the scanner"
msgstr ""
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Fokuseringposisjon"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr ""
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Vent på knappen"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2047,262 +2058,340 @@ msgstr ""
"Etter at kommandoen for skan er sendt, vent til skannerens knapp "
"ertrykket før skanings prossesen startes."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, fuzzy, no-c-format
msgid "Positive Slide"
msgstr "Lysbilde Film"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, fuzzy, no-c-format
msgid "Negative Slide"
msgstr "Negativ Film"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "Brukerdefinert"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr ""
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr ""
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr ""
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, no-c-format
msgid "Diffusion"
msgstr ""
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Hvitnivå"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Svartnivå"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, no-c-format
msgid "Continue"
msgstr ""
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr ""
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, no-c-format
msgid "Horizontal bold"
msgstr ""
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, no-c-format
msgid "Horizontal narrow"
msgstr ""
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr ""
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, no-c-format
msgid "Vertical bold"
msgstr ""
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, no-c-format
msgid "Front"
msgstr ""
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr ""
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, no-c-format
msgid "Threshold curve"
msgstr ""
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr ""
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
"than the vertical resolution this disables horizontal interpolation."
msgstr ""
-#: ../backend/genesys.c:6235
+#: ../backend/genesys.c:5869
#, fuzzy, no-c-format
-msgid "Color Filter"
+msgid "Color filter"
msgstr "Fargestrektegning"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Kalibrering"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Kvalitets kalibrering"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Kalibrering"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, fuzzy, no-c-format
msgid "Lamp off time"
msgstr "Lampe av"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
"of 0 means, that the lamp won't be turned off."
msgstr ""
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Grov kalibrering"
+
+#: ../backend/genesys.c:5941
+#, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr ""
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, fuzzy, no-c-format
msgid "File button"
msgstr "Vent på knappen"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, fuzzy, no-c-format
msgid "Power button"
msgstr "Vent på knappen"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Vent på knappen"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Grov kalibrering"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Grov kalibrering kun for første skan"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, fuzzy, no-c-format
msgid "Buttons"
msgstr "Knappstatus"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, fuzzy, no-c-format
msgid "Calibrate"
msgstr "Kalibrering"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, fuzzy, no-c-format
msgid "Start calibration using special sheet"
msgstr "Grov kalibrering"
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, fuzzy, no-c-format
msgid "Clear calibration"
msgstr "Grov kalibrering"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, fuzzy, no-c-format
msgid "Clear calibration cache"
msgstr "Kalibrering"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr ""
@@ -2420,7 +2509,7 @@ msgstr ""
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2561,12 +2650,12 @@ msgstr ""
msgid "This option reflects a front panel scanner button"
msgstr ""
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr ""
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr ""
@@ -2591,17 +2680,17 @@ msgstr "Lampe av"
msgid "Hardware internal Y position of the scanning area."
msgstr "venstre topp x posisjon av skan-areal"
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr ""
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr ""
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr ""
@@ -2709,8 +2798,8 @@ msgstr "Treig"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr ""
@@ -3041,9 +3130,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, no-c-format
msgid "continuous"
@@ -3340,7 +3429,7 @@ msgstr ""
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr ""
@@ -3407,16 +3496,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3427,16 +3506,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3505,7 +3574,7 @@ msgstr "Forbedring"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3673,7 +3742,7 @@ msgstr "Grønn"
msgid "Sets gray channel gain"
msgstr "Kontrast grønnkanal"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, fuzzy, no-c-format
msgid "Red gain"
@@ -3684,7 +3753,7 @@ msgstr "Rødbalanse"
msgid "Sets red channel gain"
msgstr "Kontrast rødkanal"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, fuzzy, no-c-format
msgid "Green gain"
@@ -3695,7 +3764,7 @@ msgstr "Grønn"
msgid "Sets green channel gain"
msgstr "Kontrast grønnkanal"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, fuzzy, no-c-format
msgid "Blue gain"
@@ -3787,7 +3856,7 @@ msgstr "En side"
msgid "All pages"
msgstr "Alle sider"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr ""
@@ -3858,12 +3927,12 @@ msgstr ""
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr ""
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Kvalitetsskan"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Høyest kvalitet men laver hastighet"
@@ -4283,12 +4352,39 @@ msgid ""
"40 seconds warm-up time."
msgstr ""
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Negativ Film"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negativ"
+
+#: ../backend/pixma.c:396
+#, no-c-format
+msgid "48 bits color"
+msgstr ""
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr ""
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4296,198 +4392,218 @@ msgid ""
"cancel, press \"GRAY\" button."
msgstr ""
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, fuzzy, no-c-format
msgid "Update button state"
msgstr "Knappstatus"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, fuzzy, no-c-format
msgid "Button 1"
msgstr "Knappstatus"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, fuzzy, no-c-format
msgid "Button 2"
msgstr "Knappstatus"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr ""
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr ""
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr ""
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr ""
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, fuzzy, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Grov kalibrering"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr ""
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, fuzzy, no-c-format
msgid "Calibration data cache"
msgstr "Kalibrering"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr ""
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, fuzzy, no-c-format
msgid "Performs calibration"
msgstr "Grov kalibrering"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr ""
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr ""
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, fuzzy, no-c-format
msgid "Warmup-time"
msgstr "Varmopp lampe"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, fuzzy, no-c-format
msgid "Warmup-time in seconds."
msgstr "Varmopp lampe"
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, fuzzy, no-c-format
msgid "Lampoff-time"
msgstr "Lampe av"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, fuzzy, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Varmopp lampe"
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr ""
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, fuzzy, no-c-format
msgid "Red offset"
msgstr "Lampe av"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, fuzzy, no-c-format
msgid "Green offset"
msgstr "Lampe av"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, fuzzy, no-c-format
msgid "Blue offset"
msgstr "Lampe av"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, fuzzy, no-c-format
msgid "Red lamp off"
msgstr "Lampe av"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, fuzzy, no-c-format
msgid "Green lamp off"
msgstr "Lampe av"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, fuzzy, no-c-format
msgid "Blue lamp off"
msgstr "Lampe av"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr ""
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Farge 36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr ""
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr ""
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr ""
@@ -4534,7 +4650,7 @@ msgstr "Håndskanner simulering"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
#: ../backend/pnm.c:283
@@ -4657,29 +4773,29 @@ msgid ""
"after sane_read() has been called."
msgstr ""
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr ""
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Lampe på"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Slå på skanner lampen"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Lampe av"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4700,42 +4816,42 @@ msgstr ""
msgid "Threshold value for lineart mode"
msgstr ""
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Dokumentmater"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr ""
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr ""
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr ""
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr ""
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr ""
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr ""
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4745,36 +4861,81 @@ msgid ""
"frontends may stop responding to X events and your system could bog down."
msgstr ""
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Løs ut dokoment etter skanning"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr ""
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
"combination of speed and detail."
msgstr ""
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr ""
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
"like."
msgstr ""
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "Fra papir"
+
+#: ../backend/snapscan-options.c:897
+#, no-c-format
+msgid "Focus-mode"
+msgstr ""
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Automatisk utløsning"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Fokuseringposisjon"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Fokuseringposisjon"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr ""
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr ""
@@ -4846,7 +5007,7 @@ msgstr ""
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
diff --git a/po/nl.po b/po/nl.po
index a8df7d3..39c40ff 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -4,16 +4,16 @@
# Martin Kho <mkho@xs4all.nl>, 2003, 2009.
# Bertrik Sikken <bertrik@zonnet.nl>, 2003.
# Martin Kho <mdlkho@gmail.com>, 2010.
-# Martin Kho <mkho@dds.nl>, 2011, 2012, 2013.
+# Martin Kho <mkho@dds.nl>, 2011, 2012, 2013, 2015.
msgid ""
msgstr ""
"Project-Id-Version: sane-backends.nl\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-23 22:53+0200\n"
-"PO-Revision-Date: 2013-09-24 09:46+0200\n"
+"POT-Creation-Date: 2015-09-24 23:43+0200\n"
+"PO-Revision-Date: 2015-09-28 15:48+0200\n"
"Last-Translator: Martin Kho <mkho@dds.nl>\n"
"Language-Team: American English <sane-devel@lists.alioth.debian.org>\n"
-"Language: en_US\n"
+"Language: nl_NL\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -31,8 +31,8 @@ msgid "Standard"
msgstr "Standaard"
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1281
-#: ../backend/genesys.c:5472 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
@@ -50,13 +50,13 @@ msgid "Geometry"
msgstr "Geometrie"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1498 ../backend/genesys.c:5532
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:854
+#: ../backend/niash.c:754 ../backend/plustek.c:854
#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
@@ -65,9 +65,9 @@ msgstr "Geometrie"
msgid "Enhancement"
msgstr "Kleurverbetering"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1206 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2825
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
@@ -86,7 +86,7 @@ msgstr "Voorbeeldscan"
#: ../include/sane/saneopts.h:163
#, no-c-format
msgid "Force monochrome preview"
-msgstr "Voorbeeldscan in grijs"
+msgstr "Dwing monochroom voorbeeldscan"
#: ../include/sane/saneopts.h:164
#, no-c-format
@@ -117,22 +117,22 @@ msgstr "Dwing \"backtracking\""
#: ../include/sane/saneopts.h:169
#, no-c-format
msgid "Top-left x"
-msgstr "Links"
+msgstr "Linksboven x"
#: ../include/sane/saneopts.h:170
#, no-c-format
msgid "Top-left y"
-msgstr "Boven"
+msgstr "Linksboven y"
#: ../include/sane/saneopts.h:171
#, no-c-format
msgid "Bottom-right x"
-msgstr "Rechts"
+msgstr "Rechtsonder x"
#: ../include/sane/saneopts.h:172
#, no-c-format
msgid "Bottom-right y"
-msgstr "Onder"
+msgstr "Rechtsonder y"
#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
#: ../backend/pixma_sane_options.c:298
@@ -163,7 +163,7 @@ msgstr "Pagina hoogte"
#: ../include/sane/saneopts.h:178
#, no-c-format
msgid "Use custom gamma table"
-msgstr "Gebruik de interne gammatabel van de scanner"
+msgstr "Gebruik door de gebruiker gedefinieerde gammatabel"
#: ../include/sane/saneopts.h:179
#, no-c-format
@@ -208,27 +208,29 @@ msgstr "Halftoonmodus"
#: ../include/sane/saneopts.h:187
#, no-c-format
msgid "Black level"
-msgstr "Waarde voor zwart"
+msgstr "Zwartwaarde"
#: ../include/sane/saneopts.h:188
#, no-c-format
msgid "White level"
-msgstr "Waarde voor wit"
+msgstr "Witwaarde"
#: ../include/sane/saneopts.h:189
#, no-c-format
msgid "White level for red"
-msgstr "Waarde voor wit voor rood"
+msgstr "Witwaarde voor rood"
#: ../include/sane/saneopts.h:190
#, no-c-format
msgid "White level for green"
-msgstr "Waarde voor wit voor groen"
+msgstr ""
+"Witwaarde "
+"voor groen"
#: ../include/sane/saneopts.h:191
#, no-c-format
msgid "White level for blue"
-msgstr "Waarde voor wit voor blauw"
+msgstr "Witwaarde voor blauw"
#: ../include/sane/saneopts.h:192
#, no-c-format
@@ -253,27 +255,27 @@ msgstr "Schaduw voor blauw"
#: ../include/sane/saneopts.h:196
#, no-c-format
msgid "Highlight"
-msgstr "Contrast"
+msgstr "Lichteffect"
#: ../include/sane/saneopts.h:197
#, no-c-format
msgid "Highlight for red"
-msgstr "Roodcontrast"
+msgstr "Lichteffect voor rood"
#: ../include/sane/saneopts.h:198
#, no-c-format
msgid "Highlight for green"
-msgstr "Groencontrast"
+msgstr "Lichteffect voor groen"
#: ../include/sane/saneopts.h:199
#, no-c-format
msgid "Highlight for blue"
-msgstr "Blauwcontrast"
+msgstr "Lichteffect voor blauw"
#: ../include/sane/saneopts.h:200
#, no-c-format
msgid "Hue"
-msgstr "Kleurschakering"
+msgstr "Tint"
#: ../include/sane/saneopts.h:201
#, no-c-format
@@ -402,7 +404,7 @@ msgstr "Belichtingstijd voor het scannen van blauw"
#: ../include/sane/saneopts.h:227
#, no-c-format
msgid "Set exposure-time"
-msgstr "Bepaal belichtingstijd"
+msgstr "Stel belichtingstijd in"
#: ../include/sane/saneopts.h:228
#, no-c-format
@@ -417,7 +419,7 @@ msgstr "Lichtwaarde bij het scannen"
#: ../include/sane/saneopts.h:230
#, no-c-format
msgid "Set lamp density"
-msgstr "Bepaal lichtwaarde"
+msgstr "Stel lichtwaarde in"
#: ../include/sane/saneopts.h:231 ../backend/umax.c:5829
#, no-c-format
@@ -430,7 +432,7 @@ msgid ""
"Read-only option that specifies how many options a specific devices "
"supports."
msgstr ""
-"Alleen-lezen optie, die aangeeft hoeveel opties een apparaat ondersteund."
+"Alleen-lezen optie, die aangeeft hoeveel opties een apparaat ondersteunt."
#: ../include/sane/saneopts.h:248
#, no-c-format
@@ -450,7 +452,7 @@ msgstr "Opties voor beeldaanpassing"
#: ../include/sane/saneopts.h:251
#, no-c-format
msgid "Hardware specific options"
-msgstr "Hardware-opties"
+msgstr "Hardware specifieke opties"
#: ../include/sane/saneopts.h:252
#, no-c-format
@@ -469,7 +471,7 @@ msgid ""
"scanner this cuts down the number of passes to one and on a one-pass "
"scanner, it reduces the memory requirements and scan-time of the preview."
msgstr ""
-"Legt vast dat alle voorbeeldscans in grijswaardenmodus worden "
+"Legt vast dat alle voorbeeldscans in grijswaardemodus worden "
"uitgevoerd. Bij een Three-Pass-Scanner is daardoor slechts één doorgang "
"nodig, bij een Single-Pass-Scanner wordt het geheugengebruik en de "
"scantijd verminderd."
@@ -486,17 +488,17 @@ msgstr ""
#: ../include/sane/saneopts.h:268
#, no-c-format
msgid "Selects the scan mode (e.g., lineart, monochrome, or color)."
-msgstr "Kiest de scanmodus (b.v. zwart/wit, grijs of kleur)."
+msgstr "Kiest de scanmodus (b.v. zwart/wit, monochroom of kleur)."
#: ../include/sane/saneopts.h:271
#, no-c-format
msgid "Determines the speed at which the scan proceeds."
-msgstr "Legt de scansnelheid vast."
+msgstr "Bepaald de snelheid waarmee wordt gescand."
#: ../include/sane/saneopts.h:274
#, no-c-format
msgid "Selects the scan source (such as a document-feeder)."
-msgstr "Selecteert de scanbron (zoals b.v. dokumentendoorvoer)."
+msgstr "Selecteert de scanbron (zoals b.v. een documentendoorvoer)."
#: ../include/sane/saneopts.h:277
#, no-c-format
@@ -506,22 +508,22 @@ msgstr "Regelt dat \"backtracking\" wordt gebruikt."
#: ../include/sane/saneopts.h:280
#, no-c-format
msgid "Top-left x position of scan area."
-msgstr "Linkerkant van het scanoppervlak."
+msgstr "Linksboven x positie van het scanoppervlak."
#: ../include/sane/saneopts.h:283
#, no-c-format
msgid "Top-left y position of scan area."
-msgstr "Bovenkant van het scanoppervlak."
+msgstr "Linksboven y positie van het scanoppervlak."
#: ../include/sane/saneopts.h:286
#, no-c-format
msgid "Bottom-right x position of scan area."
-msgstr "Rechterkant van het scanoppervlak."
+msgstr "Rechtsonder x positie van het scanoppervlak."
#: ../include/sane/saneopts.h:289
#, no-c-format
msgid "Bottom-right y position of scan area."
-msgstr "Onderkant van het scanoppervlak."
+msgstr "Rechtsonder y positie van het scanoppervlak."
#: ../include/sane/saneopts.h:292
#, no-c-format
@@ -567,8 +569,8 @@ msgid ""
"gamma table)."
msgstr ""
"Gammacorrectietabel. In kleurmodus beïnvloedt deze optie tegelijkertijd "
-"de rode, groene en blauwe kleurcomponenten. Het is ook een helderheids-"
-"gammatabel."
+"de rode, groene en blauwe kleurcomponenten. (d.w.z. Het is een helderheids-"
+"gammatabel)."
#: ../include/sane/saneopts.h:317
#, no-c-format
@@ -588,12 +590,12 @@ msgstr "Gammacorrectietabel voor de blauwe component."
#: ../include/sane/saneopts.h:326
#, no-c-format
msgid "Controls the brightness of the acquired image."
-msgstr "Regelt de helderheid van het gescande beeld."
+msgstr "Regelt de helderheid van het verkregen beeld."
#: ../include/sane/saneopts.h:329
#, no-c-format
msgid "Controls the contrast of the acquired image."
-msgstr "Regelt het contrast van het gescande beeld."
+msgstr "Regelt het contrast van het verkregen beeld."
#: ../include/sane/saneopts.h:332
#, no-c-format
@@ -601,13 +603,13 @@ msgid ""
"Selects the \"graininess\" of the acquired image. Smaller values result "
"in sharper images."
msgstr ""
-"Bepaalt de \"gekorreldheid\" van het gescande beeld. Kleine waarden "
-"leiden tot een scherper beeld."
+"Bepaalt de \"gekorreldheid\" van het verkregen beeld. Kleine waarden "
+"zorgen voor een scherper beeld."
#: ../include/sane/saneopts.h:336
#, no-c-format
msgid "Selects whether the acquired image should be halftoned (dithered)."
-msgstr "Bepaalt of het beeld in de halftoonmodus (dithered) wordt gescand."
+msgstr "Bepaalt of een halftoon beeld (dithered) wordt verkregen."
#: ../include/sane/saneopts.h:339 ../include/sane/saneopts.h:354
#, no-c-format
@@ -623,69 +625,63 @@ msgstr "Bepaalt welke helderheidswaarde als \"wit\" moet worden beschouwd."
#, no-c-format
msgid "Selects what red radiance level should be considered \"white\"."
msgstr ""
-"Bepaalt welke helderheidswaarde van de rode component als \"wit\" moet "
-"worden beschouwd."
+"Bepaalt welke rode helderheidswaarde als \"wit\" moet worden beschouwd."
#: ../include/sane/saneopts.h:348
#, no-c-format
msgid "Selects what green radiance level should be considered \"white\"."
msgstr ""
-"Bepaalt welke helderheidswaarde van de groene component als \"wit\" moet "
-"worden beschouwd."
+"Bepaalt welke groene helderheidswaarde als \"wit\" moet worden beschouwd."
#: ../include/sane/saneopts.h:351
#, no-c-format
msgid "Selects what blue radiance level should be considered \"white\"."
msgstr ""
-"Bepaalt welke helderheidswaarde van de blauwe component als \"wit\" moet "
-"worden beschouwd."
+"Bepaalt welke blauwe helderheidswaarde als \"wit\" moet worden beschouwd."
#: ../include/sane/saneopts.h:356
#, no-c-format
msgid "Selects what red radiance level should be considered \"black\"."
msgstr ""
-"Bepaalt welke helderheidswaarde van de rode component als \"zwart\" moet "
-"worden beschouwd."
+"Bepaalt welke rode helderheidswaarde als \"zwart\" moet worden beschouwd."
#: ../include/sane/saneopts.h:358
#, no-c-format
msgid "Selects what green radiance level should be considered \"black\"."
msgstr ""
-"Bepaalt welke helderheidswaarde van de groene component als \"zwart\" "
-"moet worden beschouwd."
+"Bepaalt welke groene helderheidswaarde als \"zwart\" moet worden beschouwd."
#: ../include/sane/saneopts.h:360
#, no-c-format
msgid "Selects what blue radiance level should be considered \"black\"."
msgstr ""
-"Bepaalt welke helderheidswaarde van de blauwe component als \"zwart\" "
-"moet worden beschouwd."
+"Bepaalt welke blauwe helderheidswaarde als \"zwart\" moet worden beschouwd."
#: ../include/sane/saneopts.h:365
#, no-c-format
msgid "Selects what red radiance level should be considered \"full red\"."
msgstr ""
-"Bepaalt welke helderheidswaarde van de rode component als \"verzadigd "
-"rood\" moet worden beschouwd."
+"Bepaalt welke rode helderheidswaarde als \"verzadigd rood\" moet worden "
+"beschouwd."
#: ../include/sane/saneopts.h:367
#, no-c-format
msgid "Selects what green radiance level should be considered \"full green\"."
msgstr ""
-"Bepaalt welke helderheidswaarde van de groene component als \"verzadigd "
-"groen\" moet worden beschouwd."
+"Bepaalt welke groene helderheidswaarde als \"verzadigd groen\" moet worden "
+"beschouwd."
#: ../include/sane/saneopts.h:370
#, no-c-format
msgid "Selects what blue radiance level should be considered \"full blue\"."
msgstr ""
-"Bepaalt welke helderheidswaarde van de blauwe component als \"verzadigd "
-"blauw\" moet worden beschouwd."
+"Bepaalt welke blauwe helderheidswaarde als \"verzadigd blauw\" moet worden "
+"beschouwd."
#: ../include/sane/saneopts.h:374
#, no-c-format
msgid "Controls the \"hue\" (blue-level) of the acquired image."
-msgstr "Regelt de kleurschakering (blauwniveau) van het gescande beeld."
+msgstr "Regelt de \"tint\" (blauwwaarde) van het verkregen beeld."
#: ../include/sane/saneopts.h:377
#, no-c-format
@@ -693,7 +689,7 @@ msgid ""
"The saturation level controls the amount of \"blooming\" that occurs "
"when acquiring an image with a camera. Larger values cause more blooming."
msgstr ""
-"De verzadigingsgraad stuurt de \"kleuring\" van een met een camera "
+"De verzadigingsgraad bepaalt de \"kleuring\" van een met een camera "
"opgenomen beeld. Hogere waarden zorgen voor een sterkere kleuring."
#: ../include/sane/saneopts.h:382
@@ -707,29 +703,31 @@ msgid ""
"Sets the size of the halftoning (dithering) pattern used when scanning "
"halftoned images."
msgstr ""
-"Stelt de grootte van de \"dithering\" in die wordt gebruikt om halftoon "
+"Stelt het halftoon patroon (dithering) in dat wordt gebruikt om halftoon "
"beelden te scannen."
#: ../include/sane/saneopts.h:389
#, no-c-format
msgid ""
"Defines the halftoning (dithering) pattern for scanning halftoned images."
-msgstr "Definieert de dithering waarmee halftoon beelden worden gescand."
+msgstr ""
+"Definieert het halftoon patroon (dithering) waarmee halftoon beelden worden "
+"gescand."
#: ../include/sane/saneopts.h:393
#, no-c-format
msgid "Use same values for X and Y resolution"
-msgstr "Gebruik dezelfde resoluties voor X en Y."
+msgstr "Gebruik dezelfde waarden voor X en Y resoluties."
#: ../include/sane/saneopts.h:395
#, no-c-format
msgid "Swap black and white"
-msgstr "Wissel zwart en wit (inverteren)."
+msgstr "Verwissel zwart en wit (inverteren)."
#: ../include/sane/saneopts.h:397
#, no-c-format
msgid "Do a quality white-calibration"
-msgstr "Kalibreer de wit-kwaliteit."
+msgstr "Voer een kwaliteit wit-kalibratie uit"
#: ../include/sane/saneopts.h:399
#, no-c-format
@@ -744,7 +742,7 @@ msgstr "Gebruik in RGB-modus voor alle kleuren dezelfde waarden"
#: ../include/sane/saneopts.h:403
#, no-c-format
msgid "Select minimum-brightness to get a white point"
-msgstr "Kiest de minimale helderheid waarmee wit wordt verkregen"
+msgstr "Kiest de minimale helderheid waarmee witte punt wordt verkregen"
#: ../include/sane/saneopts.h:405
#, no-c-format
@@ -774,42 +772,42 @@ msgstr "Warm de lamp op alvorens te scannen"
#: ../include/sane/saneopts.h:417
#, no-c-format
msgid "Define exposure-time for calibration"
-msgstr "Bepaalt de belichtingstijd voor de kalibrering"
+msgstr "Bepaal de belichtingstijd voor de kalibratie"
#: ../include/sane/saneopts.h:419
#, no-c-format
msgid "Define exposure-time for red calibration"
-msgstr "Bepaalt de belichtingstijd voor de kalibrering van de rode component"
+msgstr "Bepaal de belichtingstijd voor de kalibratie van de rode component"
#: ../include/sane/saneopts.h:421
#, no-c-format
msgid "Define exposure-time for green calibration"
-msgstr "Bepaalt de belichtingstijd voor de kalibrering van de groen component"
+msgstr "Bepaal de belichtingstijd voor de kalibratie van de groene component"
#: ../include/sane/saneopts.h:423
#, no-c-format
msgid "Define exposure-time for blue calibration"
-msgstr "Bepaalt de belichtingstijd voor de kalibrering van de blauwe component"
+msgstr "Bepaal de belichtingstijd voor de kalibratie van de blauwe component"
#: ../include/sane/saneopts.h:425
#, no-c-format
msgid "Define exposure-time for scan"
-msgstr "Bepaalt de belichtingstijd voor de scan"
+msgstr "Bepaal de belichtingstijd voor de scan"
#: ../include/sane/saneopts.h:427
#, no-c-format
msgid "Define exposure-time for red scan"
-msgstr "Bepaalt de belichtingstijd voor de scan van de rode component"
+msgstr "Bepaal de belichtingstijd voor de scan van de rode component"
#: ../include/sane/saneopts.h:429
#, no-c-format
msgid "Define exposure-time for green scan"
-msgstr "Bepaalt de belichtingstijd voor de scan van de groene component"
+msgstr "Bepaal de belichtingstijd voor de scan van de groene component"
#: ../include/sane/saneopts.h:431
#, no-c-format
msgid "Define exposure-time for blue scan"
-msgstr "Bepaalt de belichtingstijd voor de scan van de blauwe component"
+msgstr "Bepaal de belichtingstijd voor de scan van de blauwe component"
#: ../include/sane/saneopts.h:433
#, no-c-format
@@ -819,17 +817,17 @@ msgstr "Schakelt de instelling van de belichtingstijd in"
#: ../include/sane/saneopts.h:435
#, no-c-format
msgid "Define lamp density for calibration"
-msgstr "Definieer de lichthoeveelheid waarmee wordt gekalibreerd"
+msgstr "Bepaal de lichthoeveelheid waarmee wordt gekalibreerd"
#: ../include/sane/saneopts.h:437
#, no-c-format
msgid "Define lamp density for scan"
-msgstr "Definieer de lichthoeveelheid waarmee wordt gescand"
+msgstr "Bepaal de lichthoeveelheid waarmee wordt gescand"
#: ../include/sane/saneopts.h:439
#, no-c-format
msgid "Enable selection of lamp density"
-msgstr "Schakelt de keuze van de lichthoeveelheid in"
+msgstr "Schakelt de instelling van de lichthoeveelheid in"
#: ../include/sane/saneopts.h:441 ../backend/umax.c:5830
#, no-c-format
@@ -839,7 +837,7 @@ msgstr "Schakel de lamp uit als het programma wordt verlaten"
#: ../include/sane/saneopts.h:444
#, no-c-format
msgid "Scan button"
-msgstr "Scannerknop"
+msgstr "Scan-knop"
#: ../include/sane/saneopts.h:445
#, no-c-format
@@ -884,12 +882,12 @@ msgstr "Kleur"
#: ../include/sane/saneopts.h:455
#, no-c-format
msgid "Color Lineart"
-msgstr "Kleurenlijntekening"
+msgstr "Kleur lijntekening"
#: ../include/sane/saneopts.h:456
#, no-c-format
msgid "Color Halftone"
-msgstr "Halftoon kleur"
+msgstr "Kleur Halftoon"
#: ../include/sane/saneopts.h:457
#, no-c-format
@@ -929,7 +927,7 @@ msgstr "Apparaat is bezet"
#: ../backend/sane_strstatus.c:71
#, no-c-format
msgid "Invalid argument"
-msgstr "Ongeldige aanname"
+msgstr "Ongeldige waarde"
#: ../backend/sane_strstatus.c:74
#, no-c-format
@@ -964,7 +962,7 @@ msgstr "Geheugen vol"
#: ../backend/sane_strstatus.c:92
#, no-c-format
msgid "Access to resource has been denied"
-msgstr "Toegang tot bron gewijgerd"
+msgstr "Toegang tot bron is geweigerd"
#: ../backend/sane_strstatus.c:96
#, no-c-format
@@ -984,7 +982,7 @@ msgstr "Standaardinstellingen"
#: ../backend/artec_eplus48u.c:2876
#, no-c-format
msgid "Set default values for enhancement controls."
-msgstr "Kies standaardwaarden om verbeteropties te krijgen."
+msgstr "Stel standaardwaarden in om verbeteropties te krijgen."
#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
@@ -1019,34 +1017,34 @@ msgid ""
"or from the configuration file, are used."
msgstr ""
"Indien ingeschakeld, wordt tijdens het kalibreren alleen de schaduw-"
-"correctie uitgevoerd. De standaard waarden voor bereik, beginpositie en "
-"belichtingstijd bepaald door de hardware of door het "
-"configuratiebestand, worden gebruikt."
+"correctie uitgevoerd. De standaard waarden voor bereik, compensatie en "
+"belichtingstijd bepaald door de hardware of het configuratiebestand, "
+"worden gebruikt."
#: ../backend/artec_eplus48u.c:2967
#, no-c-format
msgid "Button state"
-msgstr "Stand van de knop"
+msgstr "Status van de knop"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
-msgstr "Aantal te scannen beelden"
+msgstr "Nummer van het te scannen scannerraam"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
-msgstr "Kiest het aantal te scannen beelden"
+msgstr "Kiest het nummer van het te scannen scannerraam"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
-msgstr "Dubbelzijdig scannen"
+msgstr "Dubbelzijdige scan"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid "Duplex scan provide a scan of the front and back side of the document"
-msgstr "Dubbelzijdig scannen scant beide zijden van een document"
+msgstr "Dubbelzijdige scan scant beide zijden van een document"
#: ../backend/canon630u.c:159
#, no-c-format
@@ -1056,7 +1054,7 @@ msgstr "Kalibreer scanner"
#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
-msgstr "Forceer kalibreren voor het scannen"
+msgstr "Dwing te kalibreren voor het scannen"
#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
@@ -1099,7 +1097,7 @@ msgstr "Ongecomprimeerd"
#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
-msgstr "Prachtige kleuren"
+msgstr "Fraaie kleuren"
#: ../backend/canon.c:169
#, no-c-format
@@ -1109,7 +1107,7 @@ msgstr "Ongecorrigeerde transparantie"
#: ../backend/canon.c:170 ../backend/canon-sane.c:680
#, no-c-format
msgid "Correction according to film type"
-msgstr "Correctie volgens filmtype"
+msgstr "Correctie op basis van filmtype"
#: ../backend/canon.c:171 ../backend/canon-sane.c:674
#, no-c-format
@@ -1161,12 +1159,12 @@ msgstr "onbekend"
#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
-msgstr "Opstopping in ADF"
+msgstr "Opstopping in automatische documentinvoer"
#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
-msgstr "Deksel van ADF open"
+msgstr "Deksel van automatische documentinvoer open"
#: ../backend/canon.c:394
#, no-c-format
@@ -1181,33 +1179,32 @@ msgstr "fout in positionering van scannerkop"
#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
-msgstr "fout in controle van processor"
+msgstr "fout bij controle van processor"
#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
-msgstr "fout in controle van het RAM geheugen"
+msgstr "fout bij controle van het RAM geheugen"
#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
-msgstr "fout in controle van het ROM geheugen"
+msgstr "fout bij controle van het ROM geheugen"
#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
-msgstr "fout in controle van de hardware"
+msgstr "fout bij controle van de hardware"
#: ../backend/canon.c:412
#, no-c-format
msgid "transparency unit lamp failure"
-msgstr "lampfalen van de transparenten eenheid"
+msgstr "lampfalen van de transparanten eenheid"
#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
-msgstr ""
-"fout in de positionering van de scannerkop van de transparanten eenheid"
+msgstr "fout in de positionering van de scannerkop in de transparanten eenheid"
#: ../backend/canon.c:429
#, no-c-format
@@ -1287,12 +1284,12 @@ msgstr "fout in SCSI pariteit"
#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
-msgstr "foutboodschap ontvangen: initiator gesignaleerd"
+msgstr "Door initiator gesignaleerde foutboodschap ontvangen"
#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
-msgstr "ongeldige boodschap"
+msgstr "ongeldige boodschap fout"
#: ../backend/canon.c:518
#, no-c-format
@@ -1322,8 +1319,8 @@ msgstr "Filmscanner"
msgid "flatbed scanner"
msgstr "Flatbedscanner"
-#: ../backend/canon.c:1183 ../backend/epson.c:3372
-#: ../backend/epson2.c:1355
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Filmtype"
@@ -1346,7 +1343,7 @@ msgstr "Selecteert het negatief filmtype"
#: ../backend/canon.c:1236
#, no-c-format
msgid "Hardware resolution"
-msgstr "hardware resolutie"
+msgstr "Hardware resolutie"
#: ../backend/canon.c:1237
#, no-c-format
@@ -1376,7 +1373,7 @@ msgstr "Eén keer autofocus"
#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
-msgstr "Doe alleen autofocus tussen uitworpen"
+msgstr "Voer alleen een autofocus uit tussen uitworpen"
#: ../backend/canon.c:1345
#, no-c-format
@@ -1398,8 +1395,8 @@ msgstr "Scanmarges"
msgid "Extra color adjustments"
msgstr "Extra kleuraanpassingen"
-#: ../backend/canon.c:1538 ../backend/epson.c:3191
-#: ../backend/epson2.c:1245 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
@@ -1413,12 +1410,12 @@ msgstr "Spiegel het beeld horizontaal"
#: ../backend/canon.c:1608
#, no-c-format
msgid "Auto exposure"
-msgstr "Atomatische belichtingstijd"
+msgstr "Automatische belichting"
#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
-msgstr "Schakel de automatische belichtingstijd aan/uit"
+msgstr "Schakel de automatische belichtingsoptie aan/uit"
#: ../backend/canon.c:1625
#, no-c-format
@@ -1458,24 +1455,23 @@ msgstr "Gemiddeld gebruik"
#: ../backend/canon.c:1668
#, no-c-format
msgid "Eject film after each scan"
-msgstr "Werp de film uit na iedere scan"
+msgstr "Werp de film uit na elke scan"
#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
-msgstr "Werp de film automatisch uit de scanner na iedere scan"
+msgstr "Werp de film automatisch uit de scanner na elke scan"
#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
-msgstr "Werp de film uit voor het verlaten van het programma"
+msgstr "Werp de film uit voor het programma wordt verlaten"
#: ../backend/canon.c:1681
#, no-c-format
msgid "Automatically eject the film from the device before exiting the program"
msgstr ""
-"Werp automatisch de film uit de scanner voor het verlaten van het "
-"programma"
+"Werp de film automatisch uit de scanner voor het programma wordt verlaten"
#: ../backend/canon.c:1690
#, no-c-format
@@ -1500,7 +1496,7 @@ msgstr "Alleen flatbed"
#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
-msgstr "Schakel automatische documentendoorvoor uit en gebruik alleen flatbed"
+msgstr "Schakel automatische documentinvoer uit en gebruik alleen flatbed"
#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, no-c-format
@@ -1547,12 +1543,12 @@ msgstr "Selecteert filmtype"
msgid "Select the film type"
msgstr "Selecteert het filmtype"
-#: ../backend/canon_dr.c:344 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:114 ../backend/fujitsu.c:604
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:167 ../backend/mustek.c:156
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
@@ -1560,71 +1556,86 @@ msgstr "Selecteert het filmtype"
msgid "Flatbed"
msgstr "Flatbed"
-#: ../backend/canon_dr.c:345 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:605 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
-msgstr "Voorkant van de ADF"
+msgstr "Automatische documentinvoer voorzijde"
-#: ../backend/canon_dr.c:346 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:606 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
-msgstr "Achterkant van de ADF"
+msgstr "Automatische documentinvoer achterzijde"
-#: ../backend/canon_dr.c:347 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:607 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
-msgstr "Dubbelzijdige ADF"
+msgstr "Automatische documentinvoer dubbelzijdig"
-#: ../backend/canon_dr.c:354 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:200
-#: ../backend/fujitsu.c:624 ../backend/genesys.c:89
+#: ../backend/canon_dr.c:392
+#, no-c-format
+msgid "Card Front"
+msgstr "Kaart voorzijde"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr "Kaart achterzijde"
+
+#: ../backend/canon_dr.c:394
+#, no-c-format
+msgid "Card Duplex"
+msgstr "Kaart dubbelzijdig"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Rood"
-#: ../backend/canon_dr.c:355 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:201
-#: ../backend/fujitsu.c:625 ../backend/genesys.c:90
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Groen"
-#: ../backend/canon_dr.c:356 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:202
-#: ../backend/fujitsu.c:626 ../backend/genesys.c:91
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Blauw"
-#: ../backend/canon_dr.c:357
+#: ../backend/canon_dr.c:404
#, no-c-format
msgid "Enhance Red"
msgstr "Verbeter rood"
-#: ../backend/canon_dr.c:358
+#: ../backend/canon_dr.c:405
#, no-c-format
msgid "Enhance Green"
msgstr "Verbeter groen"
-#: ../backend/canon_dr.c:359
+#: ../backend/canon_dr.c:406
#, no-c-format
msgid "Enhance Blue"
msgstr "Verbeter blauw"
-#: ../backend/canon_dr.c:361 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:164
-#: ../backend/epson2.c:172 ../backend/epson2.c:184 ../backend/epson2.c:199
-#: ../backend/epson2.c:213 ../backend/fujitsu.c:630
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
@@ -1633,109 +1644,109 @@ msgstr "Verbeter blauw"
msgid "None"
msgstr "Geen"
-#: ../backend/canon_dr.c:362 ../backend/fujitsu.c:631
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr "JPEG"
-#: ../backend/epson.c:491 ../backend/epson2.c:107
-#: ../backend/magicolor.c:160
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "enkelzijdig"
-#: ../backend/epson.c:492 ../backend/epson2.c:108 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:161 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Dubbelzijdig"
-#: ../backend/epson.c:502 ../backend/epson2.c:115 ../backend/pixma.c:908
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Filmeenheid"
-#: ../backend/epson.c:503 ../backend/epson2.c:117
-#: ../backend/magicolor.c:168 ../backend/mustek.c:160
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
-msgstr "Automatische documenten doorvoer"
+msgstr "Automatische documentinvoer"
-#: ../backend/epson.c:523 ../backend/epson2.c:133
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Dia"
-#: ../backend/epson.c:524 ../backend/epson2.c:134
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Transparant"
-#: ../backend/epson.c:529 ../backend/epson2.c:141
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Focus op het glas"
-#: ../backend/epson.c:530 ../backend/epson2.c:142
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Focus 2.5mm boven het glas"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:165 ../backend/epson2.c:173 ../backend/epson2.c:185
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Halftoon A (hard)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Halftoon B (zacht)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Halftoon C"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:176
-#: ../backend/epson2.c:188
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Dither A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:177
-#: ../backend/epson2.c:189
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Dither B (4x4 Spiraalvorm)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:178
-#: ../backend/epson2.c:190
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Dither C (4x4 Net Screen)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:179
-#: ../backend/epson2.c:191
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Dither D (8x4 Net Screen)"
-#: ../backend/epson.c:584 ../backend/epson2.c:192
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Tekstverbeteringstechnologie"
-#: ../backend/epson.c:585 ../backend/epson2.c:193
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Download patroon A"
-#: ../backend/epson.c:586 ../backend/epson2.c:194
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Download patroon B"
@@ -1745,7 +1756,7 @@ msgstr "Download patroon B"
msgid "No Correction"
msgstr "Geen correctie"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:254
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Door gebruiker gedefinieerd"
@@ -1763,40 +1774,40 @@ msgstr "Thermische printers"
#: ../backend/epson.c:635
#, no-c-format
msgid "Ink-jet printers"
-msgstr "Inktjetprinters"
+msgstr "Inkjetprinters"
#: ../backend/epson.c:636
#, no-c-format
msgid "CRT monitors"
msgstr "CRT-monitoren"
-#: ../backend/epson.c:656 ../backend/epson2.c:253 ../backend/fujitsu.c:614
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Standaardinstelling"
-#: ../backend/epson.c:658 ../backend/epson2.c:255
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Afdrukken op hoge kwaliteit"
-#: ../backend/epson.c:659 ../backend/epson2.c:256
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Afdrukken op lage kwaliteit"
-#: ../backend/epson.c:660 ../backend/epson2.c:257
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Afdrukken met hoog contrast"
-#: ../backend/epson.c:678 ../backend/epson2.c:275
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Door gebruiker gedefinieerd (Gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:276
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Door gebruiker gedefinieerd (Gamma=1.8)"
@@ -1836,14 +1847,14 @@ msgstr "A4"
msgid "Max"
msgstr "Maximaal"
-#: ../backend/epson.c:2799 ../backend/epson2.c:966
-#: ../backend/genesys.c:5389 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:721
+#: ../backend/niash.c:734 ../backend/plustek.c:721
#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
@@ -1852,210 +1863,211 @@ msgstr "Maximaal"
msgid "Scan Mode"
msgstr "Scanmodus"
-#: ../backend/epson.c:2831 ../backend/epson2.c:1002
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Kiest halftoon."
-#: ../backend/epson.c:2853 ../backend/epson2.c:1023
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Kleuronderdrukken"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1024
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Kiest kleuronderdrukken."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1036
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Kiest helderheid."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1049
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Scherpte"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1165
-#: ../backend/epson2.c:1212
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Kleurcorrectie"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1167
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr "Stelt de kleurcorrectietabel in voor het gekozen uitvoerapparaat."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Kleurcorrectiecoëfficiënten"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Matrix vermenigvuldiging van RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Verschuift groen naar rood"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Verschuift groen naar blauw"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Verschuift rood naar groen"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Verschuift rood naar blauw"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Verschuift blauw naar groen"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Verschuift blauw naar rood"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
-msgstr "Regelt de groeninstelling"
+msgstr "Regelt de groenwaarde"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
-msgstr "Verhoogt rood op basis van het groenniveau"
+msgstr "Verhoogt rood op basis van de groenwaarde"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
-msgstr "Verhoogt blauw op basis van het groenniveau"
+msgstr "Verhoogt blauw op basis van het groenwaarde"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
-msgstr "Verhoogt groen op basis van het roodniveau"
+msgstr "Verhoogt groen op basis van het roodwaarde"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
-msgstr "Regelt het roodniveau"
+msgstr "Regelt de roodwaarde"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
-msgstr "Verhoogt blauw op basis van het roodniveau"
+msgstr "Verhoogt blauw op basis van de roodwaarde"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
-msgstr "Verhoogt groen op basis van het blauwniveau"
+msgstr "Verhoogt groen op basis van de blauwwaarde"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
-msgstr "Verhoogt rood op basis van het blauwniveau"
+msgstr "Verhoogt rood op basis van de blauwwaarde"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
-msgstr "Regelt het blauwniveau"
+msgstr "Regelt de blauwwaarde"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1246
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
-msgstr "Het beeld spiegelen"
+msgstr "Spiegel het beeld."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Snelle voorbeeldscan"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1256
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
-msgstr "Automatische keuze van het scanbereik"
+msgstr "Automatische verdeling van het scanoppervlak"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Korte oplossingenlijst"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
-msgstr "Toon korte lijst met resoluties"
+msgstr "Toon korte lijst met oplossingen"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Vergroten"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Definieert de vergrotingsfactor die de scanner zal gebruiken"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Snelle opmaak"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1331
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Optioneel hulpstuk"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1384
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Uitwerpen"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1385
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
-msgstr "Werpt het papier in de ADF uit"
+msgstr "Werp het document in de automatische documentinvoer uit"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1395
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Automatische uitworp"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1397
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
-msgstr "Werpt het document uit na het scannen"
+msgstr "Werp het document uit na het scannen"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1407
-#: ../backend/magicolor.c:2399
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
-msgstr "ADF Mode"
+msgstr "Automatische documentinvoer Modus"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1409
-#: ../backend/magicolor.c:2401
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
-msgstr "Selecteert de ADF mode (enkelzijdig/dubbelzijdig)"
+msgstr ""
+"Selecteert de Automatische documentinvoer modus (enkelzijdig/dubbelzijdig)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1421
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Bak"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1422
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Kies de bak om te scannen"
@@ -2091,212 +2103,213 @@ msgid ""
"After sending the scan command, wait until the button on the scanner is "
"pressed to actually start the scan process."
msgstr ""
-"Begin pas met scannen nadat eerst het scancommando is gestuurd en "
-"vervolgens de knop van de scanner is ingedrukt."
+"Begin pas met scannen als eerst het scancommando naar de scanner is gestuurd "
+"en "
+"daarna de knop van de scanner is ingedrukt."
-#: ../backend/epson2.c:101 ../backend/pixma.c:390
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr "Infrarood"
-#: ../backend/epson2.c:116
+#: ../backend/epson2.c:117
#, no-c-format
msgid "TPU8x10"
msgstr "TPU8x10"
-#: ../backend/epson2.c:135
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Dia"
-#: ../backend/epson2.c:136
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Negatief"
-#: ../backend/epson2.c:214
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr "Ingebouwd CCT profiel"
-#: ../backend/epson2.c:215
+#: ../backend/epson2.c:216
#, no-c-format
msgid "User defined CCT profile"
msgstr "Door gebruiker gedefinieerd CCT profiel"
-#: ../backend/fujitsu.c:615 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Aan"
-#: ../backend/fujitsu.c:616 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Uit"
-#: ../backend/fujitsu.c:618
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr "DTC"
-#: ../backend/fujitsu.c:619
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr "SDTC"
-#: ../backend/fujitsu.c:621 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Dither"
-#: ../backend/fujitsu.c:622
+#: ../backend/fujitsu.c:667
#, no-c-format
msgid "Diffusion"
msgstr "Verspreiding"
-#: ../backend/fujitsu.c:627
+#: ../backend/fujitsu.c:672
#, no-c-format
msgid "White"
msgstr "Wit"
-#: ../backend/fujitsu.c:628
+#: ../backend/fujitsu.c:673
#, no-c-format
msgid "Black"
msgstr "Zwart"
-#: ../backend/fujitsu.c:633
+#: ../backend/fujitsu.c:678
#, no-c-format
msgid "Continue"
msgstr "Voortzetten"
-#: ../backend/fujitsu.c:634
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr "Stoppen"
-#: ../backend/fujitsu.c:636
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr "10mm"
-#: ../backend/fujitsu.c:637
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr "15mm"
-#: ../backend/fujitsu.c:638
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr "20mm"
-#: ../backend/fujitsu.c:640 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Horizontaal"
-#: ../backend/fujitsu.c:641
+#: ../backend/fujitsu.c:686
#, no-c-format
msgid "Horizontal bold"
msgstr "Horizontaal vet"
-#: ../backend/fujitsu.c:642
+#: ../backend/fujitsu.c:687
#, no-c-format
msgid "Horizontal narrow"
msgstr "Horizontaal smal"
-#: ../backend/fujitsu.c:643 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Verticaal"
-#: ../backend/fujitsu.c:644
+#: ../backend/fujitsu.c:689
#, no-c-format
msgid "Vertical bold"
msgstr "Verticaal vet"
-#: ../backend/fujitsu.c:646
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr "Van boven naar beneden"
-#: ../backend/fujitsu.c:647
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr "Van beneden naar boven"
-#: ../backend/fujitsu.c:649
+#: ../backend/fujitsu.c:694
#, no-c-format
msgid "Front"
msgstr "Voorzijde"
-#: ../backend/fujitsu.c:650
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr "Achterzijde"
-#: ../backend/fujitsu.c:3858 ../backend/genesys.c:5623
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
#: ../backend/kvs1025_opt.c:911
#, no-c-format
msgid "Software blank skip percentage"
msgstr "Softwarematig over te slaan percentage lege pagina's"
-#: ../backend/fujitsu.c:3859
+#: ../backend/fujitsu.c:4056
#, no-c-format
msgid "Request driver to discard pages with low percentage of dark pixels"
msgstr "Verzoek het stuurprogramma pagina's met weinig dekking te negeren"
-#: ../backend/genesys.c:5614
+#: ../backend/genesys.c:5757
#, no-c-format
msgid "Software crop"
msgstr "Softwarematig uitsnijden"
-#: ../backend/genesys.c:5615
+#: ../backend/genesys.c:5758
#, no-c-format
msgid "Request backend to remove border from pages digitally"
msgstr "Vraag backend randen van pagina's digitaal te verwijderen"
-#: ../backend/genesys.c:5624 ../backend/kvs1025_opt.c:913
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
#, no-c-format
msgid "Request driver to discard pages with low numbers of dark pixels"
msgstr "Vraag het stuurprogramma pagina's met weinig dekking te verwijderen"
-#: ../backend/genesys.c:5635 ../backend/kvs1025_opt.c:893
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
#, no-c-format
msgid "Software derotate"
msgstr "Softwarematige rotatie tegen de klok in"
-#: ../backend/genesys.c:5636 ../backend/kvs1025_opt.c:895
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
#, no-c-format
msgid "Request driver to detect and correct 90 degree image rotation"
msgstr ""
"Vraag stuurprogramma een 90 graden gedraaid beeld te herkennen en "
"corrigeren"
-#: ../backend/genesys.c:5667 ../backend/pixma_sane_options.c:312
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Extra's"
-#: ../backend/genesys.c:5686 ../backend/pixma_sane_options.c:333
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, no-c-format
msgid "Threshold curve"
msgstr "Drempel curve"
-#: ../backend/genesys.c:5687 ../backend/pixma_sane_options.c:334
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr "Dynamische drempel curve, van licht naar donker, normaal 50-65"
-#: ../backend/genesys.c:5696
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr "Dynamische lijntekening uitschakelen"
-#: ../backend/genesys.c:5698
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
@@ -2305,12 +2318,12 @@ msgstr ""
"Schakel, om een lijntekening te genereren het gebruik van een software "
"aanpassend algoritme uit en vertrouw in plaats daarvan op de hardware."
-#: ../backend/genesys.c:5714
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Schakel interpolatie uit"
-#: ../backend/genesys.c:5717
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2320,34 +2333,49 @@ msgstr ""
"resolutie kleiner is dan de verticale resolutie, wordt de horizontale "
"interpolatie uitgeschakeld."
-#: ../backend/genesys.c:5726
+#: ../backend/genesys.c:5869
#, no-c-format
msgid "Color filter"
msgstr "Kleurenfilter"
-#: ../backend/genesys.c:5729
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
"Wanneer grijs of lijntekening wordt gebruikt, selecteert deze optie de "
"huidige actieve kleur."
-#: ../backend/genesys.c:5755
+#: ../backend/genesys.c:5898
#, no-c-format
msgid "Calibration file"
msgstr "Kalibratiebestand"
-#: ../backend/genesys.c:5756
+#: ../backend/genesys.c:5899
#, no-c-format
msgid "Specify the calibration file to use"
msgstr "Specificeer het te gebruiken kalibratiebestand"
-#: ../backend/genesys.c:5773
+#: ../backend/genesys.c:5916
+#, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Vervaltijd van de kalibratie cache"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+"Tijd (in minuten) voordat een gecachete kalibratie verloopt. Een waarde van 0 "
+"betekent dat geen cache wordt gebruikt. Een negatieve waarde betekent dat "
+"de cache nooit verloopt."
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
-msgstr "Lamp uit tijd"
+msgstr "Lamp-uit tijd"
-#: ../backend/genesys.c:5776
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2356,71 +2384,71 @@ msgstr ""
"De lamp wordt uitgeschakeld na de opgegeven tijd (in minuten). Een "
"waarde van 0 betekent, dat de lamp niet wordt uitgeschakeld."
-#: ../backend/genesys.c:5786
+#: ../backend/genesys.c:5940
#, no-c-format
msgid "Lamp off during scan"
msgstr "Lamp uit tijdens het scannen"
-#: ../backend/genesys.c:5787
+#: ../backend/genesys.c:5941
#, no-c-format
msgid "The lamp will be turned off during scan. "
msgstr "De lamp wordt uitgeschakeld tijdens het scannen"
-#: ../backend/genesys.c:5815 ../backend/genesys.c:5816
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
-msgstr "Bestandsknop"
+msgstr "Bestand-knop"
-#: ../backend/genesys.c:5868 ../backend/genesys.c:5869
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr "OCR-knop"
-#: ../backend/genesys.c:5882 ../backend/genesys.c:5883
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
-msgstr "Power-knop"
+msgstr "Aan/Uit-knop"
-#: ../backend/genesys.c:5896 ../backend/genesys.c:5897
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
#, no-c-format
msgid "Extra button"
-msgstr "Extra knop"
+msgstr "Extra-knop"
-#: ../backend/genesys.c:5910 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, no-c-format
msgid "Need calibration"
msgstr "Kalibratie nodig"
-#: ../backend/genesys.c:5911 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "De scanner moet worden gekalibreerd voor de huidige instellingen"
-#: ../backend/genesys.c:5923 ../backend/gt68xx.c:787
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Knoppen"
-#: ../backend/genesys.c:5932 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:941
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Kalibreren"
-#: ../backend/genesys.c:5934 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, no-c-format
msgid "Start calibration using special sheet"
-msgstr "Gebruik een speciale transparant voor het kalibreerproces"
+msgstr "Begin kalibreerproces met een speciale transparant"
-#: ../backend/genesys.c:5948 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, no-c-format
msgid "Clear calibration"
msgstr "Reset kalibratie"
-#: ../backend/genesys.c:5949 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, no-c-format
msgid "Clear calibration cache"
msgstr "Reset kalibratiecache"
@@ -2460,8 +2488,8 @@ msgid ""
"Warm-up until the lamp's brightness is constant instead of insisting on "
"60 seconds warm-up time."
msgstr ""
-"Wacht totdat de lamp constant brandt in plaats van de eis van 60 seconde "
-"opwarmtijd na te leven."
+"Warm op totdat de helderheid van de lamp constant is in plaats van de "
+"'verplichte' 60 seconde opwarmtijd aan te houden."
#: ../backend/gt68xx.c:585
#, no-c-format
@@ -2480,7 +2508,7 @@ msgstr ""
#: ../backend/gt68xx.c:598
#, no-c-format
msgid "Coarse calibration"
-msgstr "Basiskalibrering"
+msgstr "Grove kalibratie"
#: ../backend/gt68xx.c:600
#, no-c-format
@@ -2489,7 +2517,7 @@ msgid ""
"disabled, options for setting the analog frontend parameters manually "
"are provided. This option is enabled by default. For testing only."
msgstr ""
-"Stelt het bereik en de offset automatisch in. Wanneer deze optie is "
+"Stel bereik en compensatie automatisch in. Wanneer deze optie is "
"uitgeschakeld, kunnen de analoge \"frontend\" parameters handmatig "
"worden ingesteld. Deze optie staat standaard aan. Alleen voor "
"testdoeleinden."
@@ -2497,7 +2525,7 @@ msgstr ""
#: ../backend/gt68xx.c:619
#, no-c-format
msgid "Coarse calibration for first scan only"
-msgstr "Basiskalibrering alleen voor de eerste scan"
+msgstr "Grove kalibratie alleen voor de eerste scan"
#: ../backend/gt68xx.c:621
#, no-c-format
@@ -2506,7 +2534,7 @@ msgid ""
"scanners and can save scanning time. If the image brightness is "
"different with each scan, disable this option. For testing only."
msgstr ""
-"Basiskalibrering wordt alleen voor de eerste scan uitgevoerd. Dit werkt "
+"Grove kalibratie wordt alleen voor de eerste scan uitgevoerd. Dit werkt "
"bij de meeste scanners en kan scantijd schelen. Wanneer de helderheid "
"van het beeld per scan verschilt, schakel deze optie dan uit. Alleen "
"voor testdoeleinden."
@@ -2525,7 +2553,7 @@ msgid ""
"omitting lines."
msgstr ""
"Het aantal scanlijnen dat de scannerwagen teruggaat als \"backtracking\" "
-"optreedt Dit gebeurt als de scanner sneller scant dan de computer de "
+"optreedt. Dit gebeurt als de scanner sneller scant dan de computer de "
"data kan verwerken. Lage waarden zorgen voor snellere scans, maar "
"vergroten het risico van gemiste scanlijnen."
@@ -2562,9 +2590,9 @@ msgstr "Scanner model"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
-"Staat het testen van de werking van het apparaat toe met andere "
+"Biedt men de mogelijkheid de werking van het apparaat te testen met andere "
"ondersteunde modellen."
#: ../backend/hp3900_sane.c:1422
@@ -2714,12 +2742,12 @@ msgstr "Werkt de informatie over het apparaat bij"
msgid "This option reflects a front panel scanner button"
msgstr "Deze optie geeft de scannerknoppen op het apparaat weer"
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Beeld"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Overig"
@@ -2727,7 +2755,7 @@ msgstr "Overig"
#: ../backend/hp5400_sane.c:358
#, no-c-format
msgid "offset X"
-msgstr "Offset X"
+msgstr "compensatie X"
#: ../backend/hp5400_sane.c:359
#, no-c-format
@@ -2737,32 +2765,32 @@ msgstr "X positie in de scanner van het scanoppervlak."
#: ../backend/hp5400_sane.c:368
#, no-c-format
msgid "offset Y"
-msgstr "Offset Y"
+msgstr "compensatie Y"
#: ../backend/hp5400_sane.c:369
#, no-c-format
msgid "Hardware internal Y position of the scanning area."
msgstr "Y positie in de scanner van het scanoppervlak."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Lamp status"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Schakelt de lamp aan of uit."
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
-msgstr "Kalibreert voor het zwart/wit niveau"
+msgstr "Kalibreert voor de zwart-/witwaarde"
#: ../backend/hp5590.c:83 ../backend/hp-option.c:3253
#, no-c-format
msgid "ADF"
-msgstr "ADF"
+msgstr "Automatische documentinvoer"
#: ../backend/hp5590.c:85
#, no-c-format
@@ -2807,7 +2835,7 @@ msgstr "Geavanceerde opties"
#: ../backend/hp-option.c:3041
#, no-c-format
msgid "Coarse"
-msgstr "Basis"
+msgstr "Grof"
#: ../backend/hp-option.c:3042
#, no-c-format
@@ -2926,7 +2954,7 @@ msgstr "Scherper maken"
#: ../backend/hp-option.h:61
#, no-c-format
msgid "Set sharpening value."
-msgstr "Stelt scherpte waarde in"
+msgstr "Stel scherpte waarde in."
#: ../backend/hp-option.h:66
#, no-c-format
@@ -2938,7 +2966,7 @@ msgstr "Automatische drempelwaarde"
msgid "Enable automatic determination of threshold for line-art scans."
msgstr ""
"Maak automatische bepaling mogelijk van de drempelwaarde voor "
-"lijntekening scans"
+"lijntekening scans."
#: ../backend/hp-option.h:73
#, no-c-format
@@ -2948,7 +2976,7 @@ msgstr "Gelijkmatig"
#: ../backend/hp-option.h:74
#, no-c-format
msgid "Select smoothing filter."
-msgstr "Kiest halftoon filter."
+msgstr "Kies halftoon filter."
#: ../backend/hp-option.h:79
#, no-c-format
@@ -2968,7 +2996,7 @@ msgstr "Wijzig origineel"
#: ../backend/hp-option.h:86
#, no-c-format
msgid "Change Document."
-msgstr "Wijzig Origineel"
+msgstr "Wijzig Origineel."
#: ../backend/hp-option.h:91
#, no-c-format
@@ -2978,7 +3006,7 @@ msgstr "Verwijder"
#: ../backend/hp-option.h:92
#, no-c-format
msgid "Unload Document."
-msgstr "Verwijder Origineel"
+msgstr "Verwijder Origineel."
#: ../backend/hp-option.h:98
#, no-c-format
@@ -2993,7 +3021,7 @@ msgstr "Origineel"
#: ../backend/hp-option.h:104
#, no-c-format
msgid "Set type of media."
-msgstr "Stelt origineel type in."
+msgstr "Stel origineel type in."
#: ../backend/hp-option.h:109
#, no-c-format
@@ -3008,34 +3036,36 @@ msgid ""
"negative film. For dark (underexposed) images you can increase this "
"value."
msgstr ""
-"Een langer belichtingstijd zorgt voor lichtere scans. Geadviseerd wordt: "
-"175% voor papier originelen, 150% voor sheets en \"Negatief\" voor dia's."
-"Voor donkere (onderbelichte) beelden kun je de waarde verhogen."
+"Een langere belichtingstijd laat de scanner meer licht verzamelen. Advies is "
+"om "
+"175% voor papieren originelen, 150% voor dia's en \"Negatief\" voor "
+"negatieven te "
+"gebruiken. Voor donkere (onderbelichte) beelden kun je deze waarde verhogen."
#: ../backend/hp-option.h:119 ../backend/hp-option.h:126
#, no-c-format
msgid "Color Matrix"
-msgstr "Kleurpatroon"
+msgstr "Kleurmatrix"
#: ../backend/hp-option.h:121
#, no-c-format
msgid "Set the scanners color matrix."
-msgstr "Stelt het kleurpatroon in van de scanner"
+msgstr "Stel de kleurmatrix in van de scanner"
#: ../backend/hp-option.h:127
#, no-c-format
msgid "Custom color matrix."
-msgstr "Door de gebruiker gedefinieerde kleurpatroon"
+msgstr "Door de gebruiker gedefinieerde kleurmatrix"
#: ../backend/hp-option.h:132
#, no-c-format
msgid "Mono Color Matrix"
-msgstr "Mono Kleurpatroon"
+msgstr "Mono Kleurmatrix"
#: ../backend/hp-option.h:133
#, no-c-format
msgid "Custom color matrix for grayscale scans."
-msgstr "Door de gebruiker gedefinieerd kleurpatroon voor grijstint scans"
+msgstr "Door de gebruiker gedefinieerd kleurmatrix voor grijstint scans"
#: ../backend/hp-option.h:138
#, no-c-format
@@ -3080,7 +3110,7 @@ msgstr "Gebruik intern meer dan acht bits, maar geef slechts acht bits."
#: ../backend/hp-option.h:164
#, no-c-format
msgid "Front button wait"
-msgstr "Knop op voorpaneel"
+msgstr "Voorpaneel knop wacht"
#: ../backend/hp-option.h:165
#, no-c-format
@@ -3090,12 +3120,12 @@ msgstr "Wacht met scannen totdat knop op voorpaneel is ingedrukt."
#: ../backend/hp-option.h:172
#, no-c-format
msgid "Shut off lamp"
-msgstr "Schakelt de lamp uit"
+msgstr "Schakel de lamp uit"
#: ../backend/hp-option.h:173
#, no-c-format
msgid "Shut off scanner lamp."
-msgstr "Schakelt de scannerlamp uit."
+msgstr "Schakel de scannerlamp uit."
#: ../backend/kvs1025.h:51 ../backend/kvs20xx_opt.c:294
#: ../backend/kvs40xx_opt.c:515 ../backend/matsushita.h:219
@@ -3118,7 +3148,7 @@ msgstr "Liggend"
#: ../backend/kvs1025.h:54 ../backend/kvs40xx_opt.c:692
#, no-c-format
msgid "Inverse Image"
-msgstr "Geinverteerd beeld"
+msgstr "Geïnverteerd beeld"
#: ../backend/kvs1025.h:56 ../backend/kvs40xx_opt.c:403
#, no-c-format
@@ -3153,13 +3183,13 @@ msgstr "Dubbele doorvoer herkenning"
#: ../backend/kvs40xx_opt.c:353 ../backend/matsushita.h:223
#, no-c-format
msgid "Enable Duplex (Dual-Sided) Scanning"
-msgstr "Schakelt Duplex (dubbelzijdig) scannen in"
+msgstr "Schakel dubbelzijdig (duplex) scannen in"
#: ../backend/kvs1025.h:65 ../backend/kvs20xx_opt.c:295
#: ../backend/kvs40xx_opt.c:516 ../backend/matsushita.h:225
#, no-c-format
msgid "Physical size of the paper in the ADF"
-msgstr "Feitelijke papierformaat van de ADF"
+msgstr "Feitelijke formaat van het papier in de Automatische documentinvoer"
#: ../backend/kvs1025_opt.c:39
#, no-c-format
@@ -3174,7 +3204,7 @@ msgstr "halftoon"
#: ../backend/kvs1025_opt.c:41
#, no-c-format
msgid "gray"
-msgstr "Grijs"
+msgstr "grijs"
#: ../backend/kvs1025_opt.c:42
#, no-c-format
@@ -3371,7 +3401,7 @@ msgstr "crt"
#: ../backend/kvs1025_opt.c:230
#, no-c-format
msgid "linier"
-msgstr "liniair"
+msgstr "lineair"
#: ../backend/kvs1025_opt.c:242 ../backend/kvs20xx_opt.c:137
#: ../backend/kvs40xx_opt.c:223
@@ -3411,12 +3441,12 @@ msgstr "Stelt de doorvoermodus in"
#: ../backend/kvs1025_opt.c:584
#, no-c-format
msgid "Enable/Disable long paper mode"
-msgstr "Groot formaat papier modus aan/uit schakelen"
+msgstr "Groot formaat papier modus in/uit schakelen"
#: ../backend/kvs1025_opt.c:593
#, no-c-format
msgid "Enable/Disable length control mode"
-msgstr "Formaat gestuurde modus aan/uit schakelen"
+msgstr "Formaat gestuurde modus in/uit schakelen"
#: ../backend/kvs1025_opt.c:601 ../backend/kvs20xx_opt.c:242
#: ../backend/kvs40xx_opt.c:416
@@ -3434,7 +3464,7 @@ msgstr "Stelt de handmatige doorvoer timeout in seconden in"
#: ../backend/kvs40xx_opt.c:441
#, no-c-format
msgid "Enable/Disable double feed detection"
-msgstr "Dubbele doorvoer herkenning aan/uit schakelen"
+msgstr "Dubbele doorvoer herkenning in/uit schakelen"
#: ../backend/kvs1025_opt.c:631 ../backend/kvs20xx_opt.c:275
#: ../backend/kvs40xx_opt.c:496
@@ -3452,7 +3482,7 @@ msgstr "Aangepast aan de pagina"
#: ../backend/kvs40xx_opt.c:498
#, no-c-format
msgid "Scanner shrinks image to fit scanned page"
-msgstr "Scanner verkleint het beeld in lijn met de gescande pagina"
+msgstr "Scanner verkleint het beeld zodat deze op de gescande pagina past"
#: ../backend/kvs1025_opt.c:661 ../backend/kvs20xx_opt.c:308
#: ../backend/kvs40xx_opt.c:532
@@ -3471,7 +3501,8 @@ msgid ""
"Automatically sets brightness, contrast, white level, gamma, noise "
"reduction and image emphasis"
msgstr ""
-"Stelt helderheid, contrast, witwaarde, gamma, ruisonderdrukking en "
+"Stelt automatisch helderheid, contrast, witwaarde, gamma, ruisonderdrukking "
+"en "
"beeldverbetering in"
#: ../backend/kvs1025_opt.c:783 ../backend/kvs40xx_opt.c:763
@@ -3484,7 +3515,7 @@ msgstr "Ruisonderdrukking"
#: ../backend/matsushita.c:1277
#, no-c-format
msgid "Reduce the isolated dot noise"
-msgstr "Vermindert de ruis van afzonderlijke punten"
+msgstr "Verminder de ruis van afzonderlijke punten"
#: ../backend/kvs1025_opt.c:796 ../backend/kvs20xx_opt.c:411
#: ../backend/kvs40xx_opt.c:654 ../backend/matsushita.c:1288
@@ -3520,7 +3551,7 @@ msgstr "Schakelt de lamp kleur in (kleur uitval)"
#: ../backend/kvs1025_opt.c:832
#, no-c-format
msgid "Inverse image in B/W or halftone mode"
-msgstr "Geinverteerd beeld in Z/W of halftoon modus"
+msgstr "Geïnverteerd beeld in Z/W of halftoon modus"
#: ../backend/kvs1025_opt.c:840
#, no-c-format
@@ -3555,8 +3586,7 @@ msgstr "Softwarematige scheefheid correctie"
#: ../backend/kvs1025_opt.c:874
#, no-c-format
msgid "Request driver to rotate skewed pages digitally"
-msgstr ""
-"Vraag het stuurprogramma de scheef getrokken pagina's digitaal te roteren"
+msgstr "Vraag het stuurprogramma scheef getrokken pagina's digitaal te roteren"
#: ../backend/kvs1025_opt.c:881
#, no-c-format
@@ -3573,7 +3603,7 @@ msgstr ""
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
-msgstr "Automatisch softwarematig uitsnijden"
+msgstr "Softwarematig automatisch uitsnijden"
#: ../backend/kvs1025_opt.c:904
#, no-c-format
@@ -3586,8 +3616,8 @@ msgid ""
"Length Control Mode is a mode that the scanner reads up to the shorter "
"length of actual paper or logical document length."
msgstr ""
-"Formaat Controle Modus is een modus waarin de scanner leest tot aan de "
-"kortste lengte van het gebruikte papier of de logische lengte van het "
+"Formaat Controle Modus is een modus waarbij de scanner leest tot aan de "
+"kortste lengte van het gebruikte papier of de feitelijke lengte van het "
"document."
#: ../backend/kvs20xx_opt.c:423 ../backend/kvs20xx_opt.c:424
@@ -3635,12 +3665,12 @@ msgstr "err_verspreiding"
#: ../backend/kvs40xx_opt.c:248
#, no-c-format
msgid "No detection"
-msgstr "geen herkenning"
+msgstr "Geen herkenning"
#: ../backend/kvs40xx_opt.c:249
#, no-c-format
msgid "Normal mode"
-msgstr "normale modus"
+msgstr "Normale modus"
#: ../backend/kvs40xx_opt.c:250
#, no-c-format
@@ -3654,8 +3684,8 @@ msgid ""
"divides long paper by the length which is set in Document Size option."
msgstr ""
"Groot Papier Modus is een modus waarin de scanner het beeld leest nadat "
-"hijhet formaat van het papier heeft gedeeld door de lengte, die is "
-"ingesteld bijde optie Document Formaat"
+"hij het formaat van het papier heeft gedeeld door de lengte, die is "
+"ingesteld bij de optie Document Formaat"
#: ../backend/kvs40xx_opt.c:448
#, no-c-format
@@ -3695,7 +3725,7 @@ msgstr "Automatische drempelwaarde modus"
#: ../backend/kvs40xx_opt.c:642
#, no-c-format
msgid "Sets the automatic threshold mode"
-msgstr "Stel de automatische drempelwaarde in"
+msgstr "Stelt de automatische drempelwaarde in"
#: ../backend/kvs40xx_opt.c:693
#, no-c-format
@@ -3760,12 +3790,12 @@ msgstr "Snij het effectieve beeldoppervlak uit"
#: ../backend/kvs40xx_opt.c:816
#, no-c-format
msgid "Scanner automatically detect image area and crop it"
-msgstr "Laat de scanner automatisch het beeldoppervlak herkennen en uitsnijden"
+msgstr "De scanner herkent automatisch het beeldoppervlak en snijdt die uit"
#: ../backend/kvs40xx_opt.c:826
#, no-c-format
msgid "It is right and left reversing"
-msgstr "Het is links/rechtse omkering"
+msgstr "Het is rechts en links omkering"
#: ../backend/kvs40xx_opt.c:833 ../backend/kvs40xx_opt.c:834
#, no-c-format
@@ -3785,7 +3815,7 @@ msgstr "Ruitvormig"
#: ../backend/leo.c:111
#, no-c-format
msgid "8x8 Coarse Fatting"
-msgstr "8x8 Basis aandikken"
+msgstr "8x8 Grof Aandikken"
#: ../backend/leo.c:112
#, no-c-format
@@ -3800,7 +3830,7 @@ msgstr "8x8 Bayer"
#: ../backend/leo.c:114
#, no-c-format
msgid "8x8 Vertical Line"
-msgstr "8x8 Verticale lijn"
+msgstr "8x8 Verticale Lijn"
#: ../backend/lexmark.c:273 ../backend/umax_pp.c:715
#, no-c-format
@@ -3954,7 +3984,7 @@ msgstr "8 bit grijstrap"
#: ../backend/microtek2.h:601
#, no-c-format
msgid "Shadow, midtone, highlight, exposure time"
-msgstr "Schaduw, middentoon, lichten, belichtingstijd"
+msgstr "Schaduw, middentoon, lichteffecten, belichtingstijd"
#: ../backend/microtek2.h:603
#, no-c-format
@@ -3974,12 +4004,12 @@ msgstr "Geen \"backtracking\""
#: ../backend/microtek2.h:608
#, no-c-format
msgid "If checked the scanner does not perform backtracking"
-msgstr "Wanneer aangevinkt, gaat de scannerkop niet terug naar de beginpositie"
+msgstr "Wanneer aangevinkt, voert de scanner geen \"backtracking\" uit"
#: ../backend/microtek2.h:612
#, no-c-format
msgid "Toggle lamp of flatbed"
-msgstr "Lamp aan-/uitschakelen"
+msgstr "Schakel lamp van de flatbed aan/uit"
#: ../backend/microtek2.h:613
#, no-c-format
@@ -3989,14 +4019,14 @@ msgstr "Schakelt de lamp van de flatbedscanner aan/uit"
#: ../backend/microtek2.h:616
#, no-c-format
msgid "Calibration by backend"
-msgstr "Softwarematig kalibreren"
+msgstr "Kalibratie door de \"backend\""
#: ../backend/microtek2.h:617
#, no-c-format
msgid "If checked the color calibration before a scan is done by the backend"
msgstr ""
-"Sommige scanners moeten softwarematig worden gekalibreerd, anders kunnen "
-"moiré strepen op het beeld ontstaan"
+"Wanneer aangevinkt, wordt de kleur kalibratie voor een scan uitgevoerd door "
+"de \"backend\""
#: ../backend/microtek2.h:621
#, no-c-format
@@ -4006,14 +4036,12 @@ msgstr "Gebruik het \"lightlid-35mm\" hulpstuk"
#: ../backend/microtek2.h:622
#, no-c-format
msgid "This option turns off the lamp of the flatbed during a scan"
-msgstr ""
-"Bij gebruik van het \"lightlid-35mm\" diahulpstuk wordt tijdens het "
-"scannen de flatbedlamp uitgeschakeld om een beter contrast te krijgen"
+msgstr "Deze optie schakelt de lamp van de flatbed uit tijdens het scannen"
#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
-msgstr "Hoge kwaliteit"
+msgstr "Hoge kwaliteit scan"
#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
@@ -4033,7 +4061,7 @@ msgstr "Hoogste snelheid, maar met een lagere kwaliteit"
#: ../backend/microtek2.h:634
#, no-c-format
msgid "Automatic adjustment of threshold"
-msgstr "Automatische aanpassing van de zwart/wit drempelwaarde"
+msgstr "Automatische aanpassing van de drempelwaarde"
#: ../backend/microtek2.h:635
#, no-c-format
@@ -4041,8 +4069,8 @@ msgid ""
"If checked the backend automatically tries to determine an optimal value "
"for the threshold."
msgstr ""
-"Indien aangevinkt, probeert de software een optimale waarde te bepalen "
-"voor de zwart/wit drempelwaarde."
+"Indien aangevinkt, probeert de \"backend\" een optimale waarde te bepalen "
+"voor de drempelwaarde."
#: ../backend/microtek2.h:641
#, no-c-format
@@ -4057,7 +4085,7 @@ msgstr "Gecombineerde gamma"
#: ../backend/microtek2.h:645
#, no-c-format
msgid "Use same gamma values for all colour channels."
-msgstr "Alle kleuren gebruiken dezelfde gammawaarden"
+msgstr "Gebruik dezelfde gammawaarden voor alle kleurkanalen."
#: ../backend/microtek2.h:649
#, no-c-format
@@ -4077,7 +4105,7 @@ msgstr "Gammagetalwaarde voor rood"
#: ../backend/microtek2.h:655
#, no-c-format
msgid "Selects a value for scalar gamma correction (red channel)"
-msgstr "Gammagetalwaarde voor rood"
+msgstr "Kiest een getalswaarde voor gammacorrectie (rode kanaal)"
#: ../backend/microtek2.h:659
#, no-c-format
@@ -4087,7 +4115,7 @@ msgstr "Gammagetalwaarde voor groen"
#: ../backend/microtek2.h:660
#, no-c-format
msgid "Selects a value for scalar gamma correction (green channel)"
-msgstr "Gammagetalwaarde voor groen"
+msgstr "Kiest een getalwaarde voor gammacorrectie (groene kanaal)"
#: ../backend/microtek2.h:664
#, no-c-format
@@ -4097,19 +4125,19 @@ msgstr "Gammagetalwaarde voor blauw"
#: ../backend/microtek2.h:665
#, no-c-format
msgid "Selects a value for scalar gamma correction (blue channel)"
-msgstr "Gammagetalwaarde voor blauw"
+msgstr "Kiest een getalwaarde voor gammacorrectie (blauwe kanaal)"
#: ../backend/microtek2.h:669
#, no-c-format
msgid "Channel"
-msgstr "kleurkanaal"
+msgstr "Kanaal"
#: ../backend/microtek2.h:670
#, no-c-format
msgid ""
"Selects the colour band, \"Master\" means that all colours are affected."
msgstr ""
-"Kiest het kleurkanaal, \"Master\" betekent dat alle kleuren worden "
+"Kiest de kleurengroep, \"Master\" betekent dat alle kleuren worden "
"beïnvloed."
#: ../backend/microtek2.h:674
@@ -4120,7 +4148,7 @@ msgstr "Middentoon"
#: ../backend/microtek2.h:675
#, no-c-format
msgid "Selects which radiance level should be considered \"50 % gray\"."
-msgstr "Bepaalt welke helderheidswaarde als 50% grijs wordt gekozen."
+msgstr "Kiest welke helderheidswaarde als 50% grijs moet worden beschouwd."
#: ../backend/microtek2.h:679
#, no-c-format
@@ -4130,7 +4158,7 @@ msgstr "Middentoon voor rood"
#: ../backend/microtek2.h:680
#, no-c-format
msgid "Selects which radiance level should be considered \"50 % red\"."
-msgstr "Bepaalt welke helderheidswaarde als 50% rood wordt gekozen."
+msgstr "Kiest welke helderheidswaarde als 50% rood moet worden beschouwd."
#: ../backend/microtek2.h:684
#, no-c-format
@@ -4140,7 +4168,7 @@ msgstr "Middentoon voor groen"
#: ../backend/microtek2.h:685
#, no-c-format
msgid "Selects which radiance level should be considered \"50 % green\"."
-msgstr "Bepaalt welke helderheidswaarde als 50% groen wordt gekozen."
+msgstr "Kiest welke helderheidswaarde als 50% groen moet worden beschouwd."
#: ../backend/microtek2.h:689
#, no-c-format
@@ -4150,7 +4178,7 @@ msgstr "Middentoon voor blauw"
#: ../backend/microtek2.h:690
#, no-c-format
msgid "Selects which radiance level should be considered \"50 % blue\"."
-msgstr "Bepaalt welke helderheidswaarde als 50% blauw wordt gekozen."
+msgstr "Kiest welke helderheidswaarde als 50% blauw moet worden beschouwd."
#: ../backend/microtek2.h:694
#, no-c-format
@@ -4160,7 +4188,8 @@ msgstr "Roodbalans"
#: ../backend/microtek2.h:695
#, no-c-format
msgid "Balance factor for red. A value of 100% means no correction."
-msgstr "Kleurbalansfactor voor rood: 100% betekent geen kleurcorrectie."
+msgstr ""
+"Kleurbalansfactor voor rood: Een waarde van 100% betekent geen kleurcorrectie."
#: ../backend/microtek2.h:699
#, no-c-format
@@ -4170,7 +4199,9 @@ msgstr "Groenbalans"
#: ../backend/microtek2.h:700
#, no-c-format
msgid "Balance factor for green. A value of 100% means no correction."
-msgstr "Kleurbalansfactor voor groen: 100% betekent geen kleurcorrectie."
+msgstr ""
+"Kleurbalansfactor voor groen: Een waarde van 100% betekent geen "
+"kleurcorrectie."
#: ../backend/microtek2.h:704
#, no-c-format
@@ -4180,12 +4211,14 @@ msgstr "Blauwbalans"
#: ../backend/microtek2.h:705
#, no-c-format
msgid "Balance factor for blue. A value of 100% means no correction."
-msgstr "Kleurbalansfactor voor blauw: 100% betekent geen kleurcorrectie."
+msgstr ""
+"Kleurbalansfactor voor blauw: Een waarde van 100% betekent geen "
+"kleurcorrectie."
#: ../backend/microtek2.h:709
#, no-c-format
msgid "Firmware balance"
-msgstr "Standaardbalans"
+msgstr "Standaardkleurbalans"
#: ../backend/microtek2.h:710
#, no-c-format
@@ -4202,12 +4235,12 @@ msgstr "Langzaamste"
#: ../backend/mustek.c:149
#, no-c-format
msgid "Slower"
-msgstr "Langzaam"
+msgstr "Langzamer"
#: ../backend/mustek.c:150
#, no-c-format
msgid "Faster"
-msgstr "Snel"
+msgstr "Sneller"
#: ../backend/mustek.c:150
#, no-c-format
@@ -4217,7 +4250,7 @@ msgstr "Snelste"
#: ../backend/mustek.c:177
#, no-c-format
msgid "8x8 coarse"
-msgstr "8x8 basis"
+msgstr "8x8 grof"
#: ../backend/mustek.c:177
#, no-c-format
@@ -4242,7 +4275,7 @@ msgstr "6x6 normaal"
#: ../backend/mustek.c:179
#, no-c-format
msgid "5x5 coarse"
-msgstr "5x5 basis"
+msgstr "5x5 grof"
#: ../backend/mustek.c:179
#, no-c-format
@@ -4252,7 +4285,7 @@ msgstr "5x5 fijn"
#: ../backend/mustek.c:179
#, no-c-format
msgid "4x4 coarse"
-msgstr "4x4 basis"
+msgstr "4x4 grof"
#: ../backend/mustek.c:180
#, no-c-format
@@ -4320,8 +4353,9 @@ msgid ""
"Request that all previews are done in the fastest (low-quality) mode. "
"This may be a non-color mode or a low resolution mode."
msgstr ""
-"Bepaalt dat alle voorbeeldscannen in de snelste (lage kwaliteit) modus "
-"worden uitgevoerd. Dit kan een niet-kleur of lage resolutie modus zijn."
+"Vraag de snelste (lage kwaliteit) modus te gebruiken voor alle "
+"voorbeeldscans. "
+"Dit kan een niet-kleur of lage resolutie modus zijn."
#: ../backend/mustek.c:4343
#, no-c-format
@@ -4331,7 +4365,7 @@ msgstr "Lamp uit tijd (minuten)"
#: ../backend/mustek.c:4344
#, no-c-format
msgid "Set the time (in minutes) after which the lamp is shut off."
-msgstr "Stelt de tijd (in minuten) in waarna de lamp wordt uitgeschakeld."
+msgstr "Stel de tijd (in minuten) in waarna de lamp wordt uitgeschakeld."
#: ../backend/mustek.c:4355
#, no-c-format
@@ -4346,77 +4380,77 @@ msgstr "Schakelt de lamp direct uit"
#: ../backend/mustek.c:4433
#, no-c-format
msgid "Red brightness"
-msgstr "Rode helderheid"
+msgstr "Helderheid van het rode kanaal"
#: ../backend/mustek.c:4434
#, no-c-format
msgid "Controls the brightness of the red channel of the acquired image."
-msgstr "Stelt de helderheid van de rode component in van het gescande beeld."
+msgstr "Bepaalt de helderheid van het rode kanaal van het verkregen beeld."
#: ../backend/mustek.c:4446
#, no-c-format
msgid "Green brightness"
-msgstr "Groene helderheid"
+msgstr "Helderheid van het groene kanaal"
#: ../backend/mustek.c:4447
#, no-c-format
msgid "Controls the brightness of the green channel of the acquired image."
-msgstr "Stelt de helderheid van de groene component in van het gescande beeld."
+msgstr "Bepaalt de helderheid van het groene kanaal van het verkregen beeld."
#: ../backend/mustek.c:4459
#, no-c-format
msgid "Blue brightness"
-msgstr "Blauwe helderheid"
+msgstr "Helderheid van het blauwe kanaal"
#: ../backend/mustek.c:4460
#, no-c-format
msgid "Controls the brightness of the blue channel of the acquired image."
-msgstr "Stelt de helderheid van de blauwe component in van het gescande beeld."
+msgstr "Bepaalt de helderheid van het blauwe kanaal van het verkregen beeld."
#: ../backend/mustek.c:4485
#, no-c-format
msgid "Contrast red channel"
-msgstr "Contrast van de rode component"
+msgstr "Contrast van het rode kanaal"
#: ../backend/mustek.c:4486
#, no-c-format
msgid "Controls the contrast of the red channel of the acquired image."
-msgstr "Stelt het contrast van de rode component in van het gescande beeld."
+msgstr "Bepaalt het contrast van het rode kanaal van het verkregen beeld."
#: ../backend/mustek.c:4498
#, no-c-format
msgid "Contrast green channel"
-msgstr "Contrast van de groene component"
+msgstr "Contrast van het groene kanaal"
#: ../backend/mustek.c:4499
#, no-c-format
msgid "Controls the contrast of the green channel of the acquired image."
-msgstr "Stelt het contrast van de groene component in van het gescande beeld."
+msgstr "Bepaalt het contrast van het groene kanaal van het verkregen beeld."
#: ../backend/mustek.c:4511
#, no-c-format
msgid "Contrast blue channel"
-msgstr "Contrast van de blauwe component"
+msgstr "Contrast van het blauwe kanaal"
#: ../backend/mustek.c:4512
#, no-c-format
msgid "Controls the contrast of the blue channel of the acquired image."
-msgstr "Stelt het contrast van de blauwe component in van het gescande beeld."
+msgstr "Bepaalt het contrast van het blauwe kanaal van het verkregen beeld."
#: ../backend/mustek_usb2.c:105
#, no-c-format
msgid "Color48"
-msgstr "Kleur 48"
+msgstr "Kleur48"
#: ../backend/mustek_usb2.c:106 ../backend/mustek_usb2.c:114
#, no-c-format
msgid "Color24"
-msgstr "Kleur 24"
+msgstr "Kleur24"
#: ../backend/mustek_usb2.c:107
#, no-c-format
msgid "Gray16"
-msgstr "Grijs 16"
+msgstr "Grijs16"
#: ../backend/mustek_usb2.c:108
#, no-c-format
@@ -4439,8 +4473,8 @@ msgid ""
"Warm-up until the lamp's brightness is constant instead of insisting on "
"40 seconds warm-up time."
msgstr ""
-"Wacht totdat de lamp constant brandt in plaats van de eis van 40 seconde "
-"opwarmtijd na te leven."
+"Warm op totdat de helderheid van de lamp constant is in plaats van de "
+"'verplichte' 40 seconde opwarmtijd aan te houden."
#: ../backend/pixma.c:378
#, no-c-format
@@ -4467,7 +4501,10 @@ msgstr "16 bits grijs"
msgid ""
"Selects the scan source (such as a document-feeder). Set source before "
"mode and resolution. Resets mode and resolution to auto values."
-msgstr "Selecteert de scanbron (zoals b.v. documentendoorvoer)."
+msgstr ""
+"Kiest de scanbron (zoals b.v. documentendoorvoer). Stel de bron in voor de "
+"modus en resolutie. "
+"Zet modus en resolutie terug naar automatische waarden."
#: ../backend/pixma_sane_options.c:96
#, no-c-format
@@ -4498,7 +4535,7 @@ msgstr "Verandert de intensiteit van de middentonen"
#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
-msgstr "Werk stand van de knop bij"
+msgstr "Werk de status van de knop bij"
#: ../backend/pixma_sane_options.c:242
#, no-c-format
@@ -4524,7 +4561,7 @@ msgstr "Soort bewerking van het resultaat"
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
-msgstr "Diapositief"
+msgstr "Transparantie"
#: ../backend/plustek.c:913
#, no-c-format
@@ -4609,12 +4646,12 @@ msgstr "Roodbereik waarde van de AFE"
#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
-msgstr "Roodoffset"
+msgstr "Rood compensatie"
#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
-msgstr "Roodoffset waarde van de AFE"
+msgstr "Rood compensatie van de AFE"
#: ../backend/plustek.c:1018
#, no-c-format
@@ -4624,12 +4661,12 @@ msgstr "Groenbereik waarde van de AFE"
#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
-msgstr "Groenoffset"
+msgstr "Groen compensatie"
#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
-msgstr "Groenoffset waarde van de AFE"
+msgstr "Groen compensatie van de AFE"
#: ../backend/plustek.c:1034
#, no-c-format
@@ -4639,12 +4676,12 @@ msgstr "Blauwbereik waarde van de AFE"
#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
-msgstr "Blauwoffset"
+msgstr "Blauw compensatie"
#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
-msgstr "Blauwoffset waarde van de AFE"
+msgstr "Blauw compensatie van de AFE"
#: ../backend/plustek.c:1049
#, no-c-format
@@ -4679,12 +4716,12 @@ msgstr "Bepaalt de blauwe lamp uit parameter"
#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
-msgstr "Deze optie geeft de status weer van de sannerknoppen."
+msgstr "Deze optie geeft de status weer van de scannerknoppen."
#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
-msgstr "Kleur 36"
+msgstr "Kleur36"
#: ../backend/plustek_pp.c:211
#, no-c-format
@@ -4732,8 +4769,9 @@ msgid ""
"Simulate a three-pass scanner by returning 3 separate frames. For "
"kicks, it returns green, then blue, then red."
msgstr ""
-"Simuleer een Three-Pass Scanner, waardoor de frames voor elke basiskleur "
-"na elkaar worden overgedragen. De volgorde is groen-blauw-rood."
+"Simuleer een Three-Pass Scanner door drie afzonderlijke afbeeldingen te "
+"retourneren. Bij "
+"voorkeur is de volgorde groen, dan blauw en tenslotte rood."
#: ../backend/pnm.c:267
#, no-c-format
@@ -4745,7 +4783,7 @@ msgstr "Handscanner simulatie"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Simuleer een handscanner. Bij handscanners staat meestal de beeldhoogte "
"van te voren niet vast. In plaats daarvan geven zij een hoogte van -1 "
@@ -4756,7 +4794,7 @@ msgstr ""
#, no-c-format
msgid "Set default values for enhancement controls (brightness & contrast)."
msgstr ""
-"Stelt de kleurverbeteringsinstellingen (helderheid en contrast) in op "
+"Stel de kleurverbeteringsinstellingen (helderheid en contrast) in op "
"standaardwaarden."
#: ../backend/pnm.c:295
@@ -4885,35 +4923,35 @@ msgid ""
"after sane_read() has been called."
msgstr ""
"Dwing de \"backend\", na een aanroep van sane_read() het "
-"statusberichtSANE_STATUS_ACCESS_DENIED terug te geven."
+"statusbericht SANE_STATUS_ACCESS_DENIED terug te geven."
-#: ../backend/rts8891.c:2803
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Deze optie geeft de status weer van een scannerknop."
-#: ../backend/rts8891.c:2834 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Lamp aan"
-#: ../backend/rts8891.c:2835 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Schakel scannerlamp aan"
-#: ../backend/rts8891.c:2845 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Lamp uit"
-#: ../backend/rts8891.c:2846 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
-msgstr "Schakelt de scannerlamp uit"
+msgstr "Schakel de scannerlamp uit"
#: ../backend/sm3840.c:760
#, no-c-format
@@ -4933,7 +4971,7 @@ msgstr "Drempelwaarde voor lijntekening modus"
#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
-msgstr "Automatische documentendoorvoer"
+msgstr "Documentinvoer"
#: ../backend/snapscan-options.c:92
#, no-c-format
@@ -5008,7 +5046,7 @@ msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
"combination of speed and detail."
msgstr ""
-"Kiest de scanmodus voor alle voorbeeldscans. Grijstrap voorbeeldscans "
+"Kies de scanmodus voor voorbeeldscans. Grijstrap voorbeeldscans "
"geven meestal de beste combinatie van snelheid en detail."
#: ../backend/snapscan-options.c:601
@@ -5026,12 +5064,12 @@ msgstr "Biedt standaard scanoppervlaktes voor foto's, afdrukken enzovoort."
#: ../backend/snapscan-options.c:884
#, no-c-format
msgid "Frame"
-msgstr "Raam"
+msgstr "Scannerraam"
#: ../backend/snapscan-options.c:885
#, no-c-format
msgid "Frame to be scanned"
-msgstr "Het te scannen raam"
+msgstr "Het te scannen scannerraam"
#: ../backend/snapscan-options.c:897
#, no-c-format
@@ -5086,12 +5124,12 @@ msgstr "Kleur RGB TEKST"
#: ../backend/test.c:137
#, no-c-format
msgid "Solid black"
-msgstr "Diep zwart"
+msgstr "Verzadigd zwart"
#: ../backend/test.c:137
#, no-c-format
msgid "Solid white"
-msgstr "Diep wit"
+msgstr "Verzadigd wit"
#: ../backend/test.c:138
#, no-c-format
@@ -5132,7 +5170,7 @@ msgstr "Handscanner-simulatie"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Simuleer een handscanner. Bij handscanners staat tenminste de "
@@ -5151,18 +5189,18 @@ msgid ""
"Simulate a three-pass scanner. In color mode, three frames are "
"transmitted."
msgstr ""
-"Simuleer een Three-Pass-Scanner. In kleurmodus worden drie \"frames\" "
+"Simuleer een Three-Pass-Scanner. In kleurmodus worden drie afbeeldingen "
"overgedragen."
#: ../backend/test.c:382
#, no-c-format
msgid "Set the order of frames"
-msgstr "Legt de volgorde van de \"frames\" vast"
+msgstr "Bepaal de volgorde van de afbeeldingen"
#: ../backend/test.c:383
#, no-c-format
msgid "Set the order of frames in three-pass color mode."
-msgstr "Legt de volgorde van de \"frames\" vast in Three-Pass-modus."
+msgstr "Bepaal de volgorde van de afbeeldingen in Three-Pass kleurenmodus."
#: ../backend/test.c:416
#, no-c-format
@@ -5170,8 +5208,8 @@ msgid ""
"If Automatic Document Feeder is selected, the feeder will be 'empty' "
"after 10 scans."
msgstr ""
-"Als de automatische documentendoorvoer is geselecteerd, dan zal de "
-"doorvoer 'leeg' zijn na 10 scans."
+"Als de automatische documentinvoer is gekozen, zal de invoer"
+"na 10 scans 'leeg' zijn."
#: ../backend/test.c:431
#, no-c-format
@@ -5181,7 +5219,7 @@ msgstr "Extra opties"
#: ../backend/test.c:444
#, no-c-format
msgid "Select the test picture"
-msgstr "Kiest het testbeeld"
+msgstr "Kies het testbeeld"
#: ../backend/test.c:446
#, no-c-format
@@ -5193,9 +5231,9 @@ msgid ""
"Grid: draws a black/white grid with a width and height of 10 mm per "
"square."
msgstr ""
-"Kiest het soort testbeeld. Beschikbare testbeelden:\n"
-"Diep zwart: maakt het gehele beeld zwart.\n"
-"Diep wit: maakt het gehele beeld wit.\n"
+"Kies het soort testbeeld. Beschikbare opties:\n"
+"Egaal zwart: maakt het gehele beeld zwart.\n"
+"Egaal wit: maakt het gehele beeld wit.\n"
"Kleurpatroon: tekent verschillende kleurtestpatronen, afhankelijk van de "
"modus.\n"
"Raster: tekent een zwart/wit raster ter grootte van 10 mm²."
@@ -5226,7 +5264,7 @@ msgstr "Leesbegrenzing"
#, no-c-format
msgid "Limit the amount of data transferred with each call to sane_read()."
msgstr ""
-"Begrenst de hoeveelheid gegevens die bij iedere aanroep van sane_read() "
+"Begrens de hoeveelheid gegevens die bij elke aanroep van sane_read() "
"wordt overgedragen."
#: ../backend/test.c:498
@@ -5238,7 +5276,7 @@ msgstr "Grootte van de leesbegrenzing"
#, no-c-format
msgid "The (maximum) amount of data transferred with each call to sane_read()."
msgstr ""
-"De (maximale) hoeveelheid gegevens die bij iedere aanroep van "
+"De (maximale) hoeveelheid gegevens die bij elke aanroep van "
"sane_read() wordt overgedragen."
#: ../backend/test.c:514
@@ -5261,8 +5299,8 @@ msgstr "Duur van de leesvertraging"
msgid ""
"How long to wait after transferring each buffer of data through the pipe."
msgstr ""
-"Legt vast, hoe lang wordt gewacht na de overdracht van de "
-"gegevensverzameling door de databus."
+"Hoe lang wordt gewacht nadat de gegevensverzameling door de databus is "
+"overgebracht."
#: ../backend/test.c:543
#, no-c-format
@@ -5276,7 +5314,7 @@ msgid ""
"handling for scanning. All other status codes are for testing how the "
"frontend handles them."
msgstr ""
-"Legt het resultaat van sane_read() vast. \"Default\" is de normale "
+"Kies het resultaat van sane_read(). \"Default\" is de normale "
"instelling voor het scannen. Alle andere resultaten zijn bedoeld om vast "
"te stellen hoe \"frontends\" hiermee omgaan."
@@ -5293,7 +5331,7 @@ msgstr "Het aantal pixels dat aan het einde van elke lijn verloren gaat."
#: ../backend/test.c:577
#, no-c-format
msgid "Fuzzy parameters"
-msgstr "Verwarrende parameters"
+msgstr "Onduidelijke parameters"
#: ../backend/test.c:578
#, no-c-format
@@ -5301,8 +5339,8 @@ msgid ""
"Return fuzzy lines and bytes per line when sane_parameters() is called "
"before sane_start()."
msgstr ""
-"Geef verwarrende waarden voor het aantal lijnen en bytes per lijn terug "
-"als sane_parameters() voor sane_start() wordt aangeroepen."
+"Geef onduidelijke lijnen en bytes per lijn terug als sane_parameters() voor "
+"sane_start() wordt aangeroepen."
#: ../backend/test.c:591
#, no-c-format
@@ -5313,8 +5351,8 @@ msgstr "Gebruik niet-blokkerende IO"
#, no-c-format
msgid "Use non-blocking IO for sane_read() if supported by the frontend."
msgstr ""
-"Gebruik niet-blokkerende IO voor sane_read() als dat door de \"frontend"
-"\"wordt ondersteund."
+"Gebruik niet-blokkerende IO voor sane_read() als de \"frontend\" dat "
+"ondersteunt."
#: ../backend/test.c:605
#, no-c-format
@@ -5327,7 +5365,7 @@ msgid ""
"Offer a select filedescriptor for detecting if sane_read() will return "
"data."
msgstr ""
-"Biedt een \"kies-bestandsbeschrijving\" aan, om te kunnen detecteren of "
+"Biedt een \"kies-bestandsbeschrijving\" aan, om te kunnen achterhalen of "
"sane_read() gegevens zal teruggeven."
#: ../backend/test.c:619
@@ -5363,7 +5401,7 @@ msgstr "Bool-testopties"
#: ../backend/test.c:725
#, no-c-format
msgid "(1/6) Bool soft select soft detect"
-msgstr "(1/6) Bool soft select soft detect"
+msgstr "(1/6) Bool \"soft select\" \"soft detect\""
#: ../backend/test.c:727
#, no-c-format
@@ -5371,14 +5409,14 @@ msgid ""
"(1/6) Bool test option that has soft select and soft detect (and "
"advanced) capabilities. That's just a normal bool option."
msgstr ""
-"(1/6) Dit is een bool-testoptie, met \"soft select\" en \"soft detect"
-"\" (en \"advanced\") mogelijkheden. Dit is slechts een normale bool-"
+"(1/6) Dit is een bool-testoptie, met \"soft select\" en \"soft detect\" "
+"(en \"advanced\") mogelijkheden. Dit is slechts een normale bool-"
"optie."
#: ../backend/test.c:743
#, no-c-format
msgid "(2/6) Bool hard select soft detect"
-msgstr "(2/6) Bool hard select soft detect"
+msgstr "(2/6) Bool \"hard select\" \"soft detect\""
#: ../backend/test.c:745
#, no-c-format
@@ -5387,15 +5425,15 @@ msgid ""
"advanced) capabilities. That means the option can't be set by the "
"frontend but by the user (e.g. by pressing a button at the device)."
msgstr ""
-"(2/6) Dit is een bool-testoptie, met \"hard select\" en \"soft detect"
-"\" (en \"advanced\") mogelijkheden. Dit betekent dat de \"frontend\" de "
+"(2/6) Dit is een bool-testoptie, met \"hard select\" en \"soft detect\" "
+"(en \"advanced\") mogelijkheden. Dit betekent dat de \"frontend\" de "
"optie niet kan instellen, maar de gebruiker dat moet doen (b.v. door op "
"een knop van het apparaat te drukken)."
#: ../backend/test.c:762
#, no-c-format
msgid "(3/6) Bool hard select"
-msgstr "(3/6) Bool hard select"
+msgstr "(3/6) Bool \"hard select\""
#: ../backend/test.c:763
#, no-c-format
@@ -5413,7 +5451,7 @@ msgstr ""
#: ../backend/test.c:781
#, no-c-format
msgid "(4/6) Bool soft detect"
-msgstr "(4/6) Bool soft detect"
+msgstr "(4/6) Bool \"soft detect\""
#: ../backend/test.c:782
#, no-c-format
@@ -5427,7 +5465,7 @@ msgstr ""
#: ../backend/test.c:798
#, no-c-format
msgid "(5/6) Bool soft select soft detect emulated"
-msgstr "(5/6) Bool soft select soft detect emulated"
+msgstr "(5/6) Bool \"soft select\" \"soft detect\" geemuleerd"
#: ../backend/test.c:799
#, no-c-format
@@ -5441,7 +5479,7 @@ msgstr ""
#: ../backend/test.c:815
#, no-c-format
msgid "(6/6) Bool soft select soft detect auto"
-msgstr "(6/6) Bool soft select soft detect auto"
+msgstr "(6/6) Bool \"soft select\" \"soft detect\" auto"
#: ../backend/test.c:816
#, no-c-format
@@ -5644,7 +5682,7 @@ msgstr "Gebruik beeldcompositie"
#: ../backend/umax.c:236
#, no-c-format
msgid "Bi-level black and white (lineart mode)"
-msgstr "2 niveau zwart/wit (lijntekening modus)"
+msgstr "2-niveau zwart/wit (lijntekening modus)"
#: ../backend/umax.c:237
#, no-c-format
@@ -5664,7 +5702,7 @@ msgstr "Multi-niveau RGB kleur (één-doorgang-kleur)"
#: ../backend/umax.c:240
#, no-c-format
msgid "Ignore calibration"
-msgstr "Negeer kalibrering"
+msgstr "Negeer kalibratie"
#: ../backend/umax.c:5733
#, no-c-format
@@ -5684,17 +5722,17 @@ msgstr "Handmatige voorfocusering"
#: ../backend/umax.c:5757
#, no-c-format
msgid "Fix focus position"
-msgstr "Vaste focuspositie"
+msgstr "Zet focuspositie vast"
#: ../backend/umax.c:5769
#, no-c-format
msgid "Lens calibration in doc position"
-msgstr "Lens op het document kalibreren"
+msgstr "Kalibratie van de lens op het document"
#: ../backend/umax.c:5770
#, no-c-format
msgid "Calibrate lens focus in document position"
-msgstr "Focus van de lens op het document kalibreren"
+msgstr "Kalibreer focus van de lens op het document"
#: ../backend/umax.c:5781
#, no-c-format
@@ -5714,7 +5752,7 @@ msgstr "Kalibreermodus"
#: ../backend/umax.c:5886
#, no-c-format
msgid "Define calibration mode"
-msgstr "Kalibreermodus definiëren"
+msgstr "Bepaal kalibreermodus"
#: ../backend/umax_pp.c:640
#, no-c-format
@@ -5734,37 +5772,37 @@ msgstr "Schakelt UTA aan/uit"
#: ../backend/umax_pp.c:771
#, no-c-format
msgid "Offset"
-msgstr "Offset"
+msgstr "Compensatie"
#: ../backend/umax_pp.c:773
#, no-c-format
msgid "Color channels offset settings"
-msgstr "Offsetinstellingen van de kleurkanalen"
+msgstr "Compensatieinstellingen van de kleurkanalen"
#: ../backend/umax_pp.c:780
#, no-c-format
msgid "Gray offset"
-msgstr "Grijsoffset"
+msgstr "Grijscompensatie"
#: ../backend/umax_pp.c:781
#, no-c-format
msgid "Sets gray channel offset"
-msgstr "Stelt het offset in van het grijze kanaal"
+msgstr "Stelt de compensatie in van het grijze kanaal"
#: ../backend/umax_pp.c:793
#, no-c-format
msgid "Sets red channel offset"
-msgstr "Stelt het offset in van het rode kanaal"
+msgstr "Stelt de compensatie in van het rode kanaal"
#: ../backend/umax_pp.c:805
#, no-c-format
msgid "Sets green channel offset"
-msgstr "Stelt het offset in van het groene kanaal"
+msgstr "Stelt de compensatie in van het groene kanaal"
#: ../backend/umax_pp.c:817
#, no-c-format
msgid "Sets blue channel offset"
-msgstr "Stelt het offset in van het blauwe kanaal"
+msgstr "Stelt de compensatie in van het blauwe kanaal"
#~ msgid "problem not analyzed (unknown SCSI class)"
#~ msgstr "probleem niet geanalyseerd (onbekende SCSI klasse)"
diff --git a/po/pl.po b/po/pl.po
index 1624c1f..bbd8bfb 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,7 +6,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends 1.0.21\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2010-11-06 19:33+0100\n"
"Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
"Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
@@ -26,17 +26,17 @@ msgid "Standard"
msgstr "Standardowe"
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -45,25 +45,25 @@ msgid "Geometry"
msgstr "Krawędzie obszaru skanowania"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Ulepszanie"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Zaawansowane"
@@ -88,8 +88,8 @@ msgstr "Wymuszaj podgląd czarnobiały"
msgid "Bit depth"
msgstr "Głębokość bitowa"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Tryb skanowania"
@@ -129,7 +129,8 @@ msgstr "Prawa"
msgid "Bottom-right y"
msgstr "Dolna"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Rozdzielczość skanowania"
@@ -297,7 +298,7 @@ msgstr "Zrównaj rozdzielczość w osi X i Y"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -983,7 +984,7 @@ msgstr "Wartości domyślne"
msgid "Set default values for enhancement controls."
msgstr "Ustaw domyślne wartości ustawień ulepszania"
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Kalibracja"
@@ -1024,22 +1025,22 @@ msgstr ""
msgid "Button state"
msgstr "Stan przycisku"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Numer ramki do skanowania"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Wybiera numer ramki do skanowania"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Skanowanie dwustronne"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
@@ -1047,42 +1048,42 @@ msgstr ""
"Skanowanie dwustronne pozwala na skanowanie przedniej i tylnej strony "
"dokumentu"
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Kalibruj Skaner"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Wymuś kalibrację przed skanowaniem"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Skanowanie w odcieniach szarości"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Skanuj raczej w odcieniach szarości niż w kolorze"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Wzmocnienie analogowe"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Zwiększ lub zmniejsz wzmocnienie analogowe matrycy CCD"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Korekcja Gamma"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Wybiera poprawioną krzywą przejścia"
@@ -1094,8 +1095,8 @@ msgstr "Surowy"
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr "Dobry kolor"
@@ -1146,600 +1147,610 @@ msgstr "1/2 zwykłej prędkości"
msgid "1/3 normal speed"
msgstr "1/3 zwykłej prędkości"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, no-c-format
msgid "rounded parameter"
msgstr "parametr zaokrąglony"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr "nieznany"
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr "zakleszczenie ADF"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr "pokrywa ADF otwarta"
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, no-c-format
msgid "lamp failure"
msgstr "awaria lampy"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr "błąd pozycjonowania głowicy skanera"
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr "błąd kontroli CPU"
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr "błąd kontroli RAM"
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr "błąd kontroli ROM"
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr "błąd kontroli sprzętu"
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, no-c-format
msgid "transparency unit lamp failure"
msgstr "awaria lampy do skanowania przezroczy"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr "błąd pozycjonowania głowicy do skanowania przezroczy"
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr "błąd długości listy parametrów"
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr "błędny kod operacji"
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr "błędne pole w CDB"
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr "nieobsługiwany LUN"
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr "błędne pole w liście parametrów"
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr "błąd sekwencji poleceń"
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr "podano zbyt dużo okien"
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr "brak nośnika"
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr "błędny komunikat bitowy IDENTIFY"
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr "opcja nie podłączona"
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr "reset po włączeniu zasilania / reset szyny"
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr "parametr zmieniony przez inny inicjator"
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr "brak dodatkowej informacji o stanie"
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr "niepowodzenie ponownego wyboru"
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr "błąd parzystości SCSI"
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr "otrzymano komunikat błędu wykryty przez inicjator"
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr "błędny komunikat"
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr "błąd przekroczenia czasu"
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, no-c-format
msgid "transparency unit shading error"
msgstr "błąd cieniowania modułu do skanowania przezroczy"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr "lampa nie ustabilizowana"
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr "problem nie przeanalizowany (nieznana klasa SCSI)"
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, no-c-format
msgid "film scanner"
msgstr "skaner filmów"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "skaner płaski"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Rodzaj filmu"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr "Wybór rodzaju filmu, np. negatywów lub slajdów"
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, no-c-format
msgid "Negative film type"
msgstr "Rodzaj negatywu"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, no-c-format
msgid "Selects the negative film type"
msgstr "Wybór rodzaju negatywu"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, no-c-format
msgid "Hardware resolution"
msgstr "Rozdzielczość sprzętowa"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, no-c-format
msgid "Use only hardware resolutions"
msgstr "Użycie tylko rozdzielczości sprzętowych"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr "Ostrość"
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, no-c-format
msgid "Auto focus"
msgstr "Ostrość automatyczna"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, no-c-format
msgid "Enable/disable auto focus"
msgstr "Włączenie/wyłączenie automatycznego ustawiania ostrości"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr "Jednokrotny autofocus"
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr "Automatyczne ustawianie ostrości tylko po wymianie nośnika"
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, no-c-format
msgid "Manual focus position"
msgstr "Ręczne ustawianie ostrości"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr "Ręczne ustawianie pozycji ostrości optyki (domyślnie: 128)."
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr "Marginesy skanowania"
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr "Dodatkowe ustawienia kolorów"
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Odbicie lustrzane obrazka"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, no-c-format
msgid "Mirror the image horizontally"
msgstr "Poziome odbicie lustrzane obrazu"
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, no-c-format
msgid "Auto exposure"
msgstr "Ekspozycja automatyczna"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Włączenie/wyłączenie automatycznego wyboru ekspozycji"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, no-c-format
msgid "Calibration now"
msgstr "Kalibruj teraz"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, no-c-format
msgid "Execute calibration *now*"
msgstr "Uruchomienie kalibracji *teraz*"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr "Autodiagnostyka"
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr "Wykonanie autodiagnostyki skanera"
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, no-c-format
msgid "Reset scanner"
msgstr "Reset skanera"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, no-c-format
msgid "Reset the scanner"
msgstr "Zresetowanie skanera"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr "Obsługa medium"
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, no-c-format
msgid "Eject film after each scan"
msgstr "Wysuń film po zeskanowaniu"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr "Automatyczne wysuwanie filmu z urządzenia po każdym skanowaniu"
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr "Wysuń film przed zakończeniem"
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr ""
"Automatyczne wysuwanie filmu z urządzenia przed zakończeniem programu"
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr "Wysuń film teraz"
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr "Wysunięcie filmu *teraz*"
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, no-c-format
msgid "Document feeder extras"
msgstr "Dodatkowy podajnik dokumentów"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, no-c-format
msgid "Flatbed only"
msgstr "Tylko płyta"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
"Wyłączenie automatycznego podajnika dokumentów, używanie tylko płyty"
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, no-c-format
msgid "Transparency unit"
msgstr "Moduł do skanowania przezroczy"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr "Włączenie/wyłączenie modułu do skanowania przezroczy (FAU)"
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, no-c-format
msgid "Negative film"
msgstr "Negatyw"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, no-c-format
msgid "Positive or negative film"
msgstr "Pozytyw lub negatyw"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr "Kontrola gęstości"
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr "Ustawienie trybu kontroli gęstości"
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, no-c-format
msgid "Transparency ratio"
msgstr "Współczynnik przezroczystości"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, no-c-format
msgid "Select film type"
msgstr "Rodzaj filmu"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, no-c-format
msgid "Select the film type"
msgstr "Wybór rodzaju filmu"
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Płyta"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr "ADF przód"
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
msgstr "ADF tył"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "ADF dwustronny"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Przód"
+
+#: ../backend/canon_dr.c:393
+#, fuzzy, no-c-format
+msgid "Card Back"
+msgstr "Tył"
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Dwustronny"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Czerwony"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Zielony"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Niebieski"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, no-c-format
msgid "Enhance Red"
msgstr "Rozszerzenie czerwieni"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, no-c-format
msgid "Enhance Green"
msgstr "Rozszerzenie zieleni"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, no-c-format
msgid "Enhance Blue"
msgstr "Rozszerzenie błękitu"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Brak"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr "JPEG"
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Jednostronny"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Dwustronny"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Moduł do skanowania przezroczy"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Automatyczny podajnik dokumentów"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Pozytyw"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Negatyw"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Ostrość na szybie"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Ostrość 2.5mm powyżej szyby"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Półton A (Twardy)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Półton B (Miękki)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Półton C (Siatka)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Ziarnistość A (4x4 Bayera)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Ziarnistość B (4x4 Spiralna)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Ziarnistość C (4x4 Siatka)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Ziarnistość D (8x4 Siatka)"
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Technologia Uwydatniania Tekstu"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Pobierz wzór A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Pobierz wzór B"
@@ -1749,7 +1760,7 @@ msgstr "Pobierz wzór B"
msgid "No Correction"
msgstr "Brak korekcji"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Zdefiniowane przez użytkownika"
@@ -1774,33 +1785,33 @@ msgstr "Drukarki atramentowe"
msgid "CRT monitors"
msgstr "Monitory CRT"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Domyślny"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Druk wysokiej gęstości"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Druk niskiej gęstości"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Druk o wysokim kontraście"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Zdefiniowane przez użytkownika (Gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Zdefiniowane przez użytkownika (Gamma=1.8)"
@@ -1840,232 +1851,232 @@ msgstr "A4"
msgid "Max"
msgstr "Maksimum"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Tryb skanowania"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Wybór półcieni"
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Dropout"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Wybiera dropout"
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Wybiera jasność"
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Ostrość"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Korekcja koloru"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
"Ustawia tablicę korekcji koloru dla wybranego urządzenia wyjściowego."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Współczynnik korekcji koloru"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Macierz mnożenia RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Przesuń zieleń do czerwieni"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Przesuń zieleń do błękitu"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Przesuń czerwień do zieleni"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Przesuń czerwień do błękitu"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Przesuń błękit do zieleni"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Przesuń błękit do czerwieni"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Nadzoruje poziom zieleni"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Dodaje do czerwieni bazując na poziomie zieleni"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Dodaje do błękitu bazując na poziomie zieleni"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Dodaje do zieleni bazując na poziomie czerwieni"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Nadzoruje poziom czerwieni"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Dodaje do błękitu bazując na poziomie czerwieni"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Dodaje do zieleni bazując na poziomie błękitu"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Dodaje do czerwieni bazując na poziomie błękitu"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Nadzoruje poziom błękitu"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Utwórz odbicie lustrzane obrazka"
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Szybki podgląd"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Automatyczny podział obszaru"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Krótka lista rozdzielczości"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Wyświetl krótką listę rozdzielczości"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Powiększenie"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Definiuje współczynnik powiększenia dla skanera"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Szybkie formatowanie"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Wyposażenie opcjonalne"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Wysuń"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Wysuń arkusz z ADF"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Wysuwanie automatyczne"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Wysuń dokument po zeskanowaniu"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "Tryb ADF"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Wybiera tryb ADF (jedno/dwustronny)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Wnęka"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Wybierz wnękę do skanowania"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2074,23 +2085,23 @@ msgstr ""
"Wybiera wartość korekcji gamma z listy zdefiniowanych urządzeń lub "
"tabeli użytkownika, która może być załadowana do skanera"
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Pozycja skupienia (ostrości)"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr "Ustawia skupienie (ostrość) na szybę lub 2.5mm powyżej szyby"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Czekaj na Przycisk"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2099,166 +2110,207 @@ msgstr ""
"Po wysłaniu komendy skanowania, czekaj aż przycisk na skanerze jest "
"naciśnięty, aby naprawdę rozpocząć skanowanie"
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr "Podczerwień"
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Pozytyw"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Negatyw"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr "Wbudowany profil CCT"
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, no-c-format
msgid "User defined CCT profile"
msgstr "Profil CCT zdefiniowany przez użytkownika"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Włączony"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Wyłącz"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr "DTC"
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr "SDTC"
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Ditheruj"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, no-c-format
msgid "Diffusion"
msgstr "Dyfuzja"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, no-c-format
msgid "White"
msgstr "Biel"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, no-c-format
msgid "Black"
msgstr "Czerń"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, no-c-format
msgid "Continue"
msgstr "Kontynuacja"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr "Stop"
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr "10mm"
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr "15mm"
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr "20mm"
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Poziomy"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, no-c-format
msgid "Horizontal bold"
msgstr "Poziomy pogrubiony"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, no-c-format
msgid "Horizontal narrow"
msgstr "Poziomy cienki"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Pionowy"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, no-c-format
msgid "Vertical bold"
msgstr "Pionowy pogrubiony"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr "Od góry do dołu"
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr "Od dołu do góry"
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, no-c-format
msgid "Front"
msgstr "Przód"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr "Tył"
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Dodatki"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, no-c-format
msgid "Threshold curve"
msgstr "Krzywa progowa"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr "Dynamiczna krzywa progowa, od ciemnego do jasnego, zwykle 50-65"
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr "Wyłączenie dynamicznego trybu kreski"
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, fuzzy, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
@@ -2267,12 +2319,12 @@ msgstr ""
"Wyłączenie użycia algorytmu adaptacyjnego do generowania linii zamiast "
"polegania na trybie sprzętowym"
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Wyłącz interpolację"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2282,22 +2334,44 @@ msgstr ""
"mniejsza niż rozdzielczość pionowa, ta opcja wyłącza interpolację "
"poziomą."
-#: ../backend/genesys.c:6235
-#, no-c-format
-msgid "Color Filter"
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
msgstr "Filtr kolorów"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr "W trybie szarości lub kreski ta opcja wybiera używany kolor."
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Kalibracja"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Zdefiniuj tryb kalibracji"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Pamięć podręczna danych kalibracji"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Czas wyłączania lampy"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2306,62 +2380,77 @@ msgstr ""
"Lampa zostanie wyłączona po podanym czasie (w minutach). Wartość 0 "
"oznacza, że lampa nie będzie wyłączana."
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Wyłącz lampę podczas kalibracji ciemności"
+
+#: ../backend/genesys.c:5941
+#, fuzzy, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr "Liczba minut do wyłączenia lampy po skanowaniu"
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
msgstr "Przycisk pliku"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr "Przycisk OCR"
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
msgstr "Przycisk zasilania"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Przycisk E-maila"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, no-c-format
msgid "Need calibration"
msgstr "Wymaga kalibracji"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Skaner wymaga kalibracji dla obecnych ustawień"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Przyciski"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Kalibracja"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, no-c-format
msgid "Start calibration using special sheet"
msgstr "Rozpocznij kalibrację przy użyciu specjalnej kartki"
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, no-c-format
msgid "Clear calibration"
msgstr "Wyczyść kalibrację"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, no-c-format
msgid "Clear calibration cache"
msgstr "Wyczyść pamięć podręczną kalibracji"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Moduł do skanowania negatywów"
@@ -2496,8 +2585,8 @@ msgid "Scanner model"
msgstr "Model skanera"
#: ../backend/hp3900_sane.c:1408
-#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+#, fuzzy, no-c-format
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
"Umożliwia sprawdzenie zachowania urządzenia z innymi obsługiwanymi "
"modelami"
@@ -2648,12 +2737,12 @@ msgstr "Uaktualnia informacje o urządzeniu"
msgid "This option reflects a front panel scanner button"
msgstr "Opcja ta odzwierciedla stan przycisku przedniego panelu skanera"
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Obraz"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Różne"
@@ -2678,17 +2767,17 @@ msgstr "przesunięcie Y"
msgid "Hardware internal Y position of the scanning area."
msgstr "Wewnętrzne sprzętowe położenie pionowe (Y) obszaru skanowania."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Status lampy"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Włącza lub wyłącza lampę."
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Kalibruje poziom dla czerni i bieli."
@@ -2796,8 +2885,8 @@ msgstr "Powolny"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Zwykły"
@@ -3134,9 +3223,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3435,7 +3524,7 @@ msgstr "Ustawia emfazę obrazka"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gamma"
@@ -3502,16 +3591,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3522,16 +3601,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3600,7 +3669,7 @@ msgstr "Ulepszanie"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3768,7 +3837,7 @@ msgstr "Wzmocnienie szarości"
msgid "Sets gray channel gain"
msgstr "Ustawia wzmocnienie kanału szarości"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3779,7 +3848,7 @@ msgstr "Wzmocnienie czerwieni"
msgid "Sets red channel gain"
msgstr "Ustawia wzmocnienie kanału czerwieni"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3790,7 +3859,7 @@ msgstr "Wzmocnienie zieleni"
msgid "Sets green channel gain"
msgstr "Ustawia wzmocnienie kanału zieleni"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3882,7 +3951,7 @@ msgstr "Jedna strona"
msgid "All pages"
msgstr "Wszystkie strony"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "skaner arkuszy"
@@ -3956,12 +4025,12 @@ msgstr ""
"Ta opcja wyłącza lampę główną skanera podczas używania przystawki do "
"materiałów przezroczystych"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Skan dobrej jakości"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Najwyższa jakość, ale mała prędkość"
@@ -4395,12 +4464,39 @@ msgstr ""
"Rozgrzewaj dopóki jasność lampy będzie stała, zamiast przyjmować stały "
"czas 40 sekund."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Negatyw"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negatyw"
+
+#: ../backend/pixma.c:396
+#, fuzzy, no-c-format
+msgid "48 bits color"
+msgstr "Dobry kolor"
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr "Skanowanie sterowane przyciskiem"
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4412,198 +4508,218 @@ msgstr ""
"\"COLOR\" (dla innych modeli). Aby anulować, należy nacisnąć przycisk "
"\"GRAY\"."
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
msgstr "Uaktualnij stan przycisku"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr "Przycisk 1"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr "Przycisk 2"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Materiały fotograficzne"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr "Ustawienia urządzenia"
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr "Przełącznik lampy"
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr "Ręczne włączanie lamp(y)."
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Wyłącz lampę podczas kalibracji ciemności"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr "Wyłączanie lampy zawsze podczas kalibracji ciemności."
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, no-c-format
msgid "Calibration data cache"
msgstr "Pamięć podręczna danych kalibracji"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr "Włącza lub wyłącza pamięć podręczną danych kalibracji."
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, no-c-format
msgid "Performs calibration"
msgstr "Wykonuje kalibrację"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr "Przyspieszenie czujnika"
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr "Włącza lub wyłącza przyspieszanie ruchu czujnika."
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr "Czas rozgrzewania"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr "Czas rozgrzewania w sekundach"
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr "Czas wyłączenia lampy"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Czas wyłączenia lampy w sekundach."
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr "Frontend analogowy"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr "Wartość AFE wzmocnienia czerwieni"
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Offset czerwieni"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr "Wartość AFE offsetu czerwieni"
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr "Wartość AFE wzmocnienia zieleni"
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Offset zieleni"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr "Wartość AFE offsetu "
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr "Wartość AFE wzmocnienia błękitu"
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Offset błękitu"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr "Wartość AFE offsetu zieleni"
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr "Wyłącz czerwoną lampę"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr "Definiuje parametr wyłączenia czerwonej lampy"
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr "Wyłącz zieloną lampę"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr "Definiuje parametr wyłączenia zielonej lampy"
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr "Wyłącz niebieską lampę"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr "Definiuje parametr wyłączenia niebieskiej lampy"
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr "Opcja ta odzwierciedla stan przycisków skanera."
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Kolor 36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Mapa Ditheringu 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Mapa Ditheringu 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Porozrzucaj"
@@ -4652,7 +4768,7 @@ msgstr "Symulacja skanera ręcznego"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Symuluje skaner ręczny. Skanery ręczne zwykle nie znają wysokości "
"obrazka. Zamiast tego zwracają wysokość -1. Ustawienie tej opcji pozwala "
@@ -4794,29 +4910,29 @@ msgstr ""
"Zmuś sterownik by zwrócił kod SANE_STATUS_ACCESS_DENIED po tym jak "
"została wywołana funkcja sane_read()."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Opcja ta odzwierciedla stan przycisku skanera."
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Włącz lampę"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Włącza lampę skanera"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Wyłącz lampę"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4837,42 +4953,42 @@ msgstr "Liczba minut do wyłączenia lampy po skanowaniu"
msgid "Threshold value for lineart mode"
msgstr "Wartość progowa dla trybu kreski"
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "podajnik dokumentów"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 (cale)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 (cale)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11 (cale)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Półcienie nie wspierane"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "RozproszonaKropka8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "RozproszonaKropka16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4888,12 +5004,27 @@ msgstr ""
"połowie pracy; jeżeli za wysoko, graficzne frontendy mogą przestać "
"odpowiadać."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Wysuń dokument po zeskanowaniu"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Tryb podglądu"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4902,12 +5033,12 @@ msgstr ""
"Wybierz tryb dla podglądów. Podglądy w skali szarości zwykle dają "
"najlepszą kombinację szybkości i detali."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Ustawienia zdefiniowane"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4915,12 +5046,42 @@ msgid ""
msgstr ""
"Udostępnia standardowe obszary skanowania dla fotografii, druków itp."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "skaner płaski"
+
+#: ../backend/snapscan-options.c:897
+#, fuzzy, no-c-format
+msgid "Focus-mode"
+msgstr "Ostrość"
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Ostrość automatyczna"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Pozycja skupienia (ostrości)"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Pozycja skupienia (ostrości)"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Liczba kolorów na odczyt"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Liczba linii w skali szarości na odczyt"
@@ -4994,7 +5155,7 @@ msgstr "Symulacja skanera ręcznego"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Symuluje skaner ręczny. Skanery ręczne zwykle nie znają wysokości "
@@ -5099,8 +5260,8 @@ msgstr "Rozmiar limitu odczytu"
msgid ""
"The (maximum) amount of data transferred with each call to sane_read()."
msgstr ""
-"(maksymalna) ilość danych transmitowanych z każdym wywołaniem sane_read"
-"()."
+"(maksymalna) ilość danych transmitowanych z każdym wywołaniem "
+"sane_read()."
#: ../backend/test.c:514
#, no-c-format
@@ -5160,8 +5321,8 @@ msgid ""
"Return fuzzy lines and bytes per line when sane_parameters() is called "
"before sane_start()."
msgstr ""
-"Zwraca rozmyte linie i bajty na linię gdy wywoływany jest sane_parameters"
-"() przed sane_start()."
+"Zwraca rozmyte linie i bajty na linię gdy wywoływany jest "
+"sane_parameters() przed sane_start()."
#: ../backend/test.c:591
#, no-c-format
@@ -5626,3 +5787,6 @@ msgstr "Ustawienie offsetu kanału zieleni"
#, no-c-format
msgid "Sets blue channel offset"
msgstr "Ustawienie offsetu kanału błękitu"
+
+#~ msgid "problem not analyzed (unknown SCSI class)"
+#~ msgstr "problem nie przeanalizowany (nieznana klasa SCSI)"
diff --git a/po/pt.po b/po/pt.po
index 13e28e5..b6ca1ca 100644
--- a/po/pt.po
+++ b/po/pt.po
@@ -5,10 +5,11 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends 1.0.10\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-05-27 11:57-0300\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2007-05-08 13:31+0200\n"
"Last-Translator: Pedro Morais <morais@inocam.com>\n"
"Language-Team: pt <morais@inocam.com>\n"
+"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
@@ -24,44 +25,44 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
-#: ../backend/leo.c:823 ../backend/lexmark.c:199 ../backend/ma1509.c:551
+#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
+#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
+#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
-#: ../backend/umax_pp.c:580 ../backend/kvs1025_opt.c:638
-#: ../backend/kvs20xx_opt.c:284
+#: ../backend/umax_pp.c:580
#, no-c-format
msgid "Geometry"
msgstr "Geometria"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
-#: ../backend/leo.c:871 ../backend/ma1509.c:599
-#: ../backend/matsushita.c:1189 ../backend/microtek2.h:600
-#: ../backend/mustek.c:4411 ../backend/mustek_usb.c:353
-#: ../backend/mustek_usb2.c:431 ../backend/niash.c:756
-#: ../backend/plustek.c:853 ../backend/plustek_pp.c:792
-#: ../backend/sceptre.c:750 ../backend/snapscan-options.c:561
-#: ../backend/stv680.c:1067 ../backend/teco1.c:1143
-#: ../backend/teco2.c:1962 ../backend/teco3.c:968 ../backend/u12.c:592
-#: ../backend/umax.c:5226 ../backend/umax_pp.c:629
-#: ../backend/kvs1025_opt.c:702
+#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
+#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
+#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
+#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
+#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
+#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Melhorias"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
-#: ../backend/kvs20xx_opt.c:365
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr ""
@@ -86,8 +87,8 @@ msgstr ""
msgid "Bit depth"
msgstr ""
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Modo de digitalização"
@@ -127,7 +128,8 @@ msgstr "Inferior-direita x"
msgid "Bottom-right y"
msgstr "Inferior-direita y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Resolução digitalização"
@@ -295,7 +297,7 @@ msgstr "Vincular resoluções X e Y"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -946,7 +948,7 @@ msgstr "Predefinições"
msgid "Set default values for enhancement controls."
msgstr ""
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Calibração"
@@ -981,63 +983,63 @@ msgstr ""
msgid "Button state"
msgstr "Estado do botão"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr ""
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr ""
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, fuzzy, no-c-format
msgid "Duplex scan"
msgstr "Digitalização completa"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
msgstr ""
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, fuzzy, no-c-format
msgid "Calibrate Scanner"
msgstr "Calibração"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, fuzzy, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Calibração rudimentar apenas na primeira digitalização"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr ""
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr ""
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Ganho analógico"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr ""
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Correcção do gamma"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr ""
@@ -1049,8 +1051,8 @@ msgstr ""
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr ""
@@ -1080,8 +1082,8 @@ msgstr "Negativo"
msgid "Slides"
msgstr "Mais lento"
-#: ../backend/canon.c:186 ../backend/matsushita.c:178
-#: ../backend/kvs1025_opt.c:181
+#: ../backend/canon.c:186 ../backend/kvs1025_opt.c:181
+#: ../backend/kvs40xx_opt.c:272 ../backend/matsushita.c:178
#, no-c-format
msgid "Automatic"
msgstr "Automático"
@@ -1101,597 +1103,608 @@ msgstr ""
msgid "1/3 normal speed"
msgstr ""
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, no-c-format
msgid "rounded parameter"
msgstr ""
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr ""
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, no-c-format
msgid "ADF jam"
msgstr ""
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr ""
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, fuzzy, no-c-format
msgid "lamp failure"
msgstr "Valor de 'gamma'"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr ""
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr ""
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr ""
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr ""
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr ""
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, fuzzy, no-c-format
msgid "transparency unit lamp failure"
msgstr "Unidade de Transparências"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr ""
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr ""
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr ""
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr ""
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr ""
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr ""
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr ""
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr ""
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr ""
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr ""
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr ""
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr ""
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr ""
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr ""
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr ""
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr ""
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr ""
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr ""
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr ""
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, fuzzy, no-c-format
msgid "transparency unit shading error"
msgstr "Unidade de Transparências"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr ""
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr ""
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, no-c-format
msgid "film scanner"
msgstr ""
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr ""
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr ""
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr ""
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, fuzzy, no-c-format
msgid "Negative film type"
msgstr "Filme Negativo"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, no-c-format
msgid "Selects the negative film type"
msgstr ""
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, no-c-format
msgid "Hardware resolution"
msgstr ""
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, no-c-format
msgid "Use only hardware resolutions"
msgstr ""
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr ""
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, no-c-format
msgid "Auto focus"
msgstr ""
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, no-c-format
msgid "Enable/disable auto focus"
msgstr ""
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr ""
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr ""
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, no-c-format
msgid "Manual focus position"
msgstr ""
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr ""
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr ""
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr ""
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
+#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr ""
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, no-c-format
msgid "Mirror the image horizontally"
msgstr ""
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, no-c-format
msgid "Auto exposure"
msgstr ""
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr ""
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, fuzzy, no-c-format
msgid "Calibration now"
msgstr "Calibração"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, fuzzy, no-c-format
msgid "Execute calibration *now*"
msgstr "Definine o modo de calibração"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr ""
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr ""
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, fuzzy, no-c-format
msgid "Reset scanner"
msgstr "Digitalização rápida"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, no-c-format
msgid "Reset the scanner"
msgstr ""
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr ""
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, no-c-format
msgid "Eject film after each scan"
msgstr ""
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr ""
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr ""
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr ""
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr ""
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr ""
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, no-c-format
msgid "Document feeder extras"
msgstr ""
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, fuzzy, no-c-format
msgid "Flatbed only"
msgstr "Flachbett"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, fuzzy, no-c-format
msgid "Transparency unit"
msgstr "Unidade de Transparências"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, fuzzy, no-c-format
msgid "Negative film"
msgstr "Filme Negativo"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, fuzzy, no-c-format
msgid "Positive or negative film"
msgstr "Filme Positivo"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr ""
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr ""
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, fuzzy, no-c-format
msgid "Transparency ratio"
msgstr "Unidade de Transparências"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, no-c-format
msgid "Select film type"
msgstr ""
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, no-c-format
msgid "Select the film type"
msgstr ""
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Flachbett"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr ""
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
msgstr ""
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/kodak.c:137 ../backend/hp5590.c:84
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr ""
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, no-c-format
+msgid "Card Front"
+msgstr ""
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, no-c-format
+msgid "Card Duplex"
+msgstr ""
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Vermelho"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Verde"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Azul"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Melhorias"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Melhorias"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Melhorias"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr ""
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr ""
-#: ../backend/epson.c:492 ../backend/epson2.c:104
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
-#: ../backend/kvs1025.h:50 ../backend/kvs20xx_opt.c:203
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
+#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr ""
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Unidade de Transparências"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr ""
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Filme Positivo"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Filme Negativo"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr ""
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr ""
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr ""
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr ""
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr ""
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr ""
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr ""
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr ""
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr ""
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr ""
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr ""
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr ""
@@ -1701,7 +1714,7 @@ msgstr ""
msgid "No Correction"
msgstr "Sem Correcção"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Definido pelo utilizador"
@@ -1726,33 +1739,33 @@ msgstr "Impressoras de jacto de tinta"
msgid "CRT monitors"
msgstr "Monitores CRT"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Predefinição"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr ""
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr ""
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr ""
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr ""
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr ""
@@ -1773,13 +1786,16 @@ msgid "A5 landscape"
msgstr ""
#: ../backend/epson.c:760 ../backend/kvs1025_opt.c:103
-#: ../backend/kvs20xx_opt.c:76
+#: ../backend/kvs20xx_opt.c:76 ../backend/kvs40xx_opt.c:130
+#: ../backend/kvs40xx_opt.c:147
#, no-c-format
msgid "Letter"
msgstr "Letter"
#: ../backend/epson.c:761 ../backend/kvs1025_opt.c:100
#: ../backend/kvs20xx_opt.c:73 ../backend/kvs20xx_opt.c:301
+#: ../backend/kvs40xx_opt.c:127 ../backend/kvs40xx_opt.c:144
+#: ../backend/kvs40xx_opt.c:525
#, no-c-format
msgid "A4"
msgstr "A4"
@@ -1789,556 +1805,598 @@ msgstr "A4"
msgid "Max"
msgstr "Máximo"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
-#: ../backend/hp-option.c:2914 ../backend/ma1509.c:501
-#: ../backend/matsushita.c:1084 ../backend/microtek2.h:598
-#: ../backend/mustek.c:4205 ../backend/mustek_usb.c:260
-#: ../backend/mustek_usb2.c:344 ../backend/niash.c:736
-#: ../backend/plustek.c:720 ../backend/plustek_pp.c:657
-#: ../backend/sceptre.c:673 ../backend/snapscan-options.c:315
-#: ../backend/stv680.c:1030 ../backend/teco2.c:1886 ../backend/test.c:306
-#: ../backend/u12.c:473 ../backend/umax.c:5054
-#: ../backend/kvs1025_opt.c:520 ../backend/kvs20xx_opt.c:170
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
+#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
+#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
+#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
+#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
+#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
+#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
+#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Modo de Digitalização"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr ""
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr ""
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr ""
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr ""
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr ""
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr ""
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr ""
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr ""
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr ""
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr ""
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Deslocar vermelho para o verde"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr ""
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr ""
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr ""
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr ""
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr ""
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr ""
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr ""
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr ""
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr ""
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr ""
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr ""
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, fuzzy, no-c-format
msgid "Controls blue level"
msgstr "Contraste do canal azul"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr ""
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr ""
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr ""
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr ""
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr ""
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr ""
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr ""
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr ""
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr ""
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr ""
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr ""
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr ""
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr ""
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr ""
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr ""
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr ""
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr ""
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
"the user defined table, which can be downloaded to the scanner"
msgstr ""
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr ""
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
msgstr ""
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr ""
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
"pressed to actually start the scan process."
msgstr ""
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, fuzzy, no-c-format
msgid "Positive Slide"
msgstr "Filme Positivo"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, fuzzy, no-c-format
msgid "Negative Slide"
msgstr "Filme Negativo"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "Definido pelo utilizador"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr ""
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr ""
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr ""
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, no-c-format
msgid "Diffusion"
msgstr ""
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Nível de branco"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Nível de preto"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, no-c-format
msgid "Continue"
msgstr ""
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr ""
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, no-c-format
msgid "Horizontal bold"
msgstr ""
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, no-c-format
msgid "Horizontal narrow"
msgstr ""
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr ""
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, no-c-format
msgid "Vertical bold"
msgstr ""
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, no-c-format
msgid "Front"
msgstr ""
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6143 ../backend/kvs1025_opt.c:858
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
#, no-c-format
-msgid "Software deskew"
-msgstr "Alinhamento - Deskew"
+msgid "Software blank skip percentage"
+msgstr "Desconsiderar porcentagem branco"
-#: ../backend/genesys.c:6144
+#: ../backend/fujitsu.c:4056
#, fuzzy, no-c-format
-msgid "Request backend to rotate skewed pages digitally"
-msgstr "Solicita ao driver para rotacionar digitalmente páginas inclinadas"
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+"Solicita ao driver para eliminar páginas com baixo número de pixels "
+"escuros"
-#: ../backend/genesys.c:6151
+#: ../backend/genesys.c:5757
#, fuzzy, no-c-format
-msgid "Software despeck"
-msgstr "Alinhamento - Deskew"
+msgid "Software crop"
+msgstr "Crop automático"
-#: ../backend/genesys.c:6152
+#: ../backend/genesys.c:5758
#, fuzzy, no-c-format
-msgid "Request backend to remove lone dots digitally"
+msgid "Request backend to remove border from pages digitally"
msgstr "Solicita ao driver para remover digitalmente bordas das páginas"
-#: ../backend/genesys.c:6159 ../backend/kvs1025_opt.c:867
-#, no-c-format
-msgid "Software despeckle diameter"
-msgstr "Diâmetro despeckle"
-
-#: ../backend/genesys.c:6160 ../backend/kvs1025_opt.c:869
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
#, no-c-format
-msgid "Maximum diameter of lone dots to remove from scan"
+msgid "Request driver to discard pages with low numbers of dark pixels"
msgstr ""
-"Diâmetro máximo de pontos isolados a serem removidos da digitalização"
+"Solicita ao driver para eliminar páginas com baixo número de pixels "
+"escuros"
-#: ../backend/genesys.c:6170
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
#, fuzzy, no-c-format
-msgid "Software crop"
-msgstr "Crop automático"
+msgid "Software derotate"
+msgstr "Alinhamento - Deskew"
-#: ../backend/genesys.c:6171
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
#, fuzzy, no-c-format
-msgid "Request backend to remove border from pages digitally"
+msgid "Request driver to detect and correct 90 degree image rotation"
msgstr "Solicita ao driver para remover digitalmente bordas das páginas"
-#: ../backend/genesys.c:6177
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr ""
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Limiar de aquecimento"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr ""
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
"than the vertical resolution this disables horizontal interpolation."
msgstr ""
-#: ../backend/genesys.c:6235
+#: ../backend/genesys.c:5869
#, fuzzy, no-c-format
-msgid "Color Filter"
+msgid "Color filter"
msgstr "Linhas em cor"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Calibração"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Definine o modo de calibração"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Modo de calibração"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, fuzzy, no-c-format
msgid "Lamp off time"
msgstr "Lâmpada acesa"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
"of 0 means, that the lamp won't be turned off."
msgstr ""
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Calibração rudimentar"
+
+#: ../backend/genesys.c:5941
+#, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr ""
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
msgstr ""
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
msgstr ""
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Origem da digitalização"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Calibração rudimentar"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Calibração rudimentar apenas na primeira digitalização"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, fuzzy, no-c-format
msgid "Buttons"
msgstr "Estado do botão"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, fuzzy, no-c-format
msgid "Calibrate"
msgstr "Calibração"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, fuzzy, no-c-format
msgid "Start calibration using special sheet"
msgstr "Calibração rudimentar"
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, fuzzy, no-c-format
msgid "Clear calibration"
msgstr "Calibração rudimentar"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, fuzzy, no-c-format
msgid "Clear calibration cache"
msgstr "Modo de calibração"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Adaptador de Transparências"
@@ -2467,7 +2525,7 @@ msgstr "Modo de digitalização"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2608,12 +2666,12 @@ msgstr ""
msgid "This option reflects a front panel scanner button"
msgstr ""
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr ""
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr ""
@@ -2638,17 +2696,17 @@ msgstr "Deslocamento"
msgid "Hardware internal Y position of the scanning area."
msgstr ""
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr ""
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr ""
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr ""
@@ -2755,9 +2813,9 @@ msgid "Slow"
msgstr "Lento"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
-#: ../backend/matsushita.c:244 ../backend/mustek.c:149
-#: ../backend/plustek.c:233 ../backend/plustek_pp.c:200
-#: ../backend/u12.c:155
+#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normal"
@@ -2986,6 +3044,677 @@ msgstr ""
msgid "Shut off scanner lamp."
msgstr ""
+#: ../backend/kvs1025.h:51 ../backend/kvs20xx_opt.c:294
+#: ../backend/kvs40xx_opt.c:515 ../backend/matsushita.h:219
+#, no-c-format
+msgid "Paper size"
+msgstr ""
+
+#: ../backend/kvs1025.h:52 ../backend/kvs1025.h:67
+#: ../backend/matsushita.h:220 ../backend/matsushita.h:227
+#, no-c-format
+msgid "Automatic separation"
+msgstr "Separação automática"
+
+#: ../backend/kvs1025.h:53 ../backend/kvs20xx_opt.c:306
+#: ../backend/kvs40xx_opt.c:530
+#, no-c-format
+msgid "Landscape"
+msgstr "Paisagem"
+
+#: ../backend/kvs1025.h:54 ../backend/kvs40xx_opt.c:692
+#, no-c-format
+msgid "Inverse Image"
+msgstr "Inverte imagem"
+
+#: ../backend/kvs1025.h:56 ../backend/kvs40xx_opt.c:403
+#, no-c-format
+msgid "Long paper mode"
+msgstr "Modo de Papel Longo"
+
+#: ../backend/kvs1025.h:57 ../backend/kvs20xx_opt.c:229
+#: ../backend/kvs40xx_opt.c:392
+#, no-c-format
+msgid "Length control mode"
+msgstr "Modo de Controle do Comprimento"
+
+#: ../backend/kvs1025.h:58 ../backend/kvs20xx_opt.c:241
+#: ../backend/kvs40xx_opt.c:415
+#, no-c-format
+msgid "Manual feed mode"
+msgstr "Modo de Alimentação manual"
+
+#: ../backend/kvs1025.h:59 ../backend/kvs20xx_opt.c:253
+#: ../backend/kvs40xx_opt.c:427
+#, no-c-format
+msgid "Manual feed timeout"
+msgstr "Tempo de desligamento da alimentação manual"
+
+#: ../backend/kvs1025.h:60 ../backend/kvs20xx_opt.c:266
+#: ../backend/kvs40xx_opt.c:440
+#, no-c-format
+msgid "Double feed detection"
+msgstr "Detecção de dupla alimentação"
+
+#: ../backend/kvs1025.h:63 ../backend/kvs20xx_opt.c:204
+#: ../backend/kvs40xx_opt.c:353 ../backend/matsushita.h:223
+#, no-c-format
+msgid "Enable Duplex (Dual-Sided) Scanning"
+msgstr ""
+
+#: ../backend/kvs1025.h:65 ../backend/kvs20xx_opt.c:295
+#: ../backend/kvs40xx_opt.c:516 ../backend/matsushita.h:225
+#, no-c-format
+msgid "Physical size of the paper in the ADF"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:39
+#, no-c-format
+msgid "bw"
+msgstr "PB"
+
+#: ../backend/kvs1025_opt.c:40
+#, no-c-format
+msgid "halftone"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:41
+#, fuzzy, no-c-format
+msgid "gray"
+msgstr "Cinzento"
+
+#: ../backend/kvs1025_opt.c:42
+#, fuzzy, no-c-format
+msgid "color"
+msgstr "Cor"
+
+#: ../backend/kvs1025_opt.c:61 ../backend/kvs40xx_opt.c:107
+#: ../backend/kvs40xx_opt.c:1046
+#, no-c-format
+msgid "adf"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:62 ../backend/kvs40xx_opt.c:49
+#: ../backend/kvs40xx_opt.c:108
+#, no-c-format
+msgid "fb"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:72 ../backend/kvs20xx_opt.c:54
+#: ../backend/kvs40xx_opt.c:100
+#, fuzzy, no-c-format
+msgid "single"
+msgstr "simples"
+
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs40xx_opt.c:1086
+#, no-c-format
+msgid "continuous"
+msgstr "contínuo"
+
+#: ../backend/kvs1025_opt.c:83 ../backend/kvs20xx_opt.c:61
+#: ../backend/kvs40xx_opt.c:114
+#, no-c-format
+msgid "off"
+msgstr "desliga"
+
+#: ../backend/kvs1025_opt.c:84 ../backend/kvs20xx_opt.c:62
+#: ../backend/kvs40xx_opt.c:115
+#, no-c-format
+msgid "wait_doc"
+msgstr "Aguarde_doc"
+
+#: ../backend/kvs1025_opt.c:85 ../backend/kvs20xx_opt.c:63
+#: ../backend/kvs40xx_opt.c:117
+#, no-c-format
+msgid "wait_key"
+msgstr "Aguarde-Chave"
+
+#: ../backend/kvs1025_opt.c:96 ../backend/kvs20xx_opt.c:69
+#: ../backend/kvs40xx_opt.c:123 ../backend/kvs40xx_opt.c:140
+#, fuzzy, no-c-format
+msgid "user_def"
+msgstr "Definido pelo utilizador"
+
+#: ../backend/kvs1025_opt.c:97 ../backend/kvs20xx_opt.c:70
+#: ../backend/kvs40xx_opt.c:124 ../backend/kvs40xx_opt.c:141
+#, no-c-format
+msgid "business_card"
+msgstr "Cartão de visita"
+
+#: ../backend/kvs1025_opt.c:98 ../backend/kvs40xx_opt.c:125
+#: ../backend/kvs40xx_opt.c:142
+#, no-c-format
+msgid "Check"
+msgstr "Verificar"
+
+#: ../backend/kvs1025_opt.c:101 ../backend/kvs20xx_opt.c:74
+#: ../backend/kvs40xx_opt.c:128 ../backend/kvs40xx_opt.c:145
+#, no-c-format
+msgid "A5"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:102 ../backend/kvs20xx_opt.c:75
+#: ../backend/kvs40xx_opt.c:129 ../backend/kvs40xx_opt.c:146
+#, no-c-format
+msgid "A6"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:106 ../backend/kvs20xx_opt.c:79
+#: ../backend/kvs40xx_opt.c:133 ../backend/kvs40xx_opt.c:150
+#, no-c-format
+msgid "B5"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:107 ../backend/kvs20xx_opt.c:80
+#: ../backend/kvs40xx_opt.c:134 ../backend/kvs40xx_opt.c:151
+#, no-c-format
+msgid "B6"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:108 ../backend/kvs20xx_opt.c:81
+#: ../backend/kvs40xx_opt.c:135 ../backend/kvs40xx_opt.c:152
+#, no-c-format
+msgid "Legal"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:149 ../backend/kvs40xx_opt.c:238
+#, no-c-format
+msgid "bayer_64"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:150 ../backend/kvs40xx_opt.c:239
+#, no-c-format
+msgid "bayer_16"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:151 ../backend/kvs40xx_opt.c:240
+#, no-c-format
+msgid "halftone_32"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:152 ../backend/kvs40xx_opt.c:241
+#, no-c-format
+msgid "halftone_64"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:153
+#, no-c-format
+msgid "diffusion"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:166 ../backend/kvs1025_opt.c:228
+#: ../backend/kvs1025_opt.c:241 ../backend/kvs20xx_opt.c:128
+#: ../backend/kvs20xx_opt.c:136 ../backend/kvs40xx_opt.c:214
+#: ../backend/kvs40xx_opt.c:222 ../backend/kvs40xx_opt.c:257
+#, fuzzy, no-c-format
+msgid "normal"
+msgstr "Normal"
+
+#: ../backend/kvs1025_opt.c:167 ../backend/kvs40xx_opt.c:258
+#, no-c-format
+msgid "light"
+msgstr "claro"
+
+#: ../backend/kvs1025_opt.c:168 ../backend/kvs40xx_opt.c:259
+#, no-c-format
+msgid "dark"
+msgstr "escuro"
+
+#: ../backend/kvs1025_opt.c:179 ../backend/kvs40xx_opt.c:270
+#, fuzzy, no-c-format
+msgid "From scanner"
+msgstr "Digitalização rápida"
+
+#: ../backend/kvs1025_opt.c:180 ../backend/kvs40xx_opt.c:271
+#: ../backend/matsushita.c:177
+#, no-c-format
+msgid "From paper"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:192 ../backend/kvs40xx_opt.c:283
+#, fuzzy, no-c-format
+msgid "default"
+msgstr "Predefinição"
+
+#: ../backend/kvs1025_opt.c:211 ../backend/kvs20xx_opt.c:122
+#: ../backend/kvs40xx_opt.c:208
+#, no-c-format
+msgid "smooth"
+msgstr "Suave"
+
+#: ../backend/kvs1025_opt.c:212 ../backend/kvs20xx_opt.c:118
+#: ../backend/kvs40xx_opt.c:204
+#, no-c-format
+msgid "none"
+msgstr "Nenhuma"
+
+#: ../backend/kvs1025_opt.c:213 ../backend/kvs20xx_opt.c:119
+#: ../backend/kvs40xx_opt.c:205
+#, fuzzy, no-c-format
+msgid "low"
+msgstr "Lento"
+
+#: ../backend/kvs1025_opt.c:214 ../backend/kvs1025_opt.c:804
+#: ../backend/kvs20xx_opt.c:120 ../backend/kvs40xx_opt.c:206
+#, no-c-format
+msgid "medium"
+msgstr "Média"
+
+#: ../backend/kvs1025_opt.c:215 ../backend/kvs20xx_opt.c:121
+#: ../backend/kvs40xx_opt.c:207
+#, no-c-format
+msgid "high"
+msgstr "Alta"
+
+#: ../backend/kvs1025_opt.c:229 ../backend/kvs20xx_opt.c:129
+#: ../backend/kvs40xx_opt.c:215
+#, no-c-format
+msgid "crt"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:230
+#, fuzzy, no-c-format
+msgid "linier"
+msgstr "Linhas"
+
+#: ../backend/kvs1025_opt.c:242 ../backend/kvs20xx_opt.c:137
+#: ../backend/kvs40xx_opt.c:223
+#, fuzzy, no-c-format
+msgid "red"
+msgstr "Vermelho"
+
+#: ../backend/kvs1025_opt.c:243 ../backend/kvs20xx_opt.c:138
+#: ../backend/kvs40xx_opt.c:224
+#, fuzzy, no-c-format
+msgid "green"
+msgstr "Verde"
+
+#: ../backend/kvs1025_opt.c:244 ../backend/kvs20xx_opt.c:139
+#: ../backend/kvs40xx_opt.c:225
+#, fuzzy, no-c-format
+msgid "blue"
+msgstr "Azul"
+
+#: ../backend/kvs1025_opt.c:562
+#, fuzzy, no-c-format
+msgid "Sets the scan source"
+msgstr "Origem da digitalização"
+
+#: ../backend/kvs1025_opt.c:573 ../backend/kvs20xx_opt.c:217
+#: ../backend/kvs40xx_opt.c:366 ../backend/matsushita.c:1126
+#, no-c-format
+msgid "Feeder mode"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:574 ../backend/kvs20xx_opt.c:218
+#: ../backend/kvs40xx_opt.c:367 ../backend/matsushita.c:1127
+#, no-c-format
+msgid "Sets the feeding mode"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:584
+#, no-c-format
+msgid "Enable/Disable long paper mode"
+msgstr "Liga / Desliga Modo Papel Longo"
+
+#: ../backend/kvs1025_opt.c:593
+#, no-c-format
+msgid "Enable/Disable length control mode"
+msgstr "Liga / Desliga Modo Controle do Comprimento"
+
+#: ../backend/kvs1025_opt.c:601 ../backend/kvs20xx_opt.c:242
+#: ../backend/kvs40xx_opt.c:416
+#, no-c-format
+msgid "Sets the manual feed mode"
+msgstr "Define modo de alimentação manual"
+
+#: ../backend/kvs1025_opt.c:612 ../backend/kvs20xx_opt.c:254
+#: ../backend/kvs40xx_opt.c:428
+#, no-c-format
+msgid "Sets the manual feed timeout in seconds"
+msgstr "Define desligamento de alimentação manual em segundos"
+
+#: ../backend/kvs1025_opt.c:625 ../backend/kvs20xx_opt.c:267
+#: ../backend/kvs40xx_opt.c:441
+#, no-c-format
+msgid "Enable/Disable double feed detection"
+msgstr "Liga / Desliga Modo de detecção de alimentação"
+
+#: ../backend/kvs1025_opt.c:631 ../backend/kvs20xx_opt.c:275
+#: ../backend/kvs40xx_opt.c:496
+#, no-c-format
+msgid "fit-to-page"
+msgstr "Adequar à página"
+
+#: ../backend/kvs1025_opt.c:632 ../backend/kvs20xx_opt.c:276
+#: ../backend/kvs40xx_opt.c:497
+#, no-c-format
+msgid "Fit to page"
+msgstr "Adequar à página"
+
+#: ../backend/kvs1025_opt.c:634 ../backend/kvs20xx_opt.c:277
+#: ../backend/kvs40xx_opt.c:498
+#, no-c-format
+msgid "Scanner shrinks image to fit scanned page"
+msgstr "Scanner diminui imagem para adequar à pagina digitalizada"
+
+#: ../backend/kvs1025_opt.c:661 ../backend/kvs20xx_opt.c:308
+#: ../backend/kvs40xx_opt.c:532
+#, no-c-format
+msgid "Set paper position : true for landscape, false for portrait"
+msgstr ""
+"Define posição do papel: Verdadeiro para Paisagem, Falso para Retrato"
+
+#: ../backend/kvs1025_opt.c:735 ../backend/matsushita.c:1224
+#, no-c-format
+msgid "Automatic threshold"
+msgstr "Limiar de aquecimento"
+
+#: ../backend/kvs1025_opt.c:738 ../backend/matsushita.c:1227
+#, no-c-format
+msgid ""
+"Automatically sets brightness, contrast, white level, gamma, noise "
+"reduction and image emphasis"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:783 ../backend/kvs40xx_opt.c:763
+#: ../backend/matsushita.c:1275
+#, no-c-format
+msgid "Noise reduction"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:785 ../backend/kvs40xx_opt.c:764
+#: ../backend/matsushita.c:1277
+#, no-c-format
+msgid "Reduce the isolated dot noise"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:796 ../backend/kvs20xx_opt.c:411
+#: ../backend/kvs40xx_opt.c:654 ../backend/matsushita.c:1288
+#, no-c-format
+msgid "Image emphasis"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:797 ../backend/kvs20xx_opt.c:412
+#: ../backend/kvs40xx_opt.c:655 ../backend/matsushita.c:1289
+#, no-c-format
+msgid "Sets the image emphasis"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
+#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
+#: ../backend/pixma_sane_options.c:110
+#, no-c-format
+msgid "Gamma"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:818 ../backend/kvs20xx_opt.c:435
+#: ../backend/kvs40xx_opt.c:680
+#, fuzzy, no-c-format
+msgid "Lamp color"
+msgstr "Cor da lâmpada"
+
+#: ../backend/kvs1025_opt.c:819 ../backend/kvs20xx_opt.c:436
+#: ../backend/kvs40xx_opt.c:681
+#, no-c-format
+msgid "Sets the lamp color (color dropout)"
+msgstr "Define cor da lâmpada (Color dropout)"
+
+#: ../backend/kvs1025_opt.c:832
+#, no-c-format
+msgid "Inverse image in B/W or halftone mode"
+msgstr "Inverte imagem nos modos P/B ou simulação de cinza"
+
+#: ../backend/kvs1025_opt.c:840
+#, no-c-format
+msgid "Mirror image (left/right flip)"
+msgstr "Imagem espelhada"
+
+#: ../backend/kvs1025_opt.c:847
+#, no-c-format
+msgid "jpeg compression"
+msgstr "Compressão JPEG"
+
+#: ../backend/kvs1025_opt.c:850
+#, no-c-format
+msgid "JPEG Image Compression with Q parameter, '0' - no compression"
+msgstr "Compressão da imagem JPEG com parâmetro Q, '0' - sem compressão"
+
+#: ../backend/kvs1025_opt.c:860
+#, no-c-format
+msgid "Rotate image clockwise"
+msgstr ""
+
+#: ../backend/kvs1025_opt.c:862
+#, fuzzy, no-c-format
+msgid "Request driver to rotate pages by a fixed amount"
+msgstr "Solicita ao driver para rotacionar digitalmente páginas inclinadas"
+
+#: ../backend/kvs1025_opt.c:872
+#, no-c-format
+msgid "Software deskew"
+msgstr "Alinhamento - Deskew"
+
+#: ../backend/kvs1025_opt.c:874
+#, no-c-format
+msgid "Request driver to rotate skewed pages digitally"
+msgstr "Solicita ao driver para rotacionar digitalmente páginas inclinadas"
+
+#: ../backend/kvs1025_opt.c:881
+#, no-c-format
+msgid "Software despeckle diameter"
+msgstr "Diâmetro despeckle"
+
+#: ../backend/kvs1025_opt.c:883
+#, no-c-format
+msgid "Maximum diameter of lone dots to remove from scan"
+msgstr ""
+"Diâmetro máximo de pontos isolados a serem removidos da digitalização"
+
+#: ../backend/kvs1025_opt.c:902
+#, no-c-format
+msgid "Software automatic cropping"
+msgstr "Crop automático"
+
+#: ../backend/kvs1025_opt.c:904
+#, no-c-format
+msgid "Request driver to remove border from pages digitally"
+msgstr "Solicita ao driver para remover digitalmente bordas das páginas"
+
+#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
+#, no-c-format
+msgid ""
+"Length Control Mode is a mode that the scanner reads up to the shorter "
+"length of actual paper or logical document length."
+msgstr ""
+
+#: ../backend/kvs20xx_opt.c:423 ../backend/kvs20xx_opt.c:424
+#: ../backend/kvs40xx_opt.c:667 ../backend/kvs40xx_opt.c:668
+#: ../backend/microtek2.h:640
+#, no-c-format
+msgid "Gamma correction"
+msgstr "Correcção do gamma"
+
+#: ../backend/kvs40xx_opt.c:116
+#, fuzzy, no-c-format
+msgid "wait_doc_hopper_up"
+msgstr "Aguarde_doc"
+
+#: ../backend/kvs40xx_opt.c:126
+#, no-c-format
+msgid "A3"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:131
+#, no-c-format
+msgid "Double letter 11x17 in"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:132
+#, no-c-format
+msgid "B4"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:230
+#, no-c-format
+msgid "High sensivity"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:231
+#, no-c-format
+msgid "Low sensivity"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:242
+#, no-c-format
+msgid "err_diffusion"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:248
+#, fuzzy, no-c-format
+msgid "No detection"
+msgstr "Sem Correcção"
+
+#: ../backend/kvs40xx_opt.c:249
+#, fuzzy, no-c-format
+msgid "Normal mode"
+msgstr "Normal"
+
+#: ../backend/kvs40xx_opt.c:250
+#, fuzzy, no-c-format
+msgid "Enhanced mode"
+msgstr "Melhorias"
+
+#: ../backend/kvs40xx_opt.c:404
+#, no-c-format
+msgid ""
+"Long Paper Mode is a mode that the scanner reads the image after it "
+"divides long paper by the length which is set in Document Size option."
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:448
+#, fuzzy, no-c-format
+msgid "Double feed detector sensitivity"
+msgstr "Detecção de dupla alimentação"
+
+#: ../backend/kvs40xx_opt.c:449
+#, fuzzy, no-c-format
+msgid "Set the double feed detector sensitivity"
+msgstr "Detecção de dupla alimentação"
+
+#: ../backend/kvs40xx_opt.c:460 ../backend/kvs40xx_opt.c:461
+#, fuzzy, no-c-format
+msgid "Do not stop after double feed detection"
+msgstr "Detecção de dupla alimentação"
+
+#: ../backend/kvs40xx_opt.c:469 ../backend/kvs40xx_opt.c:470
+#, no-c-format
+msgid "Ignore left double feed sensor"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:478 ../backend/kvs40xx_opt.c:479
+#, no-c-format
+msgid "Ignore center double feed sensor"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:487 ../backend/kvs40xx_opt.c:488
+#, no-c-format
+msgid "Ignore right double feed sensor"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:641
+#, fuzzy, no-c-format
+msgid "Automatic threshold mode"
+msgstr "Limiar de aquecimento"
+
+#: ../backend/kvs40xx_opt.c:642
+#, fuzzy, no-c-format
+msgid "Sets the automatic threshold mode"
+msgstr "Limiar de aquecimento"
+
+#: ../backend/kvs40xx_opt.c:693
+#, fuzzy, no-c-format
+msgid "Inverse image in B/W mode"
+msgstr "Inverte imagem nos modos P/B ou simulação de cinza"
+
+#: ../backend/kvs40xx_opt.c:714
+#, fuzzy, no-c-format
+msgid "JPEG compression"
+msgstr "Compressão JPEG"
+
+#: ../backend/kvs40xx_opt.c:717
+#, no-c-format
+msgid "JPEG compression (yours application must be able to uncompress)"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:736 ../backend/kvs40xx_opt.c:737
+#, no-c-format
+msgid "Detect stapled document"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:775
+#, no-c-format
+msgid "chroma of red"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:776
+#, no-c-format
+msgid "Set chroma of red"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:786
+#, fuzzy, no-c-format
+msgid "chroma of blue"
+msgstr "Sombra para azul"
+
+#: ../backend/kvs40xx_opt.c:787
+#, fuzzy, no-c-format
+msgid "Set chroma of blue"
+msgstr "Sombra para azul"
+
+#: ../backend/kvs40xx_opt.c:797 ../backend/kvs40xx_opt.c:798
+#, no-c-format
+msgid "Skew adjustment"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:807
+#, no-c-format
+msgid "Stop scanner when a paper have been skewed"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:808
+#, no-c-format
+msgid "Scanner will be stop when a paper have been skewed"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:815
+#, no-c-format
+msgid "Crop actual image area"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:816
+#, no-c-format
+msgid "Scanner automatically detect image area and crop it"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:826
+#, no-c-format
+msgid "It is right and left reversing"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:833 ../backend/kvs40xx_opt.c:834
+#, no-c-format
+msgid "Addition of space in top position"
+msgstr ""
+
+#: ../backend/kvs40xx_opt.c:841 ../backend/kvs40xx_opt.c:842
+#, no-c-format
+msgid "Addition of space in bottom position"
+msgstr ""
+
#: ../backend/leo.c:110
#, no-c-format
msgid "Diamond"
@@ -3031,7 +3760,7 @@ msgstr "Ganho do cinzento"
msgid "Sets gray channel gain"
msgstr "Ganho do canal cinzento"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3042,7 +3771,7 @@ msgstr "Ganho do vermelho"
msgid "Sets red channel gain"
msgstr "Ganho do canal vermelho"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3053,7 +3782,7 @@ msgstr "Ganho do verde"
msgid "Sets green channel gain"
msgstr "Ganho do canal verde"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3109,11 +3838,6 @@ msgstr "Modo 3"
msgid "From white stick"
msgstr ""
-#: ../backend/matsushita.c:177 ../backend/kvs1025_opt.c:180
-#, no-c-format
-msgid "From paper"
-msgstr ""
-
#: ../backend/matsushita.c:212
#, no-c-format
msgid "Smooth"
@@ -3150,64 +3874,11 @@ msgstr "Uma página"
msgid "All pages"
msgstr "Todas as páginas"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr ""
-#: ../backend/matsushita.c:1126 ../backend/kvs1025_opt.c:571
-#: ../backend/kvs20xx_opt.c:217
-#, no-c-format
-msgid "Feeder mode"
-msgstr ""
-
-#: ../backend/matsushita.c:1127 ../backend/kvs1025_opt.c:572
-#: ../backend/kvs20xx_opt.c:218
-#, no-c-format
-msgid "Sets the feeding mode"
-msgstr ""
-
-#: ../backend/matsushita.c:1224 ../backend/kvs1025_opt.c:733
-#, no-c-format
-msgid "Automatic threshold"
-msgstr "Limiar de aquecimento"
-
-#: ../backend/matsushita.c:1227 ../backend/kvs1025_opt.c:736
-#, no-c-format
-msgid ""
-"Automatically sets brightness, contrast, white level, gamma, noise "
-"reduction and image emphasis"
-msgstr ""
-
-#: ../backend/matsushita.c:1275 ../backend/kvs1025_opt.c:781
-#, no-c-format
-msgid "Noise reduction"
-msgstr ""
-
-#: ../backend/matsushita.c:1277 ../backend/kvs1025_opt.c:783
-#, no-c-format
-msgid "Reduce the isolated dot noise"
-msgstr ""
-
-#: ../backend/matsushita.c:1288 ../backend/kvs1025_opt.c:794
-#: ../backend/kvs20xx_opt.c:411
-#, no-c-format
-msgid "Image emphasis"
-msgstr ""
-
-#: ../backend/matsushita.c:1289 ../backend/kvs1025_opt.c:795
-#: ../backend/kvs20xx_opt.c:412
-#, no-c-format
-msgid "Sets the image emphasis"
-msgstr ""
-
-#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107 ../backend/kvs1025_opt.c:806
-#: ../backend/kvs1025_opt.c:807
-#, no-c-format
-msgid "Gamma"
-msgstr ""
-
#: ../backend/matsushita.h:209
#, no-c-format
msgid "Grayscale 4 bits"
@@ -3218,30 +3889,6 @@ msgstr ""
msgid "Grayscale 8 bits"
msgstr ""
-#: ../backend/matsushita.h:219 ../backend/kvs1025.h:51
-#: ../backend/kvs20xx_opt.c:294
-#, no-c-format
-msgid "Paper size"
-msgstr ""
-
-#: ../backend/matsushita.h:220 ../backend/matsushita.h:227
-#: ../backend/kvs1025.h:52 ../backend/kvs1025.h:67
-#, no-c-format
-msgid "Automatic separation"
-msgstr "Separação automática"
-
-#: ../backend/matsushita.h:223 ../backend/kvs1025.h:63
-#: ../backend/kvs20xx_opt.c:204
-#, no-c-format
-msgid "Enable Duplex (Dual-Sided) Scanning"
-msgstr ""
-
-#: ../backend/matsushita.h:225 ../backend/kvs1025.h:65
-#: ../backend/kvs20xx_opt.c:295
-#, no-c-format
-msgid "Physical size of the paper in the ADF"
-msgstr ""
-
#: ../backend/microtek2.h:601
#, no-c-format
msgid "Shadow, midtone, highlight, exposure time"
@@ -3298,12 +3945,12 @@ msgstr ""
msgid "This option turns off the lamp of the flatbed during a scan"
msgstr "Esta opção desligar a lâmpada durante a digitalização"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Digitalização de qualidade"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr ""
@@ -3330,12 +3977,6 @@ msgid ""
"for the threshold."
msgstr ""
-#: ../backend/microtek2.h:640 ../backend/kvs20xx_opt.c:423
-#: ../backend/kvs20xx_opt.c:424
-#, no-c-format
-msgid "Gamma correction"
-msgstr "Correcção do gamma"
-
#: ../backend/microtek2.h:641
#, no-c-format
msgid "Selects the gamma correction mode."
@@ -3728,12 +4369,39 @@ msgstr ""
"Aquecer até o brilho da lâmpada ser constante em ver de insistir em 40 "
"segundos de tempo de aquecimento."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Filme Negativo"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Negativo"
+
+#: ../backend/pixma.c:396
+#, no-c-format
+msgid "48 bits color"
+msgstr ""
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr ""
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -3741,198 +4409,218 @@ msgid ""
"cancel, press \"GRAY\" button."
msgstr ""
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, fuzzy, no-c-format
msgid "Update button state"
msgstr "Estado do botão"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, fuzzy, no-c-format
msgid "Button 1"
msgstr "Estado do botão"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, fuzzy, no-c-format
msgid "Button 2"
msgstr "Estado do botão"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Transparência"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr ""
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr ""
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr ""
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, fuzzy, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Calibração rudimentar"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr ""
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, fuzzy, no-c-format
msgid "Calibration data cache"
msgstr "Modo de calibração"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr ""
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, fuzzy, no-c-format
msgid "Performs calibration"
msgstr "Calibração rudimentar"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr ""
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr ""
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr ""
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr ""
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr ""
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr ""
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, fuzzy, no-c-format
msgid "Analog frontend"
msgstr "Ganho analógico"
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Deslocamento do vermelho"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Deslocamento do verde"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Deslocamento do azul"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr ""
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr ""
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr ""
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr ""
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr ""
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Cor 36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr ""
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr ""
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr ""
@@ -3979,7 +4667,7 @@ msgstr ""
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
#: ../backend/pnm.c:283
@@ -4102,29 +4790,29 @@ msgid ""
"after sane_read() has been called."
msgstr ""
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr ""
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Lâmpada acesa"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr ""
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr ""
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4145,42 +4833,42 @@ msgstr ""
msgid "Threshold value for lineart mode"
msgstr ""
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr ""
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 (pol)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 (pol)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11 (pol)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr ""
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr ""
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr ""
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4190,36 +4878,81 @@ msgid ""
"frontends may stop responding to X events and your system could bog down."
msgstr ""
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Aquecer lâmpada antes de digitalizar"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr ""
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
"combination of speed and detail."
msgstr ""
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr ""
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
"like."
msgstr ""
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "Digitalização rápida"
+
+#: ../backend/snapscan-options.c:897
+#, no-c-format
+msgid "Focus-mode"
+msgstr ""
+
+#: ../backend/snapscan-options.c:898
+#, no-c-format
+msgid "Auto or manual focus"
+msgstr ""
+
+#: ../backend/snapscan-options.c:911
+#, no-c-format
+msgid "Focus-point"
+msgstr ""
+
+#: ../backend/snapscan-options.c:912
+#, no-c-format
+msgid "Focus point"
+msgstr ""
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr ""
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr ""
@@ -4291,7 +5024,7 @@ msgstr ""
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
@@ -4856,354 +5589,18 @@ msgstr "Deslocamento do canal verde"
msgid "Sets blue channel offset"
msgstr "Deslocamento do canal azul"
-#: ../backend/kvs1025.h:53 ../backend/kvs20xx_opt.c:306
-#, no-c-format
-msgid "Landscape"
-msgstr "Paisagem"
-
-#: ../backend/kvs1025.h:54
-#, no-c-format
-msgid "Inverse Image"
-msgstr "Inverte imagem"
-
-#: ../backend/kvs1025.h:56
-#, no-c-format
-msgid "Long paper mode"
-msgstr "Modo de Papel Longo"
-
-#: ../backend/kvs1025.h:57 ../backend/kvs20xx_opt.c:229
-#, no-c-format
-msgid "Length control mode"
-msgstr "Modo de Controle do Comprimento"
-
-#: ../backend/kvs1025.h:58 ../backend/kvs20xx_opt.c:241
-#, no-c-format
-msgid "Manual feed mode"
-msgstr "Modo de Alimentação manual"
-
-#: ../backend/kvs1025.h:59 ../backend/kvs20xx_opt.c:253
-#, no-c-format
-msgid "Manual feed timeout"
-msgstr "Tempo de desligamento da alimentação manual"
-
-#: ../backend/kvs1025.h:60 ../backend/kvs20xx_opt.c:266
-#, no-c-format
-msgid "Double feed detection"
-msgstr "Detecção de dupla alimentação"
-
-#: ../backend/kvs1025_opt.c:39
-#, no-c-format
-msgid "bw"
-msgstr "PB"
-
-#: ../backend/kvs1025_opt.c:40
-#, no-c-format
-msgid "halftone"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:41
-#, fuzzy, no-c-format
-msgid "gray"
-msgstr "Cinzento"
-
-#: ../backend/kvs1025_opt.c:42
-#, fuzzy, no-c-format
-msgid "color"
-msgstr "Cor"
-
-#: ../backend/kvs1025_opt.c:61
-#, no-c-format
-msgid "adf"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:62
-#, no-c-format
-msgid "fb"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:72 ../backend/kvs20xx_opt.c:54
-#, fuzzy, no-c-format
-msgid "single"
-msgstr "simples"
-
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55
-#, no-c-format
-msgid "continuous"
-msgstr "contínuo"
-
-#: ../backend/kvs1025_opt.c:83 ../backend/kvs20xx_opt.c:61
-#, no-c-format
-msgid "off"
-msgstr "desliga"
-
-#: ../backend/kvs1025_opt.c:84 ../backend/kvs20xx_opt.c:62
-#, no-c-format
-msgid "wait_doc"
-msgstr "Aguarde_doc"
-
-#: ../backend/kvs1025_opt.c:85 ../backend/kvs20xx_opt.c:63
-#, no-c-format
-msgid "wait_key"
-msgstr "Aguarde-Chave"
-
-#: ../backend/kvs1025_opt.c:96 ../backend/kvs20xx_opt.c:69
-#, fuzzy, no-c-format
-msgid "user_def"
-msgstr "Definido pelo utilizador"
-
-#: ../backend/kvs1025_opt.c:97 ../backend/kvs20xx_opt.c:70
-#, no-c-format
-msgid "business_card"
-msgstr "Cartão de visita"
-
-#: ../backend/kvs1025_opt.c:98
-#, no-c-format
-msgid "Check"
-msgstr "Verificar"
-
-#: ../backend/kvs1025_opt.c:101 ../backend/kvs20xx_opt.c:74
-#, no-c-format
-msgid "A5"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:102 ../backend/kvs20xx_opt.c:75
-#, no-c-format
-msgid "A6"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:106 ../backend/kvs20xx_opt.c:79
-#, no-c-format
-msgid "B5"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:107 ../backend/kvs20xx_opt.c:80
-#, no-c-format
-msgid "B6"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:108 ../backend/kvs20xx_opt.c:81
-#, no-c-format
-msgid "Legal"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:149
-#, no-c-format
-msgid "bayer_64"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:150
-#, no-c-format
-msgid "bayer_16"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:151
-#, no-c-format
-msgid "halftone_32"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:152
-#, no-c-format
-msgid "halftone_64"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:153
-#, no-c-format
-msgid "diffusion"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:166 ../backend/kvs1025_opt.c:228
-#: ../backend/kvs1025_opt.c:241 ../backend/kvs20xx_opt.c:128
-#: ../backend/kvs20xx_opt.c:136
-#, fuzzy, no-c-format
-msgid "normal"
-msgstr "Normal"
-
-#: ../backend/kvs1025_opt.c:167
-#, no-c-format
-msgid "light"
-msgstr "claro"
-
-#: ../backend/kvs1025_opt.c:168
-#, no-c-format
-msgid "dark"
-msgstr "escuro"
-
-#: ../backend/kvs1025_opt.c:179
-#, fuzzy, no-c-format
-msgid "From scanner"
-msgstr "Digitalização rápida"
-
-#: ../backend/kvs1025_opt.c:192
-#, fuzzy, no-c-format
-msgid "default"
-msgstr "Predefinição"
-
-#: ../backend/kvs1025_opt.c:211 ../backend/kvs20xx_opt.c:122
-#, no-c-format
-msgid "smooth"
-msgstr "Suave"
-
-#: ../backend/kvs1025_opt.c:212 ../backend/kvs20xx_opt.c:118
-#, no-c-format
-msgid "none"
-msgstr "Nenhuma"
-
-#: ../backend/kvs1025_opt.c:213 ../backend/kvs20xx_opt.c:119
-#, fuzzy, no-c-format
-msgid "low"
-msgstr "Lento"
-
-#: ../backend/kvs1025_opt.c:214 ../backend/kvs1025_opt.c:802
-#: ../backend/kvs20xx_opt.c:120
-#, no-c-format
-msgid "medium"
-msgstr "Média"
-
-#: ../backend/kvs1025_opt.c:215 ../backend/kvs20xx_opt.c:121
-#, no-c-format
-msgid "high"
-msgstr "Alta"
-
-#: ../backend/kvs1025_opt.c:229 ../backend/kvs20xx_opt.c:129
-#, no-c-format
-msgid "crt"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:230
-#, fuzzy, no-c-format
-msgid "linier"
-msgstr "Linhas"
-
-#: ../backend/kvs1025_opt.c:242 ../backend/kvs20xx_opt.c:137
-#, fuzzy, no-c-format
-msgid "red"
-msgstr "Vermelho"
-
-#: ../backend/kvs1025_opt.c:243 ../backend/kvs20xx_opt.c:138
-#, fuzzy, no-c-format
-msgid "green"
-msgstr "Verde"
-
-#: ../backend/kvs1025_opt.c:244 ../backend/kvs20xx_opt.c:139
-#, fuzzy, no-c-format
-msgid "blue"
-msgstr "Azul"
-
-#: ../backend/kvs1025_opt.c:560
-#, fuzzy, no-c-format
-msgid "Sets the scan source"
-msgstr "Origem da digitalização"
-
-#: ../backend/kvs1025_opt.c:582
-#, no-c-format
-msgid "Enable/Disable long paper mode"
-msgstr "Liga / Desliga Modo Papel Longo"
-
-#: ../backend/kvs1025_opt.c:591
-#, no-c-format
-msgid "Enable/Disable length control mode"
-msgstr "Liga / Desliga Modo Controle do Comprimento"
-
-#: ../backend/kvs1025_opt.c:599 ../backend/kvs20xx_opt.c:242
-#, no-c-format
-msgid "Sets the manual feed mode"
-msgstr "Define modo de alimentação manual"
-
-#: ../backend/kvs1025_opt.c:610 ../backend/kvs20xx_opt.c:254
-#, no-c-format
-msgid "Sets the manual feed timeout in seconds"
-msgstr "Define desligamento de alimentação manual em segundos"
-
-#: ../backend/kvs1025_opt.c:623 ../backend/kvs20xx_opt.c:267
-#, no-c-format
-msgid "Enable/Disable double feed detection"
-msgstr "Liga / Desliga Modo de detecção de alimentação"
-
-#: ../backend/kvs1025_opt.c:629 ../backend/kvs20xx_opt.c:275
-#, no-c-format
-msgid "fit-to-page"
-msgstr "Adequar à página"
-
-#: ../backend/kvs1025_opt.c:630 ../backend/kvs20xx_opt.c:276
-#, no-c-format
-msgid "Fit to page"
-msgstr "Adequar à página"
-
-#: ../backend/kvs1025_opt.c:632 ../backend/kvs20xx_opt.c:277
-#, no-c-format
-msgid "Scanner shrinks image to fit scanned page"
-msgstr "Scanner diminui imagem para adequar à pagina digitalizada"
-
-#: ../backend/kvs1025_opt.c:659 ../backend/kvs20xx_opt.c:308
-#, no-c-format
-msgid "Set paper position : true for landscape, false for portrait"
-msgstr ""
-"Define posição do papel: Verdadeiro para Paisagem, Falso para Retrato"
-
-#: ../backend/kvs1025_opt.c:816 ../backend/kvs20xx_opt.c:435
-#, fuzzy, no-c-format
-msgid "Lamp color"
-msgstr "Cor da lâmpada"
-
-#: ../backend/kvs1025_opt.c:817 ../backend/kvs20xx_opt.c:436
-#, no-c-format
-msgid "Sets the lamp color (color dropout)"
-msgstr "Define cor da lâmpada (Color dropout)"
-
-#: ../backend/kvs1025_opt.c:830
-#, no-c-format
-msgid "Inverse image in B/W or halftone mode"
-msgstr "Inverte imagem nos modos P/B ou simulação de cinza"
-
-#: ../backend/kvs1025_opt.c:838
-#, no-c-format
-msgid "Mirror image (left/right flip)"
-msgstr "Imagem espelhada"
-
-#: ../backend/kvs1025_opt.c:845
-#, no-c-format
-msgid "jpeg compression"
-msgstr "Compressão JPEG"
+#, fuzzy
+#~ msgid "Request backend to rotate skewed pages digitally"
+#~ msgstr ""
+#~ "Solicita ao driver para rotacionar digitalmente páginas inclinadas"
-#: ../backend/kvs1025_opt.c:848
-#, no-c-format
-msgid "JPEG Image Compression with Q parameter, '0' - no compression"
-msgstr "Compressão da imagem JPEG com parâmetro Q, '0' - sem compressão"
-
-#: ../backend/kvs1025_opt.c:860
-#, no-c-format
-msgid "Request driver to rotate skewed pages digitally"
-msgstr "Solicita ao driver para rotacionar digitalmente páginas inclinadas"
-
-#: ../backend/kvs1025_opt.c:879
-#, no-c-format
-msgid "Software automatic cropping"
-msgstr "Crop automático"
-
-#: ../backend/kvs1025_opt.c:881
-#, no-c-format
-msgid "Request driver to remove border from pages digitally"
-msgstr "Solicita ao driver para remover digitalmente bordas das páginas"
-
-#: ../backend/kvs1025_opt.c:888
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr "Desconsiderar porcentagem branco"
-
-#: ../backend/kvs1025_opt.c:890
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-"Solicita ao driver para eliminar páginas com baixo número de pixels "
-"escuros"
+#, fuzzy
+#~ msgid "Software despeck"
+#~ msgstr "Alinhamento - Deskew"
-#: ../backend/kvs20xx_opt.c:232
-#, no-c-format
-msgid ""
-"Length Control Mode is a mode that the scanner reads up to the shorter "
-"length of actual paper or logical document length."
-msgstr ""
+#, fuzzy
+#~ msgid "Request backend to remove lone dots digitally"
+#~ msgstr "Solicita ao driver para remover digitalmente bordas das páginas"
#~ msgid "Grayscale"
#~ msgstr "Cinzento"
diff --git a/po/ru.po b/po/ru.po
index f99d27f..7e83aee 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2011-06-06 22:10-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2007-12-17 23:05+0100\n"
"Last-Translator: \n"
"Language-Team: <ru@li.org>\n"
@@ -31,17 +31,17 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:6028 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:144
-#: ../backend/plustek.c:807 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -50,25 +50,25 @@ msgid "Geometry"
msgstr "Расположение"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1492 ../backend/genesys.c:6088
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:853
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Повышение"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Дополнительно"
@@ -93,8 +93,8 @@ msgstr "Принудительный одноцветный предварите
msgid "Bit depth"
msgstr "Бит на цвет"
-#: ../include/sane/saneopts.h:165 ../backend/canon.c:1143
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:40
+#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Режим сканирования"
@@ -134,7 +134,8 @@ msgstr "Правая нижняя координата X"
msgid "Bottom-right y"
msgstr "Правая нижняя координата Y"
-#: ../include/sane/saneopts.h:173 ../backend/canon.c:1219
+#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Разрешение сканирования"
@@ -302,7 +303,7 @@ msgstr "Согласовывать разрешение по X и по Y"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -999,7 +1000,7 @@ msgstr "По умолчанию"
msgid "Set default values for enhancement controls."
msgstr "Устанавливает значения по умолчанию для управления повышением."
-#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1610
+#: ../backend/artec_eplus48u.c:2932 ../backend/canon.c:1616
#, no-c-format
msgid "Calibration"
msgstr "Калибровка"
@@ -1040,22 +1041,22 @@ msgstr ""
msgid "Button state"
msgstr "Состояние кнопки"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Количество кадров для сканирования"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Выберите количество кадров для сканирования"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Двухстороннее сканирование"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
@@ -1063,42 +1064,42 @@ msgstr ""
"Двухстороннее сканирование позволяет получить изображение лицевой и "
"обратной стороны документа"
-#: ../backend/canon630u.c:158
+#: ../backend/canon630u.c:159
#, no-c-format
msgid "Calibrate Scanner"
msgstr "Калибровать сканер"
-#: ../backend/canon630u.c:159
+#: ../backend/canon630u.c:160
#, no-c-format
msgid "Force scanner calibration before scan"
msgstr "Выполнять калибровку сканера перед сканированием"
-#: ../backend/canon630u.c:258 ../backend/umax1220u.c:208
+#: ../backend/canon630u.c:259 ../backend/umax1220u.c:208
#, no-c-format
msgid "Grayscale scan"
msgstr "Чёрно-белое сканирование"
-#: ../backend/canon630u.c:259 ../backend/umax1220u.c:209
+#: ../backend/canon630u.c:260 ../backend/umax1220u.c:209
#, no-c-format
msgid "Do a grayscale rather than color scan"
msgstr "Выполнять чёрно-белое сканирование вместо цветного"
-#: ../backend/canon630u.c:305
+#: ../backend/canon630u.c:306
#, no-c-format
msgid "Analog Gain"
msgstr "Аналоговое усиление"
-#: ../backend/canon630u.c:306
+#: ../backend/canon630u.c:307
#, no-c-format
msgid "Increase or decrease the analog gain of the CCD array"
msgstr "Увеличить или уменьшить аналоговое усиление матрицы CCD"
-#: ../backend/canon630u.c:346 ../backend/epson.h:68 ../backend/epson2.h:72
+#: ../backend/canon630u.c:347 ../backend/epson.h:68 ../backend/epson2.h:74
#, no-c-format
msgid "Gamma Correction"
msgstr "Коррекция гаммы"
-#: ../backend/canon630u.c:347
+#: ../backend/canon630u.c:348
#, no-c-format
msgid "Selects the gamma corrected transfer curve"
msgstr "Выберите кривую гамма-коррекции"
@@ -1110,8 +1111,8 @@ msgstr ""
#: ../backend/canon.c:157 ../backend/canon-sane.c:732
#: ../backend/canon-sane.c:940 ../backend/canon-sane.c:1076
-#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1487
-#: ../backend/canon-sane.c:1636
+#: ../backend/canon-sane.c:1318 ../backend/canon-sane.c:1501
+#: ../backend/canon-sane.c:1650
#, no-c-format
msgid "Fine color"
msgstr ""
@@ -1162,598 +1163,608 @@ msgstr "2x2 нормальное"
msgid "1/3 normal speed"
msgstr "3x3 нормальное"
-#: ../backend/canon.c:372
+#: ../backend/canon.c:365
#, fuzzy, no-c-format
msgid "rounded parameter"
msgstr "Нечёткие параметры"
-#: ../backend/canon.c:375 ../backend/canon.c:391 ../backend/canon.c:426
-#: ../backend/canon.c:476 ../backend/canon.c:494 ../backend/canon.c:537
+#: ../backend/canon.c:368 ../backend/canon.c:384 ../backend/canon.c:419
+#: ../backend/canon.c:469 ../backend/canon.c:487 ../backend/canon.c:530
#, no-c-format
msgid "unknown"
msgstr ""
-#: ../backend/canon.c:385
+#: ../backend/canon.c:378
#, fuzzy, no-c-format
msgid "ADF jam"
msgstr "АПД"
-#: ../backend/canon.c:388
+#: ../backend/canon.c:381
#, no-c-format
msgid "ADF cover open"
msgstr ""
-#: ../backend/canon.c:401
+#: ../backend/canon.c:394
#, fuzzy, no-c-format
msgid "lamp failure"
msgstr "Значение гаммы"
-#: ../backend/canon.c:404
+#: ../backend/canon.c:397
#, no-c-format
msgid "scan head positioning error"
msgstr ""
-#: ../backend/canon.c:407
+#: ../backend/canon.c:400
#, no-c-format
msgid "CPU check error"
msgstr ""
-#: ../backend/canon.c:410
+#: ../backend/canon.c:403
#, no-c-format
msgid "RAM check error"
msgstr ""
-#: ../backend/canon.c:413
+#: ../backend/canon.c:406
#, no-c-format
msgid "ROM check error"
msgstr ""
-#: ../backend/canon.c:416
+#: ../backend/canon.c:409
#, no-c-format
msgid "hardware check error"
msgstr ""
-#: ../backend/canon.c:419
+#: ../backend/canon.c:412
#, fuzzy, no-c-format
msgid "transparency unit lamp failure"
msgstr "Модуль для слайдов"
-#: ../backend/canon.c:422
+#: ../backend/canon.c:415
#, no-c-format
msgid "transparency unit scan head positioning failure"
msgstr ""
-#: ../backend/canon.c:436
+#: ../backend/canon.c:429
#, no-c-format
msgid "parameter list length error"
msgstr ""
-#: ../backend/canon.c:440
+#: ../backend/canon.c:433
#, no-c-format
msgid "invalid command operation code"
msgstr ""
-#: ../backend/canon.c:444
+#: ../backend/canon.c:437
#, no-c-format
msgid "invalid field in CDB"
msgstr ""
-#: ../backend/canon.c:448
+#: ../backend/canon.c:441
#, no-c-format
msgid "unsupported LUN"
msgstr ""
-#: ../backend/canon.c:452
+#: ../backend/canon.c:445
#, no-c-format
msgid "invalid field in parameter list"
msgstr ""
-#: ../backend/canon.c:456
+#: ../backend/canon.c:449
#, no-c-format
msgid "command sequence error"
msgstr ""
-#: ../backend/canon.c:460
+#: ../backend/canon.c:453
#, no-c-format
msgid "too many windows specified"
msgstr ""
-#: ../backend/canon.c:464
+#: ../backend/canon.c:457
#, no-c-format
msgid "medium not present"
msgstr ""
-#: ../backend/canon.c:468
+#: ../backend/canon.c:461
#, no-c-format
msgid "invalid bit IDENTIFY message"
msgstr ""
-#: ../backend/canon.c:472
+#: ../backend/canon.c:465
#, no-c-format
msgid "option not connect"
msgstr ""
-#: ../backend/canon.c:486
+#: ../backend/canon.c:479
#, no-c-format
msgid "power on reset / bus device reset"
msgstr ""
-#: ../backend/canon.c:490
+#: ../backend/canon.c:483
#, no-c-format
msgid "parameter changed by another initiator"
msgstr ""
-#: ../backend/canon.c:504
+#: ../backend/canon.c:497
#, no-c-format
msgid "no additional sense information"
msgstr ""
-#: ../backend/canon.c:508
+#: ../backend/canon.c:501
#, no-c-format
msgid "reselect failure"
msgstr ""
-#: ../backend/canon.c:512
+#: ../backend/canon.c:505
#, no-c-format
msgid "SCSI parity error"
msgstr ""
-#: ../backend/canon.c:516
+#: ../backend/canon.c:509
#, no-c-format
msgid "initiator detected error message received"
msgstr ""
-#: ../backend/canon.c:521
+#: ../backend/canon.c:514
#, no-c-format
msgid "invalid message error"
msgstr ""
-#: ../backend/canon.c:525
+#: ../backend/canon.c:518
#, no-c-format
msgid "timeout error"
msgstr ""
-#: ../backend/canon.c:529
+#: ../backend/canon.c:522
#, fuzzy, no-c-format
msgid "transparency unit shading error"
msgstr "Модуль для слайдов"
-#: ../backend/canon.c:533
+#: ../backend/canon.c:526
#, no-c-format
msgid "lamp not stabilized"
msgstr ""
-#: ../backend/canon.c:547
-#, no-c-format
-msgid "problem not analyzed (unknown SCSI class)"
-msgstr ""
-
-#: ../backend/canon.c:865 ../backend/canon.c:880
+#: ../backend/canon.c:852 ../backend/canon.c:867
#, fuzzy, no-c-format
msgid "film scanner"
msgstr "планшетный сканер"
-#: ../backend/canon.c:895 ../backend/canon.c:910 ../backend/canon.c:925
-#: ../backend/hp3900_sane.c:1683 ../backend/plustek.c:1334
-#: ../backend/plustek_pp.c:1014 ../backend/sceptre.c:593
-#: ../backend/teco2.c:1836 ../backend/u12.c:851
+#: ../backend/canon.c:882 ../backend/canon.c:897 ../backend/canon.c:912
+#: ../backend/canon.c:927 ../backend/hp3900_sane.c:1683
+#: ../backend/plustek.c:1335 ../backend/plustek_pp.c:1014
+#: ../backend/sceptre.c:593 ../backend/teco2.c:1836 ../backend/u12.c:851
#, no-c-format
msgid "flatbed scanner"
msgstr "планшетный сканер"
-#: ../backend/canon.c:1181 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Тип плёнки"
-#: ../backend/canon.c:1182
+#: ../backend/canon.c:1184
#, no-c-format
msgid "Selects the film type, i.e. negatives or slides"
msgstr ""
-#: ../backend/canon.c:1194
+#: ../backend/canon.c:1196
#, fuzzy, no-c-format
msgid "Negative film type"
msgstr "Негатив"
-#: ../backend/canon.c:1195
+#: ../backend/canon.c:1197
#, fuzzy, no-c-format
msgid "Selects the negative film type"
msgstr "Выберите тестовое изображение"
-#: ../backend/canon.c:1234
+#: ../backend/canon.c:1236
#, fuzzy, no-c-format
msgid "Hardware resolution"
msgstr "Разрешение сканирования"
-#: ../backend/canon.c:1235
+#: ../backend/canon.c:1237
#, fuzzy, no-c-format
msgid "Use only hardware resolutions"
msgstr "Показывать короткий список разрешений"
-#: ../backend/canon.c:1316
+#: ../backend/canon.c:1318
#, no-c-format
msgid "Focus"
msgstr ""
-#: ../backend/canon.c:1326
+#: ../backend/canon.c:1328
#, fuzzy, no-c-format
msgid "Auto focus"
msgstr "Автоизвлечение"
-#: ../backend/canon.c:1327
+#: ../backend/canon.c:1329
#, fuzzy, no-c-format
msgid "Enable/disable auto focus"
msgstr "Выключить предварительный фокус"
-#: ../backend/canon.c:1334
+#: ../backend/canon.c:1336
#, no-c-format
msgid "Auto focus only once"
msgstr ""
-#: ../backend/canon.c:1335
+#: ../backend/canon.c:1337
#, no-c-format
msgid "Do auto focus only once between ejects"
msgstr ""
-#: ../backend/canon.c:1343
+#: ../backend/canon.c:1345
#, fuzzy, no-c-format
msgid "Manual focus position"
msgstr "Зафиксировать позицию фокуса"
-#: ../backend/canon.c:1344
+#: ../backend/canon.c:1346
#, no-c-format
msgid "Set the optical system's focus position by hand (default: 128)."
msgstr ""
-#: ../backend/canon.c:1354
+#: ../backend/canon.c:1356
#, no-c-format
msgid "Scan margins"
msgstr ""
-#: ../backend/canon.c:1401
+#: ../backend/canon.c:1403
#, no-c-format
msgid "Extra color adjustments"
msgstr ""
-#: ../backend/canon.c:1532 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
msgstr "Зеркальное изображение"
-#: ../backend/canon.c:1533
+#: ../backend/canon.c:1539
#, fuzzy, no-c-format
msgid "Mirror the image horizontally"
msgstr "Отображает изображение по горизонтали."
-#: ../backend/canon.c:1602
+#: ../backend/canon.c:1608
#, fuzzy, no-c-format
msgid "Auto exposure"
msgstr "Установить время выдержки"
-#: ../backend/canon.c:1603
+#: ../backend/canon.c:1609
#, fuzzy, no-c-format
msgid "Enable/disable the auto exposure feature"
msgstr "Включить выбор времени выдержки"
-#: ../backend/canon.c:1619
+#: ../backend/canon.c:1625
#, fuzzy, no-c-format
msgid "Calibration now"
msgstr "Калибровка"
-#: ../backend/canon.c:1620
+#: ../backend/canon.c:1626
#, fuzzy, no-c-format
msgid "Execute calibration *now*"
msgstr "Задать режим калибровки"
-#: ../backend/canon.c:1630
+#: ../backend/canon.c:1636
#, no-c-format
msgid "Self diagnosis"
msgstr ""
-#: ../backend/canon.c:1631
+#: ../backend/canon.c:1637
#, no-c-format
msgid "Perform scanner self diagnosis"
msgstr ""
-#: ../backend/canon.c:1642
+#: ../backend/canon.c:1648
#, fuzzy, no-c-format
msgid "Reset scanner"
msgstr "листовой сканер"
-#: ../backend/canon.c:1643
+#: ../backend/canon.c:1649
#, fuzzy, no-c-format
msgid "Reset the scanner"
msgstr "листовой сканер"
-#: ../backend/canon.c:1653
+#: ../backend/canon.c:1659
#, no-c-format
msgid "Medium handling"
msgstr ""
-#: ../backend/canon.c:1662
+#: ../backend/canon.c:1668
#, fuzzy, no-c-format
msgid "Eject film after each scan"
msgstr "Извлечь документ после сканирования"
-#: ../backend/canon.c:1663
+#: ../backend/canon.c:1669
#, no-c-format
msgid "Automatically eject the film from the device after each scan"
msgstr ""
-#: ../backend/canon.c:1672
+#: ../backend/canon.c:1680
#, no-c-format
msgid "Eject film before exit"
msgstr ""
-#: ../backend/canon.c:1673
+#: ../backend/canon.c:1681
#, no-c-format
msgid ""
"Automatically eject the film from the device before exiting the program"
msgstr ""
-#: ../backend/canon.c:1682
+#: ../backend/canon.c:1690
#, no-c-format
msgid "Eject film now"
msgstr ""
-#: ../backend/canon.c:1683
+#: ../backend/canon.c:1691
#, no-c-format
msgid "Eject the film *now*"
msgstr ""
-#: ../backend/canon.c:1692
+#: ../backend/canon.c:1700
#, fuzzy, no-c-format
msgid "Document feeder extras"
msgstr "Податчик листов"
-#: ../backend/canon.c:1699
+#: ../backend/canon.c:1707
#, fuzzy, no-c-format
msgid "Flatbed only"
msgstr "Планшетный"
-#: ../backend/canon.c:1700
+#: ../backend/canon.c:1708
#, no-c-format
msgid "Disable auto document feeder and use flatbed only"
msgstr ""
-#: ../backend/canon.c:1710 ../backend/canon.c:1720
+#: ../backend/canon.c:1718 ../backend/canon.c:1728
#, fuzzy, no-c-format
msgid "Transparency unit"
msgstr "Модуль для слайдов"
-#: ../backend/canon.c:1721
+#: ../backend/canon.c:1729
#, no-c-format
msgid "Switch on/off the transparency unit (FAU, film adapter unit)"
msgstr ""
-#: ../backend/canon.c:1731
+#: ../backend/canon.c:1739
#, fuzzy, no-c-format
msgid "Negative film"
msgstr "Негатив"
-#: ../backend/canon.c:1732
+#: ../backend/canon.c:1740
#, fuzzy, no-c-format
msgid "Positive or negative film"
msgstr "Позитив"
-#: ../backend/canon.c:1741
+#: ../backend/canon.c:1749
#, no-c-format
msgid "Density control"
msgstr ""
-#: ../backend/canon.c:1742
+#: ../backend/canon.c:1750
#, no-c-format
msgid "Set density control mode"
msgstr ""
-#: ../backend/canon.c:1753
+#: ../backend/canon.c:1761
#, fuzzy, no-c-format
msgid "Transparency ratio"
msgstr "Модуль для слайдов"
-#: ../backend/canon.c:1767
+#: ../backend/canon.c:1775
#, fuzzy, no-c-format
msgid "Select film type"
msgstr "Тип плёнки"
-#: ../backend/canon.c:1768
+#: ../backend/canon.c:1776
#, fuzzy, no-c-format
msgid "Select the film type"
msgstr "Выбирает полутона."
-#: ../backend/canon_dr.c:330 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:110 ../backend/fujitsu.c:548
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:163 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:664
-#: ../backend/pixma_sane_options.c:85 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Планшетный"
-#: ../backend/canon_dr.c:331 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:549 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr ""
-#: ../backend/canon_dr.c:332 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:550 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, fuzzy, no-c-format
msgid "ADF Back"
msgstr "АПД"
-#: ../backend/canon_dr.c:333 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:551 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:675
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, fuzzy, no-c-format
msgid "ADF Duplex"
msgstr "Двухсторонний"
-#: ../backend/canon_dr.c:340 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:195
-#: ../backend/fujitsu.c:568 ../backend/genesys.c:110
-#: ../backend/genesys.c:117 ../backend/gt68xx_low.h:136
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Распечатка"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Двухсторонний"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
+#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Красный"
-#: ../backend/canon_dr.c:341 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:196
-#: ../backend/fujitsu.c:569 ../backend/genesys.c:111
-#: ../backend/genesys.c:118 ../backend/gt68xx_low.h:137
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
+#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Зелёный"
-#: ../backend/canon_dr.c:342 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:197
-#: ../backend/fujitsu.c:570 ../backend/genesys.c:112
-#: ../backend/genesys.c:119 ../backend/gt68xx_low.h:138
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
+#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Синий"
-#: ../backend/canon_dr.c:343
+#: ../backend/canon_dr.c:404
#, fuzzy, no-c-format
msgid "Enhance Red"
msgstr "Повышение"
-#: ../backend/canon_dr.c:344
+#: ../backend/canon_dr.c:405
#, fuzzy, no-c-format
msgid "Enhance Green"
msgstr "Повышение"
-#: ../backend/canon_dr.c:345
+#: ../backend/canon_dr.c:406
#, fuzzy, no-c-format
msgid "Enhance Blue"
msgstr "Повышение"
-#: ../backend/canon_dr.c:347 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:159
-#: ../backend/epson2.c:167 ../backend/epson2.c:179 ../backend/epson2.c:194
-#: ../backend/epson2.c:208 ../backend/fujitsu.c:574
-#: ../backend/genesys.c:120 ../backend/leo.c:109
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
+#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Ничего"
-#: ../backend/canon_dr.c:348 ../backend/fujitsu.c:575
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:103
-#: ../backend/magicolor.c:156
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Односторонний"
-#: ../backend/epson.c:492 ../backend/epson2.c:104 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:157 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Двухсторонний"
-#: ../backend/epson.c:502 ../backend/epson2.c:111 ../backend/pixma.c:681
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Модуль для слайдов"
-#: ../backend/epson.c:503 ../backend/epson2.c:112
-#: ../backend/magicolor.c:164 ../backend/mustek.c:160
-#: ../backend/pixma.c:669 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Автоматический податчик документов"
-#: ../backend/epson.c:523 ../backend/epson2.c:128
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Позитив"
-#: ../backend/epson.c:524 ../backend/epson2.c:129
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Негатив"
-#: ../backend/epson.c:529 ../backend/epson2.c:136
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Фокус на стекле"
-#: ../backend/epson.c:530 ../backend/epson2.c:137
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Фокус 2.5мм над стеклом"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:160 ../backend/epson2.c:168 ../backend/epson2.c:180
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Чёрно-белый A (Резкие тона)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:161 ../backend/epson2.c:169 ../backend/epson2.c:181
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Чёрно-белый B (Мягкие тона)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:162 ../backend/epson2.c:170 ../backend/epson2.c:182
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Чёрно-белый C (Net Screen)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:171
-#: ../backend/epson2.c:183
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr ""
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:172
-#: ../backend/epson2.c:184
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr ""
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:173
-#: ../backend/epson2.c:185
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr ""
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:174
-#: ../backend/epson2.c:186
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr ""
-#: ../backend/epson.c:584 ../backend/epson2.c:187
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Технология улучшения текста"
-#: ../backend/epson.c:585 ../backend/epson2.c:188
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Загрузить шаблон A"
-#: ../backend/epson.c:586 ../backend/epson2.c:189
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Загрузить шаблон B"
@@ -1763,7 +1774,7 @@ msgstr "Загрузить шаблон B"
msgid "No Correction"
msgstr "Без коррекции"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:249
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Определяемое пользователем"
@@ -1788,33 +1799,33 @@ msgstr "Струйные принтеры"
msgid "CRT monitors"
msgstr "Мониторы с ЭЛТ"
-#: ../backend/epson.c:656 ../backend/epson2.c:248 ../backend/fujitsu.c:558
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "По умолчанию"
-#: ../backend/epson.c:658 ../backend/epson2.c:250
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Печать высокой плотности"
-#: ../backend/epson.c:659 ../backend/epson2.c:251
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Печать высокой плотности"
-#: ../backend/epson.c:660 ../backend/epson2.c:252
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Печать высокой контрастности"
-#: ../backend/epson.c:678 ../backend/epson2.c:270
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Определённое пользователем (Gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:271
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Определённое пользователем (Gamma=1.8)"
@@ -1854,235 +1865,235 @@ msgstr "A4"
msgid "Max"
msgstr "Макс"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5959 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:720
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Режим сканирования"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Выбирает полутона."
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr ""
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr ""
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Выбирает яркость."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Резкость"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Коррекция цветов"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
"Устанавливает таблицу коррекции цветов для выбранного выходного "
"устройства."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Коэффициенты цветовой коррекции"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Матричный множитель RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Сдвиг зелёного к красному"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Сдвиг зелёного к синему"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Сдвиг красного к зелёному"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Сдвиг красного к синему"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Сдвиг синего к зелёному"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Сдвиг синего к красному"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Управляет уровнем зелёного"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Добавляет к красному, основанному на уровне зелёного"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Добавляет к синему, основанному на уровне зелёного"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Добавляет к зелёному, основанному на уровне красного"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Управляет уровнем красного"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Добавляет к синему, основанному на уровне красного"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Добавляет к зелёному, основанному на уровне синего"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Добавляет к красному, основанному на уровне синего"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Управляет уровнем синего"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Сделать изображение зеркальным."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Быстрый предварительный просмотр"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Автоматически разделять на области"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Короткий список разрешений"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Показывать короткий список разрешений"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Масштаб"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr ""
"Определяет коэффициент масштабирования, который будет использоваться "
"сканером"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Быстрый формат"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Дополнительное оборудование"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Извлечь"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Вставить бумагу в устройство подачи документов"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Автоизвлечение"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Извлечь документ после сканирования"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2345
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "Режим автоподачи"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2347
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Выбирает режим автоподачи (односторонний/двухсторонний)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Отсек"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Выбрать отсек, который сканировать"
-#: ../backend/epson.h:69 ../backend/epson2.h:73
+#: ../backend/epson.h:69 ../backend/epson2.h:75
#, no-c-format
msgid ""
"Selects the gamma correction value from a list of pre-defined devices or "
@@ -2091,12 +2102,12 @@ msgstr ""
"Выбирает значение гамма-коррекции из списка предопределённых или "
"настроенных пользователем, которое может быть загружено в сканер"
-#: ../backend/epson.h:72 ../backend/epson2.h:76
+#: ../backend/epson.h:72 ../backend/epson2.h:78
#, no-c-format
msgid "Focus Position"
msgstr "Расположение фокуса"
-#: ../backend/epson.h:73 ../backend/epson2.h:77
+#: ../backend/epson.h:73 ../backend/epson2.h:79
#, no-c-format
msgid ""
"Sets the focus position to either the glass or 2.5mm above the glass"
@@ -2104,12 +2115,12 @@ msgstr ""
"Устанавливает расположение фокуса либо на стекле, либо на 2.5мм выше "
"стекла"
-#: ../backend/epson.h:75 ../backend/epson2.h:79
+#: ../backend/epson.h:75 ../backend/epson2.h:81
#, no-c-format
msgid "Wait for Button"
msgstr "Ожидать нажатия кнопки"
-#: ../backend/epson.h:76 ../backend/epson2.h:80
+#: ../backend/epson.h:76 ../backend/epson2.h:82
#, no-c-format
msgid ""
"After sending the scan command, wait until the button on the scanner is "
@@ -2118,200 +2129,263 @@ msgstr ""
"После подачи команды \"сканировать\", будет ожидать пока не будет нажата "
"кнопка на сканере, чтобы действительно начать процесс сканирования."
-#: ../backend/epson2.c:97
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:130
+#: ../backend/epson2.c:117
+#, no-c-format
+msgid "TPU8x10"
+msgstr ""
+
+#: ../backend/epson2.c:136
#, fuzzy, no-c-format
msgid "Positive Slide"
msgstr "Позитив"
-#: ../backend/epson2.c:131
+#: ../backend/epson2.c:137
#, fuzzy, no-c-format
msgid "Negative Slide"
msgstr "Негатив"
-#: ../backend/epson2.c:209
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:210
+#: ../backend/epson2.c:216
#, fuzzy, no-c-format
msgid "User defined CCT profile"
msgstr "Определяемое пользователем"
-#: ../backend/fujitsu.c:559 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Вкл"
-#: ../backend/fujitsu.c:560 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Выкл"
-#: ../backend/fujitsu.c:562
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:563
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:565 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Размытие"
-#: ../backend/fujitsu.c:566
+#: ../backend/fujitsu.c:667
#, fuzzy, no-c-format
msgid "Diffusion"
msgstr "Диффузия ошибок"
-#: ../backend/fujitsu.c:571
+#: ../backend/fujitsu.c:672
#, fuzzy, no-c-format
msgid "White"
msgstr "Уровень белого"
-#: ../backend/fujitsu.c:572
+#: ../backend/fujitsu.c:673
#, fuzzy, no-c-format
msgid "Black"
msgstr "Уровень чёрного"
-#: ../backend/fujitsu.c:577
+#: ../backend/fujitsu.c:678
#, fuzzy, no-c-format
msgid "Continue"
msgstr "Условно"
-#: ../backend/fujitsu.c:578
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:580
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:581
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:582
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:584 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Горизонтально"
-#: ../backend/fujitsu.c:585
+#: ../backend/fujitsu.c:686
#, fuzzy, no-c-format
msgid "Horizontal bold"
msgstr "Горизонтально"
-#: ../backend/fujitsu.c:586
+#: ../backend/fujitsu.c:687
#, fuzzy, no-c-format
msgid "Horizontal narrow"
msgstr "Горизонтально"
-#: ../backend/fujitsu.c:587 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Вертикальное"
-#: ../backend/fujitsu.c:588
+#: ../backend/fujitsu.c:689
#, fuzzy, no-c-format
msgid "Vertical bold"
msgstr "Вертикальное"
-#: ../backend/fujitsu.c:590
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:591
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:694
#, fuzzy, no-c-format
msgid "Front"
msgstr "Распечатка"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/genesys.c:6177
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr ""
+
+#: ../backend/fujitsu.c:4056
+#, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5757
+#, no-c-format
+msgid "Software crop"
+msgstr ""
+
+#: ../backend/genesys.c:5758
+#, no-c-format
+msgid "Request backend to remove border from pages digitally"
+msgstr ""
+
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
+#, no-c-format
+msgid "Request driver to discard pages with low numbers of dark pixels"
+msgstr ""
+
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
+#, no-c-format
+msgid "Software derotate"
+msgstr ""
+
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
+#, no-c-format
+msgid "Request driver to detect and correct 90 degree image rotation"
+msgstr ""
+
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Дополнительно"
-#: ../backend/genesys.c:6196
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, fuzzy, no-c-format
msgid "Threshold curve"
msgstr "Порог"
-#: ../backend/genesys.c:6197
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:6206
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:6208
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:6223
+#: ../backend/genesys.c:5857
#, fuzzy, no-c-format
msgid "Disable interpolation"
msgstr "Выключить отслеживание"
-#: ../backend/genesys.c:6226
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
"than the vertical resolution this disables horizontal interpolation."
msgstr ""
-#: ../backend/genesys.c:6235
+#: ../backend/genesys.c:5869
#, fuzzy, no-c-format
-msgid "Color Filter"
+msgid "Color filter"
msgstr "Цветное штриховое"
-#: ../backend/genesys.c:6238
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
-#: ../backend/genesys.c:6264
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Калибровка"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Задать режим калибровки"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Кэширование калибровочных данных"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Время выключения лампы"
-#: ../backend/genesys.c:6267
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2320,62 +2394,77 @@ msgstr ""
"Лампа будет выключена через указанное время (в минутах). Значение 0 "
"означает, что лампа выключаться не будет."
-#: ../backend/genesys.c:6296 ../backend/genesys.c:6297
+#: ../backend/genesys.c:5940
+#, fuzzy, no-c-format
+msgid "Lamp off during scan"
+msgstr "Грубая калибровка"
+
+#: ../backend/genesys.c:5941
+#, no-c-format
+msgid "The lamp will be turned off during scan. "
+msgstr ""
+
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, fuzzy, no-c-format
msgid "File button"
msgstr "Ожидать нажатия кнопки"
-#: ../backend/genesys.c:6349 ../backend/genesys.c:6350
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:6363 ../backend/genesys.c:6364
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, fuzzy, no-c-format
msgid "Power button"
msgstr "Ожидать нажатия кнопки"
-#: ../backend/genesys.c:6377 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "Ожидать нажатия кнопки"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, fuzzy, no-c-format
msgid "Need calibration"
msgstr "Грубая калибровка"
-#: ../backend/genesys.c:6378 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, fuzzy, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Выполнять калибровку сканера перед сканированием"
-#: ../backend/genesys.c:6391 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:210
-#: ../backend/plustek.c:1079
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
+#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Кнопки"
-#: ../backend/genesys.c:6398 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:940
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Калибровка"
-#: ../backend/genesys.c:6400 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, fuzzy, no-c-format
msgid "Start calibration using special sheet"
msgstr "Начать процесс калибровки."
-#: ../backend/genesys.c:6414 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, fuzzy, no-c-format
msgid "Clear calibration"
msgstr "Грубая калибровка"
-#: ../backend/genesys.c:6415 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, fuzzy, no-c-format
msgid "Clear calibration cache"
msgstr "Кэширование калибровочных данных"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Слайд-модуль"
@@ -2512,7 +2601,7 @@ msgstr "Режим сканирования"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2653,12 +2742,12 @@ msgstr ""
msgid "This option reflects a front panel scanner button"
msgstr "Этот параметр отражает состояние кнопок сканера."
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Изображение"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Различное"
@@ -2683,17 +2772,17 @@ msgstr "Смещение"
msgid "Hardware internal Y position of the scanning area."
msgstr "Координата X левого верхнего угла области сканирования."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Состояние лампы"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Включить/выключить лампу."
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Калибрует для чёрного и белого уровня."
@@ -2801,8 +2890,8 @@ msgstr "Медленно"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
-#: ../backend/mustek.c:149 ../backend/plustek.c:233
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/mustek.c:149 ../backend/plustek.c:234
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Нормально"
@@ -3140,9 +3229,9 @@ msgstr ""
msgid "single"
msgstr ""
-#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:457
-#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:703
-#: ../backend/kvs40xx.c:721 ../backend/kvs40xx_opt.c:101
+#: ../backend/kvs1025_opt.c:73 ../backend/kvs20xx.c:455
+#: ../backend/kvs20xx_opt.c:55 ../backend/kvs40xx.c:704
+#: ../backend/kvs40xx.c:722 ../backend/kvs40xx_opt.c:101
#: ../backend/kvs40xx_opt.c:1086
#, fuzzy, no-c-format
msgid "continuous"
@@ -3441,7 +3530,7 @@ msgstr "Устанавливает выразительность изображ
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:107
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Гамма"
@@ -3508,16 +3597,6 @@ msgstr ""
msgid "Maximum diameter of lone dots to remove from scan"
msgstr ""
-#: ../backend/kvs1025_opt.c:893
-#, no-c-format
-msgid "Software derotate"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:895
-#, no-c-format
-msgid "Request driver to detect and correct 90 degree image rotation"
-msgstr ""
-
#: ../backend/kvs1025_opt.c:902
#, no-c-format
msgid "Software automatic cropping"
@@ -3528,16 +3607,6 @@ msgstr ""
msgid "Request driver to remove border from pages digitally"
msgstr ""
-#: ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr ""
-
-#: ../backend/kvs1025_opt.c:913
-#, no-c-format
-msgid "Request driver to discard pages with low numbers of dark pixels"
-msgstr ""
-
#: ../backend/kvs20xx_opt.c:232 ../backend/kvs40xx_opt.c:395
#, no-c-format
msgid ""
@@ -3606,7 +3675,7 @@ msgstr "Повышение"
#, no-c-format
msgid ""
"Long Paper Mode is a mode that the scanner reads the image after it "
-"divides long paperby the length which is set in Document Size option"
+"divides long paper by the length which is set in Document Size option."
msgstr ""
#: ../backend/kvs40xx_opt.c:448
@@ -3774,7 +3843,7 @@ msgstr "Усиление серого"
msgid "Sets gray channel gain"
msgstr "Устанавливает усиление серого канала"
-#: ../backend/lexmark.c:297 ../backend/plustek.c:1000
+#: ../backend/lexmark.c:297 ../backend/plustek.c:1001
#: ../backend/umax_pp.c:735
#, no-c-format
msgid "Red gain"
@@ -3785,7 +3854,7 @@ msgstr "Усиление красного"
msgid "Sets red channel gain"
msgstr "Устанавливает усиление красного канала"
-#: ../backend/lexmark.c:311 ../backend/plustek.c:1016
+#: ../backend/lexmark.c:311 ../backend/plustek.c:1017
#: ../backend/umax_pp.c:747
#, no-c-format
msgid "Green gain"
@@ -3796,7 +3865,7 @@ msgstr "Усиление зелёного"
msgid "Sets green channel gain"
msgstr "Устанавливает усиление зелёного канала"
-#: ../backend/lexmark.c:325 ../backend/plustek.c:1032
+#: ../backend/lexmark.c:325 ../backend/plustek.c:1033
#: ../backend/umax_pp.c:759
#, no-c-format
msgid "Blue gain"
@@ -3888,7 +3957,7 @@ msgstr "Одна страница"
msgid "All pages"
msgstr "Все страницы"
-#: ../backend/matsushita.c:1034 ../backend/plustek.c:1332
+#: ../backend/matsushita.c:1034 ../backend/plustek.c:1333
#, no-c-format
msgid "sheetfed scanner"
msgstr "листовой сканер"
@@ -3961,12 +4030,12 @@ msgid "This option turns off the lamp of the flatbed during a scan"
msgstr ""
"Этот параметр выключает лампу планшетного сканера во время сканирования"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Качественное сканирование"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Наивысшее качество, но медленная скорость"
@@ -4408,12 +4477,39 @@ msgstr ""
"Разогревать пока яркость лампы не станет постоянной, вместо простого 40-"
"тисекундного ожидания разогрева."
-#: ../backend/pixma_sane_options.c:91
+#: ../backend/pixma.c:378
+#, fuzzy, no-c-format
+msgid "Negative color"
+msgstr "Негатив"
+
+#: ../backend/pixma.c:383
+#, fuzzy, no-c-format
+msgid "Negative gray"
+msgstr "Негатив"
+
+#: ../backend/pixma.c:396
+#, no-c-format
+msgid "48 bits color"
+msgstr ""
+
+#: ../backend/pixma.c:401
+#, no-c-format
+msgid "16 bits gray"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:82
+#, no-c-format
+msgid ""
+"Selects the scan source (such as a document-feeder). Set source before "
+"mode and resolution. Resets mode and resolution to auto values."
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr ""
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4421,198 +4517,218 @@ msgid ""
"cancel, press \"GRAY\" button."
msgstr ""
-#: ../backend/pixma_sane_options.c:216
+#: ../backend/pixma_sane_options.c:143
+#, no-c-format
+msgid "Gamma function exponent"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:144
+#, no-c-format
+msgid "Changes intensity of midtones"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:230
#, fuzzy, no-c-format
msgid "Update button state"
msgstr "Состояние кнопки"
-#: ../backend/pixma_sane_options.c:228
+#: ../backend/pixma_sane_options.c:242
#, fuzzy, no-c-format
msgid "Button 1"
msgstr "Кнопки"
-#: ../backend/pixma_sane_options.c:242
+#: ../backend/pixma_sane_options.c:256
#, fuzzy, no-c-format
msgid "Button 2"
msgstr "Кнопки"
-#: ../backend/plustek.c:234 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
msgstr "Прозрачный"
-#: ../backend/plustek.c:912
+#: ../backend/plustek.c:913
#, no-c-format
msgid "Device-Settings"
msgstr "Настройки устройства"
-#: ../backend/plustek.c:919
+#: ../backend/plustek.c:920
#, no-c-format
msgid "Lampswitch"
msgstr "Выключатель лампы"
-#: ../backend/plustek.c:920
+#: ../backend/plustek.c:921
#, no-c-format
msgid "Manually switching the lamp(s)."
msgstr "Вручную управляет лампой."
-#: ../backend/plustek.c:925
+#: ../backend/plustek.c:926
#, fuzzy, no-c-format
msgid "Lamp off during dark calibration"
msgstr "Грубая калибровка"
-#: ../backend/plustek.c:926
+#: ../backend/plustek.c:927
#, no-c-format
msgid "Always switches lamp off when doing dark calibration."
msgstr ""
-#: ../backend/plustek.c:934
+#: ../backend/plustek.c:935
#, no-c-format
msgid "Calibration data cache"
msgstr "Кэширование калибровочных данных"
-#: ../backend/plustek.c:935
+#: ../backend/plustek.c:936
#, no-c-format
msgid "Enables or disables calibration data cache."
msgstr "Включает или выключает кэширование данных о калибровке."
-#: ../backend/plustek.c:941
+#: ../backend/plustek.c:942
#, fuzzy, no-c-format
msgid "Performs calibration"
msgstr "Грубая калибровка"
-#: ../backend/plustek.c:958
+#: ../backend/plustek.c:959
#, no-c-format
msgid "Speedup sensor"
msgstr ""
-#: ../backend/plustek.c:959
+#: ../backend/plustek.c:960
#, no-c-format
msgid "Enables or disables speeding up sensor movement."
msgstr ""
-#: ../backend/plustek.c:973
+#: ../backend/plustek.c:974
#, no-c-format
msgid "Warmup-time"
msgstr "Время прогрева лампы"
-#: ../backend/plustek.c:974
+#: ../backend/plustek.c:975
#, no-c-format
msgid "Warmup-time in seconds."
msgstr "Время прогрева лампы в секундах."
-#: ../backend/plustek.c:986
+#: ../backend/plustek.c:987
#, no-c-format
msgid "Lampoff-time"
msgstr "Время выключения лампы"
-#: ../backend/plustek.c:987
+#: ../backend/plustek.c:988
#, no-c-format
msgid "Lampoff-time in seconds."
msgstr "Время выключения лампы в секундах."
-#: ../backend/plustek.c:994
+#: ../backend/plustek.c:995
#, no-c-format
msgid "Analog frontend"
msgstr ""
-#: ../backend/plustek.c:1001
+#: ../backend/plustek.c:1002
#, no-c-format
msgid "Red gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1008 ../backend/umax_pp.c:792
+#: ../backend/plustek.c:1009 ../backend/umax_pp.c:792
#, no-c-format
msgid "Red offset"
msgstr "Смещение красного"
-#: ../backend/plustek.c:1009
+#: ../backend/plustek.c:1010
#, no-c-format
msgid "Red offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1017
+#: ../backend/plustek.c:1018
#, no-c-format
msgid "Green gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1024 ../backend/umax_pp.c:804
+#: ../backend/plustek.c:1025 ../backend/umax_pp.c:804
#, no-c-format
msgid "Green offset"
msgstr "Смещение зелёного"
-#: ../backend/plustek.c:1025
+#: ../backend/plustek.c:1026
#, no-c-format
msgid "Green offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1033
+#: ../backend/plustek.c:1034
#, no-c-format
msgid "Blue gain value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1040 ../backend/umax_pp.c:816
+#: ../backend/plustek.c:1041 ../backend/umax_pp.c:816
#, no-c-format
msgid "Blue offset"
msgstr "Смещение синего"
-#: ../backend/plustek.c:1041
+#: ../backend/plustek.c:1042
#, no-c-format
msgid "Blue offset value of the AFE"
msgstr ""
-#: ../backend/plustek.c:1048
+#: ../backend/plustek.c:1049
#, no-c-format
msgid "Red lamp off"
msgstr "Выключение красной лампы"
-#: ../backend/plustek.c:1049
+#: ../backend/plustek.c:1050
#, no-c-format
msgid "Defines red lamp off parameter"
msgstr "Определяет параметры выключения красной лампы"
-#: ../backend/plustek.c:1056
+#: ../backend/plustek.c:1057
#, no-c-format
msgid "Green lamp off"
msgstr "Выключение зелёной лампы"
-#: ../backend/plustek.c:1057
+#: ../backend/plustek.c:1058
#, no-c-format
msgid "Defines green lamp off parameter"
msgstr "Определяет параметры выключения зелёной лампы"
-#: ../backend/plustek.c:1064
+#: ../backend/plustek.c:1065
#, no-c-format
msgid "Blue lamp off"
msgstr "Выключение синей лампы"
-#: ../backend/plustek.c:1065
+#: ../backend/plustek.c:1066
#, no-c-format
msgid "Defines blue lamp off parameter"
msgstr "Определяет параметры выключения синей лампы"
-#: ../backend/plustek.c:1095
+#: ../backend/plustek.c:1096
#, no-c-format
msgid "This option reflects the status of the scanner buttons."
msgstr "Этот параметр отражает состояние кнопок сканера."
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Цветное 36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr ""
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr ""
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Случайный"
@@ -4661,7 +4777,7 @@ msgstr "Имитация ручного сканера"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Имитирует ручной сканер. Ручные сканеры часто не имеют информации о "
"длине изображения. Вместо этого они возвращает длину -1. Установка этого "
@@ -4790,29 +4906,29 @@ msgid ""
"after sane_read() has been called."
msgstr ""
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, fuzzy, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Этот параметр отражает состояние кнопок сканера."
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Включить лампу"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Включить лампу сканера"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Выключить лампу"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4833,42 +4949,42 @@ msgstr ""
msgid "Threshold value for lineart mode"
msgstr ""
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Податчик листов"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 (дюймов)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 (дюймов)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8.5x11 (дюймов)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Полутоновое сканирование не поддерживается"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "Точка размытия 8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "Точка размытия 16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4885,12 +5001,27 @@ msgstr ""
"оболочка может перестать принимать события от системы X Window и не "
"будет реагировать на ваши команды до окончания сканирования."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Извлечь документ после сканирования"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Режим предварительного просмотра"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4900,12 +5031,12 @@ msgstr ""
"предварительный просмотр обычно даёт лучшее сочетание скорости и "
"детализации."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Заранее настроенные параметры"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4914,12 +5045,42 @@ msgstr ""
"Предоставляют стандартные области сканирования для фотографий, "
"распечатанных страниц и прочего."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "планшетный сканер"
+
+#: ../backend/snapscan-options.c:897
+#, no-c-format
+msgid "Focus-mode"
+msgstr ""
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Автоизвлечение"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Расположение фокуса"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Расположение фокуса"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Цветных строк за запрос на чтение"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Чёрно-белых строк за запрос на чтение"
@@ -4992,7 +5153,7 @@ msgstr "Имитация ручного сканера"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Имитировать ручной сканер. Ручные сканеры никогда не знают о высоте "
@@ -5093,8 +5254,8 @@ msgstr "Размер предела чтения"
msgid ""
"The (maximum) amount of data transferred with each call to sane_read()."
msgstr ""
-"Максимальное количество данных, передаваемых при каждом вызове sane_read"
-"()."
+"Максимальное количество данных, передаваемых при каждом вызове "
+"sane_read()."
#: ../backend/test.c:514
#, no-c-format
diff --git a/po/sane-backends.pot b/po/sane-backends.pot
index efb2b9f..76ae8f8 100644
--- a/po/sane-backends.pot
+++ b/po/sane-backends.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-30 21:26-0400\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -28,7 +28,7 @@ msgid "Standard"
msgstr ""
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1281 ../backend/genesys.c:5472
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291 ../backend/genesys.c:5615
#: ../backend/gt68xx.c:703 ../backend/hp3500.c:1003
#: ../backend/hp-option.c:3297 ../backend/kvs1025_opt.c:640
#: ../backend/kvs20xx_opt.c:284 ../backend/kvs40xx_opt.c:505
@@ -46,12 +46,12 @@ msgid "Geometry"
msgstr ""
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1498 ../backend/genesys.c:5532 ../backend/gt68xx.c:672
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675 ../backend/gt68xx.c:672
#: ../backend/hp-option.c:2953 ../backend/kvs1025_opt.c:704
#: ../backend/leo.c:871 ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:854 ../backend/plustek_pp.c:793
+#: ../backend/niash.c:754 ../backend/plustek.c:854 ../backend/plustek_pp.c:793
#: ../backend/sceptre.c:750 ../backend/snapscan-options.c:617
#: ../backend/stv680.c:1067 ../backend/teco1.c:1143 ../backend/teco2.c:1962
#: ../backend/teco3.c:968 ../backend/u12.c:592 ../backend/umax.c:5226
@@ -60,9 +60,9 @@ msgstr ""
msgid "Enhancement"
msgstr ""
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1206 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2825
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
@@ -976,22 +976,22 @@ msgstr ""
msgid "Button state"
msgstr ""
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr ""
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr ""
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr ""
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid "Duplex scan provide a scan of the front and back side of the document"
msgstr ""
@@ -1269,7 +1269,7 @@ msgstr ""
msgid "flatbed scanner"
msgstr ""
-#: ../backend/canon.c:1183 ../backend/epson.c:3372 ../backend/epson2.c:1355
+#: ../backend/canon.c:1183 ../backend/epson.c:3386 ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr ""
@@ -1344,7 +1344,7 @@ msgstr ""
msgid "Extra color adjustments"
msgstr ""
-#: ../backend/canon.c:1538 ../backend/epson.c:3191 ../backend/epson2.c:1245
+#: ../backend/canon.c:1538 ../backend/epson.c:3205 ../backend/epson2.c:1255
#: ../backend/kvs1025.h:55 ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
@@ -1490,11 +1490,11 @@ msgstr ""
msgid "Select the film type"
msgstr ""
-#: ../backend/canon_dr.c:344 ../backend/epjitsu.c:203 ../backend/epson.c:501
-#: ../backend/epson2.c:114 ../backend/fujitsu.c:604 ../backend/gt68xx.c:148
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227 ../backend/epson.c:501
+#: ../backend/epson2.c:115 ../backend/fujitsu.c:649 ../backend/gt68xx.c:148
#: ../backend/hp3900_sane.c:418 ../backend/hp3900_sane.c:427
#: ../backend/hp3900_sane.c:1017 ../backend/hp5590.c:82
-#: ../backend/ma1509.c:108 ../backend/magicolor.c:167 ../backend/mustek.c:156
+#: ../backend/ma1509.c:108 ../backend/magicolor.c:181 ../backend/mustek.c:156
#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
@@ -1502,67 +1502,82 @@ msgstr ""
msgid "Flatbed"
msgstr ""
-#: ../backend/canon_dr.c:345 ../backend/epjitsu.c:204 ../backend/fujitsu.c:605
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228 ../backend/fujitsu.c:650
#: ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr ""
-#: ../backend/canon_dr.c:346 ../backend/epjitsu.c:205 ../backend/fujitsu.c:606
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229 ../backend/fujitsu.c:651
#: ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
msgstr ""
-#: ../backend/canon_dr.c:347 ../backend/epjitsu.c:206 ../backend/fujitsu.c:607
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230 ../backend/fujitsu.c:652
#: ../backend/hp5590.c:84 ../backend/kodak.c:137 ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr ""
-#: ../backend/canon_dr.c:354 ../backend/epson.c:599 ../backend/epson.c:3082
-#: ../backend/epson2.c:200 ../backend/fujitsu.c:624 ../backend/genesys.c:89
+#: ../backend/canon_dr.c:392
+#, no-c-format
+msgid "Card Front"
+msgstr ""
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr ""
+
+#: ../backend/canon_dr.c:394
+#, no-c-format
+msgid "Card Duplex"
+msgstr ""
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599 ../backend/epson.c:3096
+#: ../backend/epson2.c:201 ../backend/fujitsu.c:669 ../backend/genesys.c:89
#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr ""
-#: ../backend/canon_dr.c:355 ../backend/epson.c:600 ../backend/epson.c:3078
-#: ../backend/epson2.c:201 ../backend/fujitsu.c:625 ../backend/genesys.c:90
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600 ../backend/epson.c:3092
+#: ../backend/epson2.c:202 ../backend/fujitsu.c:670 ../backend/genesys.c:90
#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr ""
-#: ../backend/canon_dr.c:356 ../backend/epson.c:601 ../backend/epson.c:3086
-#: ../backend/epson2.c:202 ../backend/fujitsu.c:626 ../backend/genesys.c:91
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601 ../backend/epson.c:3100
+#: ../backend/epson2.c:203 ../backend/fujitsu.c:671 ../backend/genesys.c:91
#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr ""
-#: ../backend/canon_dr.c:357
+#: ../backend/canon_dr.c:404
#, no-c-format
msgid "Enhance Red"
msgstr ""
-#: ../backend/canon_dr.c:358
+#: ../backend/canon_dr.c:405
#, no-c-format
msgid "Enhance Green"
msgstr ""
-#: ../backend/canon_dr.c:359
+#: ../backend/canon_dr.c:406
#, no-c-format
msgid "Enhance Blue"
msgstr ""
-#: ../backend/canon_dr.c:361 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:164
-#: ../backend/epson2.c:172 ../backend/epson2.c:184 ../backend/epson2.c:199
-#: ../backend/epson2.c:213 ../backend/fujitsu.c:630 ../backend/genesys.c:99
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675 ../backend/genesys.c:99
#: ../backend/leo.c:109 ../backend/matsushita.c:138
#: ../backend/matsushita.c:159 ../backend/matsushita.c:191
#: ../backend/matsushita.c:213 ../backend/snapscan-options.c:91
@@ -1570,108 +1585,108 @@ msgstr ""
msgid "None"
msgstr ""
-#: ../backend/canon_dr.c:362 ../backend/fujitsu.c:631
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr ""
-#: ../backend/epson.c:491 ../backend/epson2.c:107 ../backend/magicolor.c:160
+#: ../backend/epson.c:491 ../backend/epson2.c:108 ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr ""
-#: ../backend/epson.c:492 ../backend/epson2.c:108 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:161 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr ""
-#: ../backend/epson.c:502 ../backend/epson2.c:115 ../backend/pixma.c:908
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr ""
-#: ../backend/epson.c:503 ../backend/epson2.c:117 ../backend/magicolor.c:168
+#: ../backend/epson.c:503 ../backend/epson2.c:118 ../backend/magicolor.c:182
#: ../backend/mustek.c:160 ../backend/pixma.c:896 ../backend/test.c:192
#: ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr ""
-#: ../backend/epson.c:523 ../backend/epson2.c:133
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr ""
-#: ../backend/epson.c:524 ../backend/epson2.c:134
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr ""
-#: ../backend/epson.c:529 ../backend/epson2.c:141
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr ""
-#: ../backend/epson.c:530 ../backend/epson2.c:142
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr ""
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:165 ../backend/epson2.c:173 ../backend/epson2.c:185
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr ""
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr ""
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr ""
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:176
-#: ../backend/epson2.c:188
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr ""
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:177
-#: ../backend/epson2.c:189
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr ""
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:178
-#: ../backend/epson2.c:190
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr ""
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:179
-#: ../backend/epson2.c:191
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr ""
-#: ../backend/epson.c:584 ../backend/epson2.c:192
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr ""
-#: ../backend/epson.c:585 ../backend/epson2.c:193
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr ""
-#: ../backend/epson.c:586 ../backend/epson2.c:194
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr ""
@@ -1681,7 +1696,7 @@ msgstr ""
msgid "No Correction"
msgstr ""
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:254
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr ""
@@ -1706,33 +1721,33 @@ msgstr ""
msgid "CRT monitors"
msgstr ""
-#: ../backend/epson.c:656 ../backend/epson2.c:253 ../backend/fujitsu.c:614
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr ""
-#: ../backend/epson.c:658 ../backend/epson2.c:255
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr ""
-#: ../backend/epson.c:659 ../backend/epson2.c:256
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr ""
-#: ../backend/epson.c:660 ../backend/epson2.c:257
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr ""
-#: ../backend/epson.c:678 ../backend/epson2.c:275
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr ""
-#: ../backend/epson.c:679 ../backend/epson2.c:276
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr ""
@@ -1772,13 +1787,13 @@ msgstr ""
msgid "Max"
msgstr ""
-#: ../backend/epson.c:2799 ../backend/epson2.c:966 ../backend/genesys.c:5389
+#: ../backend/epson.c:2813 ../backend/epson2.c:977 ../backend/genesys.c:5532
#: ../backend/gt68xx.c:458 ../backend/hp-option.c:2914
#: ../backend/kvs1025_opt.c:522 ../backend/kvs20xx_opt.c:170
#: ../backend/kvs40xx_opt.c:319 ../backend/ma1509.c:501
#: ../backend/matsushita.c:1084 ../backend/microtek2.h:598
#: ../backend/mustek.c:4205 ../backend/mustek_usb.c:260
-#: ../backend/mustek_usb2.c:344 ../backend/niash.c:736
+#: ../backend/mustek_usb2.c:344 ../backend/niash.c:734
#: ../backend/plustek.c:721 ../backend/plustek_pp.c:658
#: ../backend/sceptre.c:673 ../backend/snapscan-options.c:354
#: ../backend/stv680.c:1030 ../backend/teco2.c:1886 ../backend/test.c:306
@@ -1787,209 +1802,209 @@ msgstr ""
msgid "Scan Mode"
msgstr ""
-#: ../backend/epson.c:2831 ../backend/epson2.c:1002
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr ""
-#: ../backend/epson.c:2853 ../backend/epson2.c:1023
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr ""
-#: ../backend/epson.c:2854 ../backend/epson2.c:1024
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr ""
-#: ../backend/epson.c:2866 ../backend/epson2.c:1036
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr ""
-#: ../backend/epson.c:2881 ../backend/epson2.c:1049
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr ""
-#: ../backend/epson.c:3017 ../backend/epson2.c:1165 ../backend/epson2.c:1212
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175 ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr ""
-#: ../backend/epson.c:3020 ../backend/epson2.c:1167
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr ""
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr ""
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr ""
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr ""
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr ""
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr ""
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr ""
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr ""
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr ""
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr ""
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr ""
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr ""
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr ""
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr ""
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr ""
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr ""
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr ""
-#: ../backend/epson.c:3192 ../backend/epson2.c:1246
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr ""
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr ""
-#: ../backend/epson.c:3231 ../backend/epson2.c:1256
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr ""
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr ""
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr ""
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr ""
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr ""
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr ""
-#: ../backend/epson.c:3346 ../backend/epson2.c:1331
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr ""
-#: ../backend/epson.c:3417 ../backend/epson2.c:1384
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr ""
-#: ../backend/epson.c:3418 ../backend/epson2.c:1385
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr ""
-#: ../backend/epson.c:3430 ../backend/epson2.c:1395
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr ""
-#: ../backend/epson.c:3431 ../backend/epson2.c:1397
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr ""
-#: ../backend/epson.c:3443 ../backend/epson2.c:1407
-#: ../backend/magicolor.c:2399
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr ""
-#: ../backend/epson.c:3445 ../backend/epson2.c:1409
-#: ../backend/magicolor.c:2401
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr ""
-#: ../backend/epson.c:3459 ../backend/epson2.c:1421
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr ""
-#: ../backend/epson.c:3460 ../backend/epson2.c:1422
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr ""
@@ -2023,321 +2038,333 @@ msgid ""
"pressed to actually start the scan process."
msgstr ""
-#: ../backend/epson2.c:101 ../backend/pixma.c:390
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr ""
-#: ../backend/epson2.c:116
+#: ../backend/epson2.c:117
#, no-c-format
msgid "TPU8x10"
msgstr ""
-#: ../backend/epson2.c:135
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr ""
-#: ../backend/epson2.c:136
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr ""
-#: ../backend/epson2.c:214
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr ""
-#: ../backend/epson2.c:215
+#: ../backend/epson2.c:216
#, no-c-format
msgid "User defined CCT profile"
msgstr ""
-#: ../backend/fujitsu.c:615 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr ""
-#: ../backend/fujitsu.c:616 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr ""
-#: ../backend/fujitsu.c:618
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr ""
-#: ../backend/fujitsu.c:619
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr ""
-#: ../backend/fujitsu.c:621 ../backend/teco1.c:1152 ../backend/teco1.c:1153
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152 ../backend/teco1.c:1153
#: ../backend/teco2.c:1971 ../backend/teco2.c:1972 ../backend/teco3.c:977
#: ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr ""
-#: ../backend/fujitsu.c:622
+#: ../backend/fujitsu.c:667
#, no-c-format
msgid "Diffusion"
msgstr ""
-#: ../backend/fujitsu.c:627
+#: ../backend/fujitsu.c:672
#, no-c-format
msgid "White"
msgstr ""
-#: ../backend/fujitsu.c:628
+#: ../backend/fujitsu.c:673
#, no-c-format
msgid "Black"
msgstr ""
-#: ../backend/fujitsu.c:633
+#: ../backend/fujitsu.c:678
#, no-c-format
msgid "Continue"
msgstr ""
-#: ../backend/fujitsu.c:634
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr ""
-#: ../backend/fujitsu.c:636
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr ""
-#: ../backend/fujitsu.c:637
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr ""
-#: ../backend/fujitsu.c:638
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr ""
-#: ../backend/fujitsu.c:640 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr ""
-#: ../backend/fujitsu.c:641
+#: ../backend/fujitsu.c:686
#, no-c-format
msgid "Horizontal bold"
msgstr ""
-#: ../backend/fujitsu.c:642
+#: ../backend/fujitsu.c:687
#, no-c-format
msgid "Horizontal narrow"
msgstr ""
-#: ../backend/fujitsu.c:643 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr ""
-#: ../backend/fujitsu.c:644
+#: ../backend/fujitsu.c:689
#, no-c-format
msgid "Vertical bold"
msgstr ""
-#: ../backend/fujitsu.c:646
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr ""
-#: ../backend/fujitsu.c:647
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr ""
-#: ../backend/fujitsu.c:649
+#: ../backend/fujitsu.c:694
#, no-c-format
msgid "Front"
msgstr ""
-#: ../backend/fujitsu.c:650
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr ""
-#: ../backend/fujitsu.c:3858 ../backend/genesys.c:5623
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
#: ../backend/kvs1025_opt.c:911
#, no-c-format
msgid "Software blank skip percentage"
msgstr ""
-#: ../backend/fujitsu.c:3859
+#: ../backend/fujitsu.c:4056
#, no-c-format
msgid "Request driver to discard pages with low percentage of dark pixels"
msgstr ""
-#: ../backend/genesys.c:5614
+#: ../backend/genesys.c:5757
#, no-c-format
msgid "Software crop"
msgstr ""
-#: ../backend/genesys.c:5615
+#: ../backend/genesys.c:5758
#, no-c-format
msgid "Request backend to remove border from pages digitally"
msgstr ""
-#: ../backend/genesys.c:5624 ../backend/kvs1025_opt.c:913
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
#, no-c-format
msgid "Request driver to discard pages with low numbers of dark pixels"
msgstr ""
-#: ../backend/genesys.c:5635 ../backend/kvs1025_opt.c:893
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
#, no-c-format
msgid "Software derotate"
msgstr ""
-#: ../backend/genesys.c:5636 ../backend/kvs1025_opt.c:895
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
#, no-c-format
msgid "Request driver to detect and correct 90 degree image rotation"
msgstr ""
-#: ../backend/genesys.c:5667 ../backend/pixma_sane_options.c:312
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr ""
-#: ../backend/genesys.c:5686 ../backend/pixma_sane_options.c:333
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, no-c-format
msgid "Threshold curve"
msgstr ""
-#: ../backend/genesys.c:5687 ../backend/pixma_sane_options.c:334
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
-#: ../backend/genesys.c:5696
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr ""
-#: ../backend/genesys.c:5698
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
"instead on hardware lineart."
msgstr ""
-#: ../backend/genesys.c:5714
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr ""
-#: ../backend/genesys.c:5717
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller than "
"the vertical resolution this disables horizontal interpolation."
msgstr ""
-#: ../backend/genesys.c:5726
+#: ../backend/genesys.c:5869
#, no-c-format
msgid "Color filter"
msgstr ""
-#: ../backend/genesys.c:5729
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
-#: ../backend/genesys.c:5755
+#: ../backend/genesys.c:5898
#, no-c-format
msgid "Calibration file"
msgstr ""
-#: ../backend/genesys.c:5756
+#: ../backend/genesys.c:5899
#, no-c-format
msgid "Specify the calibration file to use"
msgstr ""
-#: ../backend/genesys.c:5773
+#: ../backend/genesys.c:5916
+#, no-c-format
+msgid "Calibration cache expiration time"
+msgstr ""
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 means "
+"cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr ""
-#: ../backend/genesys.c:5776
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value of 0 "
"means, that the lamp won't be turned off."
msgstr ""
-#: ../backend/genesys.c:5786
+#: ../backend/genesys.c:5940
#, no-c-format
msgid "Lamp off during scan"
msgstr ""
-#: ../backend/genesys.c:5787
+#: ../backend/genesys.c:5941
#, no-c-format
msgid "The lamp will be turned off during scan. "
msgstr ""
-#: ../backend/genesys.c:5815 ../backend/genesys.c:5816
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
msgstr ""
-#: ../backend/genesys.c:5868 ../backend/genesys.c:5869
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr ""
-#: ../backend/genesys.c:5882 ../backend/genesys.c:5883
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
msgstr ""
-#: ../backend/genesys.c:5896 ../backend/genesys.c:5897
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
#, no-c-format
msgid "Extra button"
msgstr ""
-#: ../backend/genesys.c:5910 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, no-c-format
msgid "Need calibration"
msgstr ""
-#: ../backend/genesys.c:5911 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr ""
-#: ../backend/genesys.c:5923 ../backend/gt68xx.c:787 ../backend/gt68xx.c:788
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787 ../backend/gt68xx.c:788
#: ../backend/pixma_sane_options.c:224 ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr ""
-#: ../backend/genesys.c:5932 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:941
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr ""
-#: ../backend/genesys.c:5934 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, no-c-format
msgid "Start calibration using special sheet"
msgstr ""
-#: ../backend/genesys.c:5948 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, no-c-format
msgid "Clear calibration"
msgstr ""
-#: ../backend/genesys.c:5949 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, no-c-format
msgid "Clear calibration cache"
msgstr ""
@@ -2460,7 +2487,7 @@ msgstr ""
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
#: ../backend/hp3900_sane.c:1422
@@ -2600,12 +2627,12 @@ msgstr ""
msgid "This option reflects a front panel scanner button"
msgstr ""
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr ""
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr ""
@@ -2630,17 +2657,17 @@ msgstr ""
msgid "Hardware internal Y position of the scanning area."
msgstr ""
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr ""
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr ""
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr ""
@@ -4590,8 +4617,8 @@ msgstr ""
#, no-c-format
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image height a "
-"priori. Instead, they return a height of -1. Setting this option allows to "
-"test whether a frontend can handle this correctly."
+"priori. Instead, they return a height of -1. Setting this option allows "
+"one to test whether a frontend can handle this correctly."
msgstr ""
#: ../backend/pnm.c:283
@@ -4713,27 +4740,27 @@ msgid ""
"sane_read() has been called."
msgstr ""
-#: ../backend/rts8891.c:2803
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr ""
-#: ../backend/rts8891.c:2834 ../backend/umax.c:5795 ../backend/umax_pp.c:639
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795 ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr ""
-#: ../backend/rts8891.c:2835 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr ""
-#: ../backend/rts8891.c:2845 ../backend/umax1220u.c:248 ../backend/umax.c:5812
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248 ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr ""
-#: ../backend/rts8891.c:2846 ../backend/umax1220u.c:249 ../backend/umax.c:5813
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249 ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
msgstr ""
@@ -4942,9 +4969,9 @@ msgstr ""
#, no-c-format
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
-"priori. Instead, they return a height of -1. Setting this option allows to "
-"test whether a frontend can handle this correctly. This option also enables "
-"a fixed width of 11 cm."
+"priori. Instead, they return a height of -1. Setting this option allows "
+"one to test whether a frontend can handle this correctly. This option also "
+"enables a fixed width of 11 cm."
msgstr ""
#: ../backend/test.c:366
diff --git a/po/sv.po b/po/sv.po
index 16658f7..0924c4c 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: sane-backends 1.0.18\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2012-10-22 10:55+0200\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
"PO-Revision-Date: 2012-10-22 11:17+0200\n"
"Last-Translator: Mattias Ellert <mattias.ellert@fysast.uu.se>\n"
"Language-Team: Swedish <sv@li.org>\n"
@@ -31,17 +31,17 @@ msgid "Standard"
msgstr "Standard"
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1269
-#: ../backend/genesys.c:5581 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
#: ../backend/lexmark.c:199 ../backend/ma1509.c:551
#: ../backend/matsushita.c:1135 ../backend/microtek2.h:599
#: ../backend/mustek.c:4363 ../backend/mustek_usb.c:305
-#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:159
-#: ../backend/plustek.c:808 ../backend/plustek_pp.c:746
-#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:494
+#: ../backend/mustek_usb2.c:465 ../backend/pixma_sane_options.c:158
+#: ../backend/plustek.c:808 ../backend/plustek_pp.c:747
+#: ../backend/sceptre.c:702 ../backend/snapscan-options.c:550
#: ../backend/teco1.c:1095 ../backend/teco2.c:1914 ../backend/teco3.c:920
#: ../backend/test.c:647 ../backend/u12.c:546 ../backend/umax.c:5176
#: ../backend/umax_pp.c:580
@@ -50,25 +50,25 @@ msgid "Geometry"
msgstr "Geometri"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1498 ../backend/genesys.c:5641
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:854
-#: ../backend/plustek_pp.c:792 ../backend/sceptre.c:750
-#: ../backend/snapscan-options.c:561 ../backend/stv680.c:1067
+#: ../backend/niash.c:754 ../backend/plustek.c:854
+#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
+#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
#: ../backend/u12.c:592 ../backend/umax.c:5226 ../backend/umax_pp.c:629
#, no-c-format
msgid "Enhancement"
msgstr "Förbättring"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1194 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2792
-#: ../backend/snapscan-options.c:816 ../backend/umax.c:5565
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
+#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
msgstr "Avancerat"
@@ -94,7 +94,7 @@ msgid "Bit depth"
msgstr "Bitdjup"
#: ../include/sane/saneopts.h:165 ../backend/canon.c:1145
-#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:43
+#: ../backend/leo.c:781 ../backend/pixma_sane_options.c:45
#, no-c-format
msgid "Scan mode"
msgstr "Bildläsarläge"
@@ -135,6 +135,7 @@ msgid "Bottom-right y"
msgstr "Nedre"
#: ../include/sane/saneopts.h:173 ../backend/canon.c:1221
+#: ../backend/pixma_sane_options.c:298
#, no-c-format
msgid "Scan resolution"
msgstr "Upplösning"
@@ -302,7 +303,7 @@ msgstr "Koppla X- och Y-upplösning"
#: ../include/sane/saneopts.h:206 ../backend/hp3900_sane.c:428
#: ../backend/hp3900_sane.c:1021 ../backend/hp3900_sane.c:1421
#: ../backend/hp-option.c:3235 ../backend/mustek_usb2.c:121
-#: ../backend/plustek.c:236 ../backend/plustek_pp.c:202
+#: ../backend/plustek.c:236 ../backend/plustek_pp.c:205
#: ../backend/u12.c:157
#, no-c-format
msgid "Negative"
@@ -1013,22 +1014,22 @@ msgstr ""
msgid "Button state"
msgstr "Knappläge"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Bildruta att läsa in"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Väljer numret på den bildruta som ska läsas in"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Dubbelsidig inläsning"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
@@ -1307,8 +1308,8 @@ msgstr "filmbildläsare"
msgid "flatbed scanner"
msgstr "flatbäddsbildläsare"
-#: ../backend/canon.c:1183 ../backend/epson.c:3372
-#: ../backend/epson2.c:1343
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Filmtyp"
@@ -1384,8 +1385,8 @@ msgstr "Inläsningsmarginaler"
msgid "Extra color adjustments"
msgstr "Extra färgjusteringar"
-#: ../backend/canon.c:1538 ../backend/epson.c:3191
-#: ../backend/epson2.c:1233 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
@@ -1533,195 +1534,210 @@ msgstr "Välj filmtyp"
msgid "Select the film type"
msgstr "Välj filmtyp"
-#: ../backend/canon_dr.c:338 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:114 ../backend/fujitsu.c:579
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:167 ../backend/mustek.c:156
-#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:851
-#: ../backend/pixma_sane_options.c:88 ../backend/snapscan-options.c:82
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
+#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
+#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
#, no-c-format
msgid "Flatbed"
msgstr "Flatbädd"
-#: ../backend/canon_dr.c:339 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:580 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr "Automatisk dokumentmatare framsida"
-#: ../backend/canon_dr.c:340 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:581 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
msgstr "Automatisk dokumentmatare baksida"
-#: ../backend/canon_dr.c:341 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:582 ../backend/hp5590.c:84 ../backend/kodak.c:137
-#: ../backend/pixma.c:862
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "Automatisk dokumentmatare dubbelsidigt"
-#: ../backend/canon_dr.c:348 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:200
-#: ../backend/fujitsu.c:599 ../backend/genesys.c:89
+#: ../backend/canon_dr.c:392
+#, fuzzy, no-c-format
+msgid "Card Front"
+msgstr "Framsida"
+
+#: ../backend/canon_dr.c:393
+#, fuzzy, no-c-format
+msgid "Card Back"
+msgstr "Baksida"
+
+#: ../backend/canon_dr.c:394
+#, fuzzy, no-c-format
+msgid "Card Duplex"
+msgstr "Dubbelsidigt"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Röd"
-#: ../backend/canon_dr.c:349 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:201
-#: ../backend/fujitsu.c:600 ../backend/genesys.c:90
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Grön"
-#: ../backend/canon_dr.c:350 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:202
-#: ../backend/fujitsu.c:601 ../backend/genesys.c:91
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Blå"
-#: ../backend/canon_dr.c:351
+#: ../backend/canon_dr.c:404
#, no-c-format
msgid "Enhance Red"
msgstr "Framhäv rött"
-#: ../backend/canon_dr.c:352
+#: ../backend/canon_dr.c:405
#, no-c-format
msgid "Enhance Green"
msgstr "Framhäv grönt"
-#: ../backend/canon_dr.c:353
+#: ../backend/canon_dr.c:406
#, no-c-format
msgid "Enhance Blue"
msgstr "Framhäv blått"
-#: ../backend/canon_dr.c:355 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:164
-#: ../backend/epson2.c:172 ../backend/epson2.c:184 ../backend/epson2.c:199
-#: ../backend/epson2.c:213 ../backend/fujitsu.c:605
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
-#: ../backend/snapscan-options.c:87
+#: ../backend/snapscan-options.c:91
#, no-c-format
msgid "None"
msgstr "Inget"
-#: ../backend/canon_dr.c:356 ../backend/fujitsu.c:606
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr "JPEG"
-#: ../backend/epson.c:491 ../backend/epson2.c:107
-#: ../backend/magicolor.c:160
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Enkelsidigt"
-#: ../backend/epson.c:492 ../backend/epson2.c:108 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:161 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Dubbelsidigt"
-#: ../backend/epson.c:502 ../backend/epson2.c:115 ../backend/pixma.c:868
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Genomlysningsenhet"
-#: ../backend/epson.c:503 ../backend/epson2.c:117
-#: ../backend/magicolor.c:168 ../backend/mustek.c:160
-#: ../backend/pixma.c:856 ../backend/test.c:192 ../backend/umax.c:183
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
+#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Automatisk dokumentmatare"
-#: ../backend/epson.c:523 ../backend/epson2.c:133
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Positiv film"
-#: ../backend/epson.c:524 ../backend/epson2.c:134
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Negativ film"
-#: ../backend/epson.c:529 ../backend/epson2.c:141
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Fokusera på glaset"
-#: ../backend/epson.c:530 ../backend/epson2.c:142
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Fokusera 2,5 mm ovanför glaset"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:165 ../backend/epson2.c:173 ../backend/epson2.c:185
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Raster A (hårt)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Raster B (mjukt)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Raster C (nätskärm)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:176
-#: ../backend/epson2.c:188
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Gitter A (4x4 Bayer)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:177
-#: ../backend/epson2.c:189
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Gitter B (4x4 spiral)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:178
-#: ../backend/epson2.c:190
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Gitter C (4x4 nätskärm)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:179
-#: ../backend/epson2.c:191
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Gitter D (8x4 nätskärm)"
-#: ../backend/epson.c:584 ../backend/epson2.c:192
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Textförbättringsteknik"
-#: ../backend/epson.c:585 ../backend/epson2.c:193
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Nedladdat mönster A"
-#: ../backend/epson.c:586 ../backend/epson2.c:194
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Nedladdat mönster B"
@@ -1731,7 +1747,7 @@ msgstr "Nedladdat mönster B"
msgid "No Correction"
msgstr "Ingen korrigering"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:254
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Användardefinierat"
@@ -1756,33 +1772,33 @@ msgstr "Bläckstråleskrivare"
msgid "CRT monitors"
msgstr "Bildskärmar (CRT)"
-#: ../backend/epson.c:656 ../backend/epson2.c:253 ../backend/fujitsu.c:589
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Standard"
-#: ../backend/epson.c:658 ../backend/epson2.c:255
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Utskrift med hög densitet"
-#: ../backend/epson.c:659 ../backend/epson2.c:256
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Utskrift med låg densitet"
-#: ../backend/epson.c:660 ../backend/epson2.c:257
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Utskrift med hög kontrast"
-#: ../backend/epson.c:678 ../backend/epson2.c:275
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Användardefinierat (gamma=1,0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:276
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Användardefinierat (gamma=1,8)"
@@ -1822,228 +1838,228 @@ msgstr "A4"
msgid "Max"
msgstr "Max"
-#: ../backend/epson.c:2799 ../backend/epson2.c:954
-#: ../backend/genesys.c:5498 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:721
-#: ../backend/plustek_pp.c:657 ../backend/sceptre.c:673
-#: ../backend/snapscan-options.c:315 ../backend/stv680.c:1030
+#: ../backend/niash.c:734 ../backend/plustek.c:721
+#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
+#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
#: ../backend/umax.c:5054
#, no-c-format
msgid "Scan Mode"
msgstr "Bildläsarläge"
-#: ../backend/epson.c:2831 ../backend/epson2.c:990
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Väljer raster."
-#: ../backend/epson.c:2853 ../backend/epson2.c:1011
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Blindfärg"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1012
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Väljer blindfärg."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1024
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Väljer ljusstyrka."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1037
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Skärpa"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1153
-#: ../backend/epson2.c:1200
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Färgkorrigering"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1155
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr "Ställer in färgkorrigeringstabellen för den valda utdataenheten."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Färgkorrigeringskoefficienter"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Matrismultiplikation av RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Skifta grön till röd"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Skifta grön till blå"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Skifta röd till grön"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Skifta röd till blå"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Skifta blå till grön"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Skifta blå till röd"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Bestämmer grönnivån"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Lägger till till rött beroende på grönnivån"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Lägger till till blått beroende på grönnivån"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Lägger till till grönt beroende på rödnivån"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Bestämmer rödnivån"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Lägger till till blått beroende på rödnivån"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Lägger till till grönt beroende på blånivån"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Lägger till till rött beroende på blånivån"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Bestämmer blånivån"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1234
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Spegla bilden."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Snabb förhandsgranskning"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1244
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Automatisk ytuppdelning"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Kort lista med upplösningar"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Visa en kort lista med upplösningar"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Zoom"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Anger zoom-faktorn som bildläsaren kommer att använda"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Snabbformatera"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1319
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Tillvalsutrustning"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1372
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Mata ut"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1373
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Mata ut bladet i dokumentmataren"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1383
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Mata ut automatiskt"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1385
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Mata ut dokument efter inläsning"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1395
-#: ../backend/magicolor.c:2399
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "Dokumentmatarläge"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1397
-#: ../backend/magicolor.c:2401
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr ""
"Väljer läge för den automatiska dokumentmataren (enkelsidigt/"
"dubbelsidigt)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1409
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Fack"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1410
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Välj fack att läsa in från"
@@ -2084,202 +2100,208 @@ msgstr ""
"Efter att ha skickat inläsningskommandot, vänta tills knappen på läsaren "
"trycks in för att starta inläsningen."
-#: ../backend/epson2.c:101
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr "Infraröd"
-#: ../backend/epson2.c:116
+#: ../backend/epson2.c:117
#, no-c-format
msgid "TPU8x10"
msgstr "TPU 8x10"
-#: ../backend/epson2.c:135
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Diapositiv"
-#: ../backend/epson2.c:136
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Dianegativ"
-#: ../backend/epson2.c:214
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr "Inbyggd CCT-profil"
-#: ../backend/epson2.c:215
+#: ../backend/epson2.c:216
#, no-c-format
msgid "User defined CCT profile"
msgstr "Användardefinierad CCT-profil"
-#: ../backend/fujitsu.c:590 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "På"
-#: ../backend/fujitsu.c:591 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Av"
-#: ../backend/fujitsu.c:593
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr "DTC"
-#: ../backend/fujitsu.c:594
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr "SDTC"
-#: ../backend/fujitsu.c:596 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Gitter"
-#: ../backend/fujitsu.c:597
+#: ../backend/fujitsu.c:667
#, no-c-format
msgid "Diffusion"
msgstr "Diffusion"
-#: ../backend/fujitsu.c:602
+#: ../backend/fujitsu.c:672
#, no-c-format
msgid "White"
msgstr "Vit"
-#: ../backend/fujitsu.c:603
+#: ../backend/fujitsu.c:673
#, no-c-format
msgid "Black"
msgstr "Svart"
-#: ../backend/fujitsu.c:608
+#: ../backend/fujitsu.c:678
#, no-c-format
msgid "Continue"
msgstr "Fortsätt"
-#: ../backend/fujitsu.c:609
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr "Avsluta"
-#: ../backend/fujitsu.c:611
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr "10 mm"
-#: ../backend/fujitsu.c:612
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr "15 mm"
-#: ../backend/fujitsu.c:613
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr "20 mm"
-#: ../backend/fujitsu.c:615 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "Vågrätt"
-#: ../backend/fujitsu.c:616
+#: ../backend/fujitsu.c:686
#, no-c-format
msgid "Horizontal bold"
msgstr "Vågrätt fetstil"
-#: ../backend/fujitsu.c:617
+#: ../backend/fujitsu.c:687
#, no-c-format
msgid "Horizontal narrow"
msgstr "Vågrätt smal"
-#: ../backend/fujitsu.c:618 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "Lodrätt"
-#: ../backend/fujitsu.c:619
+#: ../backend/fujitsu.c:689
#, no-c-format
msgid "Vertical bold"
msgstr "Lodrätt fetstil"
-#: ../backend/fujitsu.c:621
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr "Uppifrån och ner"
-#: ../backend/fujitsu.c:622
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr "Nerifrån och upp"
-#: ../backend/fujitsu.c:624
+#: ../backend/fujitsu.c:694
#, no-c-format
msgid "Front"
msgstr "Framsida"
-#: ../backend/fujitsu.c:625
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr "Baksida"
-#: ../backend/genesys.c:5723
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
+#: ../backend/kvs1025_opt.c:911
+#, no-c-format
+msgid "Software blank skip percentage"
+msgstr "Procentsats för hoppa över blanka sidor"
+
+#: ../backend/fujitsu.c:4056
+#, fuzzy, no-c-format
+msgid "Request driver to discard pages with low percentage of dark pixels"
+msgstr "Begär att drivrutinen hoppar över sidor med få mörka pixlar"
+
+#: ../backend/genesys.c:5757
#, no-c-format
msgid "Software crop"
msgstr "Mjukvarubeskärning"
-#: ../backend/genesys.c:5724
+#: ../backend/genesys.c:5758
#, no-c-format
msgid "Request backend to remove border from pages digitally"
msgstr "Begär att drivrutinen tar bort ram från sidor automatiskt"
-#: ../backend/genesys.c:5732 ../backend/kvs1025_opt.c:911
-#, no-c-format
-msgid "Software blank skip percentage"
-msgstr "Procentsats för hoppa över blanka sidor"
-
-#: ../backend/genesys.c:5733 ../backend/kvs1025_opt.c:913
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
#, no-c-format
msgid "Request driver to discard pages with low numbers of dark pixels"
msgstr "Begär att drivrutinen hoppar över sidor med få mörka pixlar"
-#: ../backend/genesys.c:5743 ../backend/kvs1025_opt.c:893
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
#, no-c-format
msgid "Software derotate"
msgstr "Mjukvaruavrotera"
-#: ../backend/genesys.c:5744 ../backend/kvs1025_opt.c:895
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
#, no-c-format
msgid "Request driver to detect and correct 90 degree image rotation"
msgstr ""
"Begär att drivrutinen detekterar och korrigerar 90 graders bildrotation"
-#: ../backend/genesys.c:5751 ../backend/pixma_sane_options.c:271
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Övrigt"
-#: ../backend/genesys.c:5770 ../backend/pixma_sane_options.c:293
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, no-c-format
msgid "Threshold curve"
msgstr "Tröskelkurva"
-#: ../backend/genesys.c:5771 ../backend/pixma_sane_options.c:294
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr "Dynamisk tröskelkurva, från ljust till mörkt, vanligen 50-65"
-#: ../backend/genesys.c:5780
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr "Avaktivera dynamisk streckteckning"
-#: ../backend/genesys.c:5782
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
@@ -2289,12 +2311,12 @@ msgstr ""
"streckteckningsinläsningar för att i stället använda hårdvarans "
"streckteckningsinläsningsläge."
-#: ../backend/genesys.c:5791
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Stäng av interpolering"
-#: ../backend/genesys.c:5794
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2304,24 +2326,46 @@ msgstr ""
"mindre än den vertikala upplösningen stänger detta av den horisontella "
"interpoleringen."
-#: ../backend/genesys.c:5803
-#, no-c-format
-msgid "Color Filter"
+#: ../backend/genesys.c:5869
+#, fuzzy, no-c-format
+msgid "Color filter"
msgstr "Färgfilter"
-#: ../backend/genesys.c:5806
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
"När gråskala eller streckteckning används väljer denna inställning den "
"använda färgen."
-#: ../backend/genesys.c:5832
+#: ../backend/genesys.c:5898
+#, fuzzy, no-c-format
+msgid "Calibration file"
+msgstr "Kalibrering"
+
+#: ../backend/genesys.c:5899
+#, fuzzy, no-c-format
+msgid "Specify the calibration file to use"
+msgstr "Definiera kalibreringsläge"
+
+#: ../backend/genesys.c:5916
+#, fuzzy, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Kalibreringsdatacache"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Lampavstängningstid"
-#: ../backend/genesys.c:5835
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2330,72 +2374,77 @@ msgstr ""
"Lampan kommer att stängas av efter den angivna tiden (i minuter). Värdet "
"0 betyder att lampan inte kommer att stängas av."
-#: ../backend/genesys.c:5845
+#: ../backend/genesys.c:5940
#, no-c-format
msgid "Lamp off during scan"
msgstr "Stäng av lampan under inläsning"
-#: ../backend/genesys.c:5846
+#: ../backend/genesys.c:5941
#, no-c-format
msgid "The lamp will be turned off during scan. "
msgstr "Lampan kommer att stängas av under inläsningen."
-#: ../backend/genesys.c:5873 ../backend/genesys.c:5874
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
msgstr "Filknapp"
-#: ../backend/genesys.c:5926 ../backend/genesys.c:5927
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr "Optisk teckenigenkännings-knapp"
-#: ../backend/genesys.c:5940 ../backend/genesys.c:5941
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
msgstr "Påslagningsknapp"
-#: ../backend/genesys.c:5954 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
+#, fuzzy, no-c-format
+msgid "Extra button"
+msgstr "E-postknapp"
+
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, no-c-format
msgid "Need calibration"
msgstr "Behöver kalibrering"
-#: ../backend/genesys.c:5955 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Bildläsaren behöver kalibrering för nuvarande inställningar"
-#: ../backend/genesys.c:5968 ../backend/gt68xx.c:787
-#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:225
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
+#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Knappar"
-#: ../backend/genesys.c:5975 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:941
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Kalibrera"
-#: ../backend/genesys.c:5977 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, no-c-format
msgid "Start calibration using special sheet"
msgstr "Påbörja kalibrering med specialark"
-#: ../backend/genesys.c:5991 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, no-c-format
msgid "Clear calibration"
msgstr "Rensa kalibrering"
-#: ../backend/genesys.c:5992 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, no-c-format
msgid "Clear calibration cache"
msgstr "Rensa kalibreringsdatacache"
#: ../backend/gt68xx.c:149 ../backend/ma1509.c:108 ../backend/mustek.c:164
-#: ../backend/snapscan-options.c:83 ../backend/umax.c:182
+#: ../backend/snapscan-options.c:87 ../backend/umax.c:182
#, no-c-format
msgid "Transparency Adapter"
msgstr "Genomlysningsadapter"
@@ -2527,8 +2576,8 @@ msgid "Scanner model"
msgstr "Bildläsarmodel"
#: ../backend/hp3900_sane.c:1408
-#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+#, fuzzy, no-c-format
+msgid "Allows one to test device behaviour with other supported models"
msgstr "Tillåter att testa enhetsbeteende med andra understötta modeller"
#: ../backend/hp3900_sane.c:1422
@@ -2677,12 +2726,12 @@ msgstr "Uppdaterar informationen om enheten"
msgid "This option reflects a front panel scanner button"
msgstr "Denna inställing avspeglar en knapp på bildläsarens panel"
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Bild"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Diverse"
@@ -2707,17 +2756,17 @@ msgstr "offset Y"
msgid "Hardware internal Y position of the scanning area."
msgstr "Inläsningsytans hårdvaruinterna Y-position."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Lampstatus"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Sätter på eller av lampan."
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Kalibrerar för svart- och vitnivå."
@@ -2826,7 +2875,7 @@ msgstr "Långsam"
#: ../backend/hp-option.c:3145 ../backend/hp-option.c:3252
#: ../backend/kvs40xx_opt.c:229 ../backend/matsushita.c:244
#: ../backend/mustek.c:149 ../backend/plustek.c:234
-#: ../backend/plustek_pp.c:200 ../backend/u12.c:155
+#: ../backend/plustek_pp.c:203 ../backend/u12.c:155
#, no-c-format
msgid "Normal"
msgstr "Normal"
@@ -3466,7 +3515,7 @@ msgstr "Ställer in bildton"
#: ../backend/kvs1025_opt.c:808 ../backend/kvs1025_opt.c:809
#: ../backend/matsushita.c:1300 ../backend/matsushita.c:1301
-#: ../backend/pixma_sane_options.c:108
+#: ../backend/pixma_sane_options.c:110
#, no-c-format
msgid "Gamma"
msgstr "Gamma"
@@ -3974,12 +4023,12 @@ msgstr ""
"Denna inställning slår av lampan på flatbäddsbildläsaren under en "
"inläsning"
-#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:375
+#: ../backend/microtek2.h:626 ../backend/snapscan-options.c:421
#, no-c-format
msgid "Quality scan"
msgstr "Kvalitetsinläsning"
-#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:376
+#: ../backend/microtek2.h:627 ../backend/snapscan-options.c:422
#, no-c-format
msgid "Highest quality but lower speed"
msgstr "Högsta kvalitet men lägre hastighet"
@@ -4283,8 +4332,8 @@ msgid ""
"Request that all previews are done in the fastest (low-quality) mode. "
"This may be a non-color mode or a low resolution mode."
msgstr ""
-"Begär att alla förhandsgranskningar görs i det snabbaste (lågkvalitets-)"
-"läget. Detta kan vara en icke-färginläsning eller en "
+"Begär att alla förhandsgranskningar görs i det snabbaste "
+"(lågkvalitets-)läget. Detta kan vara en icke-färginläsning eller en "
"lågupplösningsinläsning."
#: ../backend/mustek.c:4343
@@ -4406,27 +4455,27 @@ msgstr ""
"Värm upp tills lampans ljusstyrka är konstant i stället för att "
"insistera på 40 sekunders uppvärmningstid."
-#: ../backend/pixma.c:358
+#: ../backend/pixma.c:378
#, no-c-format
msgid "Negative color"
msgstr "Negativ färg"
-#: ../backend/pixma.c:363
+#: ../backend/pixma.c:383
#, no-c-format
msgid "Negative gray"
msgstr "Negativ gråskala"
-#: ../backend/pixma.c:370
+#: ../backend/pixma.c:396
#, no-c-format
msgid "48 bits color"
msgstr "48 bitars färg"
-#: ../backend/pixma.c:375
+#: ../backend/pixma.c:401
#, no-c-format
msgid "16 bits gray"
msgstr "16 bitars gråskala"
-#: ../backend/pixma_sane_options.c:80
+#: ../backend/pixma_sane_options.c:82
#, no-c-format
msgid ""
"Selects the scan source (such as a document-feeder). Set source before "
@@ -4435,12 +4484,12 @@ msgstr ""
"Väljer inläsningskälla (som t.ex. dokumentmatare). Välj källa före läge "
"och upplösning. Återställer läge och upplösning till förvalsvärden."
-#: ../backend/pixma_sane_options.c:94
+#: ../backend/pixma_sane_options.c:96
#, no-c-format
msgid "Button-controlled scan"
msgstr "Knappkontrollerad inläsning"
-#: ../backend/pixma_sane_options.c:95
+#: ../backend/pixma_sane_options.c:97
#, no-c-format
msgid ""
"When enabled, scan process will not start immediately. To proceed, press "
@@ -4461,22 +4510,32 @@ msgstr "Gammafunktionsexponent"
msgid "Changes intensity of midtones"
msgstr "Ändrar intensitet hos mellantoner"
-#: ../backend/pixma_sane_options.c:231
+#: ../backend/pixma_sane_options.c:230
#, no-c-format
msgid "Update button state"
msgstr "Uppdatera knappläge"
-#: ../backend/pixma_sane_options.c:243
+#: ../backend/pixma_sane_options.c:242
#, no-c-format
msgid "Button 1"
msgstr "Knapp 1"
-#: ../backend/pixma_sane_options.c:257
+#: ../backend/pixma_sane_options.c:256
#, no-c-format
msgid "Button 2"
msgstr "Knapp 2"
-#: ../backend/plustek.c:235 ../backend/plustek_pp.c:201
+#: ../backend/pixma_sane_options.c:270
+#, no-c-format
+msgid "Type of original to scan"
+msgstr ""
+
+#: ../backend/pixma_sane_options.c:284
+#, no-c-format
+msgid "Target operation type"
+msgstr ""
+
+#: ../backend/plustek.c:235 ../backend/plustek_pp.c:204
#: ../backend/u12.c:156
#, no-c-format
msgid "Transparency"
@@ -4637,22 +4696,22 @@ msgstr "Definierar blå-lampa-av-parameter"
msgid "This option reflects the status of the scanner buttons."
msgstr "Denna inställing avspeglar status på bildläsarens knappar."
-#: ../backend/plustek_pp.c:194
+#: ../backend/plustek_pp.c:197
#, no-c-format
msgid "Color36"
msgstr "Färg 36"
-#: ../backend/plustek_pp.c:208
+#: ../backend/plustek_pp.c:211
#, no-c-format
msgid "Dithermap 1"
msgstr "Gitterkarta 1"
-#: ../backend/plustek_pp.c:209
+#: ../backend/plustek_pp.c:212
#, no-c-format
msgid "Dithermap 2"
msgstr "Gitterkarta 2"
-#: ../backend/plustek_pp.c:210
+#: ../backend/plustek_pp.c:213
#, no-c-format
msgid "Randomize"
msgstr "Slumpvist"
@@ -4701,7 +4760,7 @@ msgstr "Handbildläsarsimulering"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Simulera en handbildläsare. Handbildläsare vet oftast inte bildhöjden i "
"förväg. I stället returnerar de en höjd som är -1. Om denna inställning "
@@ -4843,29 +4902,29 @@ msgstr ""
"Tvinga bakplanet att returnera statuskoden SANE_STATUS_ACCESS_DENIED "
"efter det att sane_read() har anropats."
-#: ../backend/rts8891.c:2770
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Denna inställing avspeglar status på en av bildläsarens knappar."
-#: ../backend/rts8891.c:2801 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Lampa på"
-#: ../backend/rts8891.c:2802 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Slå på bildläsarlampan"
-#: ../backend/rts8891.c:2812 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Lampa av"
-#: ../backend/rts8891.c:2813 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -4886,42 +4945,42 @@ msgstr "Antal minuter innan lampan stängs av efter en inläsning"
msgid "Threshold value for lineart mode"
msgstr "Tröskelvärde för streckteckningsläge"
-#: ../backend/snapscan-options.c:84
+#: ../backend/snapscan-options.c:88
#, no-c-format
msgid "Document Feeder"
msgstr "Dokumentmatare"
-#: ../backend/snapscan-options.c:88
+#: ../backend/snapscan-options.c:92
#, no-c-format
msgid "6x4 (inch)"
msgstr "6x4 (tum)"
-#: ../backend/snapscan-options.c:89
+#: ../backend/snapscan-options.c:93
#, no-c-format
msgid "8x10 (inch)"
msgstr "8x10 (tum)"
-#: ../backend/snapscan-options.c:90
+#: ../backend/snapscan-options.c:94
#, no-c-format
msgid "8.5x11 (inch)"
msgstr "8,5x11 (tum)"
-#: ../backend/snapscan-options.c:93
+#: ../backend/snapscan-options.c:97
#, no-c-format
msgid "Halftoning Unsupported"
msgstr "Rastrering stöds inte"
-#: ../backend/snapscan-options.c:94
+#: ../backend/snapscan-options.c:98
#, no-c-format
msgid "DispersedDot8x8"
msgstr "Upplöst punkt 8x8"
-#: ../backend/snapscan-options.c:95
+#: ../backend/snapscan-options.c:99
#, no-c-format
msgid "DispersedDot16x16"
msgstr "Upplöst punkt 16x16"
-#: ../backend/snapscan-options.c:99
+#: ../backend/snapscan-options.c:103
#, no-c-format
msgid ""
"Number of scan lines to request in a SCSI read. Changing this parameter "
@@ -4937,12 +4996,27 @@ msgstr ""
"den sätts för hög kan X-baserade framplan sluta svara på X-händelser och "
"ditt system kan gå ned."
-#: ../backend/snapscan-options.c:436
+#: ../backend/snapscan-options.c:111
+#, no-c-format
+msgid "Frame number of media holder that should be scanned."
+msgstr ""
+
+#: ../backend/snapscan-options.c:114
+#, no-c-format
+msgid "Use manual or automatic selection of focus point."
+msgstr ""
+
+#: ../backend/snapscan-options.c:117
+#, fuzzy, no-c-format
+msgid "Focus point for scanning."
+msgstr "Mata ut dokument efter inläsning"
+
+#: ../backend/snapscan-options.c:482
#, no-c-format
msgid "Preview mode"
msgstr "Förhandsgranskningsläge"
-#: ../backend/snapscan-options.c:438
+#: ../backend/snapscan-options.c:484
#, no-c-format
msgid ""
"Select the mode for previews. Greyscale previews usually give the best "
@@ -4951,12 +5025,12 @@ msgstr ""
"Välj förhandsgranskningsläge. Gråskaleförhandsgranskningar ger oftast "
"den bästa kombinationen av hastighet och detaljrikedom."
-#: ../backend/snapscan-options.c:545
+#: ../backend/snapscan-options.c:601
#, no-c-format
msgid "Predefined settings"
msgstr "Fördefinierade inställningar"
-#: ../backend/snapscan-options.c:547
+#: ../backend/snapscan-options.c:603
#, no-c-format
msgid ""
"Provides standard scanning areas for photographs, printed pages and the "
@@ -4964,12 +5038,42 @@ msgid ""
msgstr ""
"Ger standardinläsningsytor för fotografier, tryckta sidor och liknande."
-#: ../backend/snapscan-options.c:823
+#: ../backend/snapscan-options.c:884
+#, no-c-format
+msgid "Frame"
+msgstr ""
+
+#: ../backend/snapscan-options.c:885
+#, fuzzy, no-c-format
+msgid "Frame to be scanned"
+msgstr "flatbäddsbildläsare"
+
+#: ../backend/snapscan-options.c:897
+#, fuzzy, no-c-format
+msgid "Focus-mode"
+msgstr "Fokus"
+
+#: ../backend/snapscan-options.c:898
+#, fuzzy, no-c-format
+msgid "Auto or manual focus"
+msgstr "Autofokus"
+
+#: ../backend/snapscan-options.c:911
+#, fuzzy, no-c-format
+msgid "Focus-point"
+msgstr "Fokuseringspunkt"
+
+#: ../backend/snapscan-options.c:912
+#, fuzzy, no-c-format
+msgid "Focus point"
+msgstr "Fokuseringspunkt"
+
+#: ../backend/snapscan-options.c:930
#, no-c-format
msgid "Colour lines per read"
msgstr "Färglinjer per inläsning"
-#: ../backend/snapscan-options.c:835
+#: ../backend/snapscan-options.c:942
#, no-c-format
msgid "Greyscale lines per read"
msgstr "Gråskalelinjer per inläsning"
@@ -5043,7 +5147,7 @@ msgstr "Handbildläsarsimulering"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Simulera en handbildläsare. Handbildläsare vet oftast inte bildhöjden i "
diff --git a/po/uk.po b/po/uk.po
index 22fb63b..4b95ed7 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -1,13 +1,13 @@
# Copyright (C) 2009
# This file is distributed under the same license as the sane-backends package.
#
-# Yuri Chornoivan <yurchor@ukr.net>, 2009, 2010, 2011, 2012, 2013.
+# Yuri Chornoivan <yurchor@ukr.net>, 2009, 2010, 2011, 2012, 2013, 2015.
msgid ""
msgstr ""
"Project-Id-Version: sane-backends\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2013-09-15 14:54+0300\n"
-"PO-Revision-Date: 2013-08-24 12:57+0300\n"
+"POT-Creation-Date: 2015-09-28 21:21-0400\n"
+"PO-Revision-Date: 2015-09-10 09:45+0300\n"
"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
"Language-Team: Ukrainian <translation@linux.org.ua>\n"
"Language: uk\n"
@@ -29,8 +29,8 @@ msgid "Standard"
msgstr "Типово"
#: ../include/sane/saneopts.h:157 ../backend/artec_eplus48u.c:2884
-#: ../backend/epson.c:3284 ../backend/epson2.c:1281
-#: ../backend/genesys.c:5472 ../backend/gt68xx.c:703
+#: ../backend/epson.c:3298 ../backend/epson2.c:1291
+#: ../backend/genesys.c:5615 ../backend/gt68xx.c:703
#: ../backend/hp3500.c:1003 ../backend/hp-option.c:3297
#: ../backend/kvs1025_opt.c:640 ../backend/kvs20xx_opt.c:284
#: ../backend/kvs40xx_opt.c:505 ../backend/leo.c:823
@@ -48,13 +48,13 @@ msgid "Geometry"
msgstr "Позиція і розміри"
#: ../include/sane/saneopts.h:158 ../backend/artec_eplus48u.c:2805
-#: ../backend/canon.c:1498 ../backend/genesys.c:5532
+#: ../backend/canon.c:1498 ../backend/genesys.c:5675
#: ../backend/gt68xx.c:672 ../backend/hp-option.c:2953
#: ../backend/kvs1025_opt.c:704 ../backend/leo.c:871
#: ../backend/ma1509.c:599 ../backend/matsushita.c:1189
#: ../backend/microtek2.h:600 ../backend/mustek.c:4411
#: ../backend/mustek_usb.c:353 ../backend/mustek_usb2.c:431
-#: ../backend/niash.c:756 ../backend/plustek.c:854
+#: ../backend/niash.c:754 ../backend/plustek.c:854
#: ../backend/plustek_pp.c:793 ../backend/sceptre.c:750
#: ../backend/snapscan-options.c:617 ../backend/stv680.c:1067
#: ../backend/teco1.c:1143 ../backend/teco2.c:1962 ../backend/teco3.c:968
@@ -63,9 +63,9 @@ msgstr "Позиція і розміри"
msgid "Enhancement"
msgstr "Покращення"
-#: ../include/sane/saneopts.h:159 ../backend/epson.c:3183
-#: ../backend/epson2.c:1206 ../backend/kvs20xx_opt.c:365
-#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2825
+#: ../include/sane/saneopts.h:159 ../backend/epson.c:3197
+#: ../backend/epson2.c:1216 ../backend/kvs20xx_opt.c:365
+#: ../backend/kvs40xx_opt.c:596 ../backend/rts8891.c:2831
#: ../backend/snapscan-options.c:923 ../backend/umax.c:5565
#, no-c-format
msgid "Advanced"
@@ -872,7 +872,7 @@ msgstr "Кришку відчинено"
#: ../include/sane/saneopts.h:454
#, no-c-format
msgid "Color"
-msgstr "Кольорове"
+msgstr "Кольоровий"
#: ../include/sane/saneopts.h:455
#, no-c-format
@@ -1021,22 +1021,22 @@ msgstr ""
msgid "Button state"
msgstr "Стан кнопки"
-#: ../backend/avision.h:781
+#: ../backend/avision.h:777
#, no-c-format
msgid "Number of the frame to scan"
msgstr "Номер кадру для сканування"
-#: ../backend/avision.h:782
+#: ../backend/avision.h:778
#, no-c-format
msgid "Selects the number of the frame to scan"
msgstr "Визначає кількість кадрів для сканування"
-#: ../backend/avision.h:785
+#: ../backend/avision.h:781
#, no-c-format
msgid "Duplex scan"
msgstr "Двобічне сканування"
-#: ../backend/avision.h:786
+#: ../backend/avision.h:782
#, no-c-format
msgid ""
"Duplex scan provide a scan of the front and back side of the document"
@@ -1318,8 +1318,8 @@ msgstr "плівковий сканер"
msgid "flatbed scanner"
msgstr "планшетний сканер"
-#: ../backend/canon.c:1183 ../backend/epson.c:3372
-#: ../backend/epson2.c:1355
+#: ../backend/canon.c:1183 ../backend/epson.c:3386
+#: ../backend/epson2.c:1365
#, no-c-format
msgid "Film type"
msgstr "Тип плівки"
@@ -1396,8 +1396,8 @@ msgstr "Поля області сканування"
msgid "Extra color adjustments"
msgstr "Додаткова корекція кольорів"
-#: ../backend/canon.c:1538 ../backend/epson.c:3191
-#: ../backend/epson2.c:1245 ../backend/kvs1025.h:55
+#: ../backend/canon.c:1538 ../backend/epson.c:3205
+#: ../backend/epson2.c:1255 ../backend/kvs1025.h:55
#: ../backend/kvs40xx_opt.c:825
#, no-c-format
msgid "Mirror image"
@@ -1548,12 +1548,12 @@ msgstr "Оберіть тип плівки"
msgid "Select the film type"
msgstr "Визначає тип плівки"
-#: ../backend/canon_dr.c:344 ../backend/epjitsu.c:203
-#: ../backend/epson.c:501 ../backend/epson2.c:114 ../backend/fujitsu.c:604
+#: ../backend/canon_dr.c:388 ../backend/epjitsu.c:227
+#: ../backend/epson.c:501 ../backend/epson2.c:115 ../backend/fujitsu.c:649
#: ../backend/gt68xx.c:148 ../backend/hp3900_sane.c:418
#: ../backend/hp3900_sane.c:427 ../backend/hp3900_sane.c:1017
#: ../backend/hp5590.c:82 ../backend/ma1509.c:108
-#: ../backend/magicolor.c:167 ../backend/mustek.c:156
+#: ../backend/magicolor.c:181 ../backend/mustek.c:156
#: ../backend/mustek.c:160 ../backend/mustek.c:164 ../backend/pixma.c:891
#: ../backend/pixma_sane_options.c:90 ../backend/snapscan-options.c:86
#: ../backend/test.c:192 ../backend/umax.c:181
@@ -1561,71 +1561,86 @@ msgstr "Визначає тип плівки"
msgid "Flatbed"
msgstr "Планшет"
-#: ../backend/canon_dr.c:345 ../backend/epjitsu.c:204
-#: ../backend/fujitsu.c:605 ../backend/kodak.c:135
+#: ../backend/canon_dr.c:389 ../backend/epjitsu.c:228
+#: ../backend/fujitsu.c:650 ../backend/kodak.c:135
#, no-c-format
msgid "ADF Front"
msgstr "Перед протяжного механізму"
-#: ../backend/canon_dr.c:346 ../backend/epjitsu.c:205
-#: ../backend/fujitsu.c:606 ../backend/kodak.c:136
+#: ../backend/canon_dr.c:390 ../backend/epjitsu.c:229
+#: ../backend/fujitsu.c:651 ../backend/kodak.c:136
#, no-c-format
msgid "ADF Back"
msgstr "Зворот протяжного механізму"
-#: ../backend/canon_dr.c:347 ../backend/epjitsu.c:206
-#: ../backend/fujitsu.c:607 ../backend/hp5590.c:84 ../backend/kodak.c:137
+#: ../backend/canon_dr.c:391 ../backend/epjitsu.c:230
+#: ../backend/fujitsu.c:652 ../backend/hp5590.c:84 ../backend/kodak.c:137
#: ../backend/pixma.c:902
#, no-c-format
msgid "ADF Duplex"
msgstr "Двобічна АПД"
-#: ../backend/canon_dr.c:354 ../backend/epson.c:599
-#: ../backend/epson.c:3082 ../backend/epson2.c:200
-#: ../backend/fujitsu.c:624 ../backend/genesys.c:89
+#: ../backend/canon_dr.c:392
+#, no-c-format
+msgid "Card Front"
+msgstr "Картка (профіль)"
+
+#: ../backend/canon_dr.c:393
+#, no-c-format
+msgid "Card Back"
+msgstr "Картка (зворот)"
+
+#: ../backend/canon_dr.c:394
+#, no-c-format
+msgid "Card Duplex"
+msgstr "Картка (обидва боки)"
+
+#: ../backend/canon_dr.c:401 ../backend/epson.c:599
+#: ../backend/epson.c:3096 ../backend/epson2.c:201
+#: ../backend/fujitsu.c:669 ../backend/genesys.c:89
#: ../backend/genesys.c:96 ../backend/gt68xx_low.h:136
#: ../backend/hp-option.c:3093
#, no-c-format
msgid "Red"
msgstr "Червоний"
-#: ../backend/canon_dr.c:355 ../backend/epson.c:600
-#: ../backend/epson.c:3078 ../backend/epson2.c:201
-#: ../backend/fujitsu.c:625 ../backend/genesys.c:90
+#: ../backend/canon_dr.c:402 ../backend/epson.c:600
+#: ../backend/epson.c:3092 ../backend/epson2.c:202
+#: ../backend/fujitsu.c:670 ../backend/genesys.c:90
#: ../backend/genesys.c:97 ../backend/gt68xx_low.h:137
#: ../backend/hp-option.c:3094
#, no-c-format
msgid "Green"
msgstr "Зелений"
-#: ../backend/canon_dr.c:356 ../backend/epson.c:601
-#: ../backend/epson.c:3086 ../backend/epson2.c:202
-#: ../backend/fujitsu.c:626 ../backend/genesys.c:91
+#: ../backend/canon_dr.c:403 ../backend/epson.c:601
+#: ../backend/epson.c:3100 ../backend/epson2.c:203
+#: ../backend/fujitsu.c:671 ../backend/genesys.c:91
#: ../backend/genesys.c:98 ../backend/gt68xx_low.h:138
#: ../backend/hp-option.c:3095
#, no-c-format
msgid "Blue"
msgstr "Синій"
-#: ../backend/canon_dr.c:357
+#: ../backend/canon_dr.c:404
#, no-c-format
msgid "Enhance Red"
msgstr "Покращити червоний"
-#: ../backend/canon_dr.c:358
+#: ../backend/canon_dr.c:405
#, no-c-format
msgid "Enhance Green"
msgstr "Покращити зелений"
-#: ../backend/canon_dr.c:359
+#: ../backend/canon_dr.c:406
#, no-c-format
msgid "Enhance Blue"
msgstr "Покращити синій"
-#: ../backend/canon_dr.c:361 ../backend/epson.c:556 ../backend/epson.c:564
-#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:164
-#: ../backend/epson2.c:172 ../backend/epson2.c:184 ../backend/epson2.c:199
-#: ../backend/epson2.c:213 ../backend/fujitsu.c:630
+#: ../backend/canon_dr.c:408 ../backend/epson.c:556 ../backend/epson.c:564
+#: ../backend/epson.c:576 ../backend/epson.c:598 ../backend/epson2.c:165
+#: ../backend/epson2.c:173 ../backend/epson2.c:185 ../backend/epson2.c:200
+#: ../backend/epson2.c:214 ../backend/fujitsu.c:675
#: ../backend/genesys.c:99 ../backend/leo.c:109
#: ../backend/matsushita.c:138 ../backend/matsushita.c:159
#: ../backend/matsushita.c:191 ../backend/matsushita.c:213
@@ -1634,109 +1649,109 @@ msgstr "Покращити синій"
msgid "None"
msgstr "Немає"
-#: ../backend/canon_dr.c:362 ../backend/fujitsu.c:631
+#: ../backend/canon_dr.c:409 ../backend/fujitsu.c:676
#, no-c-format
msgid "JPEG"
msgstr "JPEG"
-#: ../backend/epson.c:491 ../backend/epson2.c:107
-#: ../backend/magicolor.c:160
+#: ../backend/epson.c:491 ../backend/epson2.c:108
+#: ../backend/magicolor.c:174
#, no-c-format
msgid "Simplex"
msgstr "Однобічна"
-#: ../backend/epson.c:492 ../backend/epson2.c:108 ../backend/kvs1025.h:50
+#: ../backend/epson.c:492 ../backend/epson2.c:109 ../backend/kvs1025.h:50
#: ../backend/kvs20xx_opt.c:203 ../backend/kvs40xx_opt.c:352
-#: ../backend/magicolor.c:161 ../backend/matsushita.h:218
+#: ../backend/magicolor.c:175 ../backend/matsushita.h:218
#, no-c-format
msgid "Duplex"
msgstr "Двобічна"
-#: ../backend/epson.c:502 ../backend/epson2.c:115 ../backend/pixma.c:908
+#: ../backend/epson.c:502 ../backend/epson2.c:116 ../backend/pixma.c:908
#, no-c-format
msgid "Transparency Unit"
msgstr "Модуль для слайдів"
-#: ../backend/epson.c:503 ../backend/epson2.c:117
-#: ../backend/magicolor.c:168 ../backend/mustek.c:160
+#: ../backend/epson.c:503 ../backend/epson2.c:118
+#: ../backend/magicolor.c:182 ../backend/mustek.c:160
#: ../backend/pixma.c:896 ../backend/test.c:192 ../backend/umax.c:183
#, no-c-format
msgid "Automatic Document Feeder"
msgstr "Автоматична подача документів"
-#: ../backend/epson.c:523 ../backend/epson2.c:133
+#: ../backend/epson.c:523 ../backend/epson2.c:134
#, no-c-format
msgid "Positive Film"
msgstr "Плівка-позитив"
-#: ../backend/epson.c:524 ../backend/epson2.c:134
+#: ../backend/epson.c:524 ../backend/epson2.c:135
#, no-c-format
msgid "Negative Film"
msgstr "Плівка-негатив"
-#: ../backend/epson.c:529 ../backend/epson2.c:141
+#: ../backend/epson.c:529 ../backend/epson2.c:142
#, no-c-format
msgid "Focus on glass"
msgstr "Фокус на склі"
-#: ../backend/epson.c:530 ../backend/epson2.c:142
+#: ../backend/epson.c:530 ../backend/epson2.c:143
#, no-c-format
msgid "Focus 2.5mm above glass"
msgstr "Фокус 2,5 мм над склом"
#: ../backend/epson.c:557 ../backend/epson.c:565 ../backend/epson.c:577
-#: ../backend/epson2.c:165 ../backend/epson2.c:173 ../backend/epson2.c:185
+#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
#, no-c-format
msgid "Halftone A (Hard Tone)"
msgstr "Півтони A (Різкі тони)"
#: ../backend/epson.c:558 ../backend/epson.c:566 ../backend/epson.c:578
-#: ../backend/epson2.c:166 ../backend/epson2.c:174 ../backend/epson2.c:186
+#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
#, no-c-format
msgid "Halftone B (Soft Tone)"
msgstr "Півтони B (М’які тони)"
#: ../backend/epson.c:559 ../backend/epson.c:567 ../backend/epson.c:579
-#: ../backend/epson2.c:167 ../backend/epson2.c:175 ../backend/epson2.c:187
+#: ../backend/epson2.c:168 ../backend/epson2.c:176 ../backend/epson2.c:188
#, no-c-format
msgid "Halftone C (Net Screen)"
msgstr "Півтони C (Net Screen)"
-#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:176
-#: ../backend/epson2.c:188
+#: ../backend/epson.c:568 ../backend/epson.c:580 ../backend/epson2.c:177
+#: ../backend/epson2.c:189
#, no-c-format
msgid "Dither A (4x4 Bayer)"
msgstr "Дизеринг A (секція 4x4)"
-#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:177
-#: ../backend/epson2.c:189
+#: ../backend/epson.c:569 ../backend/epson.c:581 ../backend/epson2.c:178
+#: ../backend/epson2.c:190
#, no-c-format
msgid "Dither B (4x4 Spiral)"
msgstr "Дизеринг B (спіраль 4x4)"
-#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:178
-#: ../backend/epson2.c:190
+#: ../backend/epson.c:570 ../backend/epson.c:582 ../backend/epson2.c:179
+#: ../backend/epson2.c:191
#, no-c-format
msgid "Dither C (4x4 Net Screen)"
msgstr "Дизеринг C (4x4 Net Screen)"
-#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:179
-#: ../backend/epson2.c:191
+#: ../backend/epson.c:571 ../backend/epson.c:583 ../backend/epson2.c:180
+#: ../backend/epson2.c:192
#, no-c-format
msgid "Dither D (8x4 Net Screen)"
msgstr "Дизеринг D (8x4 Net Screen)"
-#: ../backend/epson.c:584 ../backend/epson2.c:192
+#: ../backend/epson.c:584 ../backend/epson2.c:193
#, no-c-format
msgid "Text Enhanced Technology"
msgstr "Технологія покращення тексту"
-#: ../backend/epson.c:585 ../backend/epson2.c:193
+#: ../backend/epson.c:585 ../backend/epson2.c:194
#, no-c-format
msgid "Download pattern A"
msgstr "Завантажити шаблон A"
-#: ../backend/epson.c:586 ../backend/epson2.c:194
+#: ../backend/epson.c:586 ../backend/epson2.c:195
#, no-c-format
msgid "Download pattern B"
msgstr "Завантажити шаблон B"
@@ -1746,7 +1761,7 @@ msgstr "Завантажити шаблон B"
msgid "No Correction"
msgstr "Без виправлення"
-#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:254
+#: ../backend/epson.c:632 ../backend/epson.c:657 ../backend/epson2.c:255
#, no-c-format
msgid "User defined"
msgstr "Визначене користувачем"
@@ -1771,33 +1786,33 @@ msgstr "Струминні принтери"
msgid "CRT monitors"
msgstr "Монітори з ЕПТ"
-#: ../backend/epson.c:656 ../backend/epson2.c:253 ../backend/fujitsu.c:614
+#: ../backend/epson.c:656 ../backend/epson2.c:254 ../backend/fujitsu.c:659
#: ../backend/hp-option.c:3226 ../backend/test.c:143
#, no-c-format
msgid "Default"
msgstr "Типовий"
-#: ../backend/epson.c:658 ../backend/epson2.c:255
+#: ../backend/epson.c:658 ../backend/epson2.c:256
#, no-c-format
msgid "High density printing"
msgstr "Друк з високою щільністю"
-#: ../backend/epson.c:659 ../backend/epson2.c:256
+#: ../backend/epson.c:659 ../backend/epson2.c:257
#, no-c-format
msgid "Low density printing"
msgstr "Друк з низькою щільністю"
-#: ../backend/epson.c:660 ../backend/epson2.c:257
+#: ../backend/epson.c:660 ../backend/epson2.c:258
#, no-c-format
msgid "High contrast printing"
msgstr "Друк з високою контрастністю"
-#: ../backend/epson.c:678 ../backend/epson2.c:275
+#: ../backend/epson.c:678 ../backend/epson2.c:276
#, no-c-format
msgid "User defined (Gamma=1.0)"
msgstr "Визначене користувачем (Gamma=1.0)"
-#: ../backend/epson.c:679 ../backend/epson2.c:276
+#: ../backend/epson.c:679 ../backend/epson2.c:277
#, no-c-format
msgid "User defined (Gamma=1.8)"
msgstr "Визначена користувачем (Gamma=1.8)"
@@ -1837,14 +1852,14 @@ msgstr "A4"
msgid "Max"
msgstr "Макс"
-#: ../backend/epson.c:2799 ../backend/epson2.c:966
-#: ../backend/genesys.c:5389 ../backend/gt68xx.c:458
+#: ../backend/epson.c:2813 ../backend/epson2.c:977
+#: ../backend/genesys.c:5532 ../backend/gt68xx.c:458
#: ../backend/hp-option.c:2914 ../backend/kvs1025_opt.c:522
#: ../backend/kvs20xx_opt.c:170 ../backend/kvs40xx_opt.c:319
#: ../backend/ma1509.c:501 ../backend/matsushita.c:1084
#: ../backend/microtek2.h:598 ../backend/mustek.c:4205
#: ../backend/mustek_usb.c:260 ../backend/mustek_usb2.c:344
-#: ../backend/niash.c:736 ../backend/plustek.c:721
+#: ../backend/niash.c:734 ../backend/plustek.c:721
#: ../backend/plustek_pp.c:658 ../backend/sceptre.c:673
#: ../backend/snapscan-options.c:354 ../backend/stv680.c:1030
#: ../backend/teco2.c:1886 ../backend/test.c:306 ../backend/u12.c:473
@@ -1853,212 +1868,212 @@ msgstr "Макс"
msgid "Scan Mode"
msgstr "Режим сканування"
-#: ../backend/epson.c:2831 ../backend/epson2.c:1002
+#: ../backend/epson.c:2845 ../backend/epson2.c:1012
#, no-c-format
msgid "Selects the halftone."
msgstr "Визначає півтон."
-#: ../backend/epson.c:2853 ../backend/epson2.c:1023
+#: ../backend/epson.c:2867 ../backend/epson2.c:1033
#, no-c-format
msgid "Dropout"
msgstr "Маска"
-#: ../backend/epson.c:2854 ../backend/epson2.c:1024
+#: ../backend/epson.c:2868 ../backend/epson2.c:1034
#, no-c-format
msgid "Selects the dropout."
msgstr "Визначає маску."
-#: ../backend/epson.c:2866 ../backend/epson2.c:1036
+#: ../backend/epson.c:2880 ../backend/epson2.c:1046
#, no-c-format
msgid "Selects the brightness."
msgstr "Визначає яскравість."
-#: ../backend/epson.c:2881 ../backend/epson2.c:1049
+#: ../backend/epson.c:2895 ../backend/epson2.c:1059
#, no-c-format
msgid "Sharpness"
msgstr "Різкість"
-#: ../backend/epson.c:3017 ../backend/epson2.c:1165
-#: ../backend/epson2.c:1212
+#: ../backend/epson.c:3031 ../backend/epson2.c:1175
+#: ../backend/epson2.c:1222
#, no-c-format
msgid "Color correction"
msgstr "Кольорова компенсація"
-#: ../backend/epson.c:3020 ../backend/epson2.c:1167
+#: ../backend/epson.c:3034 ../backend/epson2.c:1177
#, no-c-format
msgid "Sets the color correction table for the selected output device."
msgstr ""
"Визначає таблицю виправлення кольорів для вибраного пристрою виведення "
"даних."
-#: ../backend/epson.c:3061
+#: ../backend/epson.c:3075
#, no-c-format
msgid "Color correction coefficients"
msgstr "Коефіцієнти виправлення кольорів"
-#: ../backend/epson.c:3062
+#: ../backend/epson.c:3076
#, no-c-format
msgid "Matrix multiplication of RGB"
msgstr "Матричний множник RGB"
-#: ../backend/epson.c:3079
+#: ../backend/epson.c:3093
#, no-c-format
msgid "Shift green to red"
msgstr "Зсув зеленого до червоного"
-#: ../backend/epson.c:3080
+#: ../backend/epson.c:3094
#, no-c-format
msgid "Shift green to blue"
msgstr "Зсув зеленого до синього"
-#: ../backend/epson.c:3081
+#: ../backend/epson.c:3095
#, no-c-format
msgid "Shift red to green"
msgstr "Зсув червоного до зеленого"
-#: ../backend/epson.c:3083
+#: ../backend/epson.c:3097
#, no-c-format
msgid "Shift red to blue"
msgstr "Зсув червоного до синього"
-#: ../backend/epson.c:3084
+#: ../backend/epson.c:3098
#, no-c-format
msgid "Shift blue to green"
msgstr "Зсув синього до зеленого"
-#: ../backend/epson.c:3085
+#: ../backend/epson.c:3099
#, no-c-format
msgid "Shift blue to red"
msgstr "Зсув синього до червоного"
-#: ../backend/epson.c:3088
+#: ../backend/epson.c:3102
#, no-c-format
msgid "Controls green level"
msgstr "Керує рівнем зеленого"
-#: ../backend/epson.c:3089
+#: ../backend/epson.c:3103
#, no-c-format
msgid "Adds to red based on green level"
msgstr "Додаток до червоного на основі рівня зеленого"
-#: ../backend/epson.c:3090
+#: ../backend/epson.c:3104
#, no-c-format
msgid "Adds to blue based on green level"
msgstr "Додаток до синього на основі рівня зеленого"
-#: ../backend/epson.c:3091
+#: ../backend/epson.c:3105
#, no-c-format
msgid "Adds to green based on red level"
msgstr "Додаток до зеленого на основі рівня червоного"
-#: ../backend/epson.c:3092
+#: ../backend/epson.c:3106
#, no-c-format
msgid "Controls red level"
msgstr "Керує рівнем червоного"
-#: ../backend/epson.c:3093
+#: ../backend/epson.c:3107
#, no-c-format
msgid "Adds to blue based on red level"
msgstr "Додаток до синього на основі рівня червоного"
-#: ../backend/epson.c:3094
+#: ../backend/epson.c:3108
#, no-c-format
msgid "Adds to green based on blue level"
msgstr "Додаток до зеленого на основі рівня синього"
-#: ../backend/epson.c:3095
+#: ../backend/epson.c:3109
#, no-c-format
msgid "Adds to red based on blue level"
msgstr "Додаток до червоного на основі рівня синього"
-#: ../backend/epson.c:3096
+#: ../backend/epson.c:3110
#, no-c-format
msgid "Controls blue level"
msgstr "Визначає рівень синього"
-#: ../backend/epson.c:3192 ../backend/epson2.c:1246
+#: ../backend/epson.c:3206 ../backend/epson2.c:1256
#, no-c-format
msgid "Mirror the image."
msgstr "Віддзеркалити зображення."
-#: ../backend/epson.c:3218 ../backend/mustek.c:4334
+#: ../backend/epson.c:3232 ../backend/mustek.c:4334
#, no-c-format
msgid "Fast preview"
msgstr "Швидкий перегляд"
-#: ../backend/epson.c:3231 ../backend/epson2.c:1256
+#: ../backend/epson.c:3245 ../backend/epson2.c:1266
#, no-c-format
msgid "Auto area segmentation"
msgstr "Автоматичний поділ на області"
-#: ../backend/epson.c:3244
+#: ../backend/epson.c:3258
#, no-c-format
msgid "Short resolution list"
msgstr "Короткий список роздільних здатностей"
-#: ../backend/epson.c:3246
+#: ../backend/epson.c:3260
#, no-c-format
msgid "Display short resolution list"
msgstr "Показати короткий список роздільних здатностей"
-#: ../backend/epson.c:3253
+#: ../backend/epson.c:3267
#, no-c-format
msgid "Zoom"
msgstr "Масштаб"
-#: ../backend/epson.c:3255
+#: ../backend/epson.c:3269
#, no-c-format
msgid "Defines the zoom factor the scanner will use"
msgstr "Визначає масштаб, який буде використано сканером"
-#: ../backend/epson.c:3335
+#: ../backend/epson.c:3349
#, no-c-format
msgid "Quick format"
msgstr "Швидке форматування"
-#: ../backend/epson.c:3346 ../backend/epson2.c:1331
+#: ../backend/epson.c:3360 ../backend/epson2.c:1341
#, no-c-format
msgid "Optional equipment"
msgstr "Додаткове устаткування"
-#: ../backend/epson.c:3417 ../backend/epson2.c:1384
+#: ../backend/epson.c:3431 ../backend/epson2.c:1394
#, no-c-format
msgid "Eject"
msgstr "Виштовхнути"
-#: ../backend/epson.c:3418 ../backend/epson2.c:1385
+#: ../backend/epson.c:3432 ../backend/epson2.c:1395
#, no-c-format
msgid "Eject the sheet in the ADF"
msgstr "Виштовхнути аркуш з протяжного пристрою"
-#: ../backend/epson.c:3430 ../backend/epson2.c:1395
+#: ../backend/epson.c:3444 ../backend/epson2.c:1405
#, no-c-format
msgid "Auto eject"
msgstr "Автовиштовхування"
-#: ../backend/epson.c:3431 ../backend/epson2.c:1397
+#: ../backend/epson.c:3445 ../backend/epson2.c:1407
#, no-c-format
msgid "Eject document after scanning"
msgstr "Виштовхнути документ після сканування"
-#: ../backend/epson.c:3443 ../backend/epson2.c:1407
-#: ../backend/magicolor.c:2399
+#: ../backend/epson.c:3457 ../backend/epson2.c:1417
+#: ../backend/magicolor.c:2420
#, no-c-format
msgid "ADF Mode"
msgstr "Режим автоподавання"
-#: ../backend/epson.c:3445 ../backend/epson2.c:1409
-#: ../backend/magicolor.c:2401
+#: ../backend/epson.c:3459 ../backend/epson2.c:1419
+#: ../backend/magicolor.c:2422
#, no-c-format
msgid "Selects the ADF mode (simplex/duplex)"
msgstr "Визначає режим автоподавання (однобічний/двобічний)"
-#: ../backend/epson.c:3459 ../backend/epson2.c:1421
+#: ../backend/epson.c:3473 ../backend/epson2.c:1431
#, no-c-format
msgid "Bay"
msgstr "Секція"
-#: ../backend/epson.c:3460 ../backend/epson2.c:1422
+#: ../backend/epson.c:3474 ../backend/epson2.c:1432
#, no-c-format
msgid "Select bay to scan"
msgstr "Визначає секцію, яку буде скановано"
@@ -2100,217 +2115,217 @@ msgstr ""
"Після надсилання команди сканування не розпочинати сканування до "
"натискання кнопки на сканері."
-#: ../backend/epson2.c:101 ../backend/pixma.c:390
+#: ../backend/epson2.c:102 ../backend/pixma.c:390
#, no-c-format
msgid "Infrared"
msgstr "Інфрачервоне"
-#: ../backend/epson2.c:116
+#: ../backend/epson2.c:117
#, no-c-format
msgid "TPU8x10"
msgstr "TPU8x10"
-#: ../backend/epson2.c:135
+#: ../backend/epson2.c:136
#, no-c-format
msgid "Positive Slide"
msgstr "Слайд-позитив"
-#: ../backend/epson2.c:136
+#: ../backend/epson2.c:137
#, no-c-format
msgid "Negative Slide"
msgstr "Слайд-негатив"
-#: ../backend/epson2.c:214
+#: ../backend/epson2.c:215
#, no-c-format
msgid "Built in CCT profile"
msgstr "Вбудований профіль CCT"
-#: ../backend/epson2.c:215
+#: ../backend/epson2.c:216
#, no-c-format
msgid "User defined CCT profile"
msgstr "Визначений користувачем профіль CCT"
-#: ../backend/fujitsu.c:615 ../backend/hp-option.c:3327
+#: ../backend/fujitsu.c:660 ../backend/hp-option.c:3327
#: ../backend/hp-option.c:3340
#, no-c-format
msgid "On"
msgstr "Увімкнути"
-#: ../backend/fujitsu.c:616 ../backend/hp-option.c:3159
+#: ../backend/fujitsu.c:661 ../backend/hp-option.c:3159
#: ../backend/hp-option.c:3326 ../backend/hp-option.c:3339
#, no-c-format
msgid "Off"
msgstr "Вимкнути"
-#: ../backend/fujitsu.c:618
+#: ../backend/fujitsu.c:663
#, no-c-format
msgid "DTC"
msgstr "DTC"
-#: ../backend/fujitsu.c:619
+#: ../backend/fujitsu.c:664
#, no-c-format
msgid "SDTC"
msgstr "SDTC"
-#: ../backend/fujitsu.c:621 ../backend/teco1.c:1152
+#: ../backend/fujitsu.c:666 ../backend/teco1.c:1152
#: ../backend/teco1.c:1153 ../backend/teco2.c:1971 ../backend/teco2.c:1972
#: ../backend/teco3.c:977 ../backend/teco3.c:978
#, no-c-format
msgid "Dither"
msgstr "Дизеринг"
-#: ../backend/fujitsu.c:622
+#: ../backend/fujitsu.c:667
#, no-c-format
msgid "Diffusion"
msgstr "Дифузія"
-#: ../backend/fujitsu.c:627
+#: ../backend/fujitsu.c:672
#, no-c-format
msgid "White"
msgstr "Білий"
-#: ../backend/fujitsu.c:628
+#: ../backend/fujitsu.c:673
#, no-c-format
msgid "Black"
msgstr "Чорний"
-#: ../backend/fujitsu.c:633
+#: ../backend/fujitsu.c:678
#, no-c-format
msgid "Continue"
msgstr "Продовжити"
-#: ../backend/fujitsu.c:634
+#: ../backend/fujitsu.c:679
#, no-c-format
msgid "Stop"
msgstr "Зупинити"
-#: ../backend/fujitsu.c:636
+#: ../backend/fujitsu.c:681
#, no-c-format
msgid "10mm"
msgstr "10мм"
-#: ../backend/fujitsu.c:637
+#: ../backend/fujitsu.c:682
#, no-c-format
msgid "15mm"
msgstr "15мм"
-#: ../backend/fujitsu.c:638
+#: ../backend/fujitsu.c:683
#, no-c-format
msgid "20mm"
msgstr "20мм"
-#: ../backend/fujitsu.c:640 ../backend/hp-option.c:3045
+#: ../backend/fujitsu.c:685 ../backend/hp-option.c:3045
#, no-c-format
msgid "Horizontal"
msgstr "По горизонталі"
-#: ../backend/fujitsu.c:641
+#: ../backend/fujitsu.c:686
#, no-c-format
msgid "Horizontal bold"
msgstr "Жирний по горизонталі"
-#: ../backend/fujitsu.c:642
+#: ../backend/fujitsu.c:687
#, no-c-format
msgid "Horizontal narrow"
msgstr "Вузький по горизонталі"
-#: ../backend/fujitsu.c:643 ../backend/hp-option.c:3044
+#: ../backend/fujitsu.c:688 ../backend/hp-option.c:3044
#, no-c-format
msgid "Vertical"
msgstr "По вертикалі"
-#: ../backend/fujitsu.c:644
+#: ../backend/fujitsu.c:689
#, no-c-format
msgid "Vertical bold"
msgstr "Жирний по вертикалі"
-#: ../backend/fujitsu.c:646
+#: ../backend/fujitsu.c:691
#, no-c-format
msgid "Top to bottom"
msgstr "Згори вниз"
-#: ../backend/fujitsu.c:647
+#: ../backend/fujitsu.c:692
#, no-c-format
msgid "Bottom to top"
msgstr "Знизу догори"
-#: ../backend/fujitsu.c:649
+#: ../backend/fujitsu.c:694
#, no-c-format
msgid "Front"
msgstr "Перед"
-#: ../backend/fujitsu.c:650
+#: ../backend/fujitsu.c:695
#, no-c-format
msgid "Back"
msgstr "Зворот"
-#: ../backend/fujitsu.c:3858 ../backend/genesys.c:5623
+#: ../backend/fujitsu.c:4055 ../backend/genesys.c:5766
#: ../backend/kvs1025_opt.c:911
#, no-c-format
msgid "Software blank skip percentage"
msgstr "Порогове значення порожніх сторінок для програмного відкидання"
-#: ../backend/fujitsu.c:3859
+#: ../backend/fujitsu.c:4056
#, no-c-format
msgid "Request driver to discard pages with low percentage of dark pixels"
msgstr ""
"Вимагати від драйвера відкидання сторінок з надто низькою питомою "
"кількістю темних пікселів"
-#: ../backend/genesys.c:5614
+#: ../backend/genesys.c:5757
#, no-c-format
msgid "Software crop"
msgstr "Програмне обрізання"
-#: ../backend/genesys.c:5615
+#: ../backend/genesys.c:5758
#, no-c-format
msgid "Request backend to remove border from pages digitally"
msgstr ""
"Вимагати від програмного модуля вилучення границі зі сторінок у "
"автоматичному режимі"
-#: ../backend/genesys.c:5624 ../backend/kvs1025_opt.c:913
+#: ../backend/genesys.c:5767 ../backend/kvs1025_opt.c:913
#, no-c-format
msgid "Request driver to discard pages with low numbers of dark pixels"
msgstr ""
"Вимагати від драйвера відкидання сторінок з надто низькою кількістю "
"темних пікселів"
-#: ../backend/genesys.c:5635 ../backend/kvs1025_opt.c:893
+#: ../backend/genesys.c:5778 ../backend/kvs1025_opt.c:893
#, no-c-format
msgid "Software derotate"
msgstr "Програмне усування обертання"
-#: ../backend/genesys.c:5636 ../backend/kvs1025_opt.c:895
+#: ../backend/genesys.c:5779 ../backend/kvs1025_opt.c:895
#, no-c-format
msgid "Request driver to detect and correct 90 degree image rotation"
msgstr ""
"Вимагати від драйвера виявлення і виправлення обертання зображення на 90 "
"градусів"
-#: ../backend/genesys.c:5667 ../backend/pixma_sane_options.c:312
+#: ../backend/genesys.c:5810 ../backend/pixma_sane_options.c:312
#, no-c-format
msgid "Extras"
msgstr "Додаткові"
-#: ../backend/genesys.c:5686 ../backend/pixma_sane_options.c:333
+#: ../backend/genesys.c:5829 ../backend/pixma_sane_options.c:333
#, no-c-format
msgid "Threshold curve"
msgstr "Порогова крива"
-#: ../backend/genesys.c:5687 ../backend/pixma_sane_options.c:334
+#: ../backend/genesys.c:5830 ../backend/pixma_sane_options.c:334
#, no-c-format
msgid "Dynamic threshold curve, from light to dark, normally 50-65"
msgstr ""
"Крива динамічного порогового значення, від світлого до темного, типово "
"50-65"
-#: ../backend/genesys.c:5696
+#: ../backend/genesys.c:5839
#, no-c-format
msgid "Disable dynamic lineart"
msgstr "Вимкнути динамічне штрихування"
-#: ../backend/genesys.c:5698
+#: ../backend/genesys.c:5841
#, no-c-format
msgid ""
"Disable use of a software adaptive algorithm to generate lineart relying "
@@ -2319,12 +2334,12 @@ msgstr ""
"Вимкнути використання адаптивного програмного алгоритму для створення "
"штрихування замість апаратного алгоритму штрихування."
-#: ../backend/genesys.c:5714
+#: ../backend/genesys.c:5857
#, no-c-format
msgid "Disable interpolation"
msgstr "Вимкнути інтерполяцію"
-#: ../backend/genesys.c:5717
+#: ../backend/genesys.c:5860
#, no-c-format
msgid ""
"When using high resolutions where the horizontal resolution is smaller "
@@ -2334,34 +2349,50 @@ msgstr ""
"роздільна здатність менша за вертикальну, вимикає горизонтальну "
"інтерполяцію."
-#: ../backend/genesys.c:5726
+#: ../backend/genesys.c:5869
#, no-c-format
msgid "Color filter"
msgstr "Фільтр кольору"
-#: ../backend/genesys.c:5729
+#: ../backend/genesys.c:5872
#, no-c-format
msgid "When using gray or lineart this option selects the used color."
msgstr ""
"За використання друку у півтонах або штрихового друку за допомогою цього "
"пункту можна обрати колір друку."
-#: ../backend/genesys.c:5755
+#: ../backend/genesys.c:5898
#, no-c-format
msgid "Calibration file"
msgstr "Файл калібрування"
-#: ../backend/genesys.c:5756
+#: ../backend/genesys.c:5899
#, no-c-format
msgid "Specify the calibration file to use"
msgstr "Вкажіть файл даних калібрування, які буде використано"
-#: ../backend/genesys.c:5773
+#: ../backend/genesys.c:5916
+#, no-c-format
+msgid "Calibration cache expiration time"
+msgstr "Строк дії кешу калібрування"
+
+#: ../backend/genesys.c:5917
+#, no-c-format
+msgid ""
+"Time (in minutes) before a cached calibration expires. A value of 0 "
+"means cache is not used. A negative value means cache never expires."
+msgstr ""
+"Час (у хвилинах), перш ніж завершиться строк дії кешованих даних щодо "
+"калібрування. Значення 0 означає, що кеш не використовуватиметься. "
+"Від’ємні значення означають, що обмежень на строк дії кешу не "
+"накладатиметься."
+
+#: ../backend/genesys.c:5927
#, no-c-format
msgid "Lamp off time"
msgstr "Час вимикання лампи"
-#: ../backend/genesys.c:5776
+#: ../backend/genesys.c:5930
#, no-c-format
msgid ""
"The lamp will be turned off after the given time (in minutes). A value "
@@ -2370,71 +2401,71 @@ msgstr ""
"Лампу буде вимкнено, коли спливе вказаний час (у хвилинах). Значення "
"рівне 0 означатиме, що лампа не вимикатиметься."
-#: ../backend/genesys.c:5786
+#: ../backend/genesys.c:5940
#, no-c-format
msgid "Lamp off during scan"
msgstr "Вимикання лампи під час сканування"
-#: ../backend/genesys.c:5787
+#: ../backend/genesys.c:5941
#, no-c-format
msgid "The lamp will be turned off during scan. "
msgstr "Лампу буде вимкнено під час сканування. "
-#: ../backend/genesys.c:5815 ../backend/genesys.c:5816
+#: ../backend/genesys.c:5969 ../backend/genesys.c:5970
#, no-c-format
msgid "File button"
msgstr "Кнопка «File»"
-#: ../backend/genesys.c:5868 ../backend/genesys.c:5869
+#: ../backend/genesys.c:6022 ../backend/genesys.c:6023
#, no-c-format
msgid "OCR button"
msgstr "Кнопка «OCR»"
-#: ../backend/genesys.c:5882 ../backend/genesys.c:5883
+#: ../backend/genesys.c:6036 ../backend/genesys.c:6037
#, no-c-format
msgid "Power button"
msgstr "Кнопка «Power»"
-#: ../backend/genesys.c:5896 ../backend/genesys.c:5897
+#: ../backend/genesys.c:6050 ../backend/genesys.c:6051
#, no-c-format
msgid "Extra button"
msgstr "Додаткова кнопка"
-#: ../backend/genesys.c:5910 ../backend/gt68xx.c:762
+#: ../backend/genesys.c:6064 ../backend/gt68xx.c:762
#, no-c-format
msgid "Need calibration"
msgstr "Потребує калібрування"
-#: ../backend/genesys.c:5911 ../backend/gt68xx.c:763
+#: ../backend/genesys.c:6065 ../backend/gt68xx.c:763
#, no-c-format
msgid "The scanner needs calibration for the current settings"
msgstr "Для застосування поточних параметрів потрібне калібрування"
-#: ../backend/genesys.c:5923 ../backend/gt68xx.c:787
+#: ../backend/genesys.c:6077 ../backend/gt68xx.c:787
#: ../backend/gt68xx.c:788 ../backend/pixma_sane_options.c:224
#: ../backend/plustek.c:1080
#, no-c-format
msgid "Buttons"
msgstr "Кнопки"
-#: ../backend/genesys.c:5932 ../backend/gt68xx.c:794
+#: ../backend/genesys.c:6086 ../backend/gt68xx.c:794
#: ../backend/hp5400_sane.c:392 ../backend/hp-option.h:97
-#: ../backend/niash.c:728 ../backend/plustek.c:941
+#: ../backend/niash.c:726 ../backend/plustek.c:941
#, no-c-format
msgid "Calibrate"
msgstr "Відкалібрувати"
-#: ../backend/genesys.c:5934 ../backend/gt68xx.c:796
+#: ../backend/genesys.c:6088 ../backend/gt68xx.c:796
#, no-c-format
msgid "Start calibration using special sheet"
msgstr "Почати калібрування за допомогою спеціального аркуша"
-#: ../backend/genesys.c:5948 ../backend/gt68xx.c:809
+#: ../backend/genesys.c:6102 ../backend/gt68xx.c:809
#, no-c-format
msgid "Clear calibration"
msgstr "Спорожнити дані калібрування"
-#: ../backend/genesys.c:5949 ../backend/gt68xx.c:810
+#: ../backend/genesys.c:6103 ../backend/gt68xx.c:810
#, no-c-format
msgid "Clear calibration cache"
msgstr "Спорожнити кеш калібрування"
@@ -2576,7 +2607,7 @@ msgstr "Модель сканера"
#: ../backend/hp3900_sane.c:1408
#, no-c-format
-msgid "Allows to test device behaviour with other supported models"
+msgid "Allows one to test device behaviour with other supported models"
msgstr ""
"Надає змогу перевірити поведінку пристрою з використанням інших "
"підтримуваних моделей"
@@ -2728,12 +2759,12 @@ msgstr "Оновлює дані щодо пристрою"
msgid "This option reflects a front panel scanner button"
msgstr "Цей пункт відповідає кнопці передньої панелі сканера"
-#: ../backend/hp5400_sane.c:313 ../backend/niash.c:683
+#: ../backend/hp5400_sane.c:313 ../backend/niash.c:678
#, no-c-format
msgid "Image"
msgstr "Зображення"
-#: ../backend/hp5400_sane.c:352 ../backend/niash.c:711
+#: ../backend/hp5400_sane.c:352 ../backend/niash.c:709
#, no-c-format
msgid "Miscellaneous"
msgstr "Різне"
@@ -2758,17 +2789,17 @@ msgstr "Зсув за Y"
msgid "Hardware internal Y position of the scanning area."
msgstr "Апаратна внутрішня позиція за Y області сканування."
-#: ../backend/hp5400_sane.c:381 ../backend/niash.c:718
+#: ../backend/hp5400_sane.c:381 ../backend/niash.c:716
#, no-c-format
msgid "Lamp status"
msgstr "Стан лампи"
-#: ../backend/hp5400_sane.c:382 ../backend/niash.c:719
+#: ../backend/hp5400_sane.c:382 ../backend/niash.c:717
#, no-c-format
msgid "Switches the lamp on or off."
msgstr "Вмикає або вимикає лампу."
-#: ../backend/hp5400_sane.c:393 ../backend/niash.c:729
+#: ../backend/hp5400_sane.c:393 ../backend/niash.c:727
#, no-c-format
msgid "Calibrates for black and white level."
msgstr "Калібрує для визначення рівня чорного и білого."
@@ -4775,7 +4806,7 @@ msgstr "Імітація ручного сканера"
msgid ""
"Simulate a hand-scanner. Hand-scanners often do not know the image "
"height a priori. Instead, they return a height of -1. Setting this "
-"option allows to test whether a frontend can handle this correctly."
+"option allows one to test whether a frontend can handle this correctly."
msgstr ""
"Імітує ручний сканер. Ручні сканери часто попередньо не отримують даних "
"щодо висоти зображення. Замість цього, вони повертають висоту рівну -1. "
@@ -4918,29 +4949,29 @@ msgstr ""
"Наказати серверу повертати код стану SANE_STATUS_ACCESS_DENIED після "
"виклику sane_read()."
-#: ../backend/rts8891.c:2803
+#: ../backend/rts8891.c:2809
#, no-c-format
msgid "This option reflects the status of a scanner button."
msgstr "Цей пункт відповідає стану кнопки сканування."
-#: ../backend/rts8891.c:2834 ../backend/umax.c:5795
+#: ../backend/rts8891.c:2840 ../backend/umax.c:5795
#: ../backend/umax_pp.c:639
#, no-c-format
msgid "Lamp on"
msgstr "Увімкнути лампу"
-#: ../backend/rts8891.c:2835 ../backend/umax.c:5796
+#: ../backend/rts8891.c:2841 ../backend/umax.c:5796
#, no-c-format
msgid "Turn on scanner lamp"
msgstr "Увімкнути лампу сканера"
-#: ../backend/rts8891.c:2845 ../backend/umax1220u.c:248
+#: ../backend/rts8891.c:2851 ../backend/umax1220u.c:248
#: ../backend/umax.c:5812
#, no-c-format
msgid "Lamp off"
msgstr "Вимкнути лампу"
-#: ../backend/rts8891.c:2846 ../backend/umax1220u.c:249
+#: ../backend/rts8891.c:2852 ../backend/umax1220u.c:249
#: ../backend/umax.c:5813
#, no-c-format
msgid "Turn off scanner lamp"
@@ -5164,7 +5195,7 @@ msgstr "Імітація ручного сканера"
msgid ""
"Simulate a hand-scanner. Hand-scanners do not know the image height a "
"priori. Instead, they return a height of -1. Setting this option "
-"allows to test whether a frontend can handle this correctly. This "
+"allows one to test whether a frontend can handle this correctly. This "
"option also enables a fixed width of 11 cm."
msgstr ""
"Імітує ручний сканер. Ручні сканери попередньо не отримують даних щодо "
diff --git a/sanei/Makefile.am b/sanei/Makefile.am
index c466e44..c1106ae 100644
--- a/sanei/Makefile.am
+++ b/sanei/Makefile.am
@@ -14,7 +14,7 @@ libsanei_la_SOURCES = sanei_ab306.c sanei_constrain_value.c \
sanei_codec_bin.c sanei_scsi.c sanei_config.c sanei_config2.c \
sanei_pio.c sanei_pa4s2.c sanei_auth.c sanei_usb.c sanei_thread.c \
sanei_pv8630.c sanei_pp.c sanei_lm983x.c sanei_access.c sanei_tcp.c \
- sanei_udp.c sanei_magic.c
+ sanei_udp.c sanei_magic.c sanei_ir.c
if HAVE_JPEG
libsanei_la_SOURCES += sanei_jpeg.c
endif
diff --git a/sanei/Makefile.in b/sanei/Makefile.in
index 66fc549..1fba44d 100644
--- a/sanei/Makefile.in
+++ b/sanei/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -102,7 +102,7 @@ am__libsanei_la_SOURCES_DIST = sanei_ab306.c sanei_constrain_value.c \
sanei_config.c sanei_config2.c sanei_pio.c sanei_pa4s2.c \
sanei_auth.c sanei_usb.c sanei_thread.c sanei_pv8630.c \
sanei_pp.c sanei_lm983x.c sanei_access.c sanei_tcp.c \
- sanei_udp.c sanei_magic.c sanei_jpeg.c
+ sanei_udp.c sanei_magic.c sanei_ir.c sanei_jpeg.c
@HAVE_JPEG_TRUE@am__objects_1 = sanei_jpeg.lo
am_libsanei_la_OBJECTS = sanei_ab306.lo sanei_constrain_value.lo \
sanei_init_debug.lo sanei_net.lo sanei_wire.lo \
@@ -110,7 +110,7 @@ am_libsanei_la_OBJECTS = sanei_ab306.lo sanei_constrain_value.lo \
sanei_config.lo sanei_config2.lo sanei_pio.lo sanei_pa4s2.lo \
sanei_auth.lo sanei_usb.lo sanei_thread.lo sanei_pv8630.lo \
sanei_pp.lo sanei_lm983x.lo sanei_access.lo sanei_tcp.lo \
- sanei_udp.lo sanei_magic.lo $(am__objects_1)
+ sanei_udp.lo sanei_magic.lo sanei_ir.lo $(am__objects_1)
libsanei_la_OBJECTS = $(am_libsanei_la_OBJECTS)
AM_V_lt = $(am__v_lt_@AM_V@)
am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -269,6 +269,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -280,11 +281,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -358,7 +362,7 @@ libsanei_la_SOURCES = sanei_ab306.c sanei_constrain_value.c \
sanei_config.c sanei_config2.c sanei_pio.c sanei_pa4s2.c \
sanei_auth.c sanei_usb.c sanei_thread.c sanei_pv8630.c \
sanei_pp.c sanei_lm983x.c sanei_access.c sanei_tcp.c \
- sanei_udp.c sanei_magic.c $(am__append_1)
+ sanei_udp.c sanei_magic.c sanei_ir.c $(am__append_1)
EXTRA_DIST = linux_sg3_err.h os2_srb.h sanei_DomainOS.c sanei_DomainOS.h
all: all-am
@@ -424,6 +428,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sanei_config2.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sanei_constrain_value.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sanei_init_debug.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sanei_ir.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sanei_jpeg.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sanei_lm983x.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sanei_magic.Plo@am__quote@
@@ -444,14 +449,14 @@ distclean-compile:
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
diff --git a/sanei/sanei_ab306.c b/sanei/sanei_ab306.c
index 91d647d..c663d38 100644
--- a/sanei/sanei_ab306.c
+++ b/sanei/sanei_ab306.c
@@ -51,6 +51,9 @@
#ifdef HAVE_SYS_IO_H
# include <sys/io.h> /* use where available (glibc 2.x, for example) */
+# ifndef SANE_HAVE_SYS_IO_H_WITH_INB_OUTB
+# define IO_SUPPORT_MISSING
+# endif
#elif HAVE_ASM_IO_H
# include <asm/io.h> /* ugly, but backwards compatible */
#elif defined (__i386__) && defined (__GNUC__)
diff --git a/sanei/sanei_ir.c b/sanei/sanei_ir.c
new file mode 100644
index 0000000..42e82ba
--- /dev/null
+++ b/sanei/sanei_ir.c
@@ -0,0 +1,1205 @@
+/** @file sanei_ir.c
+ *
+ * sanei_ir - functions for utilizing the infrared plane
+ *
+ * Copyright (C) 2012 Michael Rickmann <mrickma@gwdg.de>
+ *
+ * This file is part of the SANE package.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston,
+ * MA 02111-1307, USA.
+ *
+ * The threshold yen, otsu and max_entropy routines have been
+ * adapted from the FOURIER 0.8 library by M. Emre Celebi,
+ * http://sourceforge.net/projects/fourier-ipal/ which is
+ * licensed under the GNU General Public License version 2 or later.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <values.h>
+#include <math.h>
+
+#define BACKEND_NAME sanei_ir /* name of this module for debugging */
+
+#include "../include/sane/sane.h"
+#include "../include/sane/sanei_debug.h"
+#include "../include/sane/sanei_ir.h"
+#include "../include/sane/sanei_magic.h"
+
+
+double *
+sanei_ir_create_norm_histo (const SANE_Parameters * params, const SANE_Uint *img_data);
+double * sanei_ir_accumulate_norm_histo (double * histo_data);
+
+
+/* Initialize sanei_ir
+ */
+void
+sanei_ir_init (void)
+{
+ DBG_INIT ();
+}
+
+
+/* Create a normalized histogram of a grayscale image, internal
+ */
+double *
+sanei_ir_create_norm_histo (const SANE_Parameters * params,
+ const SANE_Uint *img_data)
+{
+ int is, i;
+ int num_pixels;
+ int *histo_data;
+ double *histo;
+ double term;
+
+ DBG (10, "sanei_ir_create_norm_histo\n");
+
+ if ((params->format != SANE_FRAME_GRAY)
+ && (params->format != SANE_FRAME_RED)
+ && (params->format != SANE_FRAME_GREEN)
+ && (params->format != SANE_FRAME_BLUE))
+ {
+ DBG (5, "sanei_ir_create_norm_histo: invalid format\n");
+ return NULL;
+ }
+
+ /* Allocate storage for the histogram */
+ histo_data = calloc (HISTOGRAM_SIZE, sizeof (int));
+ histo = malloc (HISTOGRAM_SIZE * sizeof (double));
+ if ((histo == NULL) || (histo_data == NULL))
+ {
+ DBG (5, "sanei_ir_create_norm_histo: no buffers\n");
+ if (histo) free (histo);
+ if (histo_data) free (histo_data);
+ return NULL;
+ }
+
+ num_pixels = params->pixels_per_line * params->lines;
+
+ DBG (1, "sanei_ir_create_norm_histo: %d pixels_per_line, %d lines => %d num_pixels\n", params->pixels_per_line, params->lines, num_pixels);
+ DBG (1, "sanei_ir_create_norm_histo: histo_data[] with %d x %ld bytes\n", HISTOGRAM_SIZE, sizeof(int));
+ /* Populate the histogram */
+ is = 16 - HISTOGRAM_SHIFT; /* Number of data bits to ignore */
+ DBG (1, "sanei_ir_create_norm_histo: depth %d, HISTOGRAM_SHIFT %d => ignore %d bits\n", params->depth, HISTOGRAM_SHIFT, is);
+ for (i = num_pixels; i > 0; i--) {
+ histo_data[*img_data++ >> is]++;
+ }
+
+ /* Calculate the normalized histogram */
+ term = 1.0 / (double) num_pixels;
+ for (i = 0; i < HISTOGRAM_SIZE; i++)
+ histo[i] = term * (double) histo_data[i];
+
+ free (histo_data);
+ return histo;
+}
+
+
+/* Create the normalized histogram of a grayscale image
+ */
+SANE_Status
+sanei_ir_create_norm_histogram (const SANE_Parameters * params,
+ const SANE_Uint *img_data,
+ double ** histogram)
+{
+ double *histo;
+
+ DBG (10, "sanei_ir_create_norm_histogram\n");
+
+ histo = sanei_ir_create_norm_histo (params, img_data);
+ if (!histo)
+ return SANE_STATUS_NO_MEM;
+
+ *histogram = histo;
+ return SANE_STATUS_GOOD;
+}
+
+/* Accumulate a normalized histogram, internal
+ */
+double *
+sanei_ir_accumulate_norm_histo (double * histo_data)
+{
+ int i;
+ double *accum_data;
+
+ accum_data = malloc (HISTOGRAM_SIZE * sizeof (double));
+ if (accum_data == NULL)
+ {
+ DBG (5, "sanei_ir_accumulate_norm_histo: Insufficient memory !\n");
+ return NULL;
+ }
+
+ accum_data[0] = histo_data[0];
+ for (i = 1; i < HISTOGRAM_SIZE; i++)
+ accum_data[i] = accum_data[i - 1] + histo_data[i];
+
+ return accum_data;
+}
+
+/* Implements Yen's thresholding method
+ */
+SANE_Status
+sanei_ir_threshold_yen (const SANE_Parameters * params,
+ double * norm_histo, int *thresh)
+{
+ double *P1 = NULL; /* cumulative normalized histogram */
+ double *P1_sq = NULL; /* cumulative normalized histogram */
+ double *P2_sq = NULL;
+ double crit, max_crit;
+ int threshold, i;
+ SANE_Status ret = SANE_STATUS_NO_MEM;
+
+ DBG (10, "sanei_ir_threshold_yen\n");
+
+ P1 = sanei_ir_accumulate_norm_histo (norm_histo);
+ P1_sq = malloc (HISTOGRAM_SIZE * sizeof (double));
+ P2_sq = malloc (HISTOGRAM_SIZE * sizeof (double));
+ if (!P1 || !P1_sq || !P2_sq)
+ {
+ DBG (5, "sanei_ir_threshold_yen: no buffers\n");
+ goto cleanup;
+ }
+
+ /* calculate cumulative squares */
+ P1_sq[0] = norm_histo[0] * norm_histo[0];
+ for (i = 1; i < HISTOGRAM_SIZE; i++)
+ P1_sq[i] = P1_sq[i - 1] + norm_histo[i] * norm_histo[i];
+ P2_sq[HISTOGRAM_SIZE - 1] = 0.0;
+ for (i = HISTOGRAM_SIZE - 2; i >= 0; i--)
+ P2_sq[i] = P2_sq[i + 1] + norm_histo[i + 1] * norm_histo[i + 1];
+
+ /* Find the threshold that maximizes the criterion */
+ threshold = INT_MIN;
+ max_crit = DBL_MIN;
+ for (i = 0; i < HISTOGRAM_SIZE; i++)
+ {
+ crit =
+ -1.0 * SAFE_LOG (P1_sq[i] * P2_sq[i]) +
+ 2 * SAFE_LOG (P1[i] * (1.0 - P1[i]));
+ if (crit > max_crit)
+ {
+ max_crit = crit;
+ threshold = i;
+ }
+ }
+
+ if (threshold == INT_MIN)
+ {
+ DBG (5, "sanei_ir_threshold_yen: no threshold found\n");
+ ret = SANE_STATUS_INVAL;
+ }
+ else
+ {
+ ret = SANE_STATUS_GOOD;
+ if (params->depth > 8)
+ {
+ i = 1 << (params->depth - HISTOGRAM_SHIFT);
+ *thresh = threshold * i + i / 2;
+ }
+ else
+ *thresh = threshold;
+ DBG (10, "sanei_ir_threshold_yen: threshold %d\n", *thresh);
+ }
+
+ cleanup:
+ if (P1)
+ free (P1);
+ if (P1_sq)
+ free (P1_sq);
+ if (P2_sq)
+ free (P2_sq);
+ return ret;
+}
+
+
+/* Implements Otsu's thresholding method
+ */
+SANE_Status
+sanei_ir_threshold_otsu (const SANE_Parameters * params,
+ double * norm_histo, int *thresh)
+{
+ double *cnh = NULL;
+ double *mean = NULL;
+ double total_mean;
+ double bcv, max_bcv;
+ int first_bin, last_bin;
+ int threshold, i;
+ SANE_Status ret = SANE_STATUS_NO_MEM;
+
+ DBG (10, "sanei_ir_threshold_otsu\n");
+
+ cnh = sanei_ir_accumulate_norm_histo (norm_histo);
+ mean = malloc (HISTOGRAM_SIZE * sizeof (double));
+ if (!cnh || !mean)
+ {
+ DBG (5, "sanei_ir_threshold_otsu: no buffers\n");
+ goto cleanup;
+ }
+
+ mean[0] = 0.0;
+ for (i = 1; i < HISTOGRAM_SIZE; i++)
+ mean[i] = mean[i - 1] + i * norm_histo[i];
+ total_mean = mean[HISTOGRAM_SIZE - 1];
+
+ first_bin = 0;
+ for (i = 0; i < HISTOGRAM_SIZE; i++)
+ if (cnh[i] != 0)
+ {
+ first_bin = i;
+ break;
+ }
+ last_bin = HISTOGRAM_SIZE - 1;
+ for (i = HISTOGRAM_SIZE - 1; i >= first_bin; i--)
+ if (1.0 - cnh[i] != 0)
+ {
+ last_bin = i;
+ break;
+ }
+
+ threshold = INT_MIN;
+ max_bcv = 0.0;
+ for (i = first_bin; i <= last_bin; i++)
+ {
+ bcv = total_mean * cnh[i] - mean[i];
+ bcv *= bcv / (cnh[i] * (1.0 - cnh[i]));
+ if (max_bcv < bcv)
+ {
+ max_bcv = bcv;
+ threshold = i;
+ }
+ }
+
+ if (threshold == INT_MIN)
+ {
+ DBG (5, "sanei_ir_threshold_otsu: no threshold found\n");
+ ret = SANE_STATUS_INVAL;
+ }
+ else
+ {
+ ret = SANE_STATUS_GOOD;
+ if (params->depth > 8)
+ {
+ i = 1 << (params->depth - HISTOGRAM_SHIFT);
+ *thresh = threshold * i + i / 2;
+ }
+ else
+ *thresh = threshold;
+ DBG (10, "sanei_ir_threshold_otsu: threshold %d\n", *thresh);
+ }
+ cleanup:
+ if (cnh)
+ free (cnh);
+ if (mean)
+ free (mean);
+ return ret;
+}
+
+
+/* Implements a Maximum Entropy thresholding method
+ */
+SANE_Status
+sanei_ir_threshold_maxentropy (const SANE_Parameters * params,
+ double * norm_histo, int *thresh)
+{
+ int ih, it;
+ int threshold;
+ int first_bin;
+ int last_bin;
+ double tot_ent, max_ent; /* entropies */
+ double ent_back, ent_obj;
+ double *P1; /* cumulative normalized histogram */
+ double *P2;
+ SANE_Status ret = SANE_STATUS_NO_MEM;
+
+ DBG (10, "sanei_ir_threshold_maxentropy\n");
+
+ /* Calculate the cumulative normalized histogram */
+ P1 = sanei_ir_accumulate_norm_histo (norm_histo);
+ P2 = malloc (HISTOGRAM_SIZE * sizeof (double));
+ if (!P1 || !P2)
+ {
+ DBG (5, "sanei_ir_threshold_maxentropy: no buffers\n");
+ goto cleanup;
+ }
+
+ for ( ih = 0; ih < HISTOGRAM_SIZE; ih++ )
+ P2[ih] = 1.0 - P1[ih];
+
+ first_bin = 0;
+ for ( ih = 0; ih < HISTOGRAM_SIZE; ih++ )
+ if (P1[ih] != 0)
+ {
+ first_bin = ih;
+ break;
+ }
+ last_bin = HISTOGRAM_SIZE - 1;
+ for ( ih = HISTOGRAM_SIZE - 1; ih >= first_bin; ih-- )
+ if (P2[ih] != 0)
+ {
+ last_bin = ih;
+ break;
+ }
+
+ /* Calculate the total entropy each gray-level
+ * and find the threshold that maximizes it
+ */
+ threshold = INT_MIN;
+ max_ent = DBL_MIN;
+ for ( it = first_bin; it <= last_bin; it++ )
+ {
+ /* Entropy of the background pixels */
+ ent_back = 0.0;
+ for ( ih = 0; ih <= it; ih++ )
+ if (norm_histo[ih] != 0)
+ ent_back -= ( norm_histo[ih] / P1[it] ) * log ( norm_histo[ih] / P1[it] );
+
+ /* Entropy of the object pixels */
+ ent_obj = 0.0;
+ for ( ih = it + 1; ih < HISTOGRAM_SIZE; ih++ )
+ if (norm_histo[ih] != 0)
+ ent_obj -= ( norm_histo[ih] / P2[it] ) * log ( norm_histo[ih] / P2[it] );
+
+ /* Total entropy */
+ tot_ent = ent_back + ent_obj;
+
+ if ( max_ent < tot_ent )
+ {
+ max_ent = tot_ent;
+ threshold = it;
+ }
+ }
+
+ if (threshold == INT_MIN)
+ {
+ DBG (5, "sanei_ir_threshold_maxentropy: no threshold found\n");
+ ret = SANE_STATUS_INVAL;
+ }
+ else
+ {
+ ret = SANE_STATUS_GOOD;
+ if (params->depth > 8)
+ {
+ it = 1 << (params->depth - HISTOGRAM_SHIFT);
+ *thresh = threshold * it + it / 2;
+ }
+ else
+ *thresh = threshold;
+ DBG (10, "sanei_ir_threshold_maxentropy: threshold %d\n", *thresh);
+ }
+
+ cleanup:
+ if (P1)
+ free (P1);
+ if (P2)
+ free (P2);
+ return ret;
+}
+
+/* Generate gray scale luminance image from separate R, G, B images
+ */
+SANE_Status
+sanei_ir_RGB_luminance (SANE_Parameters * params, const SANE_Uint **in_img,
+ SANE_Uint **out_img)
+{
+ SANE_Uint *outi;
+ int itop, i;
+
+ if ((params->depth < 8) || (params->depth > 16) ||
+ (params->format != SANE_FRAME_GRAY))
+ {
+ DBG (5, "sanei_ir_RGB_luminance: invalid format\n");
+ return SANE_STATUS_UNSUPPORTED;
+ }
+
+ itop = params->pixels_per_line * params->lines;
+ outi = malloc (itop * sizeof(SANE_Uint));
+ if (!outi)
+ {
+ DBG (5, "sanei_ir_RGB_luminance: can not allocate out_img\n");
+ return SANE_STATUS_NO_MEM;
+ }
+
+ for (i = itop; i > 0; i--)
+ *(outi++) = (218 * (int) *(in_img[0]++) +
+ 732 * (int) *(in_img[1]++) +
+ 74 * (int) *(in_img[2]++)) >> 10;
+ *out_img = outi;
+ return SANE_STATUS_GOOD;
+}
+
+/* Convert image from >8 bit depth to an 8 bit image
+ */
+SANE_Status
+sanei_ir_to_8bit (SANE_Parameters * params, const SANE_Uint *in_img,
+ SANE_Parameters * out_params, SANE_Uint **out_img)
+{
+ SANE_Uint *outi;
+ size_t ssize;
+ int i, is;
+
+ if ((params->depth < 8) || (params->depth > 16))
+ {
+ DBG (5, "sanei_ir_to_8bit: invalid format\n");
+ return SANE_STATUS_UNSUPPORTED;
+ }
+ ssize = params->pixels_per_line * params->lines;
+ if (params->format == SANE_FRAME_RGB)
+ ssize *= 3;
+ outi = malloc (ssize * sizeof(SANE_Uint));
+ if (!outi)
+ {
+ DBG (5, "sanei_ir_to_8bit: can not allocate out_img\n");
+ return SANE_STATUS_NO_MEM;
+ }
+
+ if (out_params)
+ {
+ memmove (out_params, params, sizeof(SANE_Parameters));
+ out_params->bytes_per_line = out_params->pixels_per_line;
+ if (params->format == SANE_FRAME_RGB)
+ out_params->bytes_per_line *= 3;
+ out_params->depth = 8;
+ }
+
+ memmove (outi, in_img, ssize * sizeof(SANE_Uint));
+ is = params->depth - 8;
+ for (i = ssize; i > 0; i--) {
+ *outi = *outi >> is, outi += 2;
+ }
+
+ *out_img = outi;
+ return SANE_STATUS_GOOD;
+}
+
+/* allocate and initialize logarithmic lookup table
+ */
+SANE_Status
+sanei_ir_ln_table (int len, double **lut_ln)
+{
+ double *llut;
+ int i;
+
+ DBG (10, "sanei_ir_ln_table\n");
+
+ llut = malloc (len * sizeof (double));
+ if (!llut)
+ {
+ DBG (5, "sanei_ir_ln_table: no table\n");
+ return SANE_STATUS_NO_MEM;
+ }
+ llut[0] = 0;
+ llut[1] = 0;
+ for (i = 2; i < len; i++)
+ llut[i] = log ((double) i);
+
+ *lut_ln = llut;
+ return SANE_STATUS_GOOD;
+}
+
+
+/* Reduce red spectral overlap from an infrared image plane
+ */
+SANE_Status
+sanei_ir_spectral_clean (const SANE_Parameters * params, double *lut_ln,
+ const SANE_Uint *red_data,
+ SANE_Uint *ir_data)
+{
+ const SANE_Uint *rptr;
+ SANE_Uint *iptr;
+ SANE_Int depth;
+ double *llut;
+ double rval, rsum, rrsum;
+ double risum, rfac, radd;
+ double *norm_histo;
+ int64_t isum;
+ int *calc_buf, *calc_ptr;
+ int ival, imin, imax;
+ int itop, len, ssize;
+ int thresh_low, thresh;
+ int irand, i;
+ SANE_Status status;
+
+ DBG (10, "sanei_ir_spectral_clean\n");
+
+ itop = params->pixels_per_line * params->lines;
+ calc_buf = malloc (itop * sizeof (int)); /* could save this */
+ if (!calc_buf)
+ {
+ DBG (5, "sanei_ir_spectral_clean: no buffer\n");
+ return SANE_STATUS_NO_MEM;
+ }
+
+ depth = params->depth;
+ len = 1 << depth;
+ if (lut_ln)
+ llut = lut_ln;
+ else
+ {
+ status = sanei_ir_ln_table (len, &llut);
+ if (status != SANE_STATUS_GOOD) {
+ free (calc_buf);
+ return status;
+ }
+ }
+
+ /* determine not transparent areas to exclude them later
+ * TODO: this has not been tested for negatives
+ */
+ thresh_low = INT_MAX;
+ status =
+ sanei_ir_create_norm_histogram (params, ir_data, &norm_histo);
+ if (status != SANE_STATUS_GOOD)
+ {
+ DBG (5, "sanei_ir_spectral_clean: no buffer\n");
+ free (calc_buf);
+ return SANE_STATUS_NO_MEM;
+ }
+
+ /* TODO: remember only needed if cropping is not ok */
+ status = sanei_ir_threshold_maxentropy (params, norm_histo, &thresh);
+ if (status == SANE_STATUS_GOOD)
+ thresh_low = thresh;
+ status = sanei_ir_threshold_otsu (params, norm_histo, &thresh);
+ if ((status == SANE_STATUS_GOOD) && (thresh < thresh_low))
+ thresh_low = thresh;
+ status = sanei_ir_threshold_yen (params, norm_histo, &thresh);
+ if ((status == SANE_STATUS_GOOD) && (thresh < thresh_low))
+ thresh_low = thresh;
+ if (thresh_low == INT_MAX)
+ thresh_low = 0;
+ else
+ thresh_low /= 2;
+ DBG (10, "sanei_ir_spectral_clean: low threshold %d\n", thresh_low);
+
+ /* calculate linear regression ired (red) from randomly chosen points */
+ ssize = itop / 2;
+ if (SAMPLE_SIZE < ssize)
+ ssize = SAMPLE_SIZE;
+ isum = 0;
+ rsum = rrsum = risum = 0.0;
+ i = ssize;
+ while (i > 0)
+ {
+ irand = rand () % itop;
+ rval = llut[red_data[irand]];
+ ival = ir_data[irand];
+ if (ival > thresh_low)
+ {
+ isum += ival;
+ rsum += rval;
+ rrsum += rval * rval;
+ risum += rval * (double) ival;
+ i--;
+ }
+ }
+
+ /* "a" in ired = b + a * ln (red) */
+ rfac =
+ ((double) ssize * risum -
+ rsum * (double) isum) / ((double) ssize * rrsum - rsum * rsum);
+ radd = ((double) isum - rfac * rsum) / (double) ssize; /* "b" unused */
+
+ DBG (10, "sanei_ir_spectral_clean: n = %d, ired(red) = %f * ln(red) + %f\n",
+ ssize, rfac, radd);
+
+ /* now calculate ired' = ired - a * ln (red) */
+ imin = INT_MAX;
+ imax = INT_MIN;
+ rptr = red_data;
+ iptr = ir_data;
+ calc_ptr = calc_buf;
+ for (i = itop; i > 0; i--)
+ {
+ ival = *iptr++ - (int) (rfac * llut[*rptr++] + 0.5);
+ if (ival > imax)
+ imax = ival;
+ if (ival < imin)
+ imin = ival;
+ *calc_ptr++ = ival;
+ }
+
+ /* scale the result back into the ired image */
+ calc_ptr = calc_buf;
+ iptr = ir_data;
+ rfac = (double) (len - 1) / (double) (imax - imin);
+ for (i = itop; i > 0; i--)
+ *iptr++ = (double) (*calc_ptr++ - imin) * rfac;
+
+ if (!lut_ln)
+ free (llut);
+ free (calc_buf);
+ free (norm_histo);
+ return SANE_STATUS_GOOD;
+}
+
+
+/* Hopefully fast mean filter
+ * JV: what does this do? Remove local mean?
+ */
+SANE_Status
+sanei_ir_filter_mean (const SANE_Parameters * params,
+ const SANE_Uint *in_img, SANE_Uint *out_img,
+ int win_rows, int win_cols)
+{
+ const SANE_Uint *src;
+ SANE_Uint *dest;
+ int num_cols, num_rows;
+ int itop, iadd, isub;
+ int ndiv, the_sum;
+ int nrow, ncol;
+ int hwr, hwc;
+ int *sum;
+ int i, j;
+
+ DBG (10, "sanei_ir_filter_mean, window: %d x%d\n", win_rows, win_cols);
+
+ if (((win_rows & 1) == 0) || ((win_cols & 1) == 0))
+ {
+ DBG (5, "sanei_ir_filter_mean: window even sized\n");
+ return SANE_STATUS_INVAL;
+ }
+
+ num_cols = params->pixels_per_line;
+ num_rows = params->lines;
+
+ sum = malloc (num_cols * sizeof (int));
+ if (!sum)
+ {
+ DBG (5, "sanei_ir_filter_mean: no buffer for sums\n");
+ return SANE_STATUS_NO_MEM;
+ }
+ dest = out_img;
+
+ hwr = win_rows / 2; /* half window sizes */
+ hwc = win_cols / 2;
+
+ /* pre-pre calculation */
+ for (j = 0; j < num_cols; j++)
+ {
+ sum[j] = 0;
+ src = in_img + j;
+ for (i = 0; i < hwr; i++)
+ {
+ sum[j] += *src;
+ src += num_cols;
+ }
+ }
+
+ itop = num_rows * num_cols;
+ iadd = hwr * num_cols;
+ isub = (hwr - win_rows) * num_cols;
+ nrow = hwr;
+
+ for (i = 0; i < num_rows; i++)
+ {
+ /* update row sums if possible */
+ if (isub >= 0) /* subtract old row */
+ {
+ nrow--;
+ src = in_img + isub;
+ for (j = 0; j < num_cols; j++)
+ sum[j] -= *src++;
+ }
+ isub += num_cols;
+
+ if (iadd < itop) /* add new row */
+ {
+ nrow++;
+ src = in_img + iadd;
+ for (j = 0; j < num_cols; j++)
+ sum[j] += *src++;
+ }
+ iadd += num_cols;
+
+ /* now we do the image columns using only the precalculated sums */
+
+ the_sum = 0; /* precalculation */
+ for (j = 0; j < hwc; j++)
+ the_sum += sum[j];
+ ncol = hwc;
+
+ /* at the left margin, real index hwc lower */
+ for (j = hwc; j < win_cols; j++)
+ {
+ ncol++;
+ the_sum += sum[j];
+ *dest++ = the_sum / (ncol * nrow);
+ }
+
+ ndiv = ncol * nrow;
+ /* in the middle, real index hwc + 1 higher */
+ for (j = 0; j < num_cols - win_cols; j++)
+ {
+ the_sum -= sum[j];
+ the_sum += sum[j + win_cols];
+ *dest++ = the_sum / ndiv;
+ }
+
+ /* at the right margin, real index hwc + 1 higher */
+ for (j = num_cols - win_cols; j < num_cols - hwc - 1; j++)
+ {
+ ncol--;
+ the_sum -= sum[j]; /* j - hwc - 1 */
+ *dest++ = the_sum / (ncol * nrow);
+ }
+ }
+ free (sum);
+ return SANE_STATUS_GOOD;
+}
+
+
+/* Find noise by adaptive thresholding
+ */
+SANE_Status
+sanei_ir_filter_madmean (const SANE_Parameters * params,
+ const SANE_Uint *in_img,
+ SANE_Uint ** out_img, int win_size,
+ int a_val, int b_val)
+{
+ SANE_Uint *delta_ij, *delta_ptr;
+ SANE_Uint *mad_ij;
+ const SANE_Uint *mad_ptr;
+ SANE_Uint *out_ij, *dest8;
+ double ab_term;
+ int num_rows, num_cols;
+ int threshold, itop;
+ size_t size;
+ int ival, i;
+ int depth;
+ SANE_Status ret = SANE_STATUS_NO_MEM;
+
+ DBG (10, "sanei_ir_filter_madmean\n");
+
+ depth = params->depth;
+ if (depth != 8)
+ {
+ a_val = a_val << (depth - 8);
+ b_val = b_val << (depth - 8);
+ }
+ num_cols = params->pixels_per_line;
+ num_rows = params->lines;
+ itop = num_rows * num_cols;
+ size = itop * sizeof (SANE_Uint);
+ out_ij = malloc (size);
+ delta_ij = malloc (size);
+ mad_ij = malloc (size);
+
+ if (out_ij && delta_ij && mad_ij)
+ {
+ /* get the differences to the local mean */
+ mad_ptr = in_img;
+ if (sanei_ir_filter_mean (params, mad_ptr, delta_ij, win_size, win_size)
+ == SANE_STATUS_GOOD)
+ {
+ delta_ptr = delta_ij;
+ for (i = 0; i < itop; i++)
+ {
+ ival = *mad_ptr++ - *delta_ptr;
+ *delta_ptr++ = abs (ival);
+ }
+ /* make the second filtering window a bit larger */
+ win_size = MAD_WIN2_SIZE(win_size);
+ /* and get the local mean differences */
+ if (sanei_ir_filter_mean
+ (params, delta_ij, mad_ij, win_size,
+ win_size) == SANE_STATUS_GOOD)
+ {
+ mad_ptr = mad_ij;
+ delta_ptr = delta_ij;
+ dest8 = out_ij;
+ /* construct the noise map */
+ ab_term = (b_val - a_val) / (double) b_val;
+ for (i = 0; i < itop; i++)
+ {
+ /* by calculating the threshold */
+ ival = *mad_ptr++;
+ if (ival >= b_val) /* outlier */
+ threshold = a_val;
+ else
+ threshold = a_val + (double) ival *ab_term;
+ /* above threshold is noise, indicated by 0 */
+ if (*delta_ptr++ >= threshold)
+ *dest8++ = 0;
+ else
+ *dest8++ = 255;
+ }
+ *out_img = out_ij;
+ ret = SANE_STATUS_GOOD;
+ }
+ }
+ }
+ else
+ DBG (5, "sanei_ir_filter_madmean: Cannot allocate buffers\n");
+
+ free (mad_ij);
+ free (delta_ij);
+ return ret;
+}
+
+
+/* Add dark pixels to mask from static threshold
+ */
+void
+sanei_ir_add_threshold (const SANE_Parameters * params,
+ const SANE_Uint *in_img,
+ SANE_Uint * mask_img, int threshold)
+{
+ const SANE_Uint *in_ptr;
+ SANE_Uint *mask_ptr;
+ int itop, i;
+
+ DBG (10, "sanei_ir_add_threshold\n");
+
+ itop = params->pixels_per_line * params->lines;
+ in_ptr = in_img;
+ mask_ptr = mask_img;
+
+ for (i = itop; i > 0; i--)
+ {
+ if (*in_ptr++ <= threshold)
+ *mask_ptr = 0;
+ mask_ptr++;
+ }
+}
+
+
+/* Calculate minimal Manhattan distances for an image mask
+ */
+void
+sanei_ir_manhattan_dist (const SANE_Parameters * params,
+ const SANE_Uint * mask_img, unsigned int *dist_map,
+ unsigned int *idx_map, unsigned int erode)
+{
+ const SANE_Uint *mask;
+ unsigned int *index, *manhattan;
+ int rows, cols, itop;
+ int i, j;
+
+ DBG (10, "sanei_ir_manhattan_dist\n");
+
+ if (erode != 0)
+ erode = 255;
+
+ /* initialize maps */
+ cols = params->pixels_per_line;
+ rows = params->lines;
+ itop = rows * cols;
+ mask = mask_img;
+ manhattan = dist_map;
+ index = idx_map;
+ for (i = 0; i < itop; i++)
+ {
+ *manhattan++ = *mask++;
+ *index++ = i;
+ }
+
+ /* traverse from top left to bottom right */
+ manhattan = dist_map;
+ index = idx_map;
+ for (i = 0; i < rows; i++)
+ for (j = 0; j < cols; j++)
+ {
+ if (*manhattan == erode)
+ {
+ /* take original, distance = 0, index stays the same */
+ *manhattan = 0;
+ }
+ else
+ {
+ /* assume maximal distance to clean pixel */
+ *manhattan = cols + rows;
+ /* or one further away than pixel to the top */
+ if (i > 0)
+ if (manhattan[-cols] + 1 < *manhattan)
+ {
+ *manhattan = manhattan[-cols] + 1;
+ *index = index[-cols]; /* index follows */
+ }
+ /* or one further away than pixel to the left */
+ if (j > 0)
+ {
+ if (manhattan[-1] + 1 < *manhattan)
+ {
+ *manhattan = manhattan[-1] + 1;
+ *index = index[-1]; /* index follows */
+ }
+ if (manhattan[-1] + 1 == *manhattan)
+ if (rand () % 2 == 0) /* chose index */
+ *index = index[-1];
+ }
+ }
+ manhattan++;
+ index++;
+ }
+
+ /* traverse from bottom right to top left */
+ manhattan = dist_map + itop - 1;
+ index = idx_map + itop - 1;
+ for (i = rows - 1; i >= 0; i--)
+ for (j = cols - 1; j >= 0; j--)
+ {
+ if (i < rows - 1)
+ {
+ /* either what we had on the first pass
+ or one more than the pixel to the bottm */
+ if (manhattan[+cols] + 1 < *manhattan)
+ {
+ *manhattan = manhattan[+cols] + 1;
+ *index = index[+cols]; /* index follows */
+ }
+ if (manhattan[+cols] + 1 == *manhattan)
+ if (rand () % 2 == 0) /* chose index */
+ *index = index[+cols];
+ }
+ if (j < cols - 1)
+ {
+ /* or one more than pixel to the right */
+ if (manhattan[1] + 1 < *manhattan)
+ {
+ *manhattan = manhattan[1] + 1;
+ *index = index[1]; /* index follows */
+ }
+ if (manhattan[1] + 1 == *manhattan)
+ if (rand () % 2 == 0) /* chose index */
+ *index = index[1];
+ }
+ manhattan--;
+ index--;
+ }
+}
+
+
+/* dilate or erode a mask image */
+
+void
+sanei_ir_dilate (const SANE_Parameters *params, SANE_Uint *mask_img,
+ unsigned int *dist_map, unsigned int *idx_map, int by)
+{
+ SANE_Uint *mask;
+ unsigned int *manhattan;
+ unsigned int erode;
+ unsigned int thresh;
+ int i, itop;
+
+ DBG (10, "sanei_ir_dilate\n");
+
+ if (by == 0)
+ return;
+ if (by > 0)
+ {
+ erode = 0;
+ thresh = by;
+ }
+ else
+ {
+ erode = 1;
+ thresh = -by;
+ }
+
+ itop = params->pixels_per_line * params->lines;
+ mask = mask_img;
+ sanei_ir_manhattan_dist (params, mask_img, dist_map, idx_map, erode);
+
+ manhattan = dist_map;
+ for (i = 0; i < itop; i++)
+ {
+ if (*manhattan++ <= thresh)
+ *mask++ = 0;
+ else
+ *mask++ = 255;
+ }
+
+ return;
+}
+
+
+/* Suggest cropping for dark margins of positive film
+ */
+void
+sanei_ir_find_crop (const SANE_Parameters * params,
+ unsigned int * dist_map, int inner, int * edges)
+{
+ int width = params->pixels_per_line;
+ int height = params->lines;
+ uint64_t sum_x, sum_y, n;
+ int64_t sum_xx, sum_xy;
+ double a, b, mami;
+ unsigned int *src;
+ int off1, off2, inc, wh, i, j;
+
+ DBG (10, "sanei_ir_find_crop\n");
+
+ /* loop through top, bottom, left, right */
+ for (j = 0; j < 4; j++)
+ {
+ if (j < 2) /* top, bottom */
+ {
+ off1 = width / 8; /* only middle 3/4 */
+ off2 = width - off1;
+ n = width - 2 * off1;
+ src = dist_map + off1; /* first row */
+ inc = 1;
+ wh = width;
+ if (j == 1) /* last row */
+ src += (height - 1) * width;
+ }
+ else /* left, right */
+ {
+ off1 = height / 8; /* only middle 3/4 */
+ off2 = height - off1;
+ n = height - 2 * off1;
+ src = dist_map + (off1 * width); /* first column */
+ inc = width;
+ wh = height;
+ if (j == 3)
+ src += width - 1; /* last column */
+ }
+
+ /* calculate linear regression */
+ sum_x = 0; sum_y = 0;
+ sum_xx = 0; sum_xy = 0;
+ for (i = off1; i < off2; i++)
+ {
+ sum_x += i;
+ sum_y += *src;
+ sum_xx += i * i;
+ sum_xy += i * (*src);
+ src += inc;
+ }
+ b = ((double) n * (double) sum_xy - (double) sum_x * (double) sum_y)
+ / ((double) n * (double) sum_xx - (double) sum_x * (double) sum_x);
+ a = ((double) sum_y - b * (double) sum_x) / (double) n;
+
+ DBG (10, "sanei_ir_find_crop: y = %f + %f * x\n", a, b);
+
+ /* take maximal/minimal value from either side */
+ mami = a + b * (wh - 1);
+ if (inner)
+ {
+ if (a > mami)
+ mami = a;
+ }
+ else
+ {
+ if (a < mami)
+ mami = a;
+ }
+ edges[j] = mami + 0.5;
+ }
+ edges[1] = height - edges[1];
+ edges[3] = width - edges[3];
+
+ DBG (10, "sanei_ir_find_crop: would crop at top: %d, bot: %d, left %d, right %d\n",
+ edges[0], edges[1], edges[2], edges[3]);
+
+ return;
+}
+
+
+/* Dilate clean image parts into dirty ones and smooth
+ */
+SANE_Status
+sanei_ir_dilate_mean (const SANE_Parameters * params,
+ SANE_Uint **in_img,
+ SANE_Uint * mask_img,
+ int dist_max, int expand, int win_size,
+ SANE_Bool smooth, int inner,
+ int *crop)
+{
+ SANE_Uint *color;
+ SANE_Uint *plane;
+ unsigned int *dist_map, *manhattan;
+ unsigned int *idx_map, *index;
+ int dist;
+ int rows, cols;
+ int k, i, itop;
+ SANE_Status ret = SANE_STATUS_NO_MEM;
+
+ DBG (10, "sanei_ir_dilate_mean(): dist max = %d, expand = %d, win size = %d, smooth = %d, inner = %d\n",
+ dist_max, expand, win_size, smooth, inner);
+
+ cols = params->pixels_per_line;
+ rows = params->lines;
+ itop = rows * cols;
+ idx_map = malloc (itop * sizeof (unsigned int));
+ dist_map = malloc (itop * sizeof (unsigned int));
+ plane = malloc (itop * sizeof (SANE_Uint));
+
+ if (!idx_map || !dist_map || !plane)
+ DBG (5, "sanei_ir_dilate_mean: Cannot allocate buffers\n");
+ else
+ {
+ /* expand dirty regions into their half dirty surround*/
+ if (expand > 0)
+ sanei_ir_dilate (params, mask_img, dist_map, idx_map, expand);
+ /* for dirty pixels determine the closest clean ones */
+ sanei_ir_manhattan_dist (params, mask_img, dist_map, idx_map, 1);
+
+ /* use the distance map to find how to crop dark edges */
+ if (crop)
+ sanei_ir_find_crop (params, dist_map, inner, crop);
+
+ /* replace dirty pixels */
+ for (k = 0; k < 3; k++)
+ {
+ manhattan = dist_map;
+ index = idx_map;
+ color = in_img[k];
+ /* first replacement */
+ for (i = 0; i < itop; i++)
+ {
+ dist = *manhattan++;
+ if ((dist != 0) && (dist <= dist_max))
+ color[i] = color[index[i]];
+ }
+ /* adapt pixels to their new surround and
+ * smooth the whole image or the replaced pixels only */
+ ret =
+ sanei_ir_filter_mean (params, color, plane, win_size, win_size);
+ if (ret != SANE_STATUS_GOOD)
+ break;
+ else
+ if (smooth)
+ {
+ /* a second mean results in triangular blur */
+ DBG (10, "sanei_ir_dilate_mean(): smoothing whole image\n");
+ ret =
+ sanei_ir_filter_mean (params, plane, color, win_size,
+ win_size);
+ if (ret != SANE_STATUS_GOOD)
+ break;
+ }
+ else
+ {
+ /* replace with smoothened pixels only */
+ DBG (10, "sanei_ir_dilate_mean(): smoothing replaced pixels only\n");
+ manhattan = dist_map;
+ for (i = 0; i < itop; i++)
+ {
+ dist = *manhattan++;
+ if ((dist != 0) && (dist <= dist_max))
+ color[i] = plane[i];
+ }
+ }
+ }
+ }
+ free (plane);
+ free (dist_map);
+ free (idx_map);
+
+ return ret;
+}
diff --git a/sanei/sanei_pa4s2.c b/sanei/sanei_pa4s2.c
index 8fe4260..c15dd5a 100644
--- a/sanei/sanei_pa4s2.c
+++ b/sanei/sanei_pa4s2.c
@@ -72,7 +72,10 @@
# if defined (__ICC) && __ICC >= 700
# define __GNUC__ 2
# endif
-# include <sys/io.h>
+# include <sys/io.h>
+# ifndef SANE_HAVE_SYS_IO_H_WITH_INB_OUTB
+# define IO_SUPPORT_MISSING
+# endif
# if defined (__ICC) && __ICC >= 700
# undef __GNUC__
# elif defined(__ICC) && defined(HAVE_ASM_IO_H)
diff --git a/sanei/sanei_pio.c b/sanei/sanei_pio.c
index ef00861..00e40ee 100644
--- a/sanei/sanei_pio.c
+++ b/sanei/sanei_pio.c
@@ -61,6 +61,9 @@
#ifdef HAVE_SYS_IO_H
# include <sys/io.h> /* use where available (glibc 2.x, for example) */
+# ifndef SANE_HAVE_SYS_IO_H_WITH_INB_OUTB
+# define IO_SUPPORT_MISSING
+# endif
#elif HAVE_ASM_IO_H
# include <asm/io.h> /* ugly, but backwards compatible */
#elif HAVE_SYS_HW_H
diff --git a/sanei/sanei_pp.c b/sanei/sanei_pp.c
index ced1a85..6146d1e 100644
--- a/sanei/sanei_pp.c
+++ b/sanei/sanei_pp.c
@@ -94,6 +94,9 @@
# define __GNUC__ 2
# endif
# include <sys/io.h>
+# ifndef SANE_HAVE_SYS_IO_H_WITH_INB_OUTB
+# define IO_SUPPORT_MISSING
+# endif
# if defined (__ICC) && __ICC >= 700
# undef __GNUC__
# elif defined(__ICC) && defined(HAVE_ASM_IO_H)
diff --git a/sanei/sanei_thread.c b/sanei/sanei_thread.c
index fd58af2..8db4a21 100644
--- a/sanei/sanei_thread.c
+++ b/sanei/sanei_thread.c
@@ -512,11 +512,15 @@ sanei_thread_waitpid( SANE_Pid pid, int *status )
DBG(2, "* result = %d (%p)\n", stat, (void*)status );
result = pid;
}
- /* call detach in any case to make sure that the thread resources
- * will be freed, when the thread has terminated
- */
- DBG(2, "* detaching thread(%ld)\n", pid );
- pthread_detach((pthread_t)pid);
+ if ( EDEADLK == rc ) {
+ if ( (pthread_t)pid != pthread_self() ) {
+ /* call detach in any case to make sure that the thread resources
+ * will be freed, when the thread has terminated
+ */
+ DBG(2, "* detaching thread(%ld)\n", pid );
+ pthread_detach((pthread_t)pid);
+ }
+ }
if (status)
*status = stat;
diff --git a/sanei/sanei_usb.c b/sanei/sanei_usb.c
index 7401658..f210d4f 100644
--- a/sanei/sanei_usb.c
+++ b/sanei/sanei_usb.c
@@ -154,6 +154,7 @@ typedef struct
SANE_Int control_in_ep;
SANE_Int control_out_ep;
SANE_Int interface_nr;
+ SANE_Int alt_setting;
SANE_Int missing;
#ifdef HAVE_LIBUSB
usb_dev_handle *libusb_handle;
@@ -460,8 +461,6 @@ sanei_libusb_strerror (int errcode)
default:
return "Unknown libusb-1.0 error code";
}
-
- return "Unknown libusb-1.0 error code";
}
#endif /* HAVE_LIBUSB_1_0 */
@@ -635,6 +634,7 @@ static void usbcall_scan_devices(void)
device.product = pDevDesc->idProduct;
device.method = sanei_usb_method_usbcalls;
device.interface_nr = interface;
+ device.alt_setting = 0;
DBG (4, "%s: found usbcalls device (0x%04x/0x%04x) as device number %s\n", __func__,
pDevDesc->idVendor, pDevDesc->idProduct,device.devname);
store_device(device);
@@ -821,7 +821,7 @@ static void libusb_scan_devices(void)
"scanner (%d/%d)\n", __func__, dev->descriptor.idVendor,
dev->descriptor.idProduct, interface,
dev->descriptor.bDeviceClass,
- dev->config[0].interface[interface].altsetting != 0
+ dev->config[0].interface[interface].num_altsetting != 0
? dev->config[0].interface[interface].altsetting[0].
bInterfaceClass : -1);
}
@@ -845,6 +845,7 @@ static void libusb_scan_devices(void)
device.product = dev->descriptor.idProduct;
device.method = sanei_usb_method_libusb;
device.interface_nr = interface;
+ device.alt_setting = 0;
DBG (4,
"%s: found libusb device (0x%04x/0x%04x) interface "
"%d at %s\n", __func__,
@@ -991,7 +992,7 @@ static void libusb_scan_devices(void)
"%s: device 0x%04x/0x%04x, interface %d "
"doesn't look like a scanner (%d/%d)\n", __func__,
vid, pid, interface, desc.bDeviceClass,
- (config0->interface[interface].altsetting != 0)
+ (config0->interface[interface].num_altsetting != 0)
? config0->interface[interface].altsetting[0].bInterfaceClass : -1);
}
@@ -1018,6 +1019,7 @@ static void libusb_scan_devices(void)
device.product = pid;
device.method = sanei_usb_method_libusb;
device.interface_nr = interface;
+ device.alt_setting = 0;
DBG (4,
"%s: found libusb-1.0 device (0x%04x/0x%04x) interface "
"%d at %s\n", __func__,
@@ -1381,30 +1383,32 @@ sanei_usb_open (SANE_String_Const devname, SANE_Int * dn)
"configuration (%d), choosing first config (%d)\n",
dev->descriptor.bNumConfigurations,
dev->config[0].bConfigurationValue);
- }
- result = usb_set_configuration (devices[devcount].libusb_handle,
- dev->config[0].bConfigurationValue);
- if (result < 0)
- {
- SANE_Status status = SANE_STATUS_INVAL;
- DBG (1, "sanei_usb_open: libusb complained: %s\n", usb_strerror ());
- if (errno == EPERM || errno == EACCES)
- {
- DBG (1, "Make sure you run as root or set appropriate "
- "permissions\n");
- status = SANE_STATUS_ACCESS_DENIED;
- }
- else if (errno == EBUSY)
- {
- DBG (3, "Maybe the kernel scanner driver or usblp claims the "
- "interface? Ignoring this error...\n");
- status = SANE_STATUS_GOOD;
- }
- if (status != SANE_STATUS_GOOD)
+ result = usb_set_configuration (devices[devcount].libusb_handle,
+ dev->config[0].bConfigurationValue);
+ if (result < 0)
{
- usb_close (devices[devcount].libusb_handle);
- return status;
+ SANE_Status status = SANE_STATUS_INVAL;
+
+ DBG (1, "sanei_usb_open: libusb complained: %s\n",
+ usb_strerror ());
+ if (errno == EPERM || errno == EACCES)
+ {
+ DBG (1, "Make sure you run as root or set appropriate "
+ "permissions\n");
+ status = SANE_STATUS_ACCESS_DENIED;
+ }
+ else if (errno == EBUSY)
+ {
+ DBG (3, "Maybe the kernel scanner driver or usblp claims the "
+ "interface? Ignoring this error...\n");
+ status = SANE_STATUS_GOOD;
+ }
+ if (status != SANE_STATUS_GOOD)
+ {
+ usb_close (devices[devcount].libusb_handle);
+ return status;
+ }
}
}
@@ -1445,13 +1449,13 @@ sanei_usb_open (SANE_String_Const devname, SANE_Int * dn)
DBG (5, "sanei_usb_open: interface nr: %d\n", i);
DBG (5, "sanei_usb_open: alt_setting nr: %d\n", a);
- /* Start by interfaces found in sanei_usb_init */
- if (c == 0 && i != devices[devcount].interface_nr)
- {
- DBG (5, "sanei_usb_open: interface %d not detected as "
- "a scanner by sanei_usb_init, ignoring.\n", i);
- continue;
- }
+ /* Start by interfaces found in sanei_usb_init */
+ if (c == 0 && i != devices[devcount].interface_nr)
+ {
+ DBG (5, "sanei_usb_open: interface %d not detected as "
+ "a scanner by sanei_usb_init, ignoring.\n", i);
+ continue;
+ }
interface = &dev->config[c].interface[i].altsetting[a];
@@ -1672,37 +1676,40 @@ sanei_usb_open (SANE_String_Const devname, SANE_Int * dn)
"configuration (%d), choosing first config (%d)\n",
desc.bNumConfigurations,
config0->bConfigurationValue);
- }
- result = libusb_set_configuration (devices[devcount].lu_handle,
- config0->bConfigurationValue);
- libusb_free_config_descriptor (config0);
+ result = 0;
+ if (config != config0->bConfigurationValue)
+ result = libusb_set_configuration (devices[devcount].lu_handle,
+ config0->bConfigurationValue);
- if (result < 0)
- {
- SANE_Status status = SANE_STATUS_INVAL;
-
- DBG (1, "sanei_usb_open: libusb complained: %s\n",
- sanei_libusb_strerror (result));
- if (result == LIBUSB_ERROR_ACCESS)
- {
- DBG (1, "Make sure you run as root or set appropriate "
- "permissions\n");
- status = SANE_STATUS_ACCESS_DENIED;
- }
- else if (result == LIBUSB_ERROR_BUSY)
+ if (result < 0)
{
- DBG (3, "Maybe the kernel scanner driver or usblp claims the "
- "interface? Ignoring this error...\n");
- status = SANE_STATUS_GOOD;
- }
+ SANE_Status status = SANE_STATUS_INVAL;
- if (status != SANE_STATUS_GOOD)
- {
- libusb_close (devices[devcount].lu_handle);
- return status;
+ DBG (1, "sanei_usb_open: libusb complained: %s\n",
+ sanei_libusb_strerror (result));
+ if (result == LIBUSB_ERROR_ACCESS)
+ {
+ DBG (1, "Make sure you run as root or set appropriate "
+ "permissions\n");
+ status = SANE_STATUS_ACCESS_DENIED;
+ }
+ else if (result == LIBUSB_ERROR_BUSY)
+ {
+ DBG (3, "Maybe the kernel scanner driver or usblp claims "
+ "the interface? Ignoring this error...\n");
+ status = SANE_STATUS_GOOD;
+ }
+
+ if (status != SANE_STATUS_GOOD)
+ {
+ libusb_close (devices[devcount].lu_handle);
+ libusb_free_config_descriptor (config0);
+ return status;
+ }
}
}
+ libusb_free_config_descriptor (config0);
/* Claim the interface */
result = libusb_claim_interface (devices[devcount].lu_handle,
@@ -2128,22 +2135,24 @@ sanei_usb_close (SANE_Int dn)
else
#ifdef HAVE_LIBUSB
{
-#if 0
- /* Should only be done in case of a stall */
- usb_clear_halt (devices[dn].libusb_handle, devices[dn].bulk_in_ep);
- usb_clear_halt (devices[dn].libusb_handle, devices[dn].bulk_out_ep);
- usb_clear_halt (devices[dn].libusb_handle, devices[dn].iso_in_ep);
- /* be careful, we don't know if we are in DATA0 stage now */
- usb_resetep (devices[dn].libusb_handle, devices[dn].bulk_in_ep);
- usb_resetep (devices[dn].libusb_handle, devices[dn].bulk_out_ep);
- usb_resetep (devices[dn].libusb_handle, devices[dn].iso_in_ep);
-#endif /* 0 */
+ /* This call seems to be required by Linux xhci driver
+ * even though it should be a no-op. Without it, the
+ * host or driver does not reset it's data toggle bit.
+ * We intentionally ignore the return val */
+ sanei_usb_set_altinterface (dn, devices[dn].alt_setting);
+
usb_release_interface (devices[dn].libusb_handle,
devices[dn].interface_nr);
usb_close (devices[dn].libusb_handle);
}
#elif defined(HAVE_LIBUSB_1_0)
{
+ /* This call seems to be required by Linux xhci driver
+ * even though it should be a no-op. Without it, the
+ * host or driver does not reset it's data toggle bit.
+ * We intentionally ignore the return val */
+ sanei_usb_set_altinterface (dn, devices[dn].alt_setting);
+
libusb_release_interface (devices[dn].lu_handle,
devices[dn].interface_nr);
libusb_close (devices[dn].lu_handle);
@@ -2168,7 +2177,6 @@ sanei_usb_set_timeout (SANE_Int timeout)
SANE_Status
sanei_usb_clear_halt (SANE_Int dn)
{
-#ifdef HAVE_LIBUSB
int ret;
if (dn >= device_number || dn < 0)
@@ -2177,6 +2185,14 @@ sanei_usb_clear_halt (SANE_Int dn)
return SANE_STATUS_INVAL;
}
+#ifdef HAVE_LIBUSB
+
+ /* This call seems to be required by Linux xhci driver
+ * even though it should be a no-op. Without it, the
+ * host or driver does not send the clear to the device.
+ * We intentionally ignore the return val */
+ sanei_usb_set_altinterface (dn, devices[dn].alt_setting);
+
ret = usb_clear_halt (devices[dn].libusb_handle, devices[dn].bulk_in_ep);
if (ret){
DBG (1, "sanei_usb_clear_halt: BULK_IN ret=%d\n", ret);
@@ -2189,18 +2205,13 @@ sanei_usb_clear_halt (SANE_Int dn)
return SANE_STATUS_INVAL;
}
- /* be careful, we don't know if we are in DATA0 stage now
- ret = usb_resetep (devices[dn].libusb_handle, devices[dn].bulk_in_ep);
- ret = usb_resetep (devices[dn].libusb_handle, devices[dn].bulk_out_ep);
- */
#elif defined(HAVE_LIBUSB_1_0)
- int ret;
- if (dn >= device_number || dn < 0)
- {
- DBG (1, "sanei_usb_clear_halt: dn >= device number || dn < 0\n");
- return SANE_STATUS_INVAL;
- }
+ /* This call seems to be required by Linux xhci driver
+ * even though it should be a no-op. Without it, the
+ * host or driver does not send the clear to the device.
+ * We intentionally ignore the return val */
+ sanei_usb_set_altinterface (dn, devices[dn].alt_setting);
ret = libusb_clear_halt (devices[dn].lu_handle, devices[dn].bulk_in_ep);
if (ret){
@@ -3038,6 +3049,8 @@ sanei_usb_set_altinterface (SANE_Int dn, SANE_Int alternate)
DBG (5, "sanei_usb_set_altinterface: alternate = %d\n", alternate);
+ devices[dn].alt_setting = alternate;
+
if (devices[dn].method == sanei_usb_method_scanner_driver)
{
#if defined(__linux__)
diff --git a/testsuite/Makefile.in b/testsuite/Makefile.in
index de2e094..d63597f 100644
--- a/testsuite/Makefile.in
+++ b/testsuite/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -265,6 +265,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -276,11 +277,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
diff --git a/testsuite/sanei/Makefile.in b/testsuite/sanei/Makefile.in
index af6761f..08aba0b 100644
--- a/testsuite/sanei/Makefile.in
+++ b/testsuite/sanei/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -481,6 +481,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -492,11 +493,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -661,14 +665,14 @@ distclean-compile:
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
diff --git a/testsuite/sanei/sanei_config_test.c b/testsuite/sanei/sanei_config_test.c
index 9a07f2b..3d1f5af 100644
--- a/testsuite/sanei/sanei_config_test.c
+++ b/testsuite/sanei/sanei_config_test.c
@@ -895,6 +895,9 @@ sanei_config_suite (void)
int
main (void)
{
+ /* set up config dir for local conf files */
+ putenv("SANE_CONFIG_DIR=.:/");
+
/* run suites */
sanei_config_suite ();
diff --git a/testsuite/tools/Makefile.am b/testsuite/tools/Makefile.am
index 178041b..1664ecb 100644
--- a/testsuite/tools/Makefile.am
+++ b/testsuite/tools/Makefile.am
@@ -32,7 +32,7 @@ check.local:
do \
echo "PASS: sane-desc -m $$mode -s $(srcdir)/data"; \
$(SANEDESC) -m $$mode -s $(srcdir)/data >$$mode.res ;\
- if ! diff --ignore-matching-lines="..:..:.. 20[0-9][0-9]" $(srcdir)/data/$$mode.ref $$mode.res ; \
+ if ! diff --ignore-matching-lines="..:..:.. 20[0-9][0-9]" --ignore-matching-lines="sane-backends 1.0...git" $(srcdir)/data/$$mode.ref $$mode.res ; \
then \
echo "**** File generated for $$mode mode is different from reference" ;\
exit 1 ;\
diff --git a/testsuite/tools/Makefile.in b/testsuite/tools/Makefile.in
index 6f735d0..45f79e9 100644
--- a/testsuite/tools/Makefile.in
+++ b/testsuite/tools/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -205,6 +205,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -216,11 +217,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -503,7 +507,7 @@ check.local:
do \
echo "PASS: sane-desc -m $$mode -s $(srcdir)/data"; \
$(SANEDESC) -m $$mode -s $(srcdir)/data >$$mode.res ;\
- if ! diff --ignore-matching-lines="..:..:.. 20[0-9][0-9]" $(srcdir)/data/$$mode.ref $$mode.res ; \
+ if ! diff --ignore-matching-lines="..:..:.. 20[0-9][0-9]" --ignore-matching-lines="sane-backends 1.0...git" $(srcdir)/data/$$mode.ref $$mode.res ; \
then \
echo "**** File generated for $$mode mode is different from reference" ;\
exit 1 ;\
diff --git a/testsuite/tools/data/html-backends-split.ref b/testsuite/tools/data/html-backends-split.ref
index b498c57..72fd949 100644
--- a/testsuite/tools/data/html-backends-split.ref
+++ b/testsuite/tools/data/html-backends-split.ref
@@ -16466,7 +16466,7 @@ Grandtek Scopecam
<dt><b>Manufacturer:</b></dt>
<dd>Manufacturer, vendor or brand name of the device.</dd>
<dt><b>Model:</b></dt>
- <dd>Name of the the device.</dd>
+ <dd>Name of the device.</dd>
<dt><b>Interface:</b></dt>
<dd>How the device is connected to the computer.</dd>
<dt><b>USB id:</b></dt>
diff --git a/testsuite/tools/data/html-mfgs.ref b/testsuite/tools/data/html-mfgs.ref
index 3cbaaef..5e53ee3 100644
--- a/testsuite/tools/data/html-mfgs.ref
+++ b/testsuite/tools/data/html-mfgs.ref
@@ -23864,7 +23864,7 @@ qcam<br>(unmaintained)
<blockquote>
<dl>
<dt><b>Model:</b></dt>
- <dd>Name of the the device.</dd>
+ <dd>Name of the device.</dd>
<dt><b>Interface:</b></dt>
<dd>How the device is connected to the computer.</dd>
<dt><b>USB id:</b></dt>
diff --git a/testsuite/tools/data/hwdb.ref b/testsuite/tools/data/hwdb.ref
index 357aaa8..909ac46 100644
--- a/testsuite/tools/data/hwdb.ref
+++ b/testsuite/tools/data/hwdb.ref
@@ -1,5 +1,5 @@
# This file was automatically created based on description files (*.desc)
-# by sane-desc 3.5 from sane-backends 1.0.24git on Thu Aug 1 18:50:19 2013
+# by sane-desc 3.5 from sane-backends 1.0.25git on Tue Dec 3 15:24:46 2013
#
# hwdb file for supported USB devices
#
@@ -14,637 +14,637 @@
# the sane-devel mailing list (sane-devel@lists.alioth.debian.org).
#
# Hewlett-Packard ScanJet 4100C
-usb:v03F0p03F0*
+usb:v03F0p0101*
libsane_matched=yes
# Hewlett-Packard ScanJet 4200C | Hewlett-Packard ScanJet 4200Cxi | Hewlett-Packard ScanJet 4200Cse
-usb:v03F0p03F0*
+usb:v03F0p0105*
libsane_matched=yes
# Hewlett-Packard ScanJet 6200C | Hewlett-Packard ScanJet 6250C
-usb:v03F0p03F0*
+usb:v03F0p0201*
libsane_matched=yes
# Hewlett-Packard ScanJet 3300c
-usb:v03F0p03F0*
+usb:v03F0p0205*
libsane_matched=yes
# Hewlett-Packard ScanJet 4300c
-usb:v03F0p03F0*
+usb:v03F0p0305*
libsane_matched=yes
# Hewlett-Packard ScanJet 5200C
-usb:v03F0p03F0*
+usb:v03F0p0401*
libsane_matched=yes
# Hewlett-Packard ScanJet 3400c
-usb:v03F0p03F0*
+usb:v03F0p0405*
libsane_matched=yes
# Hewlett-Packard ScanJet 2100C
-usb:v03F0p03F0*
+usb:v03F0p0505*
libsane_matched=yes
# Hewlett-Packard ScanJet 6300C | Hewlett-Packard ScanJet 6350C | Hewlett-Packard ScanJet 6390C
-usb:v03F0p03F0*
+usb:v03F0p0601*
libsane_matched=yes
# Hewlett-Packard ScanJet 2200C
-usb:v03F0p03F0*
+usb:v03F0p0605*
libsane_matched=yes
# Hewlett-Packard ScanJet 5300C | Hewlett-Packard ScanJet 5370C
-usb:v03F0p03F0*
+usb:v03F0p0701*
libsane_matched=yes
# Hewlett-Packard scanjet 4400c
-usb:v03F0p03F0*
+usb:v03F0p0705*
libsane_matched=yes
# Hewlett-Packard ScanJet 7400c | Hewlett-Packard ScanJet 7450c | Hewlett-Packard ScanJet 7490c
-usb:v03F0p03F0*
+usb:v03F0p0801*
libsane_matched=yes
# Hewlett-Packard scanjet 4470c
-usb:v03F0p03F0*
+usb:v03F0p0805*
libsane_matched=yes
# Hewlett-Packard ScanJet 2300C
-usb:v03F0p03F0*
+usb:v03F0p0901*
libsane_matched=yes
# Hewlett-Packard ScanJet 2400C | Hewlett-Packard ScanJet G2410
-usb:v03F0p03F0*
+usb:v03F0p0A01*
libsane_matched=yes
# Hewlett-Packard ScanJet 8200 | Hewlett-Packard ScanJet 8250 | Hewlett-Packard ScanJet 8290
-usb:v03F0p03F0*
+usb:v03F0p0B01*
libsane_matched=yes
# Hewlett-Packard ScanJet 5400c
-usb:v03F0p03F0*
+usb:v03F0p1005*
libsane_matched=yes
# Hewlett-Packard ScanJet 5470c
-usb:v03F0p03F0*
+usb:v03F0p1105*
libsane_matched=yes
# Hewlett-Packard ScanJet 4500C | Hewlett-Packard ScanJet 5550C
-usb:v03F0p03F0*
+usb:v03F0p1205*
libsane_matched=yes
# Hewlett-Packard ScanJet 4570C | Hewlett-Packard ScanJet 5500C
-usb:v03F0p03F0*
+usb:v03F0p1305*
libsane_matched=yes
# Hewlett-Packard ScanJet 3670C | Hewlett-Packard ScanJet 3690C
-usb:v03F0p03F0*
+usb:v03F0p1405*
libsane_matched=yes
# Hewlett-Packard ScanJet 5590
-usb:v03F0p03F0*
+usb:v03F0p1705*
libsane_matched=yes
# Hewlett-Packard ScanJet 7650
-usb:v03F0p03F0*
+usb:v03F0p1805*
libsane_matched=yes
# Hewlett-Packard ScanJet 4850C
-usb:v03F0p03F0*
+usb:v03F0p1B05*
libsane_matched=yes
# Hewlett-Packard ScanJet 3530C | Hewlett-Packard ScanJet 3570C
-usb:v03F0p03F0*
+usb:v03F0p2005*
libsane_matched=yes
# Hewlett-Packard ScanJet 3500C
-usb:v03F0p03F0*
+usb:v03F0p2205*
libsane_matched=yes
# Hewlett-Packard ScanJet 3970c
-usb:v03F0p03F0*
+usb:v03F0p2305*
libsane_matched=yes
# Hewlett-Packard ScanJet 4070 Photosmart
-usb:v03F0p03F0*
+usb:v03F0p2405*
libsane_matched=yes
# Hewlett-Packard ScanJet 3800
-usb:v03F0p03F0*
+usb:v03F0p2605*
libsane_matched=yes
# Hewlett-Packard ScanJet G2710
-usb:v03F0p03F0*
+usb:v03F0p2805*
libsane_matched=yes
# Hewlett-Packard ScanJet 8300 | Hewlett-Packard ScanJet 8350 | Hewlett-Packard ScanJet 8390
-usb:v03F0p03F0*
+usb:v03F0p3805*
libsane_matched=yes
# Hewlett-Packard ScanJet 8270
-usb:v03F0p03F0*
+usb:v03F0p3905*
libsane_matched=yes
# Hewlett-Packard LaserJet M1005 MFP
-usb:v03F0p03F0*
+usb:v03F0p3B17*
libsane_matched=yes
# Hewlett-Packard ScanJet 4370
-usb:v03F0p03F0*
+usb:v03F0p4105*
libsane_matched=yes
# Hewlett-Packard ScanJet G3010
-usb:v03F0p03F0*
+usb:v03F0p4205*
libsane_matched=yes
# Hewlett-Packard ScanJet G3110
-usb:v03F0p03F0*
+usb:v03F0p4305*
libsane_matched=yes
# Hewlett-Packard ScanJet G4010
-usb:v03F0p03F0*
+usb:v03F0p4505*
libsane_matched=yes
# Hewlett-Packard ScanJet G4050
-usb:v03F0p03F0*
+usb:v03F0p4605*
libsane_matched=yes
# Hewlett-Packard ScanJet N6310
-usb:v03F0p03F0*
+usb:v03F0p4705*
libsane_matched=yes
# Hewlett-Packard LaserJet M1120 MFP
-usb:v03F0p03F0*
+usb:v03F0p5617*
libsane_matched=yes
# Hewlett-Packard LaserJet M1120n MFP
-usb:v03F0p03F0*
+usb:v03F0p5717*
libsane_matched=yes
# Mustek BearPaw 1200
-usb:v0400p0400*
+usb:v0400p1000*
libsane_matched=yes
# Mustek BearPaw 1200 | Mustek BearPaw 2400
-usb:v0400p0400*
+usb:v0400p1001*
libsane_matched=yes
# Kodak ESP 5100
-usb:v040Ap040A*
+usb:v040Ap4025*
libsane_matched=yes
# Kodak ESP 5300
-usb:v040Ap040A*
+usb:v040Ap4026*
libsane_matched=yes
# Kodak ESP 5500
-usb:v040Ap040A*
+usb:v040Ap4027*
libsane_matched=yes
# Kodak ESP 5000
-usb:v040Ap040A*
+usb:v040Ap4028*
libsane_matched=yes
# Kodak ESP 3300
-usb:v040Ap040A*
+usb:v040Ap4031*
libsane_matched=yes
# Kodak ESP 5
-usb:v040Ap040A*
+usb:v040Ap4032*
libsane_matched=yes
# Kodak ESP 7
-usb:v040Ap040A*
+usb:v040Ap403E*
libsane_matched=yes
# Kodak ESP 9
-usb:v040Ap040A*
+usb:v040Ap403F*
libsane_matched=yes
# Kodak ESP 5200
-usb:v040Ap040A*
+usb:v040Ap4041*
libsane_matched=yes
# Kodak ESP 3200
-usb:v040Ap040A*
+usb:v040Ap4043*
libsane_matched=yes
# Kodak ESP 4100
-usb:v040Ap040A*
+usb:v040Ap4053*
libsane_matched=yes
# Kodak ESP 6100
-usb:v040Ap040A*
+usb:v040Ap4054*
libsane_matched=yes
# Kodak ESP 7200
-usb:v040Ap040A*
+usb:v040Ap4056*
libsane_matched=yes
# Kodak ESP C110
-usb:v040Ap040A*
+usb:v040Ap4057*
libsane_matched=yes
# Kodak ESP C115
-usb:v040Ap040A*
+usb:v040Ap4058*
libsane_matched=yes
# Kodak ESP 2150
-usb:v040Ap040A*
+usb:v040Ap4059*
libsane_matched=yes
# Kodak ESP C310
-usb:v040Ap040A*
+usb:v040Ap405D*
libsane_matched=yes
# Kodak ESP C315
-usb:v040Ap040A*
+usb:v040Ap405E*
libsane_matched=yes
# Advent AW10
-usb:v040Ap040A*
+usb:v040Ap4060*
libsane_matched=yes
# Kodak Hero Office 6.1
-usb:v040Ap040A*
+usb:v040Ap4062*
libsane_matched=yes
# Kodak Hero 7.1
-usb:v040Ap040A*
+usb:v040Ap4063*
libsane_matched=yes
# Kodak Hero 5.1
-usb:v040Ap040A*
+usb:v040Ap4064*
libsane_matched=yes
# Kodak ESP 9200
-usb:v040Ap040A*
+usb:v040Ap4065*
libsane_matched=yes
# Kodak ESP 2170
-usb:v040Ap040A*
+usb:v040Ap4066*
libsane_matched=yes
# Kodak Hero 9.1
-usb:v040Ap040A*
+usb:v040Ap4067*
libsane_matched=yes
# Kodak Hero 3.1
-usb:v040Ap040A*
+usb:v040Ap406D*
libsane_matched=yes
# Kodak i30
-usb:v040Ap040A*
+usb:v040Ap6001*
libsane_matched=yes
# Kodak i40
-usb:v040Ap040A*
+usb:v040Ap6002*
libsane_matched=yes
# Kodak i50 | Kodak i55
-usb:v040Ap040A*
+usb:v040Ap6003*
libsane_matched=yes
# Kodak i60 | Kodak i65
-usb:v040Ap040A*
+usb:v040Ap6004*
libsane_matched=yes
# Kodak i80
-usb:v040Ap040A*
+usb:v040Ap6005*
libsane_matched=yes
# Creative WebCam Go Mini
-usb:v041Ep041E*
+usb:v041Ep4007*
libsane_matched=yes
# Lexmark X70 | Lexmark X73
-usb:v043Dp043D*
+usb:v043Dp002D*
libsane_matched=yes
# Lexmark X74
-usb:v043Dp043D*
+usb:v043Dp0060*
libsane_matched=yes
# Lexmark X1110 | Lexmark X1130 | Lexmark X1140
# Lexmark X1150 | Lexmark X1170 | Lexmark X1180
# Lexmark X1185 | Lexmark X1195
-usb:v043Dp043D*
+usb:v043Dp007C*
libsane_matched=yes
# Lexmark X12xx
-usb:v043Dp043D*
+usb:v043Dp007D*
libsane_matched=yes
# Genius ColorPage HR6 V1
-usb:v0458p0458*
+usb:v0458p2004*
libsane_matched=yes
# Genius Colorpage HR6 V2
-usb:v0458p0458*
+usb:v0458p2007*
libsane_matched=yes
# Genius Colorpage HR6 V2
-usb:v0458p0458*
+usb:v0458p2008*
libsane_matched=yes
# Genius Colorpage HR6A
-usb:v0458p0458*
+usb:v0458p2009*
libsane_matched=yes
# Genius Colorpage Vivid3x | Genius Colorpage Vivid3 V2
-usb:v0458p0458*
+usb:v0458p2011*
libsane_matched=yes
# Genius Colorpage HR7
-usb:v0458p0458*
+usb:v0458p2013*
libsane_matched=yes
# Genius Colorpage Vivid4
-usb:v0458p0458*
+usb:v0458p2014*
libsane_matched=yes
# Genius Colorpage HR7LE
-usb:v0458p0458*
+usb:v0458p2015*
libsane_matched=yes
# Genius Colorpage HR6X
-usb:v0458p0458*
+usb:v0458p2016*
libsane_matched=yes
# Genius Colorpage Vivid3xe
-usb:v0458p0458*
+usb:v0458p2017*
libsane_matched=yes
# Genius Colorpage Vivid4xe
-usb:v0458p0458*
+usb:v0458p201A*
libsane_matched=yes
# Genius Colorpage Vivid4x
-usb:v0458p0458*
+usb:v0458p201B*
libsane_matched=yes
# Genius Colorpage Vivid 1200 X
-usb:v0458p0458*
+usb:v0458p201D*
libsane_matched=yes
# Genius ColorPage Slim 1200
-usb:v0458p0458*
+usb:v0458p201E*
libsane_matched=yes
# Genius Colorpage Vivid 1200 XE
-usb:v0458p0458*
+usb:v0458p201F*
libsane_matched=yes
# Genius Colorpage SF600
-usb:v0458p0458*
+usb:v0458p2021*
libsane_matched=yes
# Medion/Lifetec/Tevion/Cytron MD5345 | Medion/Lifetec/Tevion/Cytron MD6228 | Medion/Lifetec/Tevion/Cytron MD6471
-usb:v0461p0461*
+usb:v0461p0377*
libsane_matched=yes
# Xerox 2400 Onetouch
-usb:v0461p0461*
+usb:v0461p038B*
libsane_matched=yes
# Trust Office Scan USB 19200
-usb:v047Bp047B*
+usb:v047Bp1000*
libsane_matched=yes
# Hewlett-Packard ScanJet 4300c/Silitek
-usb:v047Bp047B*
+usb:v047Bp1002*
libsane_matched=yes
# Kyocera FS-1016MFP
-usb:v0482p0482*
+usb:v0482p0335*
libsane_matched=yes
# Compaq S4-100
-usb:v049Fp049F*
+usb:v049Fp001A*
libsane_matched=yes
# Benq (Acer) 310U
-usb:v04A5p04A5*
+usb:v04A5p1A20*
libsane_matched=yes
# Benq (Acer) 620U
-usb:v04A5p04A5*
+usb:v04A5p1A2A*
libsane_matched=yes
# Benq (Acer) 320U | Benq (Acer) 340U | Mitsubishi Diamondview 648UT
-usb:v04A5p04A5*
+usb:v04A5p2022*
libsane_matched=yes
# Benq (Acer) 620UT
-usb:v04A5p04A5*
+usb:v04A5p2040*
libsane_matched=yes
# Benq (Acer) 640U | Guillemot / Hercules Maxi Scan A4 USB 640U | Guillemot / Hercules Maxi A4 36 bit
-usb:v04A5p04A5*
+usb:v04A5p2060*
libsane_matched=yes
# Benq (Acer) 640bu
-usb:v04A5p04A5*
+usb:v04A5p207E*
libsane_matched=yes
# Benq (Acer) 3300 | Benq (Acer) 4300 | Mitsubishi Diamondview 650U
-usb:v04A5p04A5*
+usb:v04A5p20B0*
libsane_matched=yes
# Benq (Acer) 640BT
-usb:v04A5p04A5*
+usb:v04A5p20BE*
libsane_matched=yes
# Benq (Acer) 1240
-usb:v04A5p04A5*
+usb:v04A5p20C0*
libsane_matched=yes
# Benq (Acer) 3300 | Benq (Acer) 4300 | Guillemot / Hercules Scan@home Touch 1248 (USB)
-usb:v04A5p04A5*
+usb:v04A5p20DE*
libsane_matched=yes
# Benq (Acer) 5000
-usb:v04A5p04A5*
+usb:v04A5p20F8*
libsane_matched=yes
# Benq (Acer) 5000E | Benq (Acer) 5000U
-usb:v04A5p04A5*
+usb:v04A5p20FC*
libsane_matched=yes
# Benq (Acer) 5300
-usb:v04A5p04A5*
+usb:v04A5p20FE*
libsane_matched=yes
# Benq (Acer) 5150 | Benq (Acer) 5250
-usb:v04A5p04A5*
+usb:v04A5p2137*
libsane_matched=yes
# BenQ 5550
-usb:v04A5p04A5*
+usb:v04A5p2211*
libsane_matched=yes
# Visioneer Visioneer OneTouch 7100
-usb:v04A7p04A7*
+usb:v04A7p0229*
libsane_matched=yes
# Visioneer 9650
-usb:v04A7p04A7*
+usb:v04A7p0390*
libsane_matched=yes
# Visioneer 9320
-usb:v04A7p04A7*
+usb:v04A7p0420*
libsane_matched=yes
# Visioneer 9450
-usb:v04A7p04A7*
+usb:v04A7p0421*
libsane_matched=yes
# Visioneer 9550
-usb:v04A7p04A7*
+usb:v04A7p0422*
libsane_matched=yes
# Visioneer 9750
-usb:v04A7p04A7*
+usb:v04A7p0423*
libsane_matched=yes
# Visioneer Strobe XP 450
-usb:v04A7p04A7*
+usb:v04A7p0424*
libsane_matched=yes
# Visioneer Strobe XP 200
-usb:v04A7p04A7*
+usb:v04A7p0426*
libsane_matched=yes
# Visioneer Strobe XP 100
-usb:v04A7p04A7*
+usb:v04A7p0427*
libsane_matched=yes
# Visioneer OneTouch 7300
-usb:v04A7p04A7*
+usb:v04A7p0444*
libsane_matched=yes
# Xerox DocuMate510
-usb:v04A7p04A7*
+usb:v04A7p0446*
libsane_matched=yes
# Xerox DocuMate520
-usb:v04A7p04A7*
+usb:v04A7p0447*
libsane_matched=yes
# Xerox DocuMate250
-usb:v04A7p04A7*
+usb:v04A7p0448*
libsane_matched=yes
# Xerox DocuMate252
-usb:v04A7p04A7*
+usb:v04A7p0449*
libsane_matched=yes
# Xerox DocuMate262
-usb:v04A7p04A7*
+usb:v04A7p044C*
libsane_matched=yes
# Visioneer Strobe XP 300
-usb:v04A7p04A7*
+usb:v04A7p0474*
libsane_matched=yes
# Xerox DocuMate272
-usb:v04A7p04A7*
+usb:v04A7p0475*
libsane_matched=yes
# Xerox DocuMate232
-usb:v04A7p04A7*
+usb:v04A7p0476*
libsane_matched=yes
# Xerox DocuMate152
-usb:v04A7p04A7*
+usb:v04A7p0477*
libsane_matched=yes
# Xerox DocuMate752
-usb:v04A7p04A7*
+usb:v04A7p0478*
libsane_matched=yes
# Visioneer Strobe XP 470
-usb:v04A7p04A7*
+usb:v04A7p0479*
libsane_matched=yes
# Visioneer 9450-G
-usb:v04A7p04A7*
+usb:v04A7p047A*
libsane_matched=yes
# Visioneer 9650-G
-usb:v04A7p04A7*
+usb:v04A7p047B*
libsane_matched=yes
# Xerox DocuMate510-G
-usb:v04A7p04A7*
+usb:v04A7p047C*
libsane_matched=yes
# Xerox DocuMate252-G
-usb:v04A7p04A7*
+usb:v04A7p048C*
libsane_matched=yes
# Xerox DocuMate262-G
-usb:v04A7p04A7*
+usb:v04A7p048D*
libsane_matched=yes
# Xerox DocuMate272-G
-usb:v04A7p04A7*
+usb:v04A7p048E*
libsane_matched=yes
# Visioneer Strobe XP 470-G | Visioneer Patriot 470
-usb:v04A7p04A7*
+usb:v04A7p048F*
libsane_matched=yes
# Xerox DocuMate250-G
-usb:v04A7p04A7*
+usb:v04A7p0490*
libsane_matched=yes
# Visioneer Strobe XP 450-G
-usb:v04A7p04A7*
+usb:v04A7p0491*
libsane_matched=yes
# Xerox DocuMate520-G
-usb:v04A7p04A7*
+usb:v04A7p0492*
libsane_matched=yes
# Visioneer 9750-G
-usb:v04A7p04A7*
+usb:v04A7p0493*
libsane_matched=yes
# Visioneer Roadwarrior
-usb:v04A7p04A7*
+usb:v04A7p0494*
libsane_matched=yes
# Xerox DocuMate512
-usb:v04A7p04A7*
+usb:v04A7p0495*
libsane_matched=yes
# Visioneer Patriot 430
-usb:v04A7p04A7*
+usb:v04A7p0497*
libsane_matched=yes
# Visioneer Patriot 680 | Xerox DocuMate632
-usb:v04A7p04A7*
+usb:v04A7p0498*
libsane_matched=yes
# Visioneer Patriot 780
-usb:v04A7p04A7*
+usb:v04A7p0499*
libsane_matched=yes
# Xerox DocuMate752
-usb:v04A7p04A7*
+usb:v04A7p049A*
libsane_matched=yes
# Visioneer Strobe XP 100,r3
-usb:v04A7p04A7*
+usb:v04A7p049B*
libsane_matched=yes
# Xerox DocuMate150
-usb:v04A7p04A7*
+usb:v04A7p049C*
libsane_matched=yes
# Xerox DocuMate162
-usb:v04A7p04A7*
+usb:v04A7p049D*
libsane_matched=yes
# Xerox DocuMate262i
@@ -652,1519 +652,1519 @@ usb:v04A7p04A7*
libsane_matched=yes
# Xerox Travel Scanner 100
-usb:v04A7p04A7*
+usb:v04A7p04AC*
libsane_matched=yes
# Canon DR-2080C
-usb:v04A9p04A9*
+usb:v04A9p1601*
libsane_matched=yes
# Canon CR-180 | Canon CR-180II
-usb:v04A9p04A9*
+usb:v04A9p1602*
libsane_matched=yes
# Canon DR-9080C
-usb:v04A9p04A9*
+usb:v04A9p1603*
libsane_matched=yes
# Canon DR-7080C
-usb:v04A9p04A9*
+usb:v04A9p1604*
libsane_matched=yes
# Canon DR-5010C
-usb:v04A9p04A9*
+usb:v04A9p1606*
libsane_matched=yes
# Canon DR-6080
-usb:v04A9p04A9*
+usb:v04A9p1607*
libsane_matched=yes
# Canon DR-2580C
-usb:v04A9p04A9*
+usb:v04A9p1608*
libsane_matched=yes
# Canon DR-3080CII
-usb:v04A9p04A9*
+usb:v04A9p1609*
libsane_matched=yes
# Canon DR-2050C | Canon DR-2050SP
-usb:v04A9p04A9*
+usb:v04A9p160A*
libsane_matched=yes
# Canon DR-7580
-usb:v04A9p04A9*
+usb:v04A9p160B*
libsane_matched=yes
# Canon PIXMA MP750
-usb:v04A9p04A9*
+usb:v04A9p1706*
libsane_matched=yes
# Canon PIXMA MP780 | Canon PIXMA MP790
-usb:v04A9p04A9*
+usb:v04A9p1707*
libsane_matched=yes
# Canon PIXMA MP760 | Canon PIXMA MP770
-usb:v04A9p04A9*
+usb:v04A9p1708*
libsane_matched=yes
# Canon PIXMA MP150
-usb:v04A9p04A9*
+usb:v04A9p1709*
libsane_matched=yes
# Canon PIXMA MP170
-usb:v04A9p04A9*
+usb:v04A9p170A*
libsane_matched=yes
# Canon PIXMA MP450
-usb:v04A9p04A9*
+usb:v04A9p170B*
libsane_matched=yes
# Canon PIXMA MP500
-usb:v04A9p04A9*
+usb:v04A9p170C*
libsane_matched=yes
# Canon PIXMA MP800
-usb:v04A9p04A9*
+usb:v04A9p170D*
libsane_matched=yes
# Canon PIXMA MP800R
-usb:v04A9p04A9*
+usb:v04A9p170E*
libsane_matched=yes
# Canon PIXMA MP530
-usb:v04A9p04A9*
+usb:v04A9p1712*
libsane_matched=yes
# Canon PIXMA MP830
-usb:v04A9p04A9*
+usb:v04A9p1713*
libsane_matched=yes
# Canon PIXMA MP160
-usb:v04A9p04A9*
+usb:v04A9p1714*
libsane_matched=yes
# Canon PIXMA MP180
-usb:v04A9p04A9*
+usb:v04A9p1715*
libsane_matched=yes
# Canon PIXMA MP460
-usb:v04A9p04A9*
+usb:v04A9p1716*
libsane_matched=yes
# Canon PIXMA MP510
-usb:v04A9p04A9*
+usb:v04A9p1717*
libsane_matched=yes
# Canon PIXMA MP600
-usb:v04A9p04A9*
+usb:v04A9p1718*
libsane_matched=yes
# Canon PIXMA MP600R
-usb:v04A9p04A9*
+usb:v04A9p1719*
libsane_matched=yes
# Canon PIXMA MP810
-usb:v04A9p04A9*
+usb:v04A9p171A*
libsane_matched=yes
# Canon PIXMA MP960
-usb:v04A9p04A9*
+usb:v04A9p171B*
libsane_matched=yes
# Canon PIXMA MX7600
-usb:v04A9p04A9*
+usb:v04A9p171C*
libsane_matched=yes
# Canon PIXMA MP210
-usb:v04A9p04A9*
+usb:v04A9p1721*
libsane_matched=yes
# Canon PIXMA MP220
-usb:v04A9p04A9*
+usb:v04A9p1722*
libsane_matched=yes
# Canon PIXMA MP470
-usb:v04A9p04A9*
+usb:v04A9p1723*
libsane_matched=yes
# Canon PIXMA MP520
-usb:v04A9p04A9*
+usb:v04A9p1724*
libsane_matched=yes
# Canon PIXMA MP610
-usb:v04A9p04A9*
+usb:v04A9p1725*
libsane_matched=yes
# Canon PIXMA MP970
-usb:v04A9p04A9*
+usb:v04A9p1726*
libsane_matched=yes
# Canon PIXMA MX300
-usb:v04A9p04A9*
+usb:v04A9p1727*
libsane_matched=yes
# Canon PIXMA MX310
-usb:v04A9p04A9*
+usb:v04A9p1728*
libsane_matched=yes
# Canon PIXMA MX700
-usb:v04A9p04A9*
+usb:v04A9p1729*
libsane_matched=yes
# Canon PIXMA MP140
-usb:v04A9p04A9*
+usb:v04A9p172B*
libsane_matched=yes
# Canon PIXMA MX850
-usb:v04A9p04A9*
+usb:v04A9p172C*
libsane_matched=yes
# Canon PIXMA MP980
-usb:v04A9p04A9*
+usb:v04A9p172D*
libsane_matched=yes
# Canon PIXMA MP630
-usb:v04A9p04A9*
+usb:v04A9p172E*
libsane_matched=yes
# Canon PIXMA MP620
-usb:v04A9p04A9*
+usb:v04A9p172F*
libsane_matched=yes
# Canon PIXMA MP540
-usb:v04A9p04A9*
+usb:v04A9p1730*
libsane_matched=yes
# Canon PIXMA MP480
-usb:v04A9p04A9*
+usb:v04A9p1731*
libsane_matched=yes
# Canon PIXMA MP240
-usb:v04A9p04A9*
+usb:v04A9p1732*
libsane_matched=yes
# Canon PIXMA MP260
-usb:v04A9p04A9*
+usb:v04A9p1733*
libsane_matched=yes
# Canon PIXMA MP190
-usb:v04A9p04A9*
+usb:v04A9p1734*
libsane_matched=yes
# Canon PIXMA MX860
-usb:v04A9p04A9*
+usb:v04A9p1735*
libsane_matched=yes
# Canon PIXMA MX320
-usb:v04A9p04A9*
+usb:v04A9p1736*
libsane_matched=yes
# Canon PIXMA MX330
-usb:v04A9p04A9*
+usb:v04A9p1737*
libsane_matched=yes
# Canon PIXMA MP250
-usb:v04A9p04A9*
+usb:v04A9p173A*
libsane_matched=yes
# Canon PIXMA MP270
-usb:v04A9p04A9*
+usb:v04A9p173B*
libsane_matched=yes
# Canon PIXMA MP490
-usb:v04A9p04A9*
+usb:v04A9p173C*
libsane_matched=yes
# Canon PIXMA MP550
-usb:v04A9p04A9*
+usb:v04A9p173D*
libsane_matched=yes
# Canon PIXMA MP560
-usb:v04A9p04A9*
+usb:v04A9p173E*
libsane_matched=yes
# Canon PIXMA MP640
-usb:v04A9p04A9*
+usb:v04A9p173F*
libsane_matched=yes
# Canon PIXMA MP990
-usb:v04A9p04A9*
+usb:v04A9p1740*
libsane_matched=yes
# Canon PIXMA MX340
-usb:v04A9p04A9*
+usb:v04A9p1741*
libsane_matched=yes
# Canon PIXMA MX350
-usb:v04A9p04A9*
+usb:v04A9p1742*
libsane_matched=yes
# Canon PIXMA MX870
-usb:v04A9p04A9*
+usb:v04A9p1743*
libsane_matched=yes
# Canon PIXMA MP280
-usb:v04A9p04A9*
+usb:v04A9p1746*
libsane_matched=yes
# Canon PIXMA MP495
-usb:v04A9p04A9*
+usb:v04A9p1747*
libsane_matched=yes
# Canon PIXMA MG5100 Series
-usb:v04A9p04A9*
+usb:v04A9p1748*
libsane_matched=yes
# Canon PIXMA MG5200 Series
-usb:v04A9p04A9*
+usb:v04A9p1749*
libsane_matched=yes
# Canon PIXMA MG6100 Series
-usb:v04A9p04A9*
+usb:v04A9p174A*
libsane_matched=yes
# Canon PIXMA MG8100 Series
-usb:v04A9p04A9*
+usb:v04A9p174B*
libsane_matched=yes
# Canon PIXMA MX360
-usb:v04A9p04A9*
+usb:v04A9p174D*
libsane_matched=yes
# Canon PIXMA MX410
-usb:v04A9p04A9*
+usb:v04A9p174E*
libsane_matched=yes
# Canon PIXMA MX420
-usb:v04A9p04A9*
+usb:v04A9p174F*
libsane_matched=yes
# Canon PIXMA MX880 Series | Canon PIXMA MX882 | Canon PIXMA MX885
-usb:v04A9p04A9*
+usb:v04A9p1750*
libsane_matched=yes
# Canon PIXMA MG2100 Series
-usb:v04A9p04A9*
+usb:v04A9p1751*
libsane_matched=yes
# Canon PIXMA MG3100 Series
-usb:v04A9p04A9*
+usb:v04A9p1752*
libsane_matched=yes
# Canon PIXMA MG4100 Series
-usb:v04A9p04A9*
+usb:v04A9p1753*
libsane_matched=yes
# Canon PIXMA MG5300 Series
-usb:v04A9p04A9*
+usb:v04A9p1754*
libsane_matched=yes
# Canon PIXMA MG6200 Series
-usb:v04A9p04A9*
+usb:v04A9p1755*
libsane_matched=yes
# Canon PIXMA MG8200 Series
-usb:v04A9p04A9*
+usb:v04A9p1756*
libsane_matched=yes
# Canon PIXMA MP493
-usb:v04A9p04A9*
+usb:v04A9p1757*
libsane_matched=yes
# Canon PIXMA E500
-usb:v04A9p04A9*
+usb:v04A9p1758*
libsane_matched=yes
# Canon PIXMA MX370 Series
-usb:v04A9p04A9*
+usb:v04A9p1759*
libsane_matched=yes
# Canon PIXMA E600
-usb:v04A9p04A9*
+usb:v04A9p175A*
libsane_matched=yes
# Canon PIXMA MX430 Series
-usb:v04A9p04A9*
+usb:v04A9p175B*
libsane_matched=yes
# Canon PIXMA MX510 Series
-usb:v04A9p04A9*
+usb:v04A9p175C*
libsane_matched=yes
# Canon PIXMA MX710 Series
-usb:v04A9p04A9*
+usb:v04A9p175D*
libsane_matched=yes
# Canon PIXMA MX890 Series
-usb:v04A9p04A9*
+usb:v04A9p175E*
libsane_matched=yes
# Canon PIXMA MP230
-usb:v04A9p04A9*
+usb:v04A9p175F*
libsane_matched=yes
# Canon PIXMA MG2200 Series
-usb:v04A9p04A9*
+usb:v04A9p1760*
libsane_matched=yes
# Canon PIXMA E510
-usb:v04A9p04A9*
+usb:v04A9p1761*
libsane_matched=yes
# Canon PIXMA MG3200 Series
-usb:v04A9p04A9*
+usb:v04A9p1762*
libsane_matched=yes
# Canon PIXMA MG4200 Series
-usb:v04A9p04A9*
+usb:v04A9p1763*
libsane_matched=yes
# Canon PIXMA MG5400 Series
-usb:v04A9p04A9*
+usb:v04A9p1764*
libsane_matched=yes
# Canon PIXMA MG6300 Series
-usb:v04A9p04A9*
+usb:v04A9p1765*
libsane_matched=yes
# Canon PIXMA MX390 Series
-usb:v04A9p04A9*
+usb:v04A9p1766*
libsane_matched=yes
# Canon PIXMA E610
-usb:v04A9p04A9*
+usb:v04A9p1767*
libsane_matched=yes
# Canon PIXMA MX450 Series
-usb:v04A9p04A9*
+usb:v04A9p1768*
libsane_matched=yes
# Canon PIXMA MX520 Series
-usb:v04A9p04A9*
+usb:v04A9p1769*
libsane_matched=yes
# Canon PIXMA MX720 Series
-usb:v04A9p04A9*
+usb:v04A9p176A*
libsane_matched=yes
# Canon PIXMA MX920 Series
-usb:v04A9p04A9*
+usb:v04A9p176B*
libsane_matched=yes
# Canon CanoScan 8800F
-usb:v04A9p04A9*
+usb:v04A9p1901*
libsane_matched=yes
# Canon CanoScan LiDE 100
-usb:v04A9p04A9*
+usb:v04A9p1904*
libsane_matched=yes
# Canon CanoScan LiDE 200
-usb:v04A9p04A9*
+usb:v04A9p1905*
libsane_matched=yes
# Canon CanoScan 700F
-usb:v04A9p04A9*
+usb:v04A9p1907*
libsane_matched=yes
# Canon CanoScan 9000F
-usb:v04A9p04A9*
+usb:v04A9p1908*
libsane_matched=yes
# Canon CanoScan LiDE 110
-usb:v04A9p04A9*
+usb:v04A9p1909*
libsane_matched=yes
# Canon CanoScan LiDE 210
-usb:v04A9p04A9*
+usb:v04A9p190A*
libsane_matched=yes
# Canon CanoScan 9000F Mark II
-usb:v04A9p04A9*
+usb:v04A9p190D*
libsane_matched=yes
# Canon CanoScan fb630u | Canon CanoScan fb636u
-usb:v04A9p04A9*
+usb:v04A9p2204*
libsane_matched=yes
# Canon CanoScan N650U/N656U
-usb:v04A9p04A9*
+usb:v04A9p2206*
libsane_matched=yes
# Canon CanoScan N1220U
-usb:v04A9p04A9*
+usb:v04A9p2207*
libsane_matched=yes
# Canon CanoScan D660U
-usb:v04A9p04A9*
+usb:v04A9p2208*
libsane_matched=yes
# Canon CanoScan N670U/N676U/LiDE20
-usb:v04A9p04A9*
+usb:v04A9p220D*
libsane_matched=yes
# Canon CanoScan N1240U/LiDE30
-usb:v04A9p04A9*
+usb:v04A9p220E*
libsane_matched=yes
# Canon CanoScan LiDE 35 | Canon CanoScan LiDE 40 | Canon CanoScan LiDE 50
-usb:v04A9p04A9*
+usb:v04A9p2213*
libsane_matched=yes
# Canon CanoScan LiDE 60
-usb:v04A9p04A9*
+usb:v04A9p221C*
libsane_matched=yes
# Canon CanoScan LiDE25
-usb:v04A9p04A9*
+usb:v04A9p2220*
libsane_matched=yes
# Canon DR-1210C
-usb:v04A9p04A9*
+usb:v04A9p2222*
libsane_matched=yes
# Canon PIXMA MP730
-usb:v04A9p04A9*
+usb:v04A9p262F*
libsane_matched=yes
# Canon PIXMA MP700
-usb:v04A9p04A9*
+usb:v04A9p2630*
libsane_matched=yes
# Canon PIXMA MP360
-usb:v04A9p04A9*
+usb:v04A9p263C*
libsane_matched=yes
# Canon PIXMA MP370
-usb:v04A9p04A9*
+usb:v04A9p263D*
libsane_matched=yes
# Canon PIXMA MP390
-usb:v04A9p04A9*
+usb:v04A9p263E*
libsane_matched=yes
# Canon PIXMA MP375R
-usb:v04A9p04A9*
+usb:v04A9p263F*
libsane_matched=yes
# Canon PIXMA MP740
-usb:v04A9p04A9*
+usb:v04A9p264C*
libsane_matched=yes
# Canon PIXMA MP710
-usb:v04A9p04A9*
+usb:v04A9p264D*
libsane_matched=yes
# Canon imageCLASS MF5630
-usb:v04A9p04A9*
+usb:v04A9p264E*
libsane_matched=yes
# Canon laserBase MF5650
-usb:v04A9p04A9*
+usb:v04A9p264F*
libsane_matched=yes
# Canon imageCLASS MF8170c
-usb:v04A9p04A9*
+usb:v04A9p2659*
libsane_matched=yes
# Canon imageCLASS MF5730
-usb:v04A9p04A9*
+usb:v04A9p265D*
libsane_matched=yes
# Canon imageCLASS MF5750
-usb:v04A9p04A9*
+usb:v04A9p265E*
libsane_matched=yes
# Canon imageCLASS MF5770
-usb:v04A9p04A9*
+usb:v04A9p265F*
libsane_matched=yes
# Canon imageCLASS MF3110
-usb:v04A9p04A9*
+usb:v04A9p2660*
libsane_matched=yes
# Canon imageCLASS MF3240
-usb:v04A9p04A9*
+usb:v04A9p2684*
libsane_matched=yes
# Canon imageCLASS MF6500 series | Canon imageCLASS MF6550
-usb:v04A9p04A9*
+usb:v04A9p2686*
libsane_matched=yes
# Canon imageCLASS MF4120 | Canon imageCLASS MF4122 | Canon imageCLASS MF4140
# Canon imageCLASS MF4150
-usb:v04A9p04A9*
+usb:v04A9p26A3*
libsane_matched=yes
# Canon imageCLASS MF4660 | Canon imageCLASS MF4690
-usb:v04A9p04A9*
+usb:v04A9p26B0*
libsane_matched=yes
# Canon imageCLASS MF4010 | Canon imageCLASS MF4018
-usb:v04A9p04A9*
+usb:v04A9p26B4*
libsane_matched=yes
# Canon imageCLASS MF4270
-usb:v04A9p04A9*
+usb:v04A9p26B5*
libsane_matched=yes
# Canon imageRUNNER 1020/1024/1025
-usb:v04A9p04A9*
+usb:v04A9p26E6*
libsane_matched=yes
# Canon imageCLASS MF4370dn | Canon imageCLASS MF4380dn
-usb:v04A9p04A9*
+usb:v04A9p26EC*
libsane_matched=yes
# Canon imageCLASS D480
-usb:v04A9p04A9*
+usb:v04A9p26ED*
libsane_matched=yes
# Canon I-SENSYS MF4320d | Canon I-SENSYS MF4330d | Canon imageCLASS MF4350d
-usb:v04A9p04A9*
+usb:v04A9p26EE*
libsane_matched=yes
# Canon imageCLASS D420
-usb:v04A9p04A9*
+usb:v04A9p26EF*
libsane_matched=yes
# Canon i-SENSYS MF5880dn
-usb:v04A9p04A9*
+usb:v04A9p26F9*
libsane_matched=yes
# Canon i-SENSYS MF6680dn
-usb:v04A9p04A9*
+usb:v04A9p26FA*
libsane_matched=yes
# Canon imageCLASS MF8030
-usb:v04A9p04A9*
+usb:v04A9p2707*
libsane_matched=yes
# Canon i-SENSYS MF4550d
-usb:v04A9p04A9*
+usb:v04A9p2736*
libsane_matched=yes
# Canon imageCLASS MF4410 | Canon imageCLASS MF4430
-usb:v04A9p04A9*
+usb:v04A9p2737*
libsane_matched=yes
# Canon i-SENSYS MF3010
-usb:v04A9p04A9*
+usb:v04A9p2759*
libsane_matched=yes
# Nikon LS 40 ED | Nikon LS 40 ED | Nikon Coolspan IV
-usb:v04B0p04B0*
+usb:v04B0p4000*
libsane_matched=yes
# Nikon LS 50 ED | Nikon Coolscan V ED | Nikon LS 50 ED
# Nikon Coolscan V ED
-usb:v04B0p04B0*
+usb:v04B0p4001*
libsane_matched=yes
# Nikon Super Coolscan LS-5000 ED | Nikon Super Coolscan LS-5000 ED
-usb:v04B0p04B0*
+usb:v04B0p4002*
libsane_matched=yes
# Epson Perfection 636U | Epson GT-7000U | Epson Perfection 636U
-usb:v04B8p04B8*
+usb:v04B8p0101*
libsane_matched=yes
# Epson Perfection 610 | Epson GT-6600U | Epson Perfection 610
-usb:v04B8p04B8*
+usb:v04B8p0103*
libsane_matched=yes
# Epson Perfection 1200U | Epson Perfection 1200Photo | Epson GT-7600U
# Epson GT-7600UF | Epson Perfection 1200U | Epson Perfection 1200U PHOTO
-usb:v04B8p04B8*
+usb:v04B8p0104*
libsane_matched=yes
# Epson Stylus Scan 2000
-usb:v04B8p04B8*
+usb:v04B8p0105*
libsane_matched=yes
# Epson Stylus Scan 2500
-usb:v04B8p04B8*
+usb:v04B8p0106*
libsane_matched=yes
# Epson Expression 1600 | Epson ES-2000 | Epson Expression 1600
-usb:v04B8p04B8*
+usb:v04B8p0107*
libsane_matched=yes
# Epson ES-8500 | Epson Expression 1640XL
-usb:v04B8p04B8*
+usb:v04B8p0109*
libsane_matched=yes
# Epson Perfection 1640 | Epson GT-8700 | Epson GT-8700F
# Epson Perfection 1640SU | Epson Perfection 1640SU PHOTO
-usb:v04B8p04B8*
+usb:v04B8p010A*
libsane_matched=yes
# Epson Perfection 1240 | Epson GT-7700U | Epson Perfection 1240U
-usb:v04B8p04B8*
+usb:v04B8p010B*
libsane_matched=yes
# Epson Perfection 640 | Epson GT-6700U | Epson Perfection 640U
-usb:v04B8p04B8*
+usb:v04B8p010C*
libsane_matched=yes
# Epson Expression 1680 | Epson ES-2200 | Epson Expression 1680
-usb:v04B8p04B8*
+usb:v04B8p010E*
libsane_matched=yes
# Epson Perfection 1250 | Epson Perfection 1250Photo
-usb:v04B8p04B8*
+usb:v04B8p010F*
libsane_matched=yes
# Epson Perfection 1650 | Epson GT-8200U | Epson GT-8200UF
# Epson Perfection 1650 | Epson Perfection 1650 PHOTO
-usb:v04B8p04B8*
+usb:v04B8p0110*
libsane_matched=yes
# Epson Perfection 2450 | Epson GT-9700F | Epson Perfection 2450 PHOTO
-usb:v04B8p04B8*
+usb:v04B8p0112*
libsane_matched=yes
# Epson Perfection 660
-usb:v04B8p04B8*
+usb:v04B8p0114*
libsane_matched=yes
# Epson Perfection 2400 | Epson GT-9300UF | Epson Perfection 2400 PHOTO
-usb:v04B8p04B8*
+usb:v04B8p011B*
libsane_matched=yes
# Epson Perfection 3200 | Epson GT-9800F | Epson Perfection 3200 PHOTO
-usb:v04B8p04B8*
+usb:v04B8p011C*
libsane_matched=yes
# Epson Perfection 1260 | Epson Perfection 1260Photo
-usb:v04B8p04B8*
+usb:v04B8p011D*
libsane_matched=yes
# Epson Perfection 1660 | Epson GT-8300UF | Epson Perfection 1660 PHOTO
-usb:v04B8p04B8*
+usb:v04B8p011E*
libsane_matched=yes
# Epson Perfection 1670
-usb:v04B8p04B8*
+usb:v04B8p011F*
libsane_matched=yes
# Epson Perfection 1270
-usb:v04B8p04B8*
+usb:v04B8p0120*
libsane_matched=yes
# Epson Perfection 2480 | Epson Perfection 2580
-usb:v04B8p04B8*
+usb:v04B8p0121*
libsane_matched=yes
# Epson Perfection 3490 | Epson Perfection 3590
-usb:v04B8p04B8*
+usb:v04B8p0122*
libsane_matched=yes
# Epson ES-7000H | Epson GT-15000
-usb:v04B8p04B8*
+usb:v04B8p0126*
libsane_matched=yes
# Epson Perfection 4870 | Epson GT-X700 | Epson Perfection 4870 PHOTO
-usb:v04B8p04B8*
+usb:v04B8p0128*
libsane_matched=yes
# Epson ES-10000G | Epson Expression 10000XL
-usb:v04B8p04B8*
+usb:v04B8p0129*
libsane_matched=yes
# Epson Perfection 4990 | Epson GT-X800 | Epson Perfection 4990 PHOTO
-usb:v04B8p04B8*
+usb:v04B8p012A*
libsane_matched=yes
# Epson ES-H300 | Epson GT-2500
-usb:v04B8p04B8*
+usb:v04B8p012B*
libsane_matched=yes
# Epson V700 | Epson V750 | Epson GT-X900
# Epson Perfection V700 Photo | Epson Perfection V750 Photo
-usb:v04B8p04B8*
+usb:v04B8p012C*
libsane_matched=yes
# Epson GT-X970
-usb:v04B8p04B8*
+usb:v04B8p0135*
libsane_matched=yes
# Epson CX-5200 | Epson CX-5400 | Epson CC-600PX
# Epson Stylus CX5100 | Epson Stylus CX5200
-usb:v04B8p04B8*
+usb:v04B8p0801*
libsane_matched=yes
# Epson CX-3200 | Epson CC-570L | Epson Stylus CX3100
# Epson Stylus CX3200
-usb:v04B8p04B8*
+usb:v04B8p0802*
libsane_matched=yes
# Epson CX-6300 | Epson CX-6400 | Epson Stylus CX6300
# Epson Stylus CX6400
-usb:v04B8p04B8*
+usb:v04B8p0805*
libsane_matched=yes
# Epson RX-600 | Epson PM-A850 | Epson Stylus Photo RX600
-usb:v04B8p04B8*
+usb:v04B8p0806*
libsane_matched=yes
# Epson RX-500 | Epson Stylus Photo RX500 | Epson Stylus Photo RX510
-usb:v04B8p04B8*
+usb:v04B8p0807*
libsane_matched=yes
# Epson CX-5400 | Epson Stylus CX5300 | Epson Stylus CX5400
-usb:v04B8p04B8*
+usb:v04B8p0808*
libsane_matched=yes
# Epson Stylus CX-1500
-usb:v04B8p04B8*
+usb:v04B8p080C*
libsane_matched=yes
# Epson CX-4600 | Epson Stylus CX4500 | Epson Stylus CX4600
-usb:v04B8p04B8*
+usb:v04B8p080D*
libsane_matched=yes
# Epson CX-3600 | Epson CX-3650 | Epson PX-A550
# Epson Stylus CX3500 | Epson Stylus CX3600 | Epson Stylus CX3650
-usb:v04B8p04B8*
+usb:v04B8p080E*
libsane_matched=yes
# Epson RX-425 | Epson Stylus Photo RX420 | Epson Stylus Photo RX425
# Epson Stylus Photo RX430
-usb:v04B8p04B8*
+usb:v04B8p080F*
libsane_matched=yes
# Epson RX-700 | Epson PM-A900 | Epson Stylus Photo RX700
-usb:v04B8p04B8*
+usb:v04B8p0810*
libsane_matched=yes
# Epson RX-620 | Epson PM-A870 | Epson Stylus Photo RX620
# Epson Stylus Photo RX630
-usb:v04B8p04B8*
+usb:v04B8p0811*
libsane_matched=yes
# Epson CX-6500 | Epson CX-6600 | Epson Stylus CX6500
# Epson Stylus CX6600
-usb:v04B8p04B8*
+usb:v04B8p0813*
libsane_matched=yes
# Epson PM-A700
-usb:v04B8p04B8*
+usb:v04B8p0814*
libsane_matched=yes
# Epson AcuLaser CX11 | Epson AcuLaser CX11NF | Epson AcuLaser CX11
# Epson AcuLaser CX11NF | Epson LP-A500
-usb:v04B8p04B8*
+usb:v04B8p0815*
libsane_matched=yes
# Epson LP-M5500 | Epson LP-M5500F
-usb:v04B8p04B8*
+usb:v04B8p0817*
libsane_matched=yes
# Epson DX-3850 | Epson CX-3700 | Epson CX-3800
# Epson DX-3800 | Epson Stylus CX3700 | Epson Stylus CX3800
# Epson Stylus DX3800
-usb:v04B8p04B8*
+usb:v04B8p0818*
libsane_matched=yes
# Epson CX-4800 | Epson PX-A650 | Epson Stylus CX4700
# Epson Stylus CX4800 | Epson Stylus DX4800 | Epson Stylus DX4850
-usb:v04B8p04B8*
+usb:v04B8p0819*
libsane_matched=yes
# Epson PM-A750 | Epson Stylus Photo RX520 | Epson Stylus Photo RX530
-usb:v04B8p04B8*
+usb:v04B8p081A*
libsane_matched=yes
# Epson PM-A890 | Epson Stylus Photo RX640 | Epson Stylus Photo RX650
-usb:v04B8p04B8*
+usb:v04B8p081C*
libsane_matched=yes
# Epson PM-A950
-usb:v04B8p04B8*
+usb:v04B8p081D*
libsane_matched=yes
# Epson Stylus CX7700 | Epson Stylus CX7800
-usb:v04B8p04B8*
+usb:v04B8p081F*
libsane_matched=yes
# Epson CX-4200 | Epson Stylus CX4100 | Epson Stylus CX4200
# Epson Stylus DX4200
-usb:v04B8p04B8*
+usb:v04B8p0820*
libsane_matched=yes
# Epson PM-A820 | Epson Stylus Photo RX560 | Epson Stylus Photo RX580
# Epson Stylus Photo RX590
-usb:v04B8p04B8*
+usb:v04B8p0827*
libsane_matched=yes
# Epson PM-A970
-usb:v04B8p04B8*
+usb:v04B8p0828*
libsane_matched=yes
# Epson PM-T990
-usb:v04B8p04B8*
+usb:v04B8p0829*
libsane_matched=yes
# Epson PM-A920
-usb:v04B8p04B8*
+usb:v04B8p082A*
libsane_matched=yes
# Epson CX-5000 | Epson DX-5000 | Epson DX-5050
# Epson Stylus CX4900 | Epson Stylus CX5000 | Epson Stylus DX5000
-usb:v04B8p04B8*
+usb:v04B8p082B*
libsane_matched=yes
# Epson DX-6000 | Epson PX-A720 | Epson Stylus CX5900
# Epson Stylus CX6000 | Epson Stylus DX6000
-usb:v04B8p04B8*
+usb:v04B8p082E*
libsane_matched=yes
# Epson DX-4050 | Epson PX-A620 | Epson Stylus CX3900
# Epson Stylus DX4000
-usb:v04B8p04B8*
+usb:v04B8p082F*
libsane_matched=yes
# Epson ME 200 | Epson Stylus CX2800 | Epson Stylus CX2900
-usb:v04B8p04B8*
+usb:v04B8p0830*
libsane_matched=yes
# Epson LP-M5600
-usb:v04B8p04B8*
+usb:v04B8p0833*
libsane_matched=yes
# Epson LP-M6000
-usb:v04B8p04B8*
+usb:v04B8p0834*
libsane_matched=yes
# Epson AcuLaser CX21
-usb:v04B8p04B8*
+usb:v04B8p0835*
libsane_matched=yes
# Epson PM-T960
-usb:v04B8p04B8*
+usb:v04B8p0836*
libsane_matched=yes
# Epson PM-A940 | Epson Stylus Photo RX680 | Epson Stylus Photo RX685
# Epson Stylus Photo RX690
-usb:v04B8p04B8*
+usb:v04B8p0837*
libsane_matched=yes
# Epson DX-7400 | Epson PX-A640 | Epson Stylus CX7300
# Epson Stylus CX7400 | Epson Stylus DX7400
-usb:v04B8p04B8*
+usb:v04B8p0838*
libsane_matched=yes
# Epson PX-A740 | Epson Stylus CX8300 | Epson Stylus CX8400
# Epson Stylus DX8400
-usb:v04B8p04B8*
+usb:v04B8p0839*
libsane_matched=yes
# Epson PX-FA700 | Epson Stylus CX9300F | Epson Stylus CX9400Fax
# Epson Stylus DX9400F
-usb:v04B8p04B8*
+usb:v04B8p083A*
libsane_matched=yes
# Epson PM-A840 | Epson PM-A840S | Epson Stylus Photo RX585
# Epson Stylus Photo RX595 | Epson Stylus Photo RX610
-usb:v04B8p04B8*
+usb:v04B8p083C*
libsane_matched=yes
# Epson ME 300 | Epson PX-401A | Epson Stylus NX100
# Epson Stylus SX100 | Epson Stylus TX100
-usb:v04B8p04B8*
+usb:v04B8p0841*
libsane_matched=yes
# Epson LP-M5000
-usb:v04B8p04B8*
+usb:v04B8p0843*
libsane_matched=yes
# Epson Artisan 800 | Epson EP-901A | Epson EP-901F
# Epson Stylus Photo PX800FW | Epson Stylus Photo TX800FW
-usb:v04B8p04B8*
+usb:v04B8p0844*
libsane_matched=yes
# Epson Artisan 700 | Epson EP-801A | Epson Stylus Photo PX700W
# Epson Stylus Photo TX700W
-usb:v04B8p04B8*
+usb:v04B8p0846*
libsane_matched=yes
# Epson ME Office 700FW | Epson PX-601F | Epson Stylus Office BX600FW
# Epson Stylus Office TX600FW | Epson Stylus SX600FW | Epson WorkForce 600
-usb:v04B8p04B8*
+usb:v04B8p0847*
libsane_matched=yes
# Epson ME Office 600F | Epson Stylus Office BX300F | Epson Stylus Office TX300F
# Epson Stylus NX300
-usb:v04B8p04B8*
+usb:v04B8p0848*
libsane_matched=yes
# Epson Stylus NX200 | Epson Stylus SX200 | Epson Stylus SX205
# Epson Stylus TX200 | Epson Stylus TX203 | Epson Stylus TX209
-usb:v04B8p04B8*
+usb:v04B8p0849*
libsane_matched=yes
# Epson PX-501A | Epson Stylus NX400 | Epson Stylus SX400
# Epson Stylus SX405 | Epson Stylus TX400
-usb:v04B8p04B8*
+usb:v04B8p084A*
libsane_matched=yes
# Epson WorkForce 500
-usb:v04B8p04B8*
+usb:v04B8p084C*
libsane_matched=yes
# Epson PX-402A | Epson Stylus NX110 Series | Epson Stylus SX110 Series
# Epson Stylus TX110 Series
-usb:v04B8p04B8*
+usb:v04B8p084D*
libsane_matched=yes
# Epson ME OFFICE 510 | Epson Stylus NX210 Series | Epson Stylus SX210 Series
# Epson Stylus TX210 Series
-usb:v04B8p04B8*
+usb:v04B8p084F*
libsane_matched=yes
# Epson Stylus NX410 Series | Epson Stylus SX410 Series | Epson Stylus TX410 Series
-usb:v04B8p04B8*
+usb:v04B8p0851*
libsane_matched=yes
# Epson ME OFFICE 650FN Series | Epson Stylus Office BX310FN Series | Epson Stylus Office TX510FN Series
# Epson WorkForce 310 Series
-usb:v04B8p04B8*
+usb:v04B8p0854*
libsane_matched=yes
# Epson PX-502A | Epson Stylus NX510 Series | Epson Stylus SX510W Series
# Epson Stylus TX550W Series
-usb:v04B8p04B8*
+usb:v04B8p0856*
libsane_matched=yes
# Epson Stylus SX125
-usb:v04B8p04B8*
+usb:v04B8p085C*
libsane_matched=yes
# Fujitsu fi-4010CU
-usb:v04C5p04C5*
+usb:v04C5p1029*
libsane_matched=yes
# Fujitsu fi-4120C
-usb:v04C5p04C5*
+usb:v04C5p1041*
libsane_matched=yes
# Fujitsu fi-4220C
-usb:v04C5p04C5*
+usb:v04C5p1042*
libsane_matched=yes
# Fujitsu fi-4530C
-usb:v04C5p04C5*
+usb:v04C5p1078*
libsane_matched=yes
# Fujitsu fi-5750C
-usb:v04C5p04C5*
+usb:v04C5p1095*
libsane_matched=yes
# Fujitsu fi-5110EOX/2
-usb:v04C5p04C5*
+usb:v04C5p1096*
libsane_matched=yes
# Fujitsu fi-5110C
-usb:v04C5p04C5*
+usb:v04C5p1097*
libsane_matched=yes
# Fujitsu fi-5650C
-usb:v04C5p04C5*
+usb:v04C5p10AD*
libsane_matched=yes
# Fujitsu fi-4120C2
-usb:v04C5p04C5*
+usb:v04C5p10AE*
libsane_matched=yes
# Fujitsu fi-4220C2
-usb:v04C5p04C5*
+usb:v04C5p10AF*
libsane_matched=yes
# Fujitsu fi-60F
-usb:v04C5p04C5*
+usb:v04C5p10C7*
libsane_matched=yes
# Fujitsu fi-4340C
-usb:v04C5p04C5*
+usb:v04C5p10CF*
libsane_matched=yes
# Fujitsu fi-5120C
-usb:v04C5p04C5*
+usb:v04C5p10E0*
libsane_matched=yes
# Fujitsu fi-5220C
-usb:v04C5p04C5*
+usb:v04C5p10E1*
libsane_matched=yes
# Fujitsu fi-5530C
-usb:v04C5p04C5*
+usb:v04C5p10E2*
libsane_matched=yes
# Fujitsu fi-5110EOX3
-usb:v04C5p04C5*
+usb:v04C5p10E6*
libsane_matched=yes
# Fujitsu fi-5900C
-usb:v04C5p04C5*
+usb:v04C5p10E7*
libsane_matched=yes
# Fujitsu fi-5015C
-usb:v04C5p04C5*
+usb:v04C5p10EF*
libsane_matched=yes
# Fujitsu fi-5110EOXM
-usb:v04C5p04C5*
+usb:v04C5p10F2*
libsane_matched=yes
# Fujitsu ScanSnap S500
-usb:v04C5p04C5*
+usb:v04C5p10FE*
libsane_matched=yes
# Fujitsu ScanSnap S500M
-usb:v04C5p04C5*
+usb:v04C5p1135*
libsane_matched=yes
# Fujitsu fi-5530C2
-usb:v04C5p04C5*
+usb:v04C5p114A*
libsane_matched=yes
# Fujitsu fi-6140
-usb:v04C5p04C5*
+usb:v04C5p114D*
libsane_matched=yes
# Fujitsu fi-6240
-usb:v04C5p04C5*
+usb:v04C5p114E*
libsane_matched=yes
# Fujitsu fi-6130
-usb:v04C5p04C5*
+usb:v04C5p114F*
libsane_matched=yes
# Fujitsu fi-6230
-usb:v04C5p04C5*
+usb:v04C5p1150*
libsane_matched=yes
# Fujitsu ScanSnap S510
-usb:v04C5p04C5*
+usb:v04C5p1155*
libsane_matched=yes
# Fujitsu ScanSnap S300
-usb:v04C5p04C5*
+usb:v04C5p1156*
libsane_matched=yes
# Fujitsu ScanSnap S510M
-usb:v04C5p04C5*
+usb:v04C5p116F*
libsane_matched=yes
# Fujitsu fi-6770
-usb:v04C5p04C5*
+usb:v04C5p1174*
libsane_matched=yes
# Fujitsu fi-6770A
-usb:v04C5p04C5*
+usb:v04C5p1175*
libsane_matched=yes
# Fujitsu fi-6670
-usb:v04C5p04C5*
+usb:v04C5p1176*
libsane_matched=yes
# Fujitsu fi-6670A
-usb:v04C5p04C5*
+usb:v04C5p1177*
libsane_matched=yes
# Fujitsu fi-6750S
-usb:v04C5p04C5*
+usb:v04C5p1178*
libsane_matched=yes
# Fujitsu ScanSnap S300M
-usb:v04C5p04C5*
+usb:v04C5p117F*
libsane_matched=yes
# Fujitsu fi-6800
-usb:v04C5p04C5*
+usb:v04C5p119D*
libsane_matched=yes
# Fujitsu fi-6800-CGA
-usb:v04C5p04C5*
+usb:v04C5p119E*
libsane_matched=yes
# Fujitsu ScanSnap S1500 | Fujitsu ScanSnap S1500M
-usb:v04C5p04C5*
+usb:v04C5p11A2*
libsane_matched=yes
# Fujitsu ScanSnap S1300
-usb:v04C5p04C5*
+usb:v04C5p11ED*
libsane_matched=yes
# Fujitsu fi-6140Z
-usb:v04C5p04C5*
+usb:v04C5p11F1*
libsane_matched=yes
# Fujitsu fi-6240Z
-usb:v04C5p04C5*
+usb:v04C5p11F2*
libsane_matched=yes
# Fujitsu fi-6130Z
-usb:v04C5p04C5*
+usb:v04C5p11F3*
libsane_matched=yes
# Fujitsu fi-6230Z
-usb:v04C5p04C5*
+usb:v04C5p11F4*
libsane_matched=yes
# Fujitsu fi-6110
-usb:v04C5p04C5*
+usb:v04C5p11FC*
libsane_matched=yes
# Fujitsu fi-5950
-usb:v04C5p04C5*
+usb:v04C5p1213*
libsane_matched=yes
# Fujitsu ScanSnap iX500
-usb:v04C5p04C5*
+usb:v04C5p132B*
libsane_matched=yes
# Konica e-mini
-usb:v04C8p04C8*
+usb:v04C8p0722*
libsane_matched=yes
# Panasonic KV-S2026C
-usb:v04DAp04DA*
+usb:v04DAp1000*
libsane_matched=yes
# Panasonic KV-S2046C
-usb:v04DAp04DA*
+usb:v04DAp1001*
libsane_matched=yes
# Panasonic KV-S1025C
-usb:v04DAp04DA*
+usb:v04DAp1006*
libsane_matched=yes
# Panasonic KV-S1020C
-usb:v04DAp04DA*
+usb:v04DAp1007*
libsane_matched=yes
# Panasonic KV-S2048C
-usb:v04DAp04DA*
+usb:v04DAp1009*
libsane_matched=yes
# Panasonic KV-S2028C
-usb:v04DAp04DA*
+usb:v04DAp100A*
libsane_matched=yes
# Panasonic KV-S4085C
-usb:v04DAp04DA*
+usb:v04DAp100C*
libsane_matched=yes
# Panasonic KV-S4065C
-usb:v04DAp04DA*
+usb:v04DAp100D*
libsane_matched=yes
# Panasonic KV-S7075C
-usb:v04DAp04DA*
+usb:v04DAp100E*
libsane_matched=yes
# Panasonic KV-SS080
-usb:v04DAp04DA*
+usb:v04DAp100F*
libsane_matched=yes
# Panasonic KV-S1045C
-usb:v04DAp04DA*
+usb:v04DAp1010*
libsane_matched=yes
# Samsung SCX-4x16
-usb:v04E8p04E8*
+usb:v04E8p3409*
libsane_matched=yes
# Samsung SCX-6x20
-usb:v04E8p04E8*
+usb:v04E8p340D*
libsane_matched=yes
# Samsung MFP-560
-usb:v04E8p04E8*
+usb:v04E8p340E*
libsane_matched=yes
# Samsung MFP-750
-usb:v04E8p04E8*
+usb:v04E8p340F*
libsane_matched=yes
# Samsung SCX-4x20
-usb:v04E8p04E8*
+usb:v04E8p3412*
libsane_matched=yes
# Samsung SCX-4100
-usb:v04E8p04E8*
+usb:v04E8p3413*
libsane_matched=yes
# Samsung SCX-4x21
-usb:v04E8p04E8*
+usb:v04E8p3419*
libsane_matched=yes
# Samsung SCX-5x30
-usb:v04E8p04E8*
+usb:v04E8p341A*
libsane_matched=yes
# Samsung SCX-4200
-usb:v04E8p04E8*
+usb:v04E8p341B*
libsane_matched=yes
# Samsung CLX-3160
-usb:v04E8p04E8*
+usb:v04E8p341C*
libsane_matched=yes
# Samsung SCX-6x22
-usb:v04E8p04E8*
+usb:v04E8p341D*
libsane_matched=yes
# Samsung SCX4725 | Samsung SCX4725-FN
-usb:v04E8p04E8*
+usb:v04E8p341F*
libsane_matched=yes
# Samsung SCX-6x45
-usb:v04E8p04E8*
+usb:v04E8p3420*
libsane_matched=yes
# Samsung CLX-8380
-usb:v04E8p04E8*
+usb:v04E8p3421*
libsane_matched=yes
# Samsung CLX-2160
-usb:v04E8p04E8*
+usb:v04E8p3425*
libsane_matched=yes
# Samsung SCX-4500
-usb:v04E8p04E8*
+usb:v04E8p3426*
libsane_matched=yes
# Samsung CLX-6200
-usb:v04E8p04E8*
+usb:v04E8p3427*
libsane_matched=yes
# Samsung CLX-6240
-usb:v04E8p04E8*
+usb:v04E8p3428*
libsane_matched=yes
# Samsung SCX-6x55
-usb:v04E8p04E8*
+usb:v04E8p3429*
libsane_matched=yes
# Samsung CLX-3170fn (CLX-3170 Series) | Samsung CLX-3175FW
-usb:v04E8p04E8*
+usb:v04E8p342A*
libsane_matched=yes
# Samsung SCX-4500W
-usb:v04E8p04E8*
+usb:v04E8p342B*
libsane_matched=yes
# Samsung SCX-4824 (SCX-4x24 Series)
-usb:v04E8p04E8*
+usb:v04E8p342C*
libsane_matched=yes
# Samsung SCX-4828FN (SCX-4x28 Series)
-usb:v04E8p04E8*
+usb:v04E8p342D*
libsane_matched=yes
# Samsung SCX-4300
-usb:v04E8p04E8*
+usb:v04E8p342E*
libsane_matched=yes
# Samsung SCX-5835_5935
-usb:v04E8p04E8*
+usb:v04E8p342F*
libsane_matched=yes
# Samsung SCX-5635
-usb:v04E8p04E8*
+usb:v04E8p3430*
libsane_matched=yes
# Samsung SCX-4x26
-usb:v04E8p04E8*
+usb:v04E8p3432*
libsane_matched=yes
# Samsung SCX-4600
-usb:v04E8p04E8*
+usb:v04E8p3433*
libsane_matched=yes
# Samsung SCX-4623
-usb:v04E8p04E8*
+usb:v04E8p3434*
libsane_matched=yes
# Samsung MFP-65x
-usb:v04E8p04E8*
+usb:v04E8p3435*
libsane_matched=yes
# Samsung SCX-6545
-usb:v04E8p04E8*
+usb:v04E8p3437*
libsane_matched=yes
# Samsung CLX-8385
-usb:v04E8p04E8*
+usb:v04E8p3439*
libsane_matched=yes
# Samsung CLX-6220
-usb:v04E8p04E8*
+usb:v04E8p343A*
libsane_matched=yes
# Samsung CLX-6250
-usb:v04E8p04E8*
+usb:v04E8p343B*
libsane_matched=yes
# Samsung SCX-4825FN (SCX-4x25 Series)
-usb:v04E8p04E8*
+usb:v04E8p343C*
libsane_matched=yes
# Samsung CLX-3185
-usb:v04E8p04E8*
+usb:v04E8p343D*
libsane_matched=yes
# Samsung CLX-8540
-usb:v04E8p04E8*
+usb:v04E8p343F*
libsane_matched=yes
# Samsung SCX-4623FW
-usb:v04E8p04E8*
+usb:v04E8p3440*
libsane_matched=yes
# Samsung SCX-3205W (SCX-3200 Series)
-usb:v04E8p04E8*
+usb:v04E8p3441*
libsane_matched=yes
# Samsung SCX-6545X
-usb:v04E8p04E8*
+usb:v04E8p3442*
libsane_matched=yes
# Samsung SCX-6x55X
-usb:v04E8p04E8*
+usb:v04E8p3443*
libsane_matched=yes
# Samsung CLX-8385X
-usb:v04E8p04E8*
+usb:v04E8p3444*
libsane_matched=yes
# Samsung SCX-5835_5935X
-usb:v04E8p04E8*
+usb:v04E8p3446*
libsane_matched=yes
# Samsung SCX-4833FD | Samsung SCX-4835FD
-usb:v04E8p04E8*
+usb:v04E8p344B*
libsane_matched=yes
# Samsung SCX-3400
-usb:v04E8p04E8*
+usb:v04E8p344F*
libsane_matched=yes
# Samsung SF-760
-usb:v04E8p04E8*
+usb:v04E8p3450*
libsane_matched=yes
# Samsung SCX-4729FD
-usb:v04E8p04E8*
+usb:v04E8p3453*
libsane_matched=yes
# Samsung CLX-6260
-usb:v04E8p04E8*
+usb:v04E8p3455*
libsane_matched=yes
# Samsung CLX-3300 Series
-usb:v04E8p04E8*
+usb:v04E8p3456*
libsane_matched=yes
# Samsung SCX-470x
-usb:v04E8p04E8*
+usb:v04E8p3457*
libsane_matched=yes
# Samsung CLX-4190
-usb:v04E8p04E8*
+usb:v04E8p345A*
libsane_matched=yes
# Samsung SCX-4650 4x21S Series
-usb:v04E8p04E8*
+usb:v04E8p345B*
libsane_matched=yes
# Samsung M337x 387x 407x Series
-usb:v04E8p04E8*
+usb:v04E8p3460*
libsane_matched=yes
# Samsung M267x 287x Series
-usb:v04E8p04E8*
+usb:v04E8p3461*
libsane_matched=yes
# Samsung SCX-681x
-usb:v04E8p04E8*
+usb:v04E8p3466*
libsane_matched=yes
# Samsung C460
-usb:v04E8p04E8*
+usb:v04E8p3468*
libsane_matched=yes
# Pentax DSmobile 600
-usb:v04F9p04F9*
+usb:v04F9p2038*
libsane_matched=yes
# Aiptek Aiptek Pencam
-usb:v0553p0553*
+usb:v0553p0202*
libsane_matched=yes
# Mustek ScanExpress 1200 CU
-usb:v055Fp055F*
+usb:v055Fp0001*
libsane_matched=yes
# Mustek ScanExpress 600 CU
-usb:v055Fp055F*
+usb:v055Fp0002*
libsane_matched=yes
# Mustek ScanExpress 1200 UB | Trust Compact Scan USB 19200
-usb:v055Fp055F*
+usb:v055Fp0006*
libsane_matched=yes
# Mustek ScanExpress 1200 CU Plus
-usb:v055Fp055F*
+usb:v055Fp0008*
libsane_matched=yes
# Mustek BearPaw 1200 F
-usb:v055Fp055F*
+usb:v055Fp0010*
libsane_matched=yes
# Mustek ScanExpress A3 USB
-usb:v055Fp055F*
+usb:v055Fp0210*
libsane_matched=yes
# Mustek BearPaw 2400 CS | Mustek BearPaw 2400 TA | Trust 240TH Easy Webscan Gold
-usb:v055Fp055F*
+usb:v055Fp0218*
libsane_matched=yes
# Mustek BearPaw 2400 CS Plus | Mustek BearPaw 2400 TA Plus | Mustek Plug-n-Scan 2400 MT
# Mustek Plug-n-Scan 2400 M | Packard Bell Diamond 2450
-usb:v055Fp055F*
+usb:v055Fp0219*
libsane_matched=yes
# Mustek BearPaw 2448 CS Plus | Mustek BearPaw 2448 TA Plus
-usb:v055Fp055F*
+usb:v055Fp021A*
libsane_matched=yes
# Mustek BearPaw 1200 CU Plus | Packard Bell Diamond 1200 Plus
-usb:v055Fp055F*
+usb:v055Fp021B*
libsane_matched=yes
# Mustek BearPaw 1200 CU Plus | Mustek BearPaw 1248 CU | Packard Bell Diamond 1200 Plus
# Trust Direct WebScan 19200
-usb:v055Fp055F*
+usb:v055Fp021C*
libsane_matched=yes
# Mustek BearPaw 2400 CU Plus
-usb:v055Fp055F*
+usb:v055Fp021D*
libsane_matched=yes
# Mustek BearPaw 1200 CS | Mustek BearPaw 1200 TA
-usb:v055Fp055F*
+usb:v055Fp021E*
libsane_matched=yes
# Mustek ScanExpress 1248 UB
-usb:v055Fp055F*
+usb:v055Fp021F*
libsane_matched=yes
# Mustek BearPaw 2448TA Pro
-usb:v055Fp055F*
+usb:v055Fp0409*
libsane_matched=yes
# Artec/Ultima Ultima 2000 | Artec/Ultima Ultima 2000 e+ | Boeder Sm@rtScan Slim Edition
@@ -2173,564 +2173,564 @@ usb:v055Fp055F*
# Medion/Lifetec/Tevion/Cytron MD 9458 | Mustek BearPaw 1200 CU | Mustek BearPaw 2400 CU
# Mustek ScanExpress 1200 UB Plus | Mustek ScanExpress 2400 USB | Mustek ScanMagic 1200 UB Plus
# Packard Bell Diamond 1200 | Trust Compact Scan USB 19200 | Trust Flat Scan USB 19200
-usb:v05D8p05D8*
+usb:v05D8p4002*
libsane_matched=yes
# Artec/Ultima E+ 48U | Medion/Lifetec/Tevion/Cytron MD9693 | Medion/Lifetec/Tevion/Cytron MD9705
# Medion/Lifetec/Tevion/Cytron MD4394 | Microstar MR 9791
-usb:v05D8p05D8*
+usb:v05D8p4003*
libsane_matched=yes
# Artec/Ultima E+ Pro
-usb:v05D8p05D8*
+usb:v05D8p4004*
libsane_matched=yes
# Memorex MEM 48U
-usb:v05D8p05D8*
+usb:v05D8p4005*
libsane_matched=yes
# Trust Easy Webscan 19200
-usb:v05D8p05D8*
+usb:v05D8p4006*
libsane_matched=yes
# Trust 240H Easy Webscan Gold
-usb:v05D8p05D8*
+usb:v05D8p4007*
libsane_matched=yes
# UMAX AstraSlim SE
-usb:v05D8p05D8*
+usb:v05D8p4009*
libsane_matched=yes
# UMAX AstraSlim 1200 SE
-usb:v05D8p05D8*
+usb:v05D8p4010*
libsane_matched=yes
# Yakumo Scan50
-usb:v05D8p05D8*
+usb:v05D8p4011*
libsane_matched=yes
# Microtek ScanMaker X6USB
-usb:v05DAp05DA*
+usb:v05DAp0099*
libsane_matched=yes
# Microtek SlimScan C6
-usb:v05DAp05DA*
+usb:v05DAp009A*
libsane_matched=yes
# Microtek ScanMaker V6USL
-usb:v05DAp05DA*
+usb:v05DAp00A3*
libsane_matched=yes
# Microtek ScanMaker V6UPL
-usb:v05DAp05DA*
+usb:v05DAp00B6*
libsane_matched=yes
# Microtek ScanMaker 4800
-usb:v05DAp05DA*
+usb:v05DAp30CF*
libsane_matched=yes
# Microtek ScanMaker 3840
-usb:v05DAp05DA*
+usb:v05DAp30D4*
libsane_matched=yes
# Microtek ScanMaker 3600
-usb:v05DAp05DA*
+usb:v05DAp40B3*
libsane_matched=yes
# Microtek ScanMaker 3700
-usb:v05DAp05DA*
+usb:v05DAp40B8*
libsane_matched=yes
# Microtek ScanMaker 3600
-usb:v05DAp05DA*
+usb:v05DAp40CA*
libsane_matched=yes
# Microtek ScanMaker 3700
-usb:v05DAp05DA*
+usb:v05DAp40CB*
libsane_matched=yes
# Microtek ScanMaker 3750
-usb:v05DAp05DA*
+usb:v05DAp40DD*
libsane_matched=yes
# Microtek ScanMaker 3600
-usb:v05DAp05DA*
+usb:v05DAp40FF*
libsane_matched=yes
# Microtek ScanMaker V6USL
-usb:v05DAp05DA*
+usb:v05DAp80A3*
libsane_matched=yes
# iVina 1200U
-usb:v0638p0638*
+usb:v0638p0268*
libsane_matched=yes
# Minolta Dimage Scan Dual II
-usb:v0638p0638*
+usb:v0638p026A*
libsane_matched=yes
# Avision AV600U
-usb:v0638p0638*
+usb:v0638p0A13*
libsane_matched=yes
# Minolta-QMS SC-110
-usb:v0638p0638*
+usb:v0638p0A15*
libsane_matched=yes
# Avision DS610CU Scancopier | Minolta-QMS SC-215 | OKI S700 Scancopier
-usb:v0638p0638*
+usb:v0638p0A16*
libsane_matched=yes
# Avision AV610 | Avision AV600U Plus
-usb:v0638p0638*
+usb:v0638p0A18*
libsane_matched=yes
# Avision AV220
-usb:v0638p0638*
+usb:v0638p0A23*
libsane_matched=yes
# Avision AV210
-usb:v0638p0638*
+usb:v0638p0A24*
libsane_matched=yes
# Avision AV210
-usb:v0638p0638*
+usb:v0638p0A25*
libsane_matched=yes
# Avision AV120
-usb:v0638p0638*
+usb:v0638p0A27*
libsane_matched=yes
# Avision AV220C2
-usb:v0638p0638*
+usb:v0638p0A2A*
libsane_matched=yes
# Avision AV220D2
-usb:v0638p0638*
+usb:v0638p0A2B*
libsane_matched=yes
# Avision AV220+
-usb:v0638p0638*
+usb:v0638p0A2C*
libsane_matched=yes
# Avision AV220C2-G
-usb:v0638p0638*
+usb:v0638p0A2D*
libsane_matched=yes
# Avision AV220C2-B
-usb:v0638p0638*
+usb:v0638p0A2E*
libsane_matched=yes
# Avision AV210C2-G
-usb:v0638p0638*
+usb:v0638p0A2F*
libsane_matched=yes
# Avision AV122
-usb:v0638p0638*
+usb:v0638p0A33*
libsane_matched=yes
# Avision AV210C2
-usb:v0638p0638*
+usb:v0638p0A3A*
libsane_matched=yes
# Avision AV121
-usb:v0638p0638*
+usb:v0638p0A3C*
libsane_matched=yes
# Avision AV8300
-usb:v0638p0638*
+usb:v0638p0A40*
libsane_matched=yes
# Avision AM3000 Series
-usb:v0638p0638*
+usb:v0638p0A41*
libsane_matched=yes
# Avision @V5100
-usb:v0638p0638*
+usb:v0638p0A45*
libsane_matched=yes
# Avision AV8050U
-usb:v0638p0638*
+usb:v0638p0A4D*
libsane_matched=yes
# Avision AV3200SU
-usb:v0638p0638*
+usb:v0638p0A4E*
libsane_matched=yes
# Avision AV3730SU
-usb:v0638p0638*
+usb:v0638p0A4F*
libsane_matched=yes
# Avision AV610C2
-usb:v0638p0638*
+usb:v0638p0A5E*
libsane_matched=yes
# Avision IT8300
-usb:v0638p0638*
+usb:v0638p0A61*
libsane_matched=yes
# Avision AV3750SU
-usb:v0638p0638*
+usb:v0638p0A65*
libsane_matched=yes
# Avision AV3850SU
-usb:v0638p0638*
+usb:v0638p0A66*
libsane_matched=yes
# Avision AV8350
-usb:v0638p0638*
+usb:v0638p0A68*
libsane_matched=yes
# Avision FB6080E
-usb:v0638p0638*
+usb:v0638p0A82*
libsane_matched=yes
# Avision FB2080E
-usb:v0638p0638*
+usb:v0638p0A84*
libsane_matched=yes
# Avision AV122 C2
-usb:v0638p0638*
+usb:v0638p0A93*
libsane_matched=yes
# Avision AV220-G
-usb:v0638p0638*
+usb:v0638p0A94*
libsane_matched=yes
# Avision @V2500
-usb:v0638p0638*
+usb:v0638p0AA1*
libsane_matched=yes
# Avision AV210D2+
-usb:v0638p0638*
+usb:v0638p1A35*
libsane_matched=yes
# Minolta Elite II
-usb:v0686p0686*
+usb:v0686p4004*
libsane_matched=yes
# Minolta Dimage Scan Dual III
-usb:v0686p0686*
+usb:v0686p400D*
libsane_matched=yes
# Minolta Dimage Scan Elite 5400
-usb:v0686p0686*
+usb:v0686p400E*
libsane_matched=yes
# AGFA SnapScan 1212U
-usb:v06BDp06BD*
+usb:v06BDp0001*
libsane_matched=yes
# AGFA SnapScan 1236u
-usb:v06BDp06BD*
+usb:v06BDp0002*
libsane_matched=yes
# Agfa Snapscan Touch
-usb:v06BDp06BD*
+usb:v06BDp0100*
libsane_matched=yes
# AGFA SnapScan 1212U_2
-usb:v06BDp06BD*
+usb:v06BDp2061*
libsane_matched=yes
# AGFA SnapScan e40
-usb:v06BDp06BD*
+usb:v06BDp208D*
libsane_matched=yes
# AGFA SnapScan e50
-usb:v06BDp06BD*
+usb:v06BDp208F*
libsane_matched=yes
# AGFA SnapScan e20
-usb:v06BDp06BD*
+usb:v06BDp2091*
libsane_matched=yes
# AGFA SnapScan e10
-usb:v06BDp06BD*
+usb:v06BDp2093*
libsane_matched=yes
# AGFA SnapScan e25
-usb:v06BDp06BD*
+usb:v06BDp2095*
libsane_matched=yes
# AGFA SnapScan e26
-usb:v06BDp06BD*
+usb:v06BDp2097*
libsane_matched=yes
# AGFA SnapScan e52
-usb:v06BDp06BD*
+usb:v06BDp20FD*
libsane_matched=yes
# AGFA SnapScan e42
-usb:v06BDp06BD*
+usb:v06BDp20FF*
libsane_matched=yes
# UMAX Astra 4900
-usb:v06DCp06DC*
+usb:v06DCp0020*
libsane_matched=yes
# Plustek OpticPro U12 | Plustek OpticPro UT12 | Plustek OpticPro 1212U
# RevScan RevScan Orange R48Ti | Genius ColorPage Vivid III USB
-usb:v07B3p07B3*
+usb:v07B3p0001*
libsane_matched=yes
# Plustek OpticPro U12
-usb:v07B3p07B3*
+usb:v07B3p0010*
libsane_matched=yes
# Plustek OpticPro U24
-usb:v07B3p07B3*
+usb:v07B3p0011*
libsane_matched=yes
# Plustek OpticPro UT12
-usb:v07B3p07B3*
+usb:v07B3p0013*
libsane_matched=yes
# Plustek OpticPro U24
-usb:v07B3p07B3*
+usb:v07B3p0015*
libsane_matched=yes
# Plustek OpticPro UT12 | Plustek OpticPro UT16 | Plustek OpticPro UT24
-usb:v07B3p07B3*
+usb:v07B3p0017*
libsane_matched=yes
# Plustek OpticPro 1248U | RevScan 19200i
-usb:v07B3p07B3*
+usb:v07B3p0400*
libsane_matched=yes
# Plustek OpticPro 1248U
-usb:v07B3p07B3*
+usb:v07B3p0401*
libsane_matched=yes
# Plustek OpticPro U16B
-usb:v07B3p07B3*
+usb:v07B3p0402*
libsane_matched=yes
# Plustek OpticPro U16B+ | Plustek OpticPro UT16B
-usb:v07B3p07B3*
+usb:v07B3p0403*
libsane_matched=yes
# Nortek MyScan 1200 | Plustek OpticPro S12 | Plustek OpticPro ST12
-usb:v07B3p07B3*
+usb:v07B3p040B*
libsane_matched=yes
# Plustek OpticPro S24
-usb:v07B3p07B3*
+usb:v07B3p040E*
libsane_matched=yes
# NeatReceipts Scanalizer Professional 2.5 | Plustek OpticSlim M12
-usb:v07B3p07B3*
+usb:v07B3p0412*
libsane_matched=yes
# Plustek OpticSlim 1200
-usb:v07B3p07B3*
+usb:v07B3p0413*
libsane_matched=yes
# Plustek OpticSlim 2400
-usb:v07B3p07B3*
+usb:v07B3p0422*
libsane_matched=yes
# Plustek OpticSlim 2400 plus
-usb:v07B3p07B3*
+usb:v07B3p0454*
libsane_matched=yes
# Plustek Iriscan Express 2
-usb:v07B3p07B3*
+usb:v07B3p045F*
libsane_matched=yes
# NeatReceipts Mobile Scanner
-usb:v07B3p07B3*
+usb:v07B3p0462*
libsane_matched=yes
# Plustek OpticBook 3600
-usb:v07B3p07B3*
+usb:v07B3p0900*
libsane_matched=yes
# Corex 600c
-usb:v08F0p08F0*
+usb:v08F0p0002*
libsane_matched=yes
# Corex 800c
-usb:v08F0p08F0*
+usb:v08F0p0005*
libsane_matched=yes
# Xerox Phaser 6110MFP
-usb:v0924p0924*
+usb:v0924p3D5D*
libsane_matched=yes
# Xerox Phaser 3200MFP
-usb:v0924p0924*
+usb:v0924p3DA4*
libsane_matched=yes
# Xerox WorkCentre 4118 Series
-usb:v0924p0924*
+usb:v0924p420C*
libsane_matched=yes
# Xerox WorkCentre 3119 Series
-usb:v0924p0924*
+usb:v0924p4265*
libsane_matched=yes
# Xerox WorkCentre 3210
-usb:v0924p0924*
+usb:v0924p4293*
libsane_matched=yes
# Xerox WorkCentre 3220
-usb:v0924p0924*
+usb:v0924p4294*
libsane_matched=yes
# Pentax DSmobile 600
-usb:v0A17p0A17*
+usb:v0A17p3210*
libsane_matched=yes
# Portable Peripheral Co., Ltd. Q-Scan USB001 (A4 portable scanner)
-usb:v0A53p0A53*
+usb:v0A53p1000*
libsane_matched=yes
# Portable Peripheral Co., Ltd. Q-Scan USB201 (A6 portable scanner)
-usb:v0A53p0A53*
+usb:v0A53p2000*
libsane_matched=yes
# Syscan TravelScan 460/464 | Ambir Visigo A4
-usb:v0A82p0A82*
+usb:v0A82p4600*
libsane_matched=yes
# Syscan DocketPort 465
-usb:v0A82p0A82*
+usb:v0A82p4802*
libsane_matched=yes
# Syscan DocketPort 665
-usb:v0A82p0A82*
+usb:v0A82p4803*
libsane_matched=yes
# Syscan DocketPort 685/ Ambir DS685
-usb:v0A82p0A82*
+usb:v0A82p480C*
libsane_matched=yes
# Syscan DocketPort 485
-usb:v0A82p0A82*
+usb:v0A82p4810*
libsane_matched=yes
# Syscan TravelScan 662
-usb:v0A82p0A82*
+usb:v0A82p6620*
libsane_matched=yes
# Canon CR-55
-usb:v1083p1083*
+usb:v1083p160C*
libsane_matched=yes
# Canon DR-1210C
-usb:v1083p1083*
+usb:v1083p160F*
libsane_matched=yes
# Canon DR-4010C
-usb:v1083p1083*
+usb:v1083p1614*
libsane_matched=yes
# Canon DR-2510C
-usb:v1083p1083*
+usb:v1083p1617*
libsane_matched=yes
# Canon DR-X10C
-usb:v1083p1083*
+usb:v1083p1618*
libsane_matched=yes
# Canon CR-25
-usb:v1083p1083*
+usb:v1083p161A*
libsane_matched=yes
# Canon DR-2010C
-usb:v1083p1083*
+usb:v1083p161B*
libsane_matched=yes
# Canon DR-3010C
-usb:v1083p1083*
+usb:v1083p161D*
libsane_matched=yes
# Canon DR-7090C
-usb:v1083p1083*
+usb:v1083p1620*
libsane_matched=yes
# Canon DR-9050C
-usb:v1083p1083*
+usb:v1083p1622*
libsane_matched=yes
# Canon DR-7550C
-usb:v1083p1083*
+usb:v1083p1623*
libsane_matched=yes
# Canon DR-6050C
-usb:v1083p1083*
+usb:v1083p1624*
libsane_matched=yes
# Canon DR-6010C
-usb:v1083p1083*
+usb:v1083p1626*
libsane_matched=yes
# Canon CR-190i
-usb:v1083p1083*
+usb:v1083p162B*
libsane_matched=yes
# Canon DR-6030C
-usb:v1083p1083*
+usb:v1083p1638*
libsane_matched=yes
# Canon CR-135i
-usb:v1083p1083*
+usb:v1083p1639*
libsane_matched=yes
# Digital Dream l' espion XS
-usb:v1183p1183*
+usb:v1183p0001*
libsane_matched=yes
# KONICA MINOLTA magicolor 1690MF
-usb:v132Bp132B*
+usb:v132Bp2089*
libsane_matched=yes
# UMAX Astra 1220U
-usb:v1606p1606*
+usb:v1606p0010*
libsane_matched=yes
# UMAX Astra 1600U | UMAX Astra 2000U
-usb:v1606p1606*
+usb:v1606p0030*
libsane_matched=yes
# Umax UMAX 3400
-usb:v1606p1606*
+usb:v1606p0050*
libsane_matched=yes
# Umax UMAX 3400 | Umax UMAX Astranet ia101 | Umax UMAX 3450
-usb:v1606p1606*
+usb:v1606p0060*
libsane_matched=yes
# UMAX Astra 4400 | UMAX Astra 4450
-usb:v1606p1606*
+usb:v1606p0070*
libsane_matched=yes
# UMAX Astra 2100U
-usb:v1606p1606*
+usb:v1606p0130*
libsane_matched=yes
# Umax UMAX 5400
-usb:v1606p1606*
+usb:v1606p0160*
libsane_matched=yes
# UMAX Astra 2200 (SU)
-usb:v1606p1606*
+usb:v1606p0230*
libsane_matched=yes
# DCT DocketPort 487
-usb:v1DCCp1DCC*
+usb:v1DCCp4810*
libsane_matched=yes
# Dell A920
-usb:v413Cp413C*
+usb:v413Cp5105*
libsane_matched=yes
# Dell Dell MFP Laser Printer 1815dn
-usb:v413Cp413C*
+usb:v413Cp5124*
libsane_matched=yes
# Dell 1600n
-usb:v413Cp413C*
+usb:v413Cp5250*
libsane_matched=yes
diff --git a/testsuite/tools/data/udev+acl.ref b/testsuite/tools/data/udev+acl.ref
index dc21606..167cf56 100644
--- a/testsuite/tools/data/udev+acl.ref
+++ b/testsuite/tools/data/udev+acl.ref
@@ -1430,7 +1430,8 @@ ENV{libsane_matched}=="yes", RUN+="/bin/sh -c 'if test -e /sys/$env{DEVPATH}/pow
LABEL="libsane_usb_rules_end"
-SUBSYSTEMS!="scsi", GOTO="libsane_scsi_rules_end"
+SUBSYSTEMS=="scsi", GOTO="libsane_scsi_rules_begin"
+GOTO="libsane_scsi_rules_end"
LABEL="libsane_scsi_rules_begin"
# Generic: SCSI device type 6 indicates a scanner
diff --git a/testsuite/tools/data/udev+hwdb.ref b/testsuite/tools/data/udev+hwdb.ref
index 7e25b80..aec3129 100644
--- a/testsuite/tools/data/udev+hwdb.ref
+++ b/testsuite/tools/data/udev+hwdb.ref
@@ -25,7 +25,10 @@ ACTION!="add", GOTO="libsane_rules_end"
# The following rule will disable USB autosuspend for the device
ENV{DEVTYPE}=="usb_device", ENV{libsane_matched}=="yes", TEST=="power/control", ATTR{power/control}="on"
-SUBSYSTEMS!="scsi", GOTO="libsane_rules_end"
+SUBSYSTEMS=="scsi", GOTO="libsane_scsi_rules_begin"
+GOTO="libsane_rules_end"
+
+LABEL="libsane_scsi_rules_begin"
KERNEL!="sg[0-9]*", GOTO="libsane_rules_end"
# Generic: SCSI device type 6 indicates a scanner
diff --git a/testsuite/tools/data/udev.ref b/testsuite/tools/data/udev.ref
index 859a0dc..12db0e4 100644
--- a/testsuite/tools/data/udev.ref
+++ b/testsuite/tools/data/udev.ref
@@ -1430,7 +1430,8 @@ ENV{libsane_matched}=="yes", RUN+="/bin/sh -c 'if test -e /sys/$env{DEVPATH}/pow
LABEL="libsane_usb_rules_end"
-SUBSYSTEMS!="scsi", GOTO="libsane_scsi_rules_end"
+SUBSYSTEMS=="scsi", GOTO="libsane_scsi_rules_begin"
+GOTO="libsane_scsi_rules_end"
LABEL="libsane_scsi_rules_begin"
# Generic: SCSI device type 6 indicates a scanner
diff --git a/tools/Makefile.am b/tools/Makefile.am
index 7c2a616..2024180 100644
--- a/tools/Makefile.am
+++ b/tools/Makefile.am
@@ -8,7 +8,12 @@ AM_CPPFLAGS = -I. -I$(srcdir) -I$(top_builddir)/include \
-I$(top_srcdir)/include
bin_PROGRAMS = sane-find-scanner gamma4scanimage
-noinst_PROGRAMS = sane-desc umax_pp
+noinst_PROGRAMS = sane-desc
+if INSTALL_UMAX_PP_TOOLS
+bin_PROGRAMS = umax_pp
+else
+noinst_PROGRAMS = umax_pp
+endif
if CROSS_COMPILING
HOTPLUG =
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 367a70b..49d5953 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -1,4 +1,4 @@
-# Makefile.in generated by automake 1.13.4 from Makefile.am.
+# Makefile.in generated by automake 1.14.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994-2013 Free Software Foundation, Inc.
@@ -80,8 +80,15 @@ PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
-bin_PROGRAMS = sane-find-scanner$(EXEEXT) gamma4scanimage$(EXEEXT)
-noinst_PROGRAMS = sane-desc$(EXEEXT) umax_pp$(EXEEXT)
+@INSTALL_UMAX_PP_TOOLS_FALSE@bin_PROGRAMS = \
+@INSTALL_UMAX_PP_TOOLS_FALSE@ sane-find-scanner$(EXEEXT) \
+@INSTALL_UMAX_PP_TOOLS_FALSE@ gamma4scanimage$(EXEEXT)
+@INSTALL_UMAX_PP_TOOLS_TRUE@bin_PROGRAMS = umax_pp$(EXEEXT) \
+@INSTALL_UMAX_PP_TOOLS_TRUE@ sane-find-scanner$(EXEEXT) \
+@INSTALL_UMAX_PP_TOOLS_TRUE@ gamma4scanimage$(EXEEXT)
+@INSTALL_UMAX_PP_TOOLS_FALSE@noinst_PROGRAMS = umax_pp$(EXEEXT) \
+@INSTALL_UMAX_PP_TOOLS_FALSE@ sane-desc$(EXEEXT)
+@INSTALL_UMAX_PP_TOOLS_TRUE@noinst_PROGRAMS = sane-desc$(EXEEXT)
subdir = tools
DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \
$(top_srcdir)/mkinstalldirs $(srcdir)/sane-config.in \
@@ -303,6 +310,7 @@ PATH_SEPARATOR = @PATH_SEPARATOR@
PKG_CONFIG = @PKG_CONFIG@
PKG_CONFIG_LIBDIR = @PKG_CONFIG_LIBDIR@
PKG_CONFIG_PATH = @PKG_CONFIG_PATH@
+PNG_LIBS = @PNG_LIBS@
PRELOADABLE_BACKENDS = @PRELOADABLE_BACKENDS@
PRELOADABLE_BACKENDS_ENABLED = @PRELOADABLE_BACKENDS_ENABLED@
PTHREAD_LIBS = @PTHREAD_LIBS@
@@ -314,11 +322,14 @@ SCSI_LIBS = @SCSI_LIBS@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
+SNMP_CFLAGS = @SNMP_CFLAGS@
SNMP_CONFIG_PATH = @SNMP_CONFIG_PATH@
+SNMP_LIBS = @SNMP_LIBS@
SOCKET_LIBS = @SOCKET_LIBS@
STRICT_LDFLAGS = @STRICT_LDFLAGS@
STRIP = @STRIP@
SYSLOG_LIBS = @SYSLOG_LIBS@
+SYSTEMD_CFLAGS = @SYSTEMD_CFLAGS@
SYSTEMD_LIBS = @SYSTEMD_LIBS@
TIFF_LIBS = @TIFF_LIBS@
USB_LIBS = @USB_LIBS@
@@ -584,14 +595,14 @@ distclean-compile:
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c $<
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
.c.obj:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'`
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c `$(CYGPATH_W) '$<'`
+@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
.c.lo:
@am__fastdepCC_TRUE@ $(AM_V_CC)$(LTCOMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $<
diff --git a/tools/check-usb-chip.c b/tools/check-usb-chip.c
index 68b8f79..e851855 100644
--- a/tools/check-usb-chip.c
+++ b/tools/check-usb-chip.c
@@ -4063,6 +4063,213 @@ check_genesys (libusb_device_handle * handle,
return "GL646_HP";
}
+/********** the lm983x section **********/
+
+static int
+lm983x_wb (libusb_device_handle *handle, unsigned char reg, unsigned char val)
+{
+ unsigned char buf[5];
+ int written;
+ int result;
+
+ buf[0] = 0;
+ buf[1] = reg;
+ buf[2] = 0;
+ buf[3] = 1;
+ buf[4] = val;
+
+ result = libusb_bulk_transfer(handle, 0x03, buf, 5, &written, TIMEOUT);
+ if (result < 0)
+ return 0;
+
+ if (written != 5)
+ return 0;
+
+ return 1;
+}
+
+static int
+lm983x_rb (libusb_device_handle *handle, unsigned char reg, unsigned char *val)
+{
+ unsigned char buf[5];
+ int result;
+ int tfx;
+
+ buf[0] = 1;
+ buf[1] = reg;
+ buf[2] = 0;
+ buf[3] = 1;
+
+ result = libusb_bulk_transfer(handle, 0x03, buf, 4, &tfx, TIMEOUT);
+ if (result < 0)
+ return 0;
+
+ if (tfx != 4)
+ return 0;
+
+ result = libusb_bulk_transfer(handle, 0x82, val, 1, &tfx, TIMEOUT);
+ if (result < 0)
+ return 0;
+
+ if (tfx != 1)
+ return 0;
+
+ return 1;
+}
+
+/** @brief check for known LM983x chip (aka Merlin)
+ *
+ * Try to check if the scanner uses a LM983x ASIC.
+ *
+ * @param dev libusb device
+ * @param hdl libusb opened handle
+ * @param config0 configuration 0 from get config _descriptor
+ * @return a string with ASIC name, or NULL if not recognized
+ */
+static char *
+check_merlin(libusb_device_handle * handle,
+ struct libusb_device_descriptor desc,
+ struct libusb_config_descriptor *config0)
+{
+ unsigned char val;
+ int result;
+
+ if (verbose > 2)
+ printf (" checking for LM983[1,2,3] ...\n");
+
+ /* Check device descriptor */
+ if (((desc.bDeviceClass != LIBUSB_CLASS_VENDOR_SPEC)
+ && (desc.bDeviceClass != 0))
+ || (config0->interface[0].altsetting[0].bInterfaceClass !=
+ LIBUSB_CLASS_VENDOR_SPEC))
+ {
+ if (verbose > 2)
+ printf
+ (" this is not a LM983x (bDeviceClass = %d, bInterfaceClass = %d)\n",
+ desc.bDeviceClass,
+ config0->interface[0].altsetting[0].bInterfaceClass);
+ return 0;
+ }
+ if ((desc.bcdUSB != 0x110)
+ && (desc.bcdUSB != 0x101)
+ && (desc.bcdUSB != 0x100))
+ {
+ if (verbose > 2)
+ printf (" this is not a LM983x (bcdUSB = 0x%x)\n", desc.bcdUSB);
+ return 0;
+ }
+ if (desc.bDeviceSubClass != 0x00)
+ {
+ if (verbose > 2)
+ printf (" this is not a LM983x (bDeviceSubClass = 0x%x)\n",
+ desc.bDeviceSubClass);
+ return 0;
+ }
+ if ((desc.bDeviceProtocol != 0) &&
+ (desc.bDeviceProtocol != 0xff))
+ {
+ if (verbose > 2)
+ printf (" this is not a LM983x (bDeviceProtocol = 0x%x)\n",
+ desc.bDeviceProtocol);
+ return 0;
+ }
+
+ /* Check endpoints */
+ if (config0->interface[0].altsetting[0].bNumEndpoints != 3)
+ {
+ if (verbose > 2)
+ printf (" this is not a LM983x (bNumEndpoints = %d)\n",
+ config0->interface[0].altsetting[0].bNumEndpoints);
+ return 0;
+ }
+
+ if ((config0->interface[0].altsetting[0].endpoint[0].bEndpointAddress != 0x81)
+ || (config0->interface[0].altsetting[0].endpoint[0].bmAttributes != 0x03)
+ || (config0->interface[0].altsetting[0].endpoint[0].wMaxPacketSize != 0x1)
+ || (config0->interface[0].altsetting[0].endpoint[0].bInterval != 0x10))
+ {
+ if (verbose > 2)
+ printf
+ (" this is not a LM983x (bEndpointAddress = 0x%x, bmAttributes = 0x%x, "
+ "wMaxPacketSize = 0x%x, bInterval = 0x%x)\n",
+ config0->interface[0].altsetting[0].endpoint[0].bEndpointAddress,
+ config0->interface[0].altsetting[0].endpoint[0].bmAttributes,
+ config0->interface[0].altsetting[0].endpoint[0].wMaxPacketSize,
+ config0->interface[0].altsetting[0].endpoint[0].bInterval);
+ return 0;
+ }
+
+ if ((config0->interface[0].altsetting[0].endpoint[1].bEndpointAddress != 0x82)
+ || (config0->interface[0].altsetting[0].endpoint[1].bmAttributes != 0x02)
+ || (config0->interface[0].altsetting[0].endpoint[1].wMaxPacketSize != 0x40)
+ /* Currently disabled as we have some problems in detection here ! */
+ /*|| (config0->interface[0].altsetting[0].endpoint[1].bInterval != 0) */
+ )
+ {
+ if (verbose > 2)
+ printf
+ (" this is not a LM983x (bEndpointAddress = 0x%x, bmAttributes = 0x%x, "
+ "wMaxPacketSize = 0x%x, bInterval = 0x%x)\n",
+ config0->interface[0].altsetting[0].endpoint[1].bEndpointAddress,
+ config0->interface[0].altsetting[0].endpoint[1].bmAttributes,
+ config0->interface[0].altsetting[0].endpoint[1].wMaxPacketSize,
+ config0->interface[0].altsetting[0].endpoint[1].bInterval);
+ return 0;
+ }
+
+ if ((config0->interface[0].altsetting[0].endpoint[2].bEndpointAddress != 0x03)
+ || (config0->interface[0].altsetting[0].endpoint[2].bmAttributes != 0x02)
+ || (config0->interface[0].altsetting[0].endpoint[2].wMaxPacketSize != 0x40)
+ /* Currently disabled as we have some problems in detection here ! */
+ /* || (config0->interface[0].altsetting[0].endpoint[2].bInterval != 0) */
+ )
+ {
+ if (verbose > 2)
+ printf
+ (" this is not a LM983x (bEndpointAddress = 0x%x, bmAttributes = 0x%x, "
+ "wMaxPacketSize = 0x%x, bInterval = 0x%x)\n",
+ config0->interface[0].altsetting[0].endpoint[2].bEndpointAddress,
+ config0->interface[0].altsetting[0].endpoint[2].bmAttributes,
+ config0->interface[0].altsetting[0].endpoint[2].wMaxPacketSize,
+ config0->interface[0].altsetting[0].endpoint[2].bInterval);
+ return 0;
+ }
+
+ result = lm983x_wb (handle, 0x07, 0x00);
+ if (1 == result)
+ result = lm983x_wb (handle, 0x08, 0x02);
+ if (1 == result)
+ result = lm983x_rb (handle, 0x07, &val);
+ if (1 == result)
+ result = lm983x_rb (handle, 0x08, &val);
+ if (1 == result)
+ result = lm983x_rb (handle, 0x69, &val);
+
+ if (0 == result)
+ {
+ if (verbose > 2)
+ printf (" Couldn't access LM983x registers.\n");
+ return 0;
+ }
+
+ switch (val)
+ {
+ case 4:
+ return "LM9832/3";
+ break;
+ case 3:
+ return "LM9831";
+ break;
+ case 2:
+ return "LM9830";
+ break;
+ default:
+ return "LM983x?";
+ break;
+ }
+}
+
+
char *
check_usb_chip (int verbosity,
struct libusb_device_descriptor desc,
@@ -4102,6 +4309,9 @@ check_usb_chip (int verbosity,
/* now USB is opened and set up, actual chip detection */
if (!chip_name)
+ chip_name = check_merlin (hdl, desc, config0);
+
+ if (!chip_name)
chip_name = check_gt6801 (hdl, desc, config0);
if (!chip_name)
diff --git a/tools/sane-desc.c b/tools/sane-desc.c
index 3cc4407..badc8ce 100644
--- a/tools/sane-desc.c
+++ b/tools/sane-desc.c
@@ -2878,7 +2878,7 @@ static void
html_print_legend_model (void)
{
printf
- (" <dt><b>Model:</b></dt>\n" " <dd>Name of the the device.</dd>\n");
+ (" <dt><b>Model:</b></dt>\n" " <dd>Name of the device.</dd>\n");
}
static void
@@ -3568,7 +3568,8 @@ print_udev (void)
printf ("\nLABEL=\"libsane_usb_rules_end\"\n\n");
- printf ("SUBSYSTEMS!=\"scsi\", GOTO=\"libsane_scsi_rules_end\"\n\n");
+ printf ("SUBSYSTEMS==\"scsi\", GOTO=\"libsane_scsi_rules_begin\"\n");
+ printf ("GOTO=\"libsane_scsi_rules_end\"\n\n");
printf ("LABEL=\"libsane_scsi_rules_begin\"\n");
printf ("# Generic: SCSI device type 6 indicates a scanner\n");
@@ -3695,7 +3696,9 @@ print_udevhwdb (void)
printf("# The following rule will disable USB autosuspend for the device\n");
printf("ENV{DEVTYPE}==\"usb_device\", ENV{libsane_matched}==\"yes\", TEST==\"power/control\", ATTR{power/control}=\"on\"\n\n");
- printf ("SUBSYSTEMS!=\"scsi\", GOTO=\"libsane_rules_end\"\n");
+ printf ("SUBSYSTEMS==\"scsi\", GOTO=\"libsane_scsi_rules_begin\"\n");
+ printf ("GOTO=\"libsane_rules_end\"\n\n");
+ printf ("LABEL=\"libsane_scsi_rules_begin\"\n");
printf ("KERNEL!=\"sg[0-9]*\", GOTO=\"libsane_rules_end\"\n\n");
printf ("# Generic: SCSI device type 6 indicates a scanner\n");
@@ -3827,7 +3830,7 @@ print_hwdb (void)
for(j = 0; j < 4; j++) {
vendor_id[j] = toupper(vendor_id[j]);
- product_id[j] = toupper(vendor_id[j]);
+ product_id[j] = toupper(product_id[j]);
}
printf ("usb:v%sp%s*\n libsane_matched=yes\n\n",
diff --git a/tools/sane-find-scanner.c b/tools/sane-find-scanner.c
index dbfd0da..ae0e116 100644
--- a/tools/sane-find-scanner.c
+++ b/tools/sane-find-scanner.c
@@ -757,8 +757,6 @@ sfs_libusb_strerror (int errcode)
default:
return "Unknown libusb-1.0 error code";
}
-
- return "Unknown libusb-1.0 error code";
}
static char *