diff options
Diffstat (limited to 'backend')
202 files changed, 6187 insertions, 4470 deletions
diff --git a/backend/Makefile.am b/backend/Makefile.am index 48a1393..e56e7f1 100644 --- a/backend/Makefile.am +++ b/backend/Makefile.am @@ -1,3 +1,4 @@ + ## Makefile.am -- an automake template for Makefile.in file ## Copyright (C) 2009 Chris Bagwell, Olaf Meeuwissen, and Sane Developers. ## @@ -251,7 +252,15 @@ libabaton_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=abaton nodist_libsane_abaton_la_SOURCES = abaton-s.c libsane_abaton_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=abaton libsane_abaton_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_abaton_la_LIBADD = $(COMMON_LIBS) libabaton.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_abaton_la_LIBADD = $(COMMON_LIBS) \ + libabaton.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += abaton.conf.in libagfafocus_la_SOURCES = agfafocus.c agfafocus.h @@ -260,7 +269,16 @@ libagfafocus_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=agfafocus nodist_libsane_agfafocus_la_SOURCES = agfafocus-s.c libsane_agfafocus_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=agfafocus libsane_agfafocus_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_agfafocus_la_LIBADD = $(COMMON_LIBS) libagfafocus.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_thread.lo ../sanei/sanei_scsi.lo $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_agfafocus_la_LIBADD = $(COMMON_LIBS) \ + libagfafocus.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + ../sanei/sanei_config2.lo \ + sane_strstatus.lo \ + ../sanei/sanei_thread.lo \ + ../sanei/sanei_scsi.lo \ + $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += agfafocus.conf.in libapple_la_SOURCES = apple.c apple.h @@ -269,7 +287,15 @@ libapple_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=apple nodist_libsane_apple_la_SOURCES = apple-s.c libsane_apple_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=apple libsane_apple_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_apple_la_LIBADD = $(COMMON_LIBS) libapple.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_apple_la_LIBADD = $(COMMON_LIBS) \ + libapple.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += apple.conf.in libartec_la_SOURCES = artec.c artec.h @@ -278,7 +304,15 @@ libartec_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=artec nodist_libsane_artec_la_SOURCES = artec-s.c libsane_artec_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) libsane_artec_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=artec -libsane_artec_la_LIBADD = $(COMMON_LIBS) libartec.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_artec_la_LIBADD = $(COMMON_LIBS) \ + libartec.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += artec.conf.in libartec_eplus48u_la_SOURCES = artec_eplus48u.c artec_eplus48u.h @@ -287,7 +321,15 @@ libartec_eplus48u_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=artec_eplus48u nodist_libsane_artec_eplus48u_la_SOURCES = artec_eplus48u-s.c libsane_artec_eplus48u_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=artec_eplus48u libsane_artec_eplus48u_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_artec_eplus48u_la_LIBADD = $(COMMON_LIBS) libartec_eplus48u.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_thread.lo $(MATH_LIB) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMEG_LIBS) +libsane_artec_eplus48u_la_LIBADD = $(COMMON_LIBS) \ + libartec_eplus48u.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_thread.lo \ + $(MATH_LIB) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMEG_LIBS) EXTRA_DIST += artec_eplus48u.conf.in libas6e_la_SOURCES = as6e.c as6e.h @@ -304,7 +346,17 @@ libavision_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=avision nodist_libsane_avision_la_SOURCES = avision-s.c libsane_avision_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=avision libsane_avision_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_avision_la_LIBADD = $(COMMON_LIBS) libavision.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_thread.lo ../sanei/sanei_scsi.lo $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_avision_la_LIBADD = $(COMMON_LIBS) \ + libavision.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_thread.lo \ + ../sanei/sanei_scsi.lo \ + $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += avision.conf.in libbh_la_SOURCES = bh.c bh.h @@ -313,7 +365,14 @@ libbh_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=bh nodist_libsane_bh_la_SOURCES = bh-s.c libsane_bh_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=bh libsane_bh_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_bh_la_LIBADD = $(COMMON_LIBS) libbh.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_bh_la_LIBADD = $(COMMON_LIBS) libbh.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += bh.conf.in libcanon_la_SOURCES = canon.c canon.h @@ -322,7 +381,14 @@ libcanon_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=canon nodist_libsane_canon_la_SOURCES = canon-s.c libsane_canon_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=canon libsane_canon_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_canon_la_LIBADD = $(COMMON_LIBS) libcanon.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 $(MATH_LIB) $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_canon_la_LIBADD = $(COMMON_LIBS) libcanon.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 \ + $(MATH_LIB) $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += canon.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += canon-sane.c canon-scsi.c @@ -333,7 +399,14 @@ libcanon630u_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=canon630u nodist_libsane_canon630u_la_SOURCES = canon630u-s.c libsane_canon630u_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=canon630u libsane_canon630u_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_canon630u_la_LIBADD = $(COMMON_LIBS) libcanon630u.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_canon630u_la_LIBADD = $(COMMON_LIBS) \ + libcanon630u.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += canon630u.conf.in # TODO: Why are this distributed but not compiled? EXTRA_DIST += canon630u-common.c lm9830.h @@ -344,7 +417,17 @@ libcanon_dr_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=canon_dr nodist_libsane_canon_dr_la_SOURCES = canon_dr-s.c libsane_canon_dr_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=canon_dr libsane_canon_dr_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_canon_dr_la_LIBADD = $(COMMON_LIBS) libcanon_dr.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_magic.lo $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS) +libsane_canon_dr_la_LIBADD = $(COMMON_LIBS) \ + libcanon_dr.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_magic.lo \ + $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += canon_dr.conf.in libcanon_lide70_la_SOURCES = canon_lide70.c @@ -353,7 +436,14 @@ libcanon_lide70_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=canon_lide70 nodist_libsane_canon_lide70_la_SOURCES = canon_lide70-s.c libsane_canon_lide70_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=canon_lide70 libsane_canon_lide70_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_canon_lide70_la_LIBADD = $(COMMON_LIBS) libcanon_lide70.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_canon_lide70_la_LIBADD = $(COMMON_LIBS) \ + libcanon_lide70.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += canon_lide70.conf.in # TODO: Why are this distributed but not compiled? EXTRA_DIST += canon_lide70-common.c @@ -364,7 +454,13 @@ libcanon_pp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=canon_pp nodist_libsane_canon_pp_la_SOURCES = canon_pp-s.c libsane_canon_pp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=canon_pp libsane_canon_pp_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_canon_pp_la_LIBADD = $(COMMON_LIBS) libcanon_pp.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(IEEE1284_LIBS) +libsane_canon_pp_la_LIBADD = $(COMMON_LIBS) \ + libcanon_pp.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(IEEE1284_LIBS) EXTRA_DIST += canon_pp.conf.in libcardscan_la_SOURCES = cardscan.c cardscan.h @@ -373,7 +469,14 @@ libcardscan_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=cardscan nodist_libsane_cardscan_la_SOURCES = cardscan-s.c libsane_cardscan_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=cardscan libsane_cardscan_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_cardscan_la_LIBADD = $(COMMON_LIBS) libcardscan.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) +libsane_cardscan_la_LIBADD = $(COMMON_LIBS) \ + libcardscan.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) EXTRA_DIST += cardscan.conf.in libcoolscan_la_SOURCES = coolscan.c coolscan.h coolscan-scsidef.h @@ -382,7 +485,17 @@ libcoolscan_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=coolscan nodist_libsane_coolscan_la_SOURCES = coolscan-s.c libsane_coolscan_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=coolscan libsane_coolscan_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_coolscan_la_LIBADD = $(COMMON_LIBS) libcoolscan.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_thread.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_coolscan_la_LIBADD = $(COMMON_LIBS) \ + libcoolscan.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + ../sanei/sanei_config2.lo \ + sane_strstatus.lo \ + ../sanei/sanei_thread.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_scsi.lo \ + $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += coolscan.conf.in libcoolscan2_la_SOURCES = coolscan2.c @@ -391,7 +504,16 @@ libcoolscan2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=coolscan2 nodist_libsane_coolscan2_la_SOURCES = coolscan2-s.c libsane_coolscan2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=coolscan2 libsane_coolscan2_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_coolscan2_la_LIBADD = $(COMMON_LIBS) libcoolscan2.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 $(SCSI_LIBS) $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_coolscan2_la_LIBADD = $(COMMON_LIBS) \ + libcoolscan2.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 \ + $(SCSI_LIBS) $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += coolscan2.conf.in libcoolscan3_la_SOURCES = coolscan3.c @@ -400,7 +522,16 @@ libcoolscan3_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=coolscan3 nodist_libsane_coolscan3_la_SOURCES = coolscan3-s.c libsane_coolscan3_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=coolscan3 libsane_coolscan3_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_coolscan3_la_LIBADD = $(COMMON_LIBS) libcoolscan3.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 $(SCSI_LIBS) $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_coolscan3_la_LIBADD = $(COMMON_LIBS) \ + libcoolscan3.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 \ + $(SCSI_LIBS) $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += coolscan3.conf.in libdc25_la_SOURCES = dc25.c dc25.h @@ -409,7 +540,13 @@ libdc25_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dc25 nodist_libsane_dc25_la_SOURCES = dc25-s.c libsane_dc25_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dc25 libsane_dc25_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_dc25_la_LIBADD = $(COMMON_LIBS) libdc25.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(MATH_LIB) +libsane_dc25_la_LIBADD = $(COMMON_LIBS) \ + libdc25.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(MATH_LIB) EXTRA_DIST += dc25.conf.in libdc210_la_SOURCES = dc210.c dc210.h @@ -418,7 +555,13 @@ libdc210_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dc210 nodist_libsane_dc210_la_SOURCES = dc210-s.c libsane_dc210_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dc210 libsane_dc210_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_dc210_la_LIBADD = $(COMMON_LIBS) libdc210.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(SANEI_SANEI_JPEG_LO) $(JPEG_LIBS) +libsane_dc210_la_LIBADD = $(COMMON_LIBS) \ + libdc210.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(SANEI_SANEI_JPEG_LO) $(JPEG_LIBS) EXTRA_DIST += dc210.conf.in libdc240_la_SOURCES = dc240.c dc240.h @@ -427,7 +570,13 @@ libdc240_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dc240 nodist_libsane_dc240_la_SOURCES = dc240-s.c libsane_dc240_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dc240 libsane_dc240_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_dc240_la_LIBADD = $(COMMON_LIBS) libdc240.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(SANEI_SANEI_JPEG_LO) $(JPEG_LIBS) +libsane_dc240_la_LIBADD = $(COMMON_LIBS) \ + libdc240.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(SANEI_SANEI_JPEG_LO) $(JPEG_LIBS) EXTRA_DIST += dc240.conf.in libdell1600n_net_la_SOURCES = dell1600n_net.c @@ -436,7 +585,13 @@ libdell1600n_net_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dell1600n_net nodist_libsane_dell1600n_net_la_SOURCES = dell1600n_net-s.c libsane_dell1600n_net_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dell1600n_net libsane_dell1600n_net_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_dell1600n_net_la_LIBADD = $(COMMON_LIBS) libdell1600n_net.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(TIFF_LIBS) $(JPEG_LIBS) $(SOCKET_LIBS) +libsane_dell1600n_net_la_LIBADD = $(COMMON_LIBS) \ + libdell1600n_net.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(TIFF_LIBS) $(JPEG_LIBS) $(SOCKET_LIBS) EXTRA_DIST += dell1600n_net.conf.in libdmc_la_SOURCES = dmc.c dmc.h @@ -445,7 +600,15 @@ libdmc_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dmc nodist_libsane_dmc_la_SOURCES = dmc-s.c libsane_dmc_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dmc libsane_dmc_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_dmc_la_LIBADD = $(COMMON_LIBS) libdmc.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_dmc_la_LIBADD = $(COMMON_LIBS) \ + libdmc.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += dmc.conf.in if have_libavahi @@ -470,7 +633,14 @@ nodist_libsane_escl_la_SOURCES = escl-s.c libsane_escl_la_CPPFLAGS = $(AM_CPPFLAGS) $(JPEG_CFLAGS) $(PNG_CFLAGS) $(TIFF_CFLAGS) $(POPPLER_GLIB_CFLAGS) $(XML_CFLAGS) $(libcurl_CFLAGS) $(AVAHI_CFLAGS) -DBACKEND_NAME=escl libsane_escl_la_CFLAGS = $(AM_CFLAGS) $(JPEG_CFLAGS) $(PNG_CFLAGS) $(TIFF_CFLAGS) $(POPPLER_GLIB_CFLAGS) $(XML_CFLAGS) $(libcurl_CFLAGS) $(AVAHI_CFLAGS) -DBACKEND_NAME=escl libsane_escl_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_escl_la_LIBADD = $(COMMON_LIBS) libescl.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(MATH_LIB) $(JPEG_LIBS) $(PNG_LIBS) $(TIFF_LIBS) $(POPPLER_GLIB_LIBS) $(XML_LIBS) $(libcurl_LIBS) $(AVAHI_LIBS) +libsane_escl_la_LIBADD = $(COMMON_LIBS) \ + libescl.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(MATH_LIB) $(JPEG_LIBS) $(PNG_LIBS) $(TIFF_LIBS) $(POPPLER_GLIB_LIBS) \ + $(XML_LIBS) $(libcurl_LIBS) $(AVAHI_LIBS) endif endif endif @@ -482,7 +652,14 @@ libepjitsu_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epjitsu nodist_libsane_epjitsu_la_SOURCES = epjitsu-s.c libsane_epjitsu_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epjitsu libsane_epjitsu_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_epjitsu_la_LIBADD = $(COMMON_LIBS) libepjitsu.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_epjitsu_la_LIBADD = $(COMMON_LIBS) \ + libepjitsu.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += epjitsu.conf.in libepson_la_SOURCES = epson.c epson.h epson_scsi.c epson_scsi.h epson_usb.c epson_usb.h @@ -491,7 +668,17 @@ libepson_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=epson 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) +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 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 @@ -500,7 +687,19 @@ 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) +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 \ @@ -511,11 +710,20 @@ 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) + +if have_libavahi +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_tcp.lo ../sanei/sanei_udp.lo \ + $(SANEI_SANEI_JPEG_LO) $(JPEG_LIBS) $(USB_LIBS) $(MATH_LIB) $(RESMGR_LIBS) $(SOCKET_LIBS) $(AVAHI_LIBS) +else 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_tcp.lo ../sanei/sanei_udp.lo \ $(SANEI_SANEI_JPEG_LO) $(JPEG_LIBS) $(USB_LIBS) $(MATH_LIB) $(RESMGR_LIBS) $(SOCKET_LIBS) +endif EXTRA_DIST += epsonds.conf.in libfujitsu_la_SOURCES = fujitsu.c fujitsu.h fujitsu-scsi.h @@ -524,7 +732,17 @@ libfujitsu_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=fujitsu nodist_libsane_fujitsu_la_SOURCES = fujitsu-s.c libsane_fujitsu_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=fujitsu libsane_fujitsu_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_fujitsu_la_LIBADD = $(COMMON_LIBS) libfujitsu.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_magic.lo $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS) +libsane_fujitsu_la_LIBADD = $(COMMON_LIBS) \ + libfujitsu.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_magic.lo \ + $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += fujitsu.conf.in libgenesys_la_SOURCES = genesys/genesys.cpp genesys/genesys.h \ @@ -577,8 +795,11 @@ nodist_libsane_genesys_la_SOURCES = genesys-s.cpp libsane_genesys_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=genesys libsane_genesys_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) libsane_genesys_la_LIBADD = $(COMMON_LIBS) libgenesys.la \ - ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo \ - ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ $(MATH_LIB) $(TIFF_LIBS) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += genesys.conf.in @@ -588,7 +809,13 @@ libgphoto2_i_la_CPPFLAGS = $(AM_CPPFLAGS) $(GPHOTO2_CPPFLAGS) -DBACKEND_NAME=gph nodist_libsane_gphoto2_la_SOURCES = gphoto2-s.c libsane_gphoto2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=gphoto2 libsane_gphoto2_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_gphoto2_la_LIBADD = $(GPHOTO2_LDFLAGS) $(COMMON_LIBS) libgphoto2_i.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(SANEI_SANEI_JPEG_LO) $(GPHOTO2_LIBS) $(JPEG_LIBS) +libsane_gphoto2_la_LIBADD = $(GPHOTO2_LDFLAGS) $(COMMON_LIBS) \ + libgphoto2_i.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(SANEI_SANEI_JPEG_LO) $(GPHOTO2_LIBS) $(JPEG_LIBS) EXTRA_DIST += gphoto2.conf.in libgt68xx_la_SOURCES = gt68xx.c gt68xx.h @@ -597,7 +824,14 @@ libgt68xx_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=gt68xx nodist_libsane_gt68xx_la_SOURCES = gt68xx-s.c libsane_gt68xx_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=gt68xx libsane_gt68xx_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_gt68xx_la_LIBADD = $(COMMON_LIBS) libgt68xx.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_gt68xx_la_LIBADD = $(COMMON_LIBS) \ + libgt68xx.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += gt68xx.conf.in # TODO: Why are this distributed but not compiled? EXTRA_DIST += 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 @@ -608,7 +842,18 @@ libhp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp nodist_libsane_hp_la_SOURCES = hp-s.c libsane_hp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp libsane_hp_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_hp_la_LIBADD = $(COMMON_LIBS) libhp.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_thread.lo $(SCSI_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_hp_la_LIBADD = $(COMMON_LIBS) \ + libhp.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_thread.lo \ + $(SCSI_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += hp.conf.in # TODO: These should be moved to ../docs/hp; don't belong here. EXTRA_DIST += hp.README hp.TODO @@ -619,7 +864,15 @@ libhp3500_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp3500 nodist_libsane_hp3500_la_SOURCES = hp3500-s.c libsane_hp3500_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp3500 libsane_hp3500_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_hp3500_la_LIBADD = $(COMMON_LIBS) libhp3500.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_thread.lo $(MATH_LIB) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_hp3500_la_LIBADD = $(COMMON_LIBS) \ + libhp3500.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_thread.lo \ + $(MATH_LIB) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) libhp3900_la_SOURCES = hp3900.c libhp3900_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp3900 @@ -627,7 +880,14 @@ libhp3900_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp3900 nodist_libsane_hp3900_la_SOURCES = hp3900-s.c libsane_hp3900_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp3900 libsane_hp3900_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_hp3900_la_LIBADD = $(COMMON_LIBS) libhp3900.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(TIFF_LIBS) $(USB_LIBS) $(RESMGR_LIBS) +libsane_hp3900_la_LIBADD = $(COMMON_LIBS) \ + libhp3900.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + $(MATH_LIB) $(TIFF_LIBS) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += hp3900.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += hp3900_config.c hp3900_debug.c hp3900_rts8822.c hp3900_sane.c hp3900_types.c hp3900_usb.c @@ -638,7 +898,15 @@ libhp4200_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp4200 nodist_libsane_hp4200_la_SOURCES = hp4200-s.c libsane_hp4200_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp4200 libsane_hp4200_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_hp4200_la_LIBADD = $(COMMON_LIBS) libhp4200.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_pv8630.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_hp4200_la_LIBADD = $(COMMON_LIBS) \ + libhp4200.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_pv8630.lo \ + $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += hp4200.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += hp4200_lm9830.c hp4200_lm9830.h @@ -649,7 +917,14 @@ libhp5400_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp5400 nodist_libsane_hp5400_la_SOURCES = hp5400-s.c libsane_hp5400_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp5400 libsane_hp5400_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_hp5400_la_LIBADD = $(COMMON_LIBS) libhp5400.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) +libsane_hp5400_la_LIBADD = $(COMMON_LIBS) \ + libhp5400.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) EXTRA_DIST += hp5400.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += hp5400_debug.c hp5400_debug.h hp5400_internal.c hp5400_internal.h hp5400_sane.c hp5400_sanei.c hp5400_sanei.h hp5400_xfer.h @@ -660,7 +935,14 @@ libhp5590_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp5590 nodist_libsane_hp5590_la_SOURCES = hp5590-s.c libsane_hp5590_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hp5590 libsane_hp5590_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_hp5590_la_LIBADD = $(COMMON_LIBS) libhp5590.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) +libsane_hp5590_la_LIBADD = $(COMMON_LIBS) \ + libhp5590.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) # TODO: Why are these distributed but not compiled? EXTRA_DIST += hp5590_cmds.c hp5590_cmds.h hp5590_low.c hp5590_low.h @@ -670,7 +952,14 @@ libhpljm1005_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hpljm1005 nodist_libsane_hpljm1005_la_SOURCES = hpljm1005-s.c libsane_hpljm1005_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hpljm1005 libsane_hpljm1005_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_hpljm1005_la_LIBADD = $(COMMON_LIBS) libhpljm1005.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_hpljm1005_la_LIBADD = $(COMMON_LIBS) \ + libhpljm1005.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) libhpsj5s_la_SOURCES = hpsj5s.c hpsj5s.h libhpsj5s_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hpsj5s @@ -678,7 +967,13 @@ libhpsj5s_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hpsj5s nodist_libsane_hpsj5s_la_SOURCES = hpsj5s-s.c libsane_hpsj5s_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hpsj5s libsane_hpsj5s_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_hpsj5s_la_LIBADD = $(COMMON_LIBS) libhpsj5s.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(IEEE1284_LIBS) +libsane_hpsj5s_la_LIBADD = $(COMMON_LIBS) \ + libhpsj5s.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(IEEE1284_LIBS) EXTRA_DIST += hpsj5s.conf.in libhs2p_la_SOURCES = hs2p.c hs2p.h hs2p-saneopts.h @@ -687,7 +982,15 @@ libhs2p_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hs2p nodist_libsane_hs2p_la_SOURCES = hs2p-s.c libsane_hs2p_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=hs2p libsane_hs2p_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_hs2p_la_LIBADD = $(COMMON_LIBS) libhs2p.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_hs2p_la_LIBADD = $(COMMON_LIBS) \ + libhs2p.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += hs2p.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += hs2p-scsi.c hs2p-scsi.h @@ -698,7 +1001,15 @@ libibm_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=ibm nodist_libsane_ibm_la_SOURCES = ibm-s.c libsane_ibm_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=ibm libsane_ibm_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_ibm_la_LIBADD = $(COMMON_LIBS) libibm.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_ibm_la_LIBADD = $(COMMON_LIBS) \ + libibm.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += ibm.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += ibm-scsi.c @@ -709,7 +1020,15 @@ libkodak_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kodak nodist_libsane_kodak_la_SOURCES = kodak-s.c libsane_kodak_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kodak libsane_kodak_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_kodak_la_LIBADD = $(COMMON_LIBS) libkodak.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 $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS) +libsane_kodak_la_LIBADD = $(COMMON_LIBS) \ + libkodak.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 \ + $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += kodak.conf.in libkodakaio_la_SOURCES = kodakaio.c kodakaio.h @@ -718,7 +1037,18 @@ libkodakaio_la_CPPFLAGS = $(AM_CPPFLAGS) $(AVAHI_CFLAGS) -DBACKEND_NAME=kodakaio nodist_libsane_kodakaio_la_SOURCES = kodakaio-s.c libsane_kodakaio_la_CPPFLAGS = $(AM_CPPFLAGS) $(AVAHI_CFLAGS) -DBACKEND_NAME=kodakaio libsane_kodakaio_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_kodakaio_la_LIBADD = $(COMMON_LIBS) libkodakaio.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) $(AVAHI_LIBS) $(MATH_LIB) $(RESMGR_LIBS) +libsane_kodakaio_la_LIBADD = $(COMMON_LIBS) \ + libkodakaio.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) $(AVAHI_LIBS) $(MATH_LIB) $(RESMGR_LIBS) EXTRA_DIST += kodakaio.conf.in libkvs1025_la_SOURCES = kvs1025.c kvs1025_low.c kvs1025_opt.c kvs1025_usb.c \ @@ -728,7 +1058,15 @@ libkvs1025_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs1025 nodist_libsane_kvs1025_la_SOURCES = kvs1025-s.c libsane_kvs1025_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs1025 libsane_kvs1025_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_kvs1025_la_LIBADD = $(COMMON_LIBS) libkvs1025.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_magic.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_kvs1025_la_LIBADD = $(COMMON_LIBS) \ + libkvs1025.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_magic.lo \ + $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += kvs1025.conf.in libkvs20xx_la_SOURCES = kvs20xx.c kvs20xx_cmd.c kvs20xx_opt.c \ @@ -738,7 +1076,15 @@ libkvs20xx_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs20xx nodist_libsane_kvs20xx_la_SOURCES = kvs20xx-s.c libsane_kvs20xx_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs20xx libsane_kvs20xx_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_kvs20xx_la_LIBADD = $(COMMON_LIBS) libkvs20xx.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS) +libsane_kvs20xx_la_LIBADD = $(COMMON_LIBS) \ + libkvs20xx.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_scsi.lo \ + $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS) libkvs40xx_la_SOURCES = kvs40xx.c kvs40xx_cmd.c kvs40xx_opt.c \ kvs40xx.h @@ -747,7 +1093,15 @@ libkvs40xx_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs40xx nodist_libsane_kvs40xx_la_SOURCES = kvs40xx-s.c libsane_kvs40xx_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=kvs40xx libsane_kvs40xx_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_kvs40xx_la_LIBADD = $(COMMON_LIBS) libkvs40xx.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo $(SCSI_LIBS) $(USB_LIBS) $(PTHREAD_LIBS) $(RESMGR_LIBS) +libsane_kvs40xx_la_LIBADD = $(COMMON_LIBS) \ + libkvs40xx.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_scsi.lo \ + $(SCSI_LIBS) $(USB_LIBS) $(PTHREAD_LIBS) $(RESMGR_LIBS) libleo_la_SOURCES = leo.c leo.h libleo_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=leo @@ -755,7 +1109,15 @@ libleo_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=leo nodist_libsane_leo_la_SOURCES = leo-s.c libsane_leo_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=leo libsane_leo_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_leo_la_LIBADD = $(COMMON_LIBS) libleo.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_leo_la_LIBADD = $(COMMON_LIBS) \ + libleo.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += leo.conf.in liblexmark_la_SOURCES = lexmark.c lexmark.h lexmark_low.c @@ -764,7 +1126,14 @@ liblexmark_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=lexmark nodist_libsane_lexmark_la_SOURCES = lexmark-s.c libsane_lexmark_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=lexmark libsane_lexmark_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_lexmark_la_LIBADD = $(COMMON_LIBS) liblexmark.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) +libsane_lexmark_la_LIBADD = $(COMMON_LIBS) \ + liblexmark.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) EXTRA_DIST += lexmark.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += lexmark_models.c lexmark_sensors.c @@ -775,7 +1144,14 @@ libma1509_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=ma1509 nodist_libsane_ma1509_la_SOURCES = ma1509-s.c 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) +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) EXTRA_DIST += ma1509.conf.in libmagicolor_la_SOURCES = magicolor.c magicolor.h @@ -784,7 +1160,18 @@ 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) $(SNMP_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 @@ -793,7 +1180,15 @@ libmatsushita_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=matsushita nodist_libsane_matsushita_la_SOURCES = matsushita-s.c libsane_matsushita_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=matsushita libsane_matsushita_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_matsushita_la_LIBADD = $(COMMON_LIBS) libmatsushita.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_matsushita_la_LIBADD = $(COMMON_LIBS) \ + libmatsushita.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += matsushita.conf.in libmicrotek_la_SOURCES = microtek.c microtek.h @@ -802,7 +1197,15 @@ libmicrotek_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=microtek nodist_libsane_microtek_la_SOURCES = microtek-s.c libsane_microtek_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=microtek libsane_microtek_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_microtek_la_LIBADD = $(COMMON_LIBS) libmicrotek.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 $(MATH_LIB) $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_microtek_la_LIBADD = $(COMMON_LIBS) \ + libmicrotek.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 \ + $(MATH_LIB) $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += microtek.conf.in libmicrotek2_la_SOURCES = microtek2.c microtek2.h @@ -811,7 +1214,16 @@ libmicrotek2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=microtek2 nodist_libsane_microtek2_la_SOURCES = microtek2-s.c libsane_microtek2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=microtek2 libsane_microtek2_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_microtek2_la_LIBADD = $(COMMON_LIBS) libmicrotek2.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 $(MATH_LIB) $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_microtek2_la_LIBADD = $(COMMON_LIBS) \ + libmicrotek2.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 \ + $(MATH_LIB) $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += microtek2.conf.in libmustek_la_SOURCES = mustek.c mustek.h @@ -820,7 +1232,18 @@ libmustek_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=mustek nodist_libsane_mustek_la_SOURCES = mustek-s.c libsane_mustek_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=mustek libsane_mustek_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_mustek_la_LIBADD = $(COMMON_LIBS) libmustek.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_ab306.lo ../sanei/sanei_pa4s2.lo $(IEEE1284_LIBS) $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_mustek_la_LIBADD = $(COMMON_LIBS) \ + libmustek.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_ab306.lo \ + ../sanei/sanei_pa4s2.lo \ + $(IEEE1284_LIBS) $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += mustek.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += mustek_scsi_pp.c mustek_scsi_pp.h @@ -831,7 +1254,14 @@ libmustek_pp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=mustek_pp nodist_libsane_mustek_pp_la_SOURCES = mustek_pp-s.c libsane_mustek_pp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=mustek_pp libsane_mustek_pp_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_mustek_pp_la_LIBADD = $(COMMON_LIBS) libmustek_pp.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_pa4s2.lo $(MATH_LIB) $(IEEE1284_LIBS) +libsane_mustek_pp_la_LIBADD = $(COMMON_LIBS) \ + libmustek_pp.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_pa4s2.lo \ + $(MATH_LIB) $(IEEE1284_LIBS) EXTRA_DIST += mustek_pp.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += mustek_pp_ccd300.c mustek_pp_ccd300.h mustek_pp_cis.c mustek_pp_cis.h mustek_pp_null.c @@ -842,7 +1272,14 @@ libmustek_usb_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=mustek_usb nodist_libsane_mustek_usb_la_SOURCES = mustek_usb-s.c libsane_mustek_usb_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=mustek_usb libsane_mustek_usb_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_mustek_usb_la_LIBADD = $(COMMON_LIBS) libmustek_usb.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) +libsane_mustek_usb_la_LIBADD = $(COMMON_LIBS) \ + libmustek_usb.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) EXTRA_DIST += mustek_usb.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += mustek_usb_high.c mustek_usb_high.h mustek_usb_low.c mustek_usb_low.h mustek_usb_mid.c mustek_usb_mid.h @@ -853,7 +1290,14 @@ libmustek_usb2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=mustek_usb2 nodist_libsane_mustek_usb2_la_SOURCES = mustek_usb2-s.c libsane_mustek_usb2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=mustek_usb2 libsane_mustek_usb2_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_mustek_usb2_la_LIBADD = $(COMMON_LIBS) libmustek_usb2.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(PTHREAD_LIBS) $(USB_LIBS) $(RESMGR_LIBS) +libsane_mustek_usb2_la_LIBADD = $(COMMON_LIBS) \ + libmustek_usb2.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + $(MATH_LIB) $(PTHREAD_LIBS) $(USB_LIBS) $(RESMGR_LIBS) # TODO: Why are these distributed but not compiled? EXTRA_DIST += mustek_usb2_asic.c mustek_usb2_asic.h mustek_usb2_high.c mustek_usb2_high.h mustek_usb2_reflective.c mustek_usb2_transparent.c @@ -863,7 +1307,15 @@ libnec_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=nec nodist_libsane_nec_la_SOURCES = nec-s.c libsane_nec_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=nec libsane_nec_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_nec_la_LIBADD = $(COMMON_LIBS) libnec.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 $(MATH_LIB) $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_nec_la_LIBADD = $(COMMON_LIBS) \ + libnec.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 \ + $(MATH_LIB) $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += nec.conf.in libnet_la_SOURCES = net.c net.h @@ -872,7 +1324,16 @@ libnet_la_CPPFLAGS = $(AM_CPPFLAGS) $(AVAHI_CFLAGS) -DBACKEND_NAME=net nodist_libsane_net_la_SOURCES = net-s.c libsane_net_la_CPPFLAGS = $(AM_CPPFLAGS) $(AVAHI_CFLAGS) -DBACKEND_NAME=net libsane_net_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_net_la_LIBADD = $(COMMON_LIBS) libnet.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_net.lo ../sanei/sanei_wire.lo ../sanei/sanei_codec_bin.lo $(AVAHI_LIBS) $(SOCKET_LIBS) +libsane_net_la_LIBADD = $(COMMON_LIBS) \ + libnet.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_net.lo \ + ../sanei/sanei_wire.lo \ + ../sanei/sanei_codec_bin.lo \ + $(AVAHI_LIBS) $(SOCKET_LIBS) EXTRA_DIST += net.conf.in libniash_la_SOURCES = niash.c @@ -881,7 +1342,14 @@ libniash_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=niash nodist_libsane_niash_la_SOURCES = niash-s.c libsane_niash_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=niash libsane_niash_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_niash_la_LIBADD = $(COMMON_LIBS) libniash.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_niash_la_LIBADD = $(COMMON_LIBS) \ + libniash.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) # TODO: Why are these distributed but not compiled? EXTRA_DIST += niash_core.c niash_core.h niash_xfer.c niash_xfer.h @@ -891,7 +1359,16 @@ libpie_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pie 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) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +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) $(SANEI_THREAD_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 @@ -900,7 +1377,19 @@ 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 $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) $(USB_LIBS) $(MATH_LIB) +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 \ + $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) $(USB_LIBS) $(MATH_LIB) EXTRA_DIST += pieusb.conf.in libp5_la_SOURCES = p5.c p5.h p5_device.h @@ -909,7 +1398,13 @@ libp5_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=p5 nodist_libsane_p5_la_SOURCES = p5-s.c libsane_p5_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=p5 libsane_p5_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_p5_la_LIBADD = $(COMMON_LIBS) libp5.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo +libsane_p5_la_LIBADD = $(COMMON_LIBS) \ + libp5.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo + EXTRA_DIST += p5.conf.in p5_device.c libpint_la_SOURCES = pint.c pint.h @@ -918,7 +1413,12 @@ libpint_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pint nodist_libsane_pint_la_SOURCES = pint-s.c libsane_pint_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pint libsane_pint_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_pint_la_LIBADD = $(COMMON_LIBS) libpint.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo +libsane_pint_la_LIBADD = $(COMMON_LIBS) \ + libpint.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo libpixma_la_SOURCES = pixma/pixma.c \ pixma/pixma.h \ @@ -961,7 +1461,15 @@ CLEANFILES += pixma/pixma_sane_options.h nodist_libsane_pixma_la_SOURCES = pixma-s.c libsane_pixma_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pixma libsane_pixma_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_pixma_la_LIBADD = $(COMMON_LIBS) libpixma.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_thread.lo $(SANEI_SANEI_JPEG_LO) $(JPEG_LIBS) $(XML_LIBS) $(MATH_LIB) $(SOCKET_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_pixma_la_LIBADD = $(COMMON_LIBS) \ + libpixma.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_thread.lo \ + $(SANEI_SANEI_JPEG_LO) $(JPEG_LIBS) $(XML_LIBS) $(MATH_LIB) $(SOCKET_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += pixma.conf.in libplustek_la_SOURCES = plustek.c plustek.h @@ -970,7 +1478,17 @@ libplustek_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=plustek nodist_libsane_plustek_la_SOURCES = plustek-s.c libsane_plustek_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=plustek libsane_plustek_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_plustek_la_LIBADD = $(COMMON_LIBS) libplustek.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_thread.lo ../sanei/sanei_lm983x.lo ../sanei/sanei_access.lo $(MATH_LIB) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_plustek_la_LIBADD = $(COMMON_LIBS) \ + libplustek.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_thread.lo \ + ../sanei/sanei_lm983x.lo \ + ../sanei/sanei_access.lo \ + $(MATH_LIB) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += plustek.conf.in EXTRA_DIST += 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 @@ -991,7 +1509,12 @@ libpnm_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pnm nodist_libsane_pnm_la_SOURCES = pnm-s.c libsane_pnm_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=pnm libsane_pnm_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_pnm_la_LIBADD = $(COMMON_LIBS) libpnm.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo +libsane_pnm_la_LIBADD = $(COMMON_LIBS) \ + libpnm.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo libqcam_la_SOURCES = qcam.c qcam.h libqcam_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=qcam @@ -999,7 +1522,14 @@ libqcam_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=qcam nodist_libsane_qcam_la_SOURCES = qcam-s.c libsane_qcam_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=qcam libsane_qcam_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_qcam_la_LIBADD = $(COMMON_LIBS) libqcam.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_pio.lo +libsane_qcam_la_LIBADD = $(COMMON_LIBS) \ + libqcam.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_pio.lo + EXTRA_DIST += qcam.conf.in libricoh_la_SOURCES = ricoh.c ricoh.h @@ -1008,7 +1538,15 @@ libricoh_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=ricoh nodist_libsane_ricoh_la_SOURCES = ricoh-s.c libsane_ricoh_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=ricoh libsane_ricoh_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_ricoh_la_LIBADD = $(COMMON_LIBS) libricoh.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_ricoh_la_LIBADD = $(COMMON_LIBS) \ + libricoh.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += ricoh.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += ricoh-scsi.c @@ -1019,7 +1557,14 @@ libricoh2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=ricoh2 nodist_libsane_ricoh2_la_SOURCES = ricoh2-s.c libsane_ricoh2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=ricoh2 libsane_ricoh2_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_ricoh2_la_LIBADD = $(COMMON_LIBS) libricoh2.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_usb.lo ../sanei/sanei_config.lo sane_strstatus.lo $(USB_LIBS) +libsane_ricoh2_la_LIBADD = $(COMMON_LIBS) \ + libricoh2.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(USB_LIBS) EXTRA_DIST += ricoh2_buffer.c librts8891_la_SOURCES = rts8891.c rts8891.h rts88xx_lib.c rts88xx_lib.h @@ -1028,7 +1573,15 @@ librts8891_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=rts8891 nodist_libsane_rts8891_la_SOURCES = rts8891-s.c libsane_rts8891_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=rts8891 libsane_rts8891_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_rts8891_la_LIBADD = $(COMMON_LIBS) librts8891.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_scsi.lo ../sanei/sanei_usb.lo $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS) $(RESMGR_LIBS) +libsane_rts8891_la_LIBADD = $(COMMON_LIBS) \ + librts8891.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_scsi.lo \ + ../sanei/sanei_usb.lo \ + $(SCSI_LIBS) $(USB_LIBS) $(RESMGR_LIBS) $(RESMGR_LIBS) EXTRA_DIST += rts8891.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += rts8891_devices.c rts8891_low.c rts8891_low.h @@ -1039,7 +1592,15 @@ libs9036_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=s9036 nodist_libsane_s9036_la_SOURCES = s9036-s.c libsane_s9036_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=s9036 libsane_s9036_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_s9036_la_LIBADD = $(COMMON_LIBS) libs9036.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_s9036_la_LIBADD = $(COMMON_LIBS) \ + libs9036.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += s9036.conf.in libsceptre_la_SOURCES = sceptre.c sceptre.h @@ -1048,7 +1609,15 @@ libsceptre_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=sceptre nodist_libsane_sceptre_la_SOURCES = sceptre-s.c libsane_sceptre_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=sceptre libsane_sceptre_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_sceptre_la_LIBADD = $(COMMON_LIBS) libsceptre.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_sceptre_la_LIBADD = $(COMMON_LIBS) \ + libsceptre.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += sceptre.conf.in libsharp_la_SOURCES = sharp.c sharp.h @@ -1057,7 +1626,15 @@ libsharp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=sharp nodist_libsane_sharp_la_SOURCES = sharp-s.c libsane_sharp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=sharp libsane_sharp_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_sharp_la_LIBADD = $(COMMON_LIBS) libsharp.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 $(MATH_LIB) $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_sharp_la_LIBADD = $(COMMON_LIBS) \ + libsharp.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 \ + $(MATH_LIB) $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += sharp.conf.in libsm3600_la_SOURCES = sm3600.c sm3600.h @@ -1066,7 +1643,14 @@ libsm3600_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=sm3600 nodist_libsane_sm3600_la_SOURCES = sm3600-s.c libsane_sm3600_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=sm3600 libsane_sm3600_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_sm3600_la_LIBADD = $(COMMON_LIBS) libsm3600.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) +libsane_sm3600_la_LIBADD = $(COMMON_LIBS) \ + libsm3600.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) # TODO: Why are these distributed but not compiled? EXTRA_DIST += sm3600-color.c sm3600-gray.c sm3600-homerun.c sm3600-scanmtek.c sm3600-scantool.h sm3600-scanusb.c sm3600-scanutil.c @@ -1076,7 +1660,14 @@ libsm3840_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=sm3840 nodist_libsane_sm3840_la_SOURCES = sm3840-s.c libsane_sm3840_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=sm3840 libsane_sm3840_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_sm3840_la_LIBADD = $(COMMON_LIBS) libsm3840.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_sm3840_la_LIBADD = $(COMMON_LIBS) \ + libsm3840.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += sm3840.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += sm3840_lib.c sm3840_lib.h sm3840_scan.c @@ -1087,7 +1678,17 @@ libsnapscan_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=snapscan nodist_libsane_snapscan_la_SOURCES = snapscan-s.c libsane_snapscan_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=snapscan libsane_snapscan_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_snapscan_la_LIBADD = $(COMMON_LIBS) libsnapscan.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_thread.lo ../sanei/sanei_scsi.lo $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_snapscan_la_LIBADD = $(COMMON_LIBS) \ + libsnapscan.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_thread.lo \ + ../sanei/sanei_scsi.lo \ + $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += snapscan.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += snapscan-data.c snapscan-mutex.c snapscan-options.c snapscan-scsi.c snapscan-sources.c snapscan-sources.h snapscan-usb.c snapscan-usb.h @@ -1098,16 +1699,34 @@ libsp15c_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=sp15c nodist_libsane_sp15c_la_SOURCES = sp15c-s.c libsane_sp15c_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=sp15c libsane_sp15c_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_sp15c_la_LIBADD = $(COMMON_LIBS) libsp15c.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_thread.lo ../sanei/sanei_scsi.lo $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_sp15c_la_LIBADD = $(COMMON_LIBS) \ + libsp15c.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + ../sanei/sanei_config2.lo \ + sane_strstatus.lo \ + ../sanei/sanei_thread.lo \ + ../sanei/sanei_scsi.lo \ + $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += sp15c.conf.in libst400_la_SOURCES = st400.c st400.h libst400_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=st400 nodist_libsane_st400_la_SOURCES = st400-s.c ../sanei/sanei_scsi.lo + libsane_st400_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=st400 libsane_st400_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_st400_la_LIBADD = $(COMMON_LIBS) libst400.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_st400_la_LIBADD = $(COMMON_LIBS) \ + libst400.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += st400.conf.in libstv680_la_SOURCES = stv680.c stv680.h @@ -1116,7 +1735,14 @@ libstv680_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=stv680 nodist_libsane_stv680_la_SOURCES = stv680-s.c libsane_stv680_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=stv680 libsane_stv680_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_stv680_la_LIBADD = $(COMMON_LIBS) libstv680.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) +libsane_stv680_la_LIBADD = $(COMMON_LIBS) \ + libstv680.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) EXTRA_DIST += stv680.conf.in libtamarack_la_SOURCES = tamarack.c tamarack.h @@ -1125,7 +1751,16 @@ libtamarack_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=tamarack nodist_libsane_tamarack_la_SOURCES = tamarack-s.c libsane_tamarack_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=tamarack libsane_tamarack_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_tamarack_la_LIBADD = $(COMMON_LIBS) libtamarack.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo ../sanei/sanei_config2.lo sane_strstatus.lo ../sanei/sanei_thread.lo ../sanei/sanei_scsi.lo $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_tamarack_la_LIBADD = $(COMMON_LIBS) \ + libtamarack.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + ../sanei/sanei_config2.lo \ + sane_strstatus.lo \ + ../sanei/sanei_thread.lo \ + ../sanei/sanei_scsi.lo \ + $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += tamarack.conf.in libtest_la_SOURCES = test.c test.h @@ -1134,7 +1769,14 @@ libtest_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=test nodist_libsane_test_la_SOURCES = test-s.c libsane_test_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=test libsane_test_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_test_la_LIBADD = $(COMMON_LIBS) libtest.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_thread.lo $(SANEI_THREAD_LIBS) +libsane_test_la_LIBADD = $(COMMON_LIBS) \ + libtest.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_thread.lo \ + $(SANEI_THREAD_LIBS) EXTRA_DIST += test.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += test-picture.c @@ -1145,7 +1787,15 @@ libteco1_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=teco1 nodist_libsane_teco1_la_SOURCES = teco1-s.c libsane_teco1_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=teco1 libsane_teco1_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_teco1_la_LIBADD = $(COMMON_LIBS) libteco1.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_teco1_la_LIBADD = $(COMMON_LIBS) \ + libteco1.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += teco1.conf.in libteco2_la_SOURCES = teco2.c teco2.h @@ -1154,7 +1804,15 @@ libteco2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=teco2 nodist_libsane_teco2_la_SOURCES = teco2-s.c libsane_teco2_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=teco2 libsane_teco2_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_teco2_la_LIBADD = $(COMMON_LIBS) libteco2.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_teco2_la_LIBADD = $(COMMON_LIBS) \ + libteco2.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += teco2.conf.in libteco3_la_SOURCES = teco3.c teco3.h @@ -1163,7 +1821,15 @@ libteco3_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=teco3 nodist_libsane_teco3_la_SOURCES = teco3-s.c libsane_teco3_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=teco3 libsane_teco3_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_teco3_la_LIBADD = $(COMMON_LIBS) libteco3.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 $(SCSI_LIBS) $(RESMGR_LIBS) +libsane_teco3_la_LIBADD = $(COMMON_LIBS) \ + libteco3.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 \ + $(SCSI_LIBS) $(RESMGR_LIBS) EXTRA_DIST += teco3.conf.in libu12_la_SOURCES = u12.c u12.h @@ -1172,7 +1838,15 @@ libu12_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=u12 nodist_libsane_u12_la_SOURCES = u12-s.c libsane_u12_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=u12 libsane_u12_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_u12_la_LIBADD = $(COMMON_LIBS) libu12.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_thread.lo $(MATH_LIB) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_u12_la_LIBADD = $(COMMON_LIBS) \ + libu12.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_thread.lo \ + $(MATH_LIB) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += u12.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += 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 @@ -1183,7 +1857,18 @@ libumax_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=umax nodist_libsane_umax_la_SOURCES = umax-s.c libsane_umax_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=umax libsane_umax_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_umax_la_LIBADD = $(COMMON_LIBS) libumax.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_thread.lo ../sanei/sanei_scsi.lo ../sanei/sanei_pv8630.lo $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) +libsane_umax_la_LIBADD = $(COMMON_LIBS) \ + libumax.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_thread.lo \ + ../sanei/sanei_scsi.lo \ + ../sanei/sanei_pv8630.lo \ + $(MATH_LIB) $(SCSI_LIBS) $(USB_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) EXTRA_DIST += umax.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += 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 @@ -1194,7 +1879,15 @@ libumax1220u_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=umax1220u nodist_libsane_umax1220u_la_SOURCES = umax1220u-s.c libsane_umax1220u_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=umax1220u libsane_umax1220u_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_umax1220u_la_LIBADD = $(COMMON_LIBS) libumax1220u.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo ../sanei/sanei_usb.lo ../sanei/sanei_pv8630.lo $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) +libsane_umax1220u_la_LIBADD = $(COMMON_LIBS) \ + libumax1220u.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_pv8630.lo \ + $(MATH_LIB) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += umax1220u.conf.in # TODO: Why are these distributed but not compiled? EXTRA_DIST += umax1220u-common.c @@ -1205,7 +1898,13 @@ libumax_pp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=umax_pp nodist_libsane_umax_pp_la_SOURCES = umax_pp-s.c libsane_umax_pp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=umax_pp libsane_umax_pp_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_umax_pp_la_LIBADD = $(COMMON_LIBS) libumax_pp.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(MATH_LIB) +libsane_umax_pp_la_LIBADD = $(COMMON_LIBS) \ + libumax_pp.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(MATH_LIB) EXTRA_DIST += umax_pp.conf.in libv4l_la_SOURCES = v4l.c v4l.h v4l-frequencies.h @@ -1214,7 +1913,13 @@ libv4l_la_CPPFLAGS = $(AM_CPPFLAGS) $(LIBV4L_CFLAGS) -DBACKEND_NAME=v4l nodist_libsane_v4l_la_SOURCES = v4l-s.c libsane_v4l_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=v4l libsane_v4l_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_v4l_la_LIBADD = $(COMMON_LIBS) libv4l.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(LIBV4L_LIBS) +libsane_v4l_la_LIBADD = $(COMMON_LIBS) \ + libv4l.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(LIBV4L_LIBS) EXTRA_DIST += v4l.conf.in libxerox_mfp_la_SOURCES = xerox_mfp.c xerox_mfp-usb.c xerox_mfp-tcp.c xerox_mfp.h @@ -1223,22 +1928,38 @@ libxerox_mfp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=xerox_mfp nodist_libsane_xerox_mfp_la_SOURCES = xerox_mfp-s.c libsane_xerox_mfp_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=xerox_mfp libsane_xerox_mfp_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_xerox_mfp_la_LIBADD = $(COMMON_LIBS) libxerox_mfp.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo @SANEI_SANEI_JPEG_LO@ $(JPEG_LIBS) ../sanei/sanei_usb.lo ../sanei/sanei_tcp.lo $(MATH_LIB) $(SOCKET_LIBS) $(USB_LIBS) $(RESMGR_LIBS) +libsane_xerox_mfp_la_LIBADD = $(COMMON_LIBS) \ + libxerox_mfp.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + @SANEI_SANEI_JPEG_LO@ $(JPEG_LIBS) ../sanei/sanei_usb.lo \ + ../sanei/sanei_tcp.lo \ + $(MATH_LIB) $(SOCKET_LIBS) $(USB_LIBS) $(RESMGR_LIBS) EXTRA_DIST += xerox_mfp.conf.in libdll_preload_la_SOURCES = dll.c libdll_preload_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dll -DENABLE_PRELOAD -libdll_preload_la_LIBADD = ../sanei/sanei_usb.lo $(USB_LIBS) $(XML_LIBS) +libdll_preload_la_LIBADD = ../sanei/sanei_usb.lo \ + $(USB_LIBS) $(XML_LIBS) libdll_la_SOURCES = dll.c libdll_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dll -libdll_la_LIBADD = ../sanei/sanei_usb.lo $(USB_LIBS) $(XML_LIBS) +libdll_la_LIBADD = ../sanei/sanei_usb.lo \ + $(USB_LIBS) $(XML_LIBS) BUILT_SOURCES = dll-preload.h CLEANFILES += dll-preload.h nodist_libsane_dll_la_SOURCES = dll-s.c libsane_dll_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dll libsane_dll_la_LDFLAGS = $(DIST_SANELIBS_LDFLAGS) -libsane_dll_la_LIBADD = $(COMMON_LIBS) libdll.la ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo sane_strstatus.lo $(DL_LIBS) +libsane_dll_la_LIBADD = $(COMMON_LIBS) \ + libdll.la \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + sane_strstatus.lo \ + $(DL_LIBS) EXTRA_DIST += dll.conf.in # TODO: Why is this distributed but not installed? EXTRA_DIST += dll.aliases @@ -1262,13 +1983,76 @@ EXTRA_DIST += dll.aliases # what backends are preloaded. It should include what is needed by # those backends that are actually preloaded. if preloadable_backends_enabled -PRELOADABLE_BACKENDS_LIBS = ../sanei/sanei_config2.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_pv8630.lo ../sanei/sanei_pp.lo ../sanei/sanei_thread.lo ../sanei/sanei_lm983x.lo ../sanei/sanei_access.lo ../sanei/sanei_net.lo ../sanei/sanei_wire.lo ../sanei/sanei_codec_bin.lo ../sanei/sanei_pa4s2.lo ../sanei/sanei_ab306.lo ../sanei/sanei_pio.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo ../sanei/sanei_magic.lo $(LIBV4L_LIBS) $(MATH_LIB) $(IEEE1284_LIBS) $(TIFF_LIBS) $(JPEG_LIBS) $(GPHOTO2_LIBS) $(SOCKET_LIBS) $(USB_LIBS) $(AVAHI_LIBS) $(SCSI_LIBS) $(SANEI_THREAD_LIBS) $(RESMGR_LIBS) $(PNG_LIBS) $(POPPLER_GLIB_LIBS) $(XML_LIBS) $(libcurl_LIBS) $(SNMP_LIBS) -PRELOADABLE_BACKENDS_DEPS = ../sanei/sanei_config2.lo ../sanei/sanei_usb.lo ../sanei/sanei_scsi.lo ../sanei/sanei_pv8630.lo ../sanei/sanei_pp.lo ../sanei/sanei_thread.lo ../sanei/sanei_lm983x.lo ../sanei/sanei_access.lo ../sanei/sanei_net.lo ../sanei/sanei_wire.lo ../sanei/sanei_codec_bin.lo ../sanei/sanei_pa4s2.lo ../sanei/sanei_ab306.lo ../sanei/sanei_pio.lo ../sanei/sanei_tcp.lo ../sanei/sanei_udp.lo ../sanei/sanei_magic.lo $(SANEI_SANEI_JPEG_LO) +PRELOADABLE_BACKENDS_LIBS = \ + ../sanei/sanei_config2.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_scsi.lo \ + ../sanei/sanei_pv8630.lo \ + ../sanei/sanei_pp.lo \ + ../sanei/sanei_thread.lo \ + ../sanei/sanei_lm983x.lo \ + ../sanei/sanei_access.lo \ + ../sanei/sanei_net.lo \ + ../sanei/sanei_wire.lo \ + ../sanei/sanei_codec_bin.lo \ + ../sanei/sanei_pa4s2.lo \ + ../sanei/sanei_ab306.lo \ + ../sanei/sanei_pio.lo \ + ../sanei/sanei_tcp.lo \ + ../sanei/sanei_udp.lo \ + ../sanei/sanei_magic.lo \ + $(LIBV4L_LIBS) $(MATH_LIB) \ + $(IEEE1284_LIBS) \ + $(TIFF_LIBS) \ + $(JPEG_LIBS) \ + $(GPHOTO2_LIBS) \ + $(SOCKET_LIBS) \ + $(USB_LIBS) \ + $(AVAHI_LIBS) \ + $(SCSI_LIBS) \ + $(SANEI_THREAD_LIBS) \ + $(RESMGR_LIBS) \ + $(PNG_LIBS) \ + $(POPPLER_GLIB_LIBS) \ + $(XML_LIBS) \ + $(libcurl_LIBS) \ + $(SNMP_LIBS) + +PRELOADABLE_BACKENDS_DEPS = ../sanei/sanei_config2.lo \ + ../sanei/sanei_usb.lo \ + ../sanei/sanei_scsi.lo \ + ../sanei/sanei_pv8630.lo \ + ../sanei/sanei_pp.lo \ + ../sanei/sanei_thread.lo \ + ../sanei/sanei_lm983x.lo \ + ../sanei/sanei_access.lo \ + ../sanei/sanei_net.lo \ + ../sanei/sanei_wire.lo \ + ../sanei/sanei_codec_bin.lo \ + ../sanei/sanei_pa4s2.lo \ + ../sanei/sanei_ab306.lo \ + ../sanei/sanei_pio.lo \ + ../sanei/sanei_tcp.lo \ + ../sanei/sanei_udp.lo \ + ../sanei/sanei_magic.lo \ + $(SANEI_SANEI_JPEG_LO) endif nodist_libsane_la_SOURCES = dll-s.c libsane_la_CPPFLAGS = $(AM_CPPFLAGS) -DBACKEND_NAME=dll libsane_la_LDFLAGS = $(DIST_LIBS_LDFLAGS) -libsane_la_LIBADD = $(COMMON_LIBS) $(PRELOADABLE_BACKENDS_ENABLED) libdll_preload.la sane_strstatus.lo ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo $(PRELOADABLE_BACKENDS_LIBS) $(DL_LIBS) $(XML_LIBS) +libsane_la_LIBADD = $(COMMON_LIBS) \ + $(PRELOADABLE_BACKENDS_ENABLED) libdll_preload.la \ + sane_strstatus.lo \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + $(PRELOADABLE_BACKENDS_LIBS) $(DL_LIBS) $(XML_LIBS) # WARNING: Automake is getting this wrong so have to do it ourselves. -libsane_la_DEPENDENCIES = ../lib/liblib.la $(PRELOADABLE_BACKENDS_ENABLED) libdll_preload.la sane_strstatus.lo ../sanei/sanei_init_debug.lo ../sanei/sanei_constrain_value.lo ../sanei/sanei_config.lo $(PRELOADABLE_BACKENDS_DEPS) +libsane_la_DEPENDENCIES = ../lib/liblib.la \ + $(PRELOADABLE_BACKENDS_ENABLED) libdll_preload.la \ + sane_strstatus.lo \ + ../sanei/sanei_init_debug.lo \ + ../sanei/sanei_constrain_value.lo \ + ../sanei/sanei_config.lo \ + $(PRELOADABLE_BACKENDS_DEPS) diff --git a/backend/abaton.c b/backend/abaton.c index d5968cc..06e60f1 100644 --- a/backend/abaton.c +++ b/backend/abaton.c @@ -855,7 +855,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG_INIT (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (ABATON_CONFIG_FILE); if (!fp) diff --git a/backend/agfafocus.c b/backend/agfafocus.c index 71fcf30..d972f59 100644 --- a/backend/agfafocus.c +++ b/backend/agfafocus.c @@ -1287,7 +1287,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) sanei_thread_init (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open ("agfafocus.conf"); if (!fp) diff --git a/backend/apple.c b/backend/apple.c index 328fd1e..7b37248 100644 --- a/backend/apple.c +++ b/backend/apple.c @@ -1871,7 +1871,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG_INIT (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (APPLE_CONFIG_FILE); if (!fp) diff --git a/backend/artec.c b/backend/artec.c index 355e78e..ea211eb 100644 --- a/backend/artec.c +++ b/backend/artec.c @@ -2591,7 +2591,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) strcpy (artec_model, ""); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); if (authorize) DBG (7, "sane_init(), authorize %s null\n", (authorize) ? "!=" : "=="); diff --git a/backend/artec_eplus48u.c b/backend/artec_eplus48u.c index 4c15673..a4a3c24 100644 --- a/backend/artec_eplus48u.c +++ b/backend/artec_eplus48u.c @@ -4458,7 +4458,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) auth = authorize; if (version_code != NULL) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (ARTEC48U_CONFIG_FILE); diff --git a/backend/as6e.c b/backend/as6e.c index f7c0e81..7655777 100644 --- a/backend/as6e.c +++ b/backend/as6e.c @@ -626,7 +626,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG_INIT (); DBG (2, "sane_init (authorize %s null)\n", (authorize) ? "!=" : "=="); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); /* fp = sanei_config_open (AS6E_CONFIG_FILE);*/ if (!fp) { diff --git a/backend/avision.c b/backend/avision.c index e047a7f..b81578a 100644 --- a/backend/avision.c +++ b/backend/avision.c @@ -2013,6 +2013,102 @@ static void debug_print_window_descriptor (int dbg_level, char* func, func, window->avision.type.normal.background_lines); } +static SANE_String_Const +avision_strdatatypecode (uint8_t datatypecode) +{ + static char buf[80]; + + switch (datatypecode) + { + case AVISION_DATATYPECODE_LIGHT_STATUS: + return "Light status"; + case AVISION_DATATYPECODE_POWER_SAVING_TIMER: + return "Power saving timer"; + case AVISION_DATATYPECODE_FIRMWARE_STATUS: + return "Firmware status"; + case AVISION_DATATYPECODE_FLASH_RAM_INFO: + return "Flash RAM info"; + case AVISION_DATATYPECODE_READ_NVRAM_DATA: + return "Read NVRAM data"; + case AVISION_DATATYPECODE_SEND_NVRAM_DATA: + return "Send NVRAM data"; + case AVISION_DATATYPECODE_FLASH_DATA: + return "Flash data"; + case AVISION_DATATYPECODE_UNKNOWN: + return "Unknown"; + case AVISION_DATATYPECODE_DETECT_ACCESSORIES: + return "Detect accessories"; + case AVISION_DATATYPECODE_BUTTON_STATUS: + return "Button status"; + case AVISION_DATATYPECODE_FILM_HOLDER_SENSE: + return "Film holder sense"; + case AVISION_DATATYPECODE_READ_DUPLEX_INFO: + return "Read duplex info"; + case AVISION_DATATYPECODE_READ_GENERAL_ABILITY_PARAM: + return "Read general ability/parameter"; + case AVISION_DATATYPECODE_ATTACH_TRUNCATE_HEAD: + return "Attach/Truncate head (left) of scan length"; + case AVISION_DATATYPECODE_ATTACH_TRUNCATE_TAIL: + return "Attach/Truncate tail (right) of scan length"; + case AVISION_DATATYPECODE_GET_CALIBRATION_FORMAT: + return "Get calibration format"; + case AVISION_DATATYPECODE_DOWNLOAD_GAMMA_TABLE: + return "Download gamma table"; + case AVISION_DATATYPECODE_3X3_COLOR_MATRIX: + return "3x3 color matrix"; + case AVISION_DATATYPECODE_ACCELERATION_TABLE: + return "Acceleration table"; + case AVISION_DATATYPECODE_GET_BACKGROUND_RASTER: + return "Get background raster"; + case AVISION_DATATYPECODE_READ_IMAGE_DATA: + return "Read image data"; + default: + /* non-reentrant, but better than nothing */ + sprintf (buf, "Unknown data type code %02X", datatypecode); + return buf; + } +} + +static int +avision_strcmd (SANE_String buffer, size_t size, const void* cmd) +{ + const uint8_t* m_cmd = (const uint8_t*)cmd; + uint8_t opc = m_cmd[0]; + uint8_t datatypecode = m_cmd[2]; + + switch (opc) + { + case AVISION_SCSI_TEST_UNIT_READY: + return snprintf (buffer, size, "Test unit ready"); + case AVISION_SCSI_REQUEST_SENSE: + return snprintf (buffer, size, "Request sense"); + case AVISION_SCSI_MEDIA_CHECK: + return snprintf (buffer, size, "Media check"); + case AVISION_SCSI_INQUIRY: + return snprintf (buffer, size, "Inquiry"); + case AVISION_SCSI_MODE_SELECT: + return snprintf (buffer, size, "Mode select"); + case AVISION_SCSI_RESERVE_UNIT: + return snprintf (buffer, size, "Reserve unit"); + case AVISION_SCSI_RELEASE_UNIT: + return snprintf (buffer, size, "Release unit"); + case AVISION_SCSI_SCAN: + return snprintf (buffer, size, "Scan"); + case AVISION_SCSI_SET_WINDOW: + return snprintf (buffer, size, "Set window"); + case AVISION_SCSI_READ: + return snprintf (buffer, size, "Read (%s)", avision_strdatatypecode (datatypecode)); + case AVISION_SCSI_SEND: + return snprintf (buffer, size, "Send (%s)", avision_strdatatypecode (datatypecode)); + case AVISION_SCSI_OBJECT_POSITION: + return snprintf (buffer, size, "Object position"); + case AVISION_SCSI_GET_DATA_STATUS: + return snprintf (buffer, size, "Get data status"); + default: + return snprintf (buffer, size, "Unknown OPC %d", opc); + } +} + static int write_pnm_header (FILE* f, color_mode m, int depth, int width, int height) { int maxval = (1 << depth) - 1; @@ -2378,6 +2474,9 @@ static SANE_Status avision_cmd (Avision_Connection* av_con, const void* src, size_t src_size, void* dst, size_t* dst_size) { + SANE_Char strcmd[80]; + avision_strcmd (strcmd, sizeof (strcmd), cmd); + DBG (7, "avision_cmd: %s\n", strcmd); if (av_con->connection_type == AV_SCSI) { return sanei_scsi_cmd2 (av_con->scsi_fd, cmd, cmd_size, src, src_size, dst, dst_size); @@ -3224,7 +3323,7 @@ wait_4_light (Avision_Scanner* s) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0xa0; /* get light status */ + rcmd.datatypecode = AVISION_DATATYPECODE_LIGHT_STATUS; /* get light status */ set_double (rcmd.datatypequal, dev->data_dq); set_triple (rcmd.transferlen, size); @@ -3263,7 +3362,7 @@ wait_4_light (Avision_Scanner* s) memset (&scmd, 0, sizeof (scmd)); scmd.opc = AVISION_SCSI_SEND; - scmd.datatypecode = 0xa0; /* send light status */ + scmd.datatypecode = AVISION_DATATYPECODE_LIGHT_STATUS; /* send light status */ set_double (scmd.datatypequal, dev->data_dq); set_triple (scmd.transferlen, size); @@ -3297,7 +3396,7 @@ set_power_save_time (Avision_Scanner* s, int time) memset (&scmd, 0, sizeof (scmd)); scmd.cmd.opc = AVISION_SCSI_SEND; - scmd.cmd.datatypecode = 0xA2; /* power-saving timer */ + scmd.cmd.datatypecode = AVISION_DATATYPECODE_POWER_SAVING_TIMER; /* power-saving timer */ set_double (scmd.cmd.datatypequal, dev->data_dq); set_triple (scmd.cmd.transferlen, sizeof (scmd.time) ); @@ -3327,7 +3426,7 @@ get_firmware_status (Avision_Connection* av_con) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0x90; /* firmware status */ + rcmd.datatypecode = AVISION_DATATYPECODE_FIRMWARE_STATUS; /* firmware status */ set_double (rcmd.datatypequal, 0); /* dev->data_dq not available */ set_triple (rcmd.transferlen, size); @@ -3364,7 +3463,7 @@ get_flash_ram_info (Avision_Connection* av_con) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0x6a; /* flash ram information */ + rcmd.datatypecode = AVISION_DATATYPECODE_FLASH_RAM_INFO; /* flash ram information */ set_double (rcmd.datatypequal, 0); /* dev->data_dq not available */ set_triple (rcmd.transferlen, size); @@ -3433,7 +3532,7 @@ get_nvram_data (Avision_Scanner* s, nvram_data* nvram) rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0x69; /* Read NVM RAM data */ + rcmd.datatypecode = AVISION_DATATYPECODE_READ_NVRAM_DATA; /* Read NVM RAM data */ set_double (rcmd.datatypequal, 0); /* dev->data_dq not available */ set_triple (rcmd.transferlen, size); @@ -3547,7 +3646,7 @@ send_nvram_data (Avision_Connection* av_con) memset (&scmd, 0, sizeof (scmd)); scmd.opc = AVISION_SCSI_SEND; - scmd.datatypecode = 0x85; /* nvram data */ + scmd.datatypecode = AVISION_DATATYPECODE_SEND_NVRAM_DATA; /* nvram data */ set_double (scmd.datatypequal, 0); /* dev->data_dq not available */ set_triple (scmd.transferlen, size); @@ -3577,7 +3676,7 @@ send_flash_ram_data (Avision_Connection* av_con) memset (&scmd, 0, sizeof (scmd)); scmd.opc = AVISION_SCSI_SEND; - scmd.datatypecode = 0x86; /* flash data */ + scmd.datatypecode = AVISION_DATATYPECODE_FLASH_DATA; /* flash data */ set_double (scmd.datatypequal, 0); set_triple (scmd.transferlen, size); @@ -3613,7 +3712,7 @@ adf_reset (Avision_Scanner* s) memset (&scmd, 0, sizeof (scmd)); memset (&payload, 0, sizeof (payload)); scmd.opc = AVISION_SCSI_SEND; - scmd.datatypecode = 0xD0; /* unknown */ + scmd.datatypecode = AVISION_DATATYPECODE_UNKNOWN; /* unknown */ set_double (scmd.datatypequal, 0); size = 2; set_triple (scmd.transferlen, size); @@ -3629,7 +3728,7 @@ adf_reset (Avision_Scanner* s) memset (&rcmd, 0, sizeof (rcmd)); memset (&payload, 0, sizeof (payload)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0x69; /* Read NVRAM data */ + rcmd.datatypecode = AVISION_DATATYPECODE_READ_NVRAM_DATA; /* Read NVRAM data */ set_double (rcmd.datatypequal, dev->data_dq); size = 4 - i; /* read 3 bytes the first time, 4 the second */ set_triple (rcmd.transferlen, size); @@ -3668,7 +3767,7 @@ get_accessories_info (Avision_Scanner* s) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0x64; /* detect accessories */ + rcmd.datatypecode = AVISION_DATATYPECODE_DETECT_ACCESSORIES; /* detect accessories */ set_double (rcmd.datatypequal, dev->data_dq); set_triple (rcmd.transferlen, size); @@ -3825,7 +3924,7 @@ get_button_status (Avision_Scanner* s) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0xA1; /* button status */ + rcmd.datatypecode = AVISION_DATATYPECODE_BUTTON_STATUS; /* button status */ set_double (rcmd.datatypequal, dev->data_dq); set_triple (rcmd.transferlen, size); @@ -3927,7 +4026,7 @@ get_button_status (Avision_Scanner* s) memset (&scmd, 0, sizeof (scmd)); scmd.opc = AVISION_SCSI_SEND; - scmd.datatypecode = 0xA1; /* button control */ + scmd.datatypecode = AVISION_DATATYPECODE_BUTTON_STATUS; /* button control */ set_double (scmd.datatypequal, dev->data_dq); set_triple (scmd.transferlen, size); @@ -3984,7 +4083,7 @@ get_frame_info (Avision_Scanner* s) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0x87; /* film holder sense */ + rcmd.datatypecode = AVISION_DATATYPECODE_FILM_HOLDER_SENSE; /* film holder sense */ set_double (rcmd.datatypequal, dev->data_dq); set_triple (rcmd.transferlen, size); @@ -4051,7 +4150,7 @@ get_duplex_info (Avision_Scanner* s) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0xB1; /* read duplex info */ + rcmd.datatypecode = AVISION_DATATYPECODE_READ_DUPLEX_INFO; /* read duplex info */ set_double (rcmd.datatypequal, dev->data_dq); set_triple (rcmd.transferlen, size); @@ -4117,7 +4216,7 @@ set_frame (Avision_Scanner* s, SANE_Word frame) memset (&scmd, 0, sizeof (scmd)); scmd.cmd.opc = AVISION_SCSI_SEND; - scmd.cmd.datatypecode = 0x87; /* send film holder "sense" */ + scmd.cmd.datatypecode = AVISION_DATATYPECODE_FILM_HOLDER_SENSE; /* send film holder "sense" */ set_double (scmd.cmd.datatypequal, dev->data_dq); set_triple (scmd.cmd.transferlen, sizeof (scmd.data) ); @@ -4817,7 +4916,7 @@ get_tune_scan_length (Avision_Scanner* s) size = sizeof (payload); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0xD2; /* Read General Ability/Parameter */ + rcmd.datatypecode = AVISION_DATATYPECODE_READ_GENERAL_ABILITY_PARAM; /* Read General Ability/Parameter */ for (i = 1; i <= 8; ++i) { memset (&payload, 0, sizeof (payload)); @@ -4860,7 +4959,7 @@ send_tune_scan_length (Avision_Scanner* s) size = sizeof (payload); scmd.opc = AVISION_SCSI_SEND; - scmd.datatypecode = 0x96; /* Attach/Truncate head(left) of scan length */ + scmd.datatypecode = AVISION_DATATYPECODE_ATTACH_TRUNCATE_HEAD; /* Attach/Truncate head(left) of scan length */ set_triple (scmd.transferlen, size); /* the SPEC says optical DPI, but real world measuring suggests it is 1200 @@ -4907,7 +5006,7 @@ send_tune_scan_length (Avision_Scanner* s) return status; } - scmd.datatypecode = 0x95; /* Attach/Truncate tail(right) of scan length */ + scmd.datatypecode = AVISION_DATATYPECODE_ATTACH_TRUNCATE_TAIL; /* Attach/Truncate tail(right) of scan length */ bottom = dpi * SANE_UNFIX (s->val[OPT_OVERSCAN_BOTTOM].w) / MM_PER_INCH; DBG (3, "send_tune_scan_length: bottom: %d\n", bottom); @@ -5055,7 +5154,7 @@ get_calib_format (Avision_Scanner* s, struct calibration_format* format) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0x60; /* get calibration format */ + rcmd.datatypecode = AVISION_DATATYPECODE_GET_CALIBRATION_FORMAT; /* get calibration format */ set_double (rcmd.datatypequal, s->hw->data_dq); set_triple (rcmd.transferlen, size); @@ -5720,7 +5819,7 @@ send_gamma (Avision_Scanner* s) memset (&scmd, 0, sizeof (scmd) ); scmd.opc = AVISION_SCSI_SEND; - scmd.datatypecode = 0x81; /* 0x81 for download gamma table */ + scmd.datatypecode = AVISION_DATATYPECODE_DOWNLOAD_GAMMA_TABLE; /* 0x81 for download gamma table */ set_triple (scmd.transferlen, gamma_table_raw_size); for (color = 0; color < 3 && status == SANE_STATUS_GOOD; ++ color) @@ -5872,7 +5971,7 @@ send_3x3_matrix (Avision_Scanner* s) } cmd.scmd.opc = AVISION_SCSI_SEND; - cmd.scmd.datatypecode = 0x83; /* 0x83 for 3x3 color matrix */ + cmd.scmd.datatypecode = AVISION_DATATYPECODE_3X3_COLOR_MATRIX; /* 0x83 for 3x3 color matrix */ set_triple (cmd.scmd.transferlen, sizeof (struct matrix_3x3)); if (1) { @@ -5903,7 +6002,7 @@ get_acceleration_info (Avision_Scanner* s, struct acceleration_info* info) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0x6c; /* get acceleration information */ + rcmd.datatypecode = AVISION_DATATYPECODE_ACCELERATION_TABLE; /* get acceleration information */ set_double (rcmd.datatypequal, s->hw->data_dq); set_triple (rcmd.transferlen, size); @@ -5967,7 +6066,7 @@ send_acceleration_table (Avision_Scanner* s) memset (&scmd, 0x00, sizeof (scmd)); scmd.opc = AVISION_SCSI_SEND; - scmd.datatypecode = 0x6c; /* send acceleration table */ + scmd.datatypecode = AVISION_DATATYPECODE_ACCELERATION_TABLE; /* send acceleration table */ set_double (scmd.datatypequal, table); set_triple (scmd.transferlen, accel_info.total_steps); @@ -6393,7 +6492,7 @@ get_background_raster (Avision_Scanner* s) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0x9b; /* get background raster */ + rcmd.datatypecode = AVISION_DATATYPECODE_GET_BACKGROUND_RASTER; /* get background raster */ set_double (rcmd.datatypequal, s->hw->data_dq); /* Ok, well - this part is very messy. The AV122 and DM152 appear to @@ -6792,6 +6891,11 @@ do_cancel (Avision_Scanner* s) DBG (1, "do_cancel: release_unit failed\n"); } + DBG (4, "FORCE RELEASE UNIT ON CANCEL\n"); + status = release_unit (s, 1); + if (status != SANE_STATUS_GOOD) + DBG (1, "do_cancel: release_unit failed\n"); + return SANE_STATUS_CANCELLED; } @@ -6806,7 +6910,7 @@ read_data (Avision_Scanner* s, SANE_Byte* buf, size_t* count) memset (&rcmd, 0, sizeof (rcmd)); rcmd.opc = AVISION_SCSI_READ; - rcmd.datatypecode = 0x00; /* read image data */ + rcmd.datatypecode = AVISION_DATATYPECODE_READ_IMAGE_DATA; /* read image data */ set_double (rcmd.datatypequal, s->hw->data_dq); set_triple (rcmd.transferlen, *count); @@ -8081,15 +8185,15 @@ reader_process (void *data) exit_status = SANE_STATUS_CANCELLED; } - status = release_unit (s, 0); - if (status != SANE_STATUS_GOOD) - DBG (1, "reader_process: release_unit failed\n"); - if (dev->inquiry_new_protocol && dev->scanner_type == AV_FILM) { status = object_position (s, AVISION_SCSI_OP_GO_HOME); if (status != SANE_STATUS_GOOD) DBG (1, "reader_process: object position go-home failed!\n"); } + + status = release_unit (s, 0); + if (status != SANE_STATUS_GOOD) + DBG (1, "reader_process: release_unit failed\n"); } if ((dev->hw->feature_type & AV_ADF_FLIPPING_DUPLEX) && s->source_mode == AV_ADF_DUPLEX && s->page % 2) { @@ -8347,13 +8451,13 @@ sane_init (SANE_Int* version_code, SANE_Auth_Callback authorize) #endif DBG (3, "sane_init:(Version: %i.%i Build: %i)\n", - SANE_CURRENT_MAJOR, V_MINOR, BACKEND_BUILD); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BACKEND_BUILD); /* must come first */ sanei_thread_init (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BACKEND_BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BACKEND_BUILD); sane_reload_devices (); diff --git a/backend/avision.h b/backend/avision.h index 0847dc8..aed6d9e 100644 --- a/backend/avision.h +++ b/backend/avision.h @@ -851,4 +851,29 @@ extern SANE_Status ENTRY(media_check) (SANE_Handle handle); #endif +typedef enum +{ + AVISION_DATATYPECODE_READ_IMAGE_DATA = 0x00, + AVISION_DATATYPECODE_GET_CALIBRATION_FORMAT = 0x60, + AVISION_DATATYPECODE_DETECT_ACCESSORIES = 0x64, + AVISION_DATATYPECODE_READ_NVRAM_DATA = 0x69, + AVISION_DATATYPECODE_FLASH_RAM_INFO = 0x6a, + AVISION_DATATYPECODE_ACCELERATION_TABLE = 0x6c, + AVISION_DATATYPECODE_DOWNLOAD_GAMMA_TABLE = 0x81, + AVISION_DATATYPECODE_3X3_COLOR_MATRIX = 0x83, + AVISION_DATATYPECODE_SEND_NVRAM_DATA = 0x85, + AVISION_DATATYPECODE_FLASH_DATA = 0x86, + AVISION_DATATYPECODE_FILM_HOLDER_SENSE = 0x87, + AVISION_DATATYPECODE_FIRMWARE_STATUS = 0x90, + AVISION_DATATYPECODE_ATTACH_TRUNCATE_TAIL = 0x95, + AVISION_DATATYPECODE_ATTACH_TRUNCATE_HEAD = 0x96, + AVISION_DATATYPECODE_GET_BACKGROUND_RASTER = 0x9b, + AVISION_DATATYPECODE_LIGHT_STATUS = 0xa0, + AVISION_DATATYPECODE_BUTTON_STATUS = 0xa1, + AVISION_DATATYPECODE_POWER_SAVING_TIMER = 0xa2, + AVISION_DATATYPECODE_READ_DUPLEX_INFO = 0xb1, + AVISION_DATATYPECODE_UNKNOWN = 0xd0, + AVISION_DATATYPECODE_READ_GENERAL_ABILITY_PARAM = 0xd2, +} Avision_Datatypecode; + #endif /* avision_h */ diff --git a/backend/bh.c b/backend/bh.c index dd5f6a0..0f2e70e 100644 --- a/backend/bh.c +++ b/backend/bh.c @@ -3150,11 +3150,11 @@ sane_init (SANE_Int *version_code, SANE_Auth_Callback authorize) DBG_INIT(); DBG(3, "sane_init called\n"); DBG(1, "Bell+Howell SANE backend %d.%d build %d %s endian\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, _is_host_little_endian() ? "little" : "big"); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); fp = sanei_config_open(BH_CONFIG_FILE); if (fp) diff --git a/backend/canon-sane.c b/backend/canon-sane.c index 016ca8a..6957aa7 100644 --- a/backend/canon-sane.c +++ b/backend/canon-sane.c @@ -55,7 +55,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize #endif if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (CANON_CONFIG_FILE); if (fp) diff --git a/backend/canon630u.c b/backend/canon630u.c index 6a76211..659c31f 100644 --- a/backend/canon630u.c +++ b/backend/canon630u.c @@ -720,10 +720,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (2, "sane_init: version_code %s 0, authorize %s 0\n", version_code == 0 ? "=" : "!=", authorize == 0 ? "=" : "!="); DBG (1, "sane_init: SANE Canon630u backend version %d.%d.%d from %s\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); sanei_usb_init (); diff --git a/backend/canon_dr-cmd.h b/backend/canon_dr-cmd.h index 44751fa..e9fc54b 100644 --- a/backend/canon_dr-cmd.h +++ b/backend/canon_dr-cmd.h @@ -11,9 +11,7 @@ #define USB_HEADER_LEN 12 #define USB_COMMAND_LEN 12 #define USB_STATUS_LEN 4 -#define USB_COMMAND_TIME 30000 -#define USB_DATA_TIME 30000 -#define USB_STATUS_TIME 30000 +#define USB_PACKET_TIMEOUT 30000 /*static inline void */ static void @@ -116,8 +114,10 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes) #define INQUIRY_code 0x12 #define INQUIRY_len 6 -#define INQUIRY_std_len 0x30 -#define INQUIRY_vpd_len 0x1e +#define INQUIRY_std_max_len 0x30 +#define INQUIRY_std_typ_len 0x30 +#define INQUIRY_vpd_max_len 0x30 +#define INQUIRY_vpd_typ_len 0x1e #define set_IN_evpd(icb, val) setbitfield(icb + 1, 1, 0, val) #define set_IN_page_code(icb, val) icb[0x02]=val diff --git a/backend/canon_dr.c b/backend/canon_dr.c index de7ed7e..95799e7 100644 --- a/backend/canon_dr.c +++ b/backend/canon_dr.c @@ -3,7 +3,7 @@ This file is part of the SANE package, and implements a SANE backend for various Canon DR-series scanners. - Copyright (C) 2008-2020 m. allan noah + Copyright (C) 2008-2021 m. allan noah Yabarana Corp. www.yabarana.com provided significant funding EvriChart, Inc. www.evrichart.com provided funding and loaned equipment @@ -346,6 +346,15 @@ - add new gray and color interlacing options for DR-C120 - initial support for DR-C120 and C130 - enable fine calibration for P-208 (per @sashacmc in !546) + v61 2021-02-13, MAN + - treat DR-P208 like P-208 (#356) + - treat DR-P215 like P-215 (#356) + - adjust wait_scanner to try one TUR with a long timeout (#142) + v62 2021-02-13, MAN + - allow config file to set inq and vpd lengths for DR-M1060 (#263) + - rewrite do_cmd() timeout handling + - remove long timeout TUR from v61 (did not help) + - allow config file to set initial tur timeout for DR-X10C (#142) SANE FLOW DIAGRAM @@ -384,6 +393,7 @@ #include <math.h> /*tan*/ #include <unistd.h> /*usleep*/ #include <sys/time.h> /*gettimeofday*/ +#include <stdlib.h> /*strtol*/ #include "../include/sane/sanei_backend.h" #include "../include/sane/sanei_scsi.h" @@ -396,7 +406,7 @@ #include "canon_dr.h" #define DEBUG 1 -#define BUILD 60 +#define BUILD 62 /* values for SANE_DEBUG_CANON_DR env var: - errors 5 @@ -448,6 +458,10 @@ 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 int global_inquiry_length; +static int global_vpd_length; +static int global_tur_timeout; +static int global_tur_timeout_default = USB_PACKET_TIMEOUT/60; /* half second */ static char global_vendor_name[9]; static char global_model_name[17]; static char global_version_name[5]; @@ -486,10 +500,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (10, "sane_init: start\n"); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (5, "sane_init: canon_dr backend %d.%d.%d, from %s\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); DBG (10, "sane_init: finish\n"); @@ -675,6 +689,84 @@ sane_get_devices (const SANE_Device *** device_list, SANE_Bool local_only) global_duplex_offset = buf; } + /* INQUIRY_LENGTH: <= 0x30 */ + else if (!strncmp (lp, "inquiry-length", 14) && isspace (lp[14])) { + + int buf; + lp += 14; + lp = sanei_config_skip_whitespace (lp); + buf = (int) strtol (lp,NULL,16); + + if (buf > INQUIRY_std_max_len) { + DBG (5, "sane_get_devices: config option \"inquiry-length\" " + "(%#04x) is > %#04x, ignoring!\n", buf, INQUIRY_std_max_len); + continue; + } + + if (buf < 0) { + DBG (5, "sane_get_devices: config option \"inquiry-length\" " + "(%#04x) is < 0, ignoring!\n", buf); + continue; + } + + DBG (15, "sane_get_devices: setting \"inquiry-length\" to %#04x\n", + buf); + + global_inquiry_length = buf; + } + + /* VPD_LENGTH: <= 0x30 */ + else if (!strncmp (lp, "vpd-length", 10) && isspace (lp[10])) { + + int buf; + lp += 10; + lp = sanei_config_skip_whitespace (lp); + buf = (int) strtol (lp,NULL,16); + + if (buf > INQUIRY_vpd_max_len) { + DBG (5, "sane_get_devices: config option \"vpd-length\" " + "(%#04x) is > %#04x, ignoring!\n", buf, INQUIRY_vpd_max_len); + continue; + } + + if (buf < 0) { + DBG (5, "sane_get_devices: config option \"vpd-length\" " + "(%#04x) is < 0, ignoring!\n", buf); + continue; + } + + DBG (15, "sane_get_devices: setting \"vpd-length\" to %#04x\n", + buf); + + global_vpd_length = buf; + } + + /* TUR_TIMEOUT <= 60000 */ + else if (!strncmp (lp, "tur-timeout", 11) && isspace (lp[11])) { + + int buf; + lp += 11; + lp = sanei_config_skip_whitespace (lp); + buf = atoi (lp); + + if (buf > 60000) { + DBG (5, "sane_get_devices: config option \"tur-timeout\" " + "(%d) is > 60000, ignoring!\n", buf); + continue; + } + + if (buf < 0) { + DBG (5, "sane_get_devices: config option \"tur-timeout\" " + "(%d) is < 0, ignoring!\n", buf); + continue; + } + + DBG (15, "sane_get_devices: setting \"tur-timeout\" to %d\n", + buf); + + global_tur_timeout = buf; + } + /* VENDOR: we ingest up to 8 bytes */ else if (!strncmp (lp, "vendor-name", 11) && isspace (lp[11])) { @@ -841,6 +933,9 @@ attach_one (const char *device_name, int connType) s->padded_read = global_padded_read; s->extra_status = global_extra_status; s->duplex_offset = global_duplex_offset; + s->inquiry_length = global_inquiry_length; + s->vpd_length = global_vpd_length; + s->tur_timeout = global_tur_timeout; /* copy the device name */ strcpy (s->device_name, device_name); @@ -1017,8 +1112,8 @@ init_inquire (struct scanner *s) unsigned char cmd[INQUIRY_len]; size_t cmdLen = INQUIRY_len; - unsigned char in[INQUIRY_std_len]; - size_t inLen = INQUIRY_std_len; + unsigned char in[INQUIRY_std_max_len]; + size_t inLen = s->inquiry_length; DBG (10, "init_inquire: start\n"); @@ -1099,8 +1194,8 @@ init_vpd (struct scanner *s) unsigned char cmd[INQUIRY_len]; size_t cmdLen = INQUIRY_len; - unsigned char in[INQUIRY_vpd_len]; - size_t inLen = INQUIRY_vpd_len; + unsigned char in[INQUIRY_vpd_max_len]; + size_t inLen = s->vpd_length; DBG (10, "init_vpd: start\n"); @@ -1491,7 +1586,8 @@ init_model (struct scanner *s) s->has_card = 1; } - else if (strstr (s->model_name, "P-208")) { + else if (strstr (s->model_name, "P-208") + || strstr (s->model_name,"DR-P208")){ s->color_interlace[SIDE_FRONT] = COLOR_INTERLACE_RRGGBB; s->color_interlace[SIDE_BACK] = COLOR_INTERLACE_rRgGbB; s->gray_interlace[SIDE_BACK] = GRAY_INTERLACE_gG; @@ -1508,7 +1604,8 @@ init_model (struct scanner *s) s->can_read_sensors = 1; } - else if (strstr (s->model_name, "P-215")) { + else if (strstr (s->model_name, "P-215") + || strstr (s->model_name,"DR-P215")){ s->color_interlace[SIDE_FRONT] = COLOR_INTERLACE_rRgGbB; s->color_interlace[SIDE_BACK] = COLOR_INTERLACE_RRGGBB; s->gray_interlace[SIDE_FRONT] = GRAY_INTERLACE_gG; @@ -7079,6 +7176,9 @@ default_globals(void) global_padded_read = global_padded_read_default; global_extra_status = global_extra_status_default; global_duplex_offset = global_duplex_offset_default; + global_inquiry_length = INQUIRY_std_typ_len; + global_vpd_length = INQUIRY_vpd_typ_len; + global_tur_timeout = global_tur_timeout_default; global_vendor_name[0] = 0; global_model_name[0] = 0; global_version_name[0] = 0; @@ -7332,21 +7432,21 @@ sense_handler (int fd, unsigned char * sensed_data, void *arg) * take a bunch of pointers, send commands to scanner */ static SANE_Status -do_cmd(struct scanner *s, int runRS, int shortTime, +do_cmd(struct scanner *s, int runRS, int timeout, unsigned char * cmdBuff, size_t cmdLen, unsigned char * outBuff, size_t outLen, unsigned char * inBuff, size_t * inLen ) { if (s->connection == CONNECTION_SCSI) { - return do_scsi_cmd(s, runRS, shortTime, + return do_scsi_cmd(s, runRS, timeout, cmdBuff, cmdLen, outBuff, outLen, inBuff, inLen ); } if (s->connection == CONNECTION_USB) { - return do_usb_cmd(s, runRS, shortTime, + return do_usb_cmd(s, runRS, timeout, cmdBuff, cmdLen, outBuff, outLen, inBuff, inLen @@ -7356,7 +7456,7 @@ do_cmd(struct scanner *s, int runRS, int shortTime, } static SANE_Status -do_scsi_cmd(struct scanner *s, int runRS, int shortTime, +do_scsi_cmd(struct scanner *s, int runRS, int timeout, unsigned char * cmdBuff, size_t cmdLen, unsigned char * outBuff, size_t outLen, unsigned char * inBuff, size_t * inLen @@ -7366,7 +7466,7 @@ do_scsi_cmd(struct scanner *s, int runRS, int shortTime, /*shut up compiler*/ runRS=runRS; - shortTime=shortTime; + timeout=timeout; DBG(10, "do_scsi_cmd: start\n"); @@ -7404,7 +7504,7 @@ do_scsi_cmd(struct scanner *s, int runRS, int shortTime, } static SANE_Status -do_usb_cmd(struct scanner *s, int runRS, int shortTime, +do_usb_cmd(struct scanner *s, int runRS, int timeout, unsigned char * cmdBuff, size_t cmdLen, unsigned char * outBuff, size_t outLen, unsigned char * inBuff, size_t * inLen @@ -7414,21 +7514,19 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime, size_t cmdLength = 0; size_t cmdActual = 0; unsigned char * cmdBuffer = NULL; - int cmdTimeout = 0; size_t outOffset = 0; size_t outLength = 0; size_t outActual = 0; unsigned char * outBuffer = NULL; - int outTimeout = 0; size_t inOffset = 0; size_t inLength = 0; size_t inActual = 0; unsigned char * inBuffer = NULL; - int inTimeout = 0; size_t extraLength = 0; + int actTimeout = timeout ? timeout : USB_PACKET_TIMEOUT; int ret = 0; int ret2 = 0; @@ -7438,18 +7536,15 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime, DBG (10, "do_usb_cmd: start %lu %lu\n", (long unsigned int)timer.tv_sec, (long unsigned int)timer.tv_usec); + /* change timeout */ + sanei_usb_set_timeout(actTimeout); + /****************************************************************/ /* the command stage */ { cmdOffset = USB_HEADER_LEN; cmdLength = cmdOffset+USB_COMMAND_LEN; cmdActual = cmdLength; - cmdTimeout = USB_COMMAND_TIME; - - /* change timeout */ - if(shortTime) - cmdTimeout/=60; - sanei_usb_set_timeout(cmdTimeout); /* build buffer */ cmdBuffer = calloc(cmdLength,1); @@ -7465,7 +7560,7 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime, memcpy(cmdBuffer+cmdOffset,cmdBuff,cmdLen); /* write the command out */ - DBG(25, "cmd: writing %d bytes, timeout %d\n", (int)cmdLength, cmdTimeout); + DBG(25, "cmd: writing %d bytes, timeout %d\n", (int)cmdLength, actTimeout); hexdump(30, "cmd: >>", cmdBuffer, cmdLength); ret = sanei_usb_write_bulk(s->fd, cmdBuffer, &cmdActual); DBG(25, "cmd: wrote %d bytes, retVal %d\n", (int)cmdActual, ret); @@ -7488,7 +7583,7 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime, /* 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); + ret2 = do_usb_status(s,runRS,timeout,&extraLength); /* bail out on bad RS status */ if(ret2){ @@ -7504,12 +7599,6 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime, outOffset = USB_HEADER_LEN; outLength = outOffset+outLen; outActual = outLength; - outTimeout = USB_DATA_TIME; - - /* change timeout */ - if(shortTime) - outTimeout/=60; - sanei_usb_set_timeout(outTimeout); /* build outBuffer */ outBuffer = calloc(outLength,1); @@ -7525,7 +7614,7 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime, memcpy(outBuffer+outOffset,outBuff,outLen); /* write the command out */ - DBG(25, "out: writing %d bytes, timeout %d\n", (int)outLength, outTimeout); + DBG(25, "out: writing %d bytes, timeout %d\n", (int)outLength, actTimeout); hexdump(30, "out: >>", outBuffer, outLength); ret = sanei_usb_write_bulk(s->fd, outBuffer, &outActual); DBG(25, "out: wrote %d bytes, retVal %d\n", (int)outActual, ret); @@ -7563,13 +7652,6 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime, /*blast caller's copy in case we error out*/ *inLen = 0; - inTimeout = USB_DATA_TIME; - - /* change timeout */ - if(shortTime) - inTimeout/=60; - sanei_usb_set_timeout(inTimeout); - /* build inBuffer */ inBuffer = calloc(inActual,1); if(!inBuffer){ @@ -7577,7 +7659,7 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime, return SANE_STATUS_NO_MEM; } - DBG(25, "in: reading %d bytes, timeout %d\n", (int)inActual, inTimeout); + DBG(25, "in: reading %d bytes, timeout %d\n", (int)inActual, actTimeout); ret = sanei_usb_read_bulk(s->fd, inBuffer, &inActual); DBG(25, "in: read %d bytes, retval %d\n", (int)inActual, ret); hexdump(31, "in: <<", inBuffer, inActual); @@ -7603,7 +7685,7 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime, /****************************************************************/ /* the normal status stage */ - ret2 = do_usb_status(s,runRS,shortTime,&extraLength); + ret2 = do_usb_status(s,runRS,timeout,&extraLength); /* if status said EOF, adjust input with remainder count */ if(ret2 == SANE_STATUS_EOF && inBuffer){ @@ -7651,7 +7733,7 @@ do_usb_cmd(struct scanner *s, int runRS, int shortTime, } static SANE_Status -do_usb_status(struct scanner *s, int runRS, int shortTime, size_t * extraLength) +do_usb_status(struct scanner *s, int runRS, int timeout, size_t * extraLength) { #define EXTRA_READ_len 4 @@ -7661,7 +7743,8 @@ do_usb_status(struct scanner *s, int runRS, int shortTime, size_t * extraLength) size_t statLength = 0; size_t statActual = 0; unsigned char * statBuffer = NULL; - int statTimeout = 0; + + int actTimeout = timeout ? timeout : USB_PACKET_TIMEOUT; int ret = 0; @@ -7675,12 +7758,9 @@ do_usb_status(struct scanner *s, int runRS, int shortTime, size_t * extraLength) statLength += EXTRA_READ_len; statActual = statLength; - statTimeout = USB_STATUS_TIME; /* change timeout */ - if(shortTime) - statTimeout/=60; - sanei_usb_set_timeout(statTimeout); + sanei_usb_set_timeout(timeout ? timeout : USB_PACKET_TIMEOUT); /* build statBuffer */ statBuffer = calloc(statLength,1); @@ -7689,7 +7769,7 @@ do_usb_status(struct scanner *s, int runRS, int shortTime, size_t * extraLength) return SANE_STATUS_NO_MEM; } - DBG(25, "stat: reading %d bytes, timeout %d\n", (int)statLength, statTimeout); + DBG(25, "stat: reading %d bytes, timeout %d\n", (int)statLength, actTimeout); 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); @@ -7754,7 +7834,7 @@ do_usb_clear(struct scanner *s, int clear, int runRS) DBG(25,"rs sub call >>\n"); ret2 = do_cmd( - s,0,0, + s, 0, 0, rs_cmd, rs_cmdLen, NULL,0, rs_in, &rs_inLen @@ -7796,7 +7876,7 @@ wait_scanner(struct scanner *s) set_SCSI_opcode(cmd,TEST_UNIT_READY_code); ret = do_cmd ( - s, 0, 1, + s, 0, s->tur_timeout, cmd, cmdLen, NULL, 0, NULL, NULL @@ -7805,7 +7885,7 @@ wait_scanner(struct scanner *s) if (ret != SANE_STATUS_GOOD) { DBG(5,"WARNING: Brain-dead scanner. Hitting with stick.\n"); ret = do_cmd ( - s, 0, 1, + s, 0, s->tur_timeout, cmd, cmdLen, NULL, 0, NULL, NULL @@ -7814,7 +7894,7 @@ wait_scanner(struct scanner *s) if (ret != SANE_STATUS_GOOD) { DBG(5,"WARNING: Brain-dead scanner. Hitting with stick again.\n"); ret = do_cmd ( - s, 0, 1, + s, 0, s->tur_timeout, cmd, cmdLen, NULL, 0, NULL, NULL @@ -7823,18 +7903,9 @@ wait_scanner(struct scanner *s) // some scanners (such as DR-F120) are OK but will not respond to commands // when in sleep mode. By checking the sense it wakes them up. if (ret != SANE_STATUS_GOOD) { - DBG(5,"WARNING: Brain-dead scanner. Hitting with request sense.\n"); - ret = do_cmd ( - s, 1, 1, - cmd, cmdLen, - NULL, 0, - NULL, NULL - ); - } - if (ret != SANE_STATUS_GOOD) { - DBG(5,"WARNING: Brain-dead scanner. Hitting with stick a third time.\n"); + DBG(5,"WARNING: Brain-dead scanner. Hitting with stick and request sense.\n"); ret = do_cmd ( - s, 0, 1, + s, 1, s->tur_timeout, cmd, cmdLen, NULL, 0, NULL, NULL @@ -7843,7 +7914,7 @@ wait_scanner(struct scanner *s) if (ret != SANE_STATUS_GOOD) { DBG(5,"WARNING: Brain-dead scanner. Hitting with stick a fourth time.\n"); ret = do_cmd ( - s, 0, 1, + s, 0, s->tur_timeout, cmd, cmdLen, NULL, 0, NULL, NULL diff --git a/backend/canon_dr.conf.in b/backend/canon_dr.conf.in index 3b72fda..7bce43c 100644 --- a/backend/canon_dr.conf.in +++ b/backend/canon_dr.conf.in @@ -103,6 +103,7 @@ option duplex-offset 400 usb 0x1083 0x1617 # DR-X10C +option tur-timeout 5000 usb 0x1083 0x1618 # CR-25 @@ -173,6 +174,7 @@ usb 0x1083 0x164a usb 0x1083 0x164b # P-208 +option duplex-offset 260 usb 0x1083 0x164c # DR-G1130 @@ -194,6 +196,8 @@ option duplex-offset 1640 usb 0x1083 0x1654 # DR-M1060 +option inquiry-length 0x24 +option vpd-length 0x30 usb 0x1083 0x1657 # DR-C225 diff --git a/backend/canon_dr.h b/backend/canon_dr.h index a945d00..7afbb90 100644 --- a/backend/canon_dr.h +++ b/backend/canon_dr.h @@ -116,12 +116,18 @@ struct scanner /* --------------------------------------------------------------------- */ /* immutable values which are set during reading of config file. */ + int connection; /* hardware interface type */ int buffer_size; - int connection; /* hardware interface type */ + int duplex_offset; /* number of lines of padding added to front (1/1200)*/ + int extra_status; /* some machines need extra status read after cmd */ + int inquiry_length; /* some models are particular about inquiry size */ + int padded_read; /* some machines need extra 12 bytes on reads */ + int tur_timeout; /* some models are slow to wake up */ + int vpd_length; /* some models are particular about vpd size */ /* --------------------------------------------------------------------- */ /* immutable values which are set during inquiry probing of the scanner. */ - /* members in order found in scsi data... */ + /* members in order found in scsi data. These can also be in config file */ char vendor_name[9]; /* raw data as returned by SCSI inquiry. */ char model_name[17]; /* raw data as returned by SCSI inquiry. */ char version_name[5]; /* raw data as returned by SCSI inquiry. */ @@ -207,8 +213,6 @@ struct scanner int always_op; /* send object pos between pages */ 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 */ @@ -217,7 +221,6 @@ struct scanner 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)*/ int duplex_offset_side; /* padding added to front or back? */ int sw_lut; /* no hardware brightness/contrast support */ diff --git a/backend/canon_lide70-common.c b/backend/canon_lide70-common.c index 405d693..0882fec 100644 --- a/backend/canon_lide70-common.c +++ b/backend/canon_lide70-common.c @@ -2,7 +2,7 @@ BACKEND canon_lide70 - Copyright (C) 2019 Juergen Ernst and pimvantend. + Copyright (C) 2019-2021 Juergen Ernst and pimvantend. This file is part of the SANE package. @@ -28,7 +28,7 @@ #include <string.h> #include <unistd.h> /* usleep */ #include <time.h> -#include <math.h> /* exp() */ +#include <math.h> /* pow() */ #ifdef HAVE_OS2_H #include <sys/types.h> /* mode_t */ #endif @@ -74,12 +74,18 @@ typedef struct CANON_Handle long width, height; /* at scan resolution */ unsigned char value_08, value_09; /* left */ unsigned char value_0a, value_0b; /* right */ - unsigned char value_67, value_68; /* bottom */ + unsigned char value_66, value_67, value_68; /* bottom */ unsigned char value_51; /* lamp colors */ + unsigned char value_90; /* motor mode */ int resolution; /* dpi */ char *fname; /* output file name */ FILE *fp; /* output file pointer (for reading) */ unsigned char absolute_threshold; + double table_gamma; + double table_gamma_blue; + unsigned char highlight_red_enhanced; + unsigned char highlight_blue_reduced; + unsigned char highlight_other; } CANON_Handle; @@ -104,12 +110,15 @@ cp2155_set (int fd, CP2155_Register reg, byte data) cmd_buffer[3] = 0x00; cmd_buffer[4] = data; +/* if (cmd_buffer[0]==0 && cmd_buffer[1]>0x21 && cmd_buffer[1]<0x44) + { */ DBG (1, "cp2155_set %02x %02x %02x %02x %02x\n", cmd_buffer[0], cmd_buffer[1], cmd_buffer[2], cmd_buffer[3], cmd_buffer[4]); -/* - usleep (100 * MSEC); -*/ +/* } */ +/* */ + usleep (0.0 * MSEC); +/* */ status = sanei_usb_write_bulk (fd, cmd_buffer, &count); if (status != SANE_STATUS_GOOD) @@ -225,110 +234,98 @@ cp2155_write_gamma_block (int fd, unsigned int addr, byte * data) sanei_usb_write_bulk (fd, data, &count); } -/* size=0x0100 */ -/* gamma table red*/ -static byte cp2155_gamma_red_enhanced_data[] = { - - 0x04, 0x70, 0x00, 0x01, - 0x00, 0x14, 0x1c, 0x26, 0x2a, 0x2e, 0x34, 0x37, 0x3a, 0x3f, 0x42, 0x44, - 0x48, 0x4a, 0x4c, 0x50, - 0x52, 0x53, 0x57, 0x58, 0x5c, 0x5d, 0x5f, 0x62, 0x63, 0x64, 0x67, 0x68, - 0x6a, 0x6c, 0x6e, 0x6f, - 0x71, 0x72, 0x74, 0x76, 0x77, 0x78, 0x7a, 0x7c, 0x7e, 0x7f, 0x80, 0x82, - 0x83, 0x84, 0x86, 0x87, - 0x88, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x91, 0x92, 0x93, 0x95, 0x96, - 0x97, 0x98, 0x99, 0x9b, - 0x9b, 0x9c, 0x9e, 0x9f, 0x9f, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, - 0xa8, 0xa9, 0xaa, 0xab, - 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb6, - 0xb8, 0xb8, 0xb9, 0xba, - 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, - 0xc5, 0xc6, 0xc7, 0xc8, - 0xc9, 0xc9, 0xca, 0xcb, 0xcc, 0xcc, 0xce, 0xce, 0xcf, 0xd0, 0xd1, 0xd2, - 0xd2, 0xd3, 0xd4, 0xd5, - 0xd5, 0xd6, 0xd7, 0xd7, 0xd9, 0xd9, 0xda, 0xdb, 0xdb, 0xdc, 0xdd, 0xdd, - 0xdf, 0xdf, 0xe0, 0xe1, - 0xe1, 0xe2, 0xe3, 0xe3, 0xe4, 0xe5, 0xe5, 0xe6, 0xe7, 0xe7, 0xe8, 0xe9, - 0xe9, 0xea, 0xeb, 0xeb, - 0xec, 0xed, 0xed, 0xee, 0xef, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf3, - 0xf4, 0xf5, 0xf5, 0xf6, - 0xf7, 0xf7, 0xf8, 0xf9, 0xfa, 0xfa, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, - 0xfe, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, - 0xff, 0xff, 0xff, 0xff -}; - -/* size=0x0100 */ -/* gamma table */ -static byte cp2155_gamma_standard_data[] = { - - 0x04, 0x70, 0x00, 0x01, - 0x00, 0x14, 0x1c, 0x21, 0x26, 0x2a, 0x2e, 0x31, 0x34, 0x37, 0x3a, 0x3d, - 0x3f, 0x42, 0x44, 0x46, - 0x48, 0x4a, 0x4c, 0x4e, 0x50, 0x52, 0x53, 0x55, 0x57, 0x58, 0x5a, 0x5c, - 0x5d, 0x5f, 0x60, 0x62, - 0x63, 0x64, 0x66, 0x67, 0x68, 0x6a, 0x6b, 0x6c, 0x6e, 0x6f, 0x70, 0x71, - 0x72, 0x74, 0x75, 0x76, - 0x77, 0x78, 0x79, 0x7a, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, - 0x84, 0x85, 0x86, 0x87, - 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, - 0x93, 0x94, 0x95, 0x96, - 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0x9f, - 0xa0, 0xa1, 0xa2, 0xa3, - 0xa3, 0xa4, 0xa5, 0xa6, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, - 0xac, 0xad, 0xae, 0xaf, - 0xaf, 0xb0, 0xb1, 0xb1, 0xb2, 0xb3, 0xb4, 0xb4, 0xb5, 0xb6, 0xb6, 0xb7, - 0xb8, 0xb8, 0xb9, 0xba, - 0xba, 0xbb, 0xbc, 0xbc, 0xbd, 0xbe, 0xbe, 0xbf, 0xc0, 0xc0, 0xc1, 0xc1, - 0xc2, 0xc3, 0xc3, 0xc4, - 0xc5, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc8, 0xc9, 0xc9, 0xca, 0xcb, 0xcb, - 0xcc, 0xcc, 0xcd, 0xce, - 0xce, 0xcf, 0xcf, 0xd0, 0xd1, 0xd1, 0xd2, 0xd2, 0xd3, 0xd3, 0xd4, 0xd5, - 0xd5, 0xd6, 0xd6, 0xd7, - 0xd7, 0xd8, 0xd9, 0xd9, 0xda, 0xda, 0xdb, 0xdb, 0xdc, 0xdc, 0xdd, 0xdd, - 0xde, 0xdf, 0xdf, 0xe0, - 0xe0, 0xe1, 0xe1, 0xe2, 0xe2, 0xe3, 0xe3, 0xe4, 0xe4, 0xe5, 0xe5, 0xe6, - 0xe6, 0xe7, 0xe7, 0xe8, - 0xe8, 0xe9, 0xe9, 0xea, 0xea, 0xeb, 0xeb, 0xec, 0xec, 0xed, 0xed, 0xee, - 0xee, 0xef, 0xef, 0xf0, - 0xf0, 0xf1, 0xf1, 0xf2, 0xf2, 0xf3, 0xf3, 0xf4, 0xf4, 0xf5, 0xf5, 0xf6, - 0xf6, 0xf7, 0xf7, 0xf8, - 0xf8, 0xf9, 0xf9, 0xfa, 0xfa, 0xfa, 0xfb, 0xfb, 0xfc, 0xfc, 0xfd, 0xfd, - 0xfe, 0xfe, 0xff, 0xff -}; +void +makegammatable (double gamma, int highlight, unsigned char *buf) +{ + int maxin = 255; /* 8 bit gamma input */ + int maxout = 255; /* 8 bit gamma output */ + int in = 0; + int out; + + buf[0] = 0x04; + buf[1] = 0x70; + buf[2] = 0x00; + buf[3] = 0x01; + + while (in < highlight) + { + out = maxout * pow ((double) in / highlight, (1.0 / gamma)); + buf[in + 4] = (unsigned char) out; + in++; + } + + while (in <= maxin) + { + buf[in + 4] = maxout; + in++; + } + + return; +} static void -cp2155_set_gamma (int fd) +cp2155_set_gamma (int fd, CANON_Handle * chndl) { DBG (1, "cp2155_set_gamma\n"); + unsigned char buf[260]; /* gamma tables */ - cp2155_write_gamma_block (fd, 0x000, cp2155_gamma_standard_data); - cp2155_write_gamma_block (fd, 0x100, cp2155_gamma_standard_data); - cp2155_write_gamma_block (fd, 0x200, cp2155_gamma_standard_data); + makegammatable (chndl->table_gamma, chndl->highlight_other, buf); + cp2155_write_gamma_block (fd, 0x000, buf); + cp2155_write_gamma_block (fd, 0x100, buf); + cp2155_write_gamma_block (fd, 0x200, buf); } static void -cp2155_set_gamma_red_enhanced (int fd) +cp2155_set_gamma_red_enhanced (int fd, CANON_Handle * chndl) { DBG (1, "cp2155_set_gamma\n"); + unsigned char buf[260]; /* gamma tables */ - cp2155_write_gamma_block (fd, 0x000, cp2155_gamma_red_enhanced_data); - cp2155_write_gamma_block (fd, 0x100, cp2155_gamma_standard_data); - cp2155_write_gamma_block (fd, 0x200, cp2155_gamma_standard_data); + makegammatable (chndl->table_gamma, chndl->highlight_red_enhanced, buf); + cp2155_write_gamma_block (fd, 0x000, buf); + makegammatable (chndl->table_gamma, chndl->highlight_other, buf); + cp2155_write_gamma_block (fd, 0x100, buf); + makegammatable (chndl->table_gamma_blue, chndl->highlight_blue_reduced, + buf); + cp2155_write_gamma_block (fd, 0x200, buf); +} + +void +make_descending_slope (size_t start_descent, double coefficient, + unsigned char *buf) +{ + size_t count, position; + int top_value; + int value; + unsigned char value_lo, value_hi; + DBG (1, "start_descent = %lx\n", start_descent); + top_value = buf[start_descent - 2] + 256 * buf[start_descent - 1]; + DBG (1, "buf[start_descent-2] = %02x buf[start_descent-1] = %02x\n", + buf[start_descent - 2], buf[start_descent - 1]); + count = buf[2] + 256 * buf[3]; + position = start_descent; + DBG (1, "count = %ld top_value = %d\n", count, top_value); + while (position < count + 4) + { + value = + (int) (top_value / + (1.0 + coefficient * (position + 2 - start_descent))); + value_lo = value & 0xff; + value_hi = (value >> 8) & 0xff; + buf[position] = value_lo; + buf[position + 1] = value_hi; + DBG (1, + "position = %03lx buf[position]= %02x buf[position+1] = %02x\n", + position, buf[position], buf[position + 1]); + position += 2; + } } void -make_buf (size_t count, unsigned char *buf) +make_constant_buf (size_t count, unsigned int hiword, unsigned int loword, + unsigned char *buf) { size_t i = 4; - int hiword = 62756; - int loword = 20918; unsigned char hihi = (hiword >> 8) & 0xff; unsigned char hilo = (hiword) & 0xff; unsigned char lohi = (loword >> 8) & 0xff; @@ -351,6 +348,27 @@ make_buf (size_t count, unsigned char *buf) } void +make_slope_table (size_t count, unsigned int word, size_t start_descent, + double coefficient, unsigned char *buf) +{ + size_t i = 4; + unsigned char hi = (word >> 8) & 0xff; + unsigned char lo = (word) & 0xff; + buf[0] = 0x04; + buf[1] = 0x70; + buf[2] = (count - 4) & 0xff; + buf[3] = ((count - 4) >> 8) & 0xff; + while (i < start_descent) + { + buf[i] = lo; + i++; + buf[i] = hi; + i++; + } + make_descending_slope (start_descent, coefficient, buf); +} + +void write_buf (int fd, size_t count, unsigned char *buf, unsigned char value_74, unsigned char value_75) { @@ -375,10 +393,31 @@ write_buf (int fd, size_t count, unsigned char *buf, void big_write (int fd, size_t count, unsigned char *buf) { - make_buf (count, buf); + make_constant_buf (count, 62756, 20918, buf); + write_buf (fd, count, buf, 0x00, 0x00); + write_buf (fd, count, buf, 0x00, 0xb0); + write_buf (fd, count, buf, 0x01, 0x60); + write_buf (fd, count, buf, 0x02, 0x10); +} + +void +big_write_2224 (int fd, size_t count, unsigned char *buf) +{ + make_constant_buf (count, 62756, 30918, buf); write_buf (fd, count, buf, 0x00, 0x00); write_buf (fd, count, buf, 0x00, 0xb0); write_buf (fd, count, buf, 0x01, 0x60); + write_buf (fd, count, buf, 0x02, 0x10); +} + +void +big_write_film (int fd, size_t count, unsigned char *buf) +{ + make_constant_buf (count, 62756, 20918, buf); + write_buf (fd, count, buf, 0x00, 0x00); + write_buf (fd, count, buf, 0x02, 0x00); + write_buf (fd, count, buf, 0x04, 0x00); + write_buf (fd, count, buf, 0x06, 0x00); } void @@ -422,6 +461,92 @@ general_motor_2224 (int fd) } void +register_table (int fd, unsigned char register_value, unsigned char *buf) +{ + cp2155_set (fd, 0x1a, 0x00); + cp2155_set (fd, 0x1b, 0x00); + cp2155_set (fd, 0x1c, 0x02); + cp2155_set (fd, 0x15, 0x80); + cp2155_set (fd, 0x14, 0x7c); + cp2155_set (fd, 0x17, 0x01); + cp2155_set (fd, 0x43, 0x1c); + cp2155_set (fd, 0x44, 0x9c); + cp2155_set (fd, 0x45, 0x38); + if (register_value > 0) + { + unsigned char register_number = 0x23; + while (register_number < 0x43) + { + cp2155_set (fd, register_number, register_value); + register_number++; + } + } + else + { + int buffer_index = 0; + cp2155_set (fd, 0x23 + buffer_index, buf[buffer_index]); + cp2155_set (fd, 0x33 + buffer_index, buf[buffer_index]); + buffer_index++; + while (buffer_index < 9) + { + cp2155_set (fd, 0x23 + buffer_index, buf[buffer_index]); + cp2155_set (fd, 0x33 + buffer_index, buf[buffer_index]); + cp2155_set (fd, 0x43 - buffer_index, buf[buffer_index]); + cp2155_set (fd, 0x33 - buffer_index, buf[buffer_index]); + buffer_index++; + } + } + + cp2155_set (fd, 0xca, 0x00); + cp2155_set (fd, 0xca, 0x00); + cp2155_set (fd, 0xca, 0x00); + +} + +void +register_table_4800 (int fd, unsigned char register_value, unsigned char *buf) +{ + cp2155_set (fd, 0x1a, 0x00); + cp2155_set (fd, 0x1b, 0x00); + cp2155_set (fd, 0x1c, 0x02); + cp2155_set (fd, 0x15, 0x80); + cp2155_set (fd, 0x14, 0x7a); + cp2155_set (fd, 0x17, 0x02); + cp2155_set (fd, 0x43, 0x1c); + cp2155_set (fd, 0x44, 0x9c); + cp2155_set (fd, 0x45, 0x38); + if (register_value > 0) + { + unsigned char register_number = 0x23; + while (register_number < 0x43) + { + cp2155_set (fd, register_number, register_value); + register_number++; + } + } + else + { + int buffer_index = 0; + cp2155_set (fd, 0x23 + buffer_index, buf[buffer_index]); + cp2155_set (fd, 0x33 + buffer_index, buf[buffer_index]); + buffer_index++; + while (buffer_index < 9) + { + cp2155_set (fd, 0x23 + buffer_index, buf[buffer_index]); + cp2155_set (fd, 0x33 + buffer_index, buf[buffer_index]); + cp2155_set (fd, 0x43 - buffer_index, buf[buffer_index]); + cp2155_set (fd, 0x33 - buffer_index, buf[buffer_index]); + buffer_index++; + } + } + + cp2155_set (fd, 0xca, 0x00); + cp2155_set (fd, 0xca, 0x00); + cp2155_set (fd, 0xca, 0x00); + +} + +void startblob_2225_0075 (CANON_Handle * chndl, unsigned char *buf) { @@ -429,6 +554,15 @@ startblob_2225_0075 (CANON_Handle * chndl, unsigned char *buf) fd = chndl->fd; size_t count; + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x2e; + +/* original: + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x2e; + ratio 320 decimal + +*/ cp2155_set (fd, 0x90, 0xd8); cp2155_set (fd, 0x90, 0xd8); cp2155_set (fd, 0xb0, 0x03); @@ -445,7 +579,7 @@ startblob_2225_0075 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x2e); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0x00); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -506,114 +640,21 @@ startblob_2225_0075 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, chndl->value_67); cp2155_set (fd, 0x68, chndl->value_68); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x83); - cp2155_set (fd, 0x14, 0x7c); - cp2155_set (fd, 0x17, 0x02); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x28); - cp2155_set (fd, 0x33, 0x28); - cp2155_set (fd, 0x24, 0x27); - cp2155_set (fd, 0x34, 0x27); - cp2155_set (fd, 0x25, 0x25); - cp2155_set (fd, 0x35, 0x25); - cp2155_set (fd, 0x26, 0x21); - cp2155_set (fd, 0x36, 0x21); - cp2155_set (fd, 0x27, 0x1c); - cp2155_set (fd, 0x37, 0x1c); - cp2155_set (fd, 0x28, 0x16); - cp2155_set (fd, 0x38, 0x16); - cp2155_set (fd, 0x29, 0x0f); - cp2155_set (fd, 0x39, 0x0f); - cp2155_set (fd, 0x2a, 0x08); - cp2155_set (fd, 0x3a, 0x08); - cp2155_set (fd, 0x2b, 0x00); - cp2155_set (fd, 0x3b, 0x00); - cp2155_set (fd, 0x2c, 0x08); - cp2155_set (fd, 0x3c, 0x08); - cp2155_set (fd, 0x2d, 0x0f); - cp2155_set (fd, 0x3d, 0x0f); - cp2155_set (fd, 0x2e, 0x16); - cp2155_set (fd, 0x3e, 0x16); - cp2155_set (fd, 0x2f, 0x1c); - cp2155_set (fd, 0x3f, 0x1c); - cp2155_set (fd, 0x30, 0x21); - cp2155_set (fd, 0x40, 0x21); - cp2155_set (fd, 0x31, 0x25); - cp2155_set (fd, 0x41, 0x25); - cp2155_set (fd, 0x32, 0x27); - cp2155_set (fd, 0x42, 0x27); - cp2155_set (fd, 0xca, 0x01); - cp2155_set (fd, 0xca, 0x01); - cp2155_set (fd, 0xca, 0x11); + + memcpy (buf, "\x28\x27\x25\x21\x1c\x16\x0f\x08\x00", 9); + register_table (fd, 0, buf); cp2155_set (fd, 0x18, 0x00); - memcpy (buf + 0x00000000, - "\x04\x70\x00\x01\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000010, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000020, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000030, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000040, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000050, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000060, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\xf0\x23\x80\x22\x2c\x21", - 16); - memcpy (buf + 0x00000070, - "\xf1\x1f\xcd\x1e\xbd\x1d\xc0\x1c\xd2\x1b\xf4\x1a\x22\x1a\x5e\x19", - 16); - memcpy (buf + 0x00000080, - "\xa4\x18\xf5\x17\x4f\x17\xb2\x16\x1d\x16\x90\x15\x09\x15\x89\x14", - 16); - memcpy (buf + 0x00000090, - "\x0e\x14\x9a\x13\x2a\x13\xc0\x12\x59\x12\xf8\x11\x9a\x11\x3f\x11", - 16); - memcpy (buf + 0x000000a0, - "\xe9\x10\x96\x10\x46\x10\xf8\x0f\xae\x0f\x66\x0f\x21\x0f\xde\x0e", - 16); - memcpy (buf + 0x000000b0, - "\x9e\x0e\x60\x0e\x23\x0e\xe9\x0d\xb0\x0d\x7a\x0d\x44\x0d\x11\x0d", - 16); - memcpy (buf + 0x000000c0, - "\xdf\x0c\xaf\x0c\x80\x0c\x52\x0c\x25\x0c\xfa\x0b\xd0\x0b\xa7\x0b", - 16); - memcpy (buf + 0x000000d0, - "\x80\x0b\x59\x0b\x33\x0b\x0e\x0b\xea\x0a\xc8\x0a\xa5\x0a\x84\x0a", - 16); - memcpy (buf + 0x000000e0, - "\x64\x0a\x44\x0a\x25\x0a\x07\x0a\xe9\x09\xcd\x09\xb0\x09\x95\x09", - 16); - memcpy (buf + 0x000000f0, - "\x7a\x09\x60\x09\x46\x09\x2c\x09\x14\x09\xfc\x08\xe4\x08\xcd\x08", - 16); - memcpy (buf + 0x00000100, "\xb6\x08\xa0\x08", 4); count = 260; + make_slope_table (count, top_value, 0x6a, 0.021739, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x80\x25\xc0\x1c\x4f\x17\x9a\x13\xe9\x10\xde\x0e", - 16); - memcpy (buf + 0x00000010, - "\x44\x0d\xfa\x0b\xea\x0a\x07\x0a\x46\x09\xa0\x08\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000020, "\x80\x25\x80\x25", 4); count = 36; + make_slope_table (count, top_value, 0x06, 0.15217, buf); + write_buf (fd, count, buf, 0x03, 0x04); write_buf (fd, count, buf, 0x03, 0x08); @@ -628,6 +669,14 @@ startblob_2225_0150 (CANON_Handle * chndl, unsigned char *buf) fd = chndl->fd; size_t count; + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x1e; + +/* original: + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x1e; + ratio 320 decimal +*/ cp2155_set (fd, 0x90, 0xd8); cp2155_set (fd, 0x90, 0xd8); cp2155_set (fd, 0xb0, 0x02); @@ -644,7 +693,7 @@ startblob_2225_0150 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x1e); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0xa0); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -705,125 +754,21 @@ startblob_2225_0150 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, chndl->value_67); cp2155_set (fd, 0x68, chndl->value_68); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x84); - cp2155_set (fd, 0x14, 0x7c); - cp2155_set (fd, 0x17, 0x02); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x28); - cp2155_set (fd, 0x33, 0x28); - cp2155_set (fd, 0x24, 0x27); - cp2155_set (fd, 0x34, 0x27); - cp2155_set (fd, 0x25, 0x25); - cp2155_set (fd, 0x35, 0x25); - cp2155_set (fd, 0x26, 0x21); - cp2155_set (fd, 0x36, 0x21); - cp2155_set (fd, 0x27, 0x1c); - cp2155_set (fd, 0x37, 0x1c); - cp2155_set (fd, 0x28, 0x16); - cp2155_set (fd, 0x38, 0x16); - cp2155_set (fd, 0x29, 0x0f); - cp2155_set (fd, 0x39, 0x0f); - cp2155_set (fd, 0x2a, 0x08); - cp2155_set (fd, 0x3a, 0x08); - cp2155_set (fd, 0x2b, 0x00); - cp2155_set (fd, 0x3b, 0x00); - cp2155_set (fd, 0x2c, 0x08); - cp2155_set (fd, 0x3c, 0x08); - cp2155_set (fd, 0x2d, 0x0f); - cp2155_set (fd, 0x3d, 0x0f); - cp2155_set (fd, 0x2e, 0x16); - cp2155_set (fd, 0x3e, 0x16); - cp2155_set (fd, 0x2f, 0x1c); - cp2155_set (fd, 0x3f, 0x1c); - cp2155_set (fd, 0x30, 0x21); - cp2155_set (fd, 0x40, 0x21); - cp2155_set (fd, 0x31, 0x25); - cp2155_set (fd, 0x41, 0x25); - cp2155_set (fd, 0x32, 0x27); - cp2155_set (fd, 0x42, 0x27); - cp2155_set (fd, 0xca, 0x01); - cp2155_set (fd, 0xca, 0x01); - cp2155_set (fd, 0xca, 0x11); + + memcpy (buf, "\x28\x27\x25\x21\x1c\x16\x0f\x08\x00", 9); + register_table (fd, 0, buf); cp2155_set (fd, 0x18, 0x00); - cp2155_set (fd, 0x71, 0x01); - cp2155_set (fd, 0x0230, 0x11); - cp2155_set (fd, 0x71, 0x14); - cp2155_set (fd, 0x72, 0x01); - cp2155_set (fd, 0x73, 0x00); - cp2155_set (fd, 0x74, 0x03); - cp2155_set (fd, 0x75, 0x00); - cp2155_set (fd, 0x76, 0x00); - cp2155_set (fd, 0x0239, 0x40); - cp2155_set (fd, 0x0238, 0x89); - cp2155_set (fd, 0x023c, 0x2f); - cp2155_set (fd, 0x0264, 0x20); - memcpy (buf + 0x00000000, - "\x04\x70\x00\x01\x80\x25\xd7\x24\x35\x24\x98\x23\x00\x23\x6d\x22", - 16); - memcpy (buf + 0x00000010, - "\xdf\x21\x56\x21\xd1\x20\x50\x20\xd2\x1f\x59\x1f\xe3\x1e\x70\x1e", - 16); - memcpy (buf + 0x00000020, - "\x01\x1e\x95\x1d\x2c\x1d\xc6\x1c\x62\x1c\x02\x1c\xa3\x1b\x47\x1b", - 16); - memcpy (buf + 0x00000030, - "\xee\x1a\x97\x1a\x42\x1a\xef\x19\x9e\x19\x4f\x19\x02\x19\xb7\x18", - 16); - memcpy (buf + 0x00000040, - "\x6d\x18\x25\x18\xdf\x17\x9a\x17\x57\x17\x16\x17\xd6\x16\x97\x16", - 16); - memcpy (buf + 0x00000050, - "\x59\x16\x1d\x16\xe2\x15\xa8\x15\x70\x15\x38\x15\x02\x15\xcd\x14", - 16); - memcpy (buf + 0x00000060, - "\x99\x14\x66\x14\x33\x14\x02\x14\xd2\x13\xa2\x13\x74\x13\x46\x13", - 16); - memcpy (buf + 0x00000070, - "\x19\x13\xed\x12\xc2\x12\x98\x12\x6e\x12\x45\x12\x1d\x12\xf5\x11", - 16); - memcpy (buf + 0x00000080, - "\xce\x11\xa8\x11\x82\x11\x5d\x11\x39\x11\x15\x11\xf2\x10\xcf\x10", - 16); - memcpy (buf + 0x00000090, - "\xad\x10\x8b\x10\x6a\x10\x4a\x10\x2a\x10\x0a\x10\xeb\x0f\xcc\x0f", - 16); - memcpy (buf + 0x000000a0, - "\xae\x0f\x90\x0f\x73\x0f\x56\x0f\x3a\x0f\x1e\x0f\x02\x0f\xe7\x0e", - 16); - memcpy (buf + 0x000000b0, - "\xcc\x0e\xb2\x0e\x97\x0e\x7e\x0e\x64\x0e\x4b\x0e\x32\x0e\x1a\x0e", - 16); - memcpy (buf + 0x000000c0, - "\x02\x0e\xea\x0d\xd3\x0d\xbc\x0d\xa5\x0d\x8e\x0d\x78\x0d\x62\x0d", - 16); - memcpy (buf + 0x000000d0, - "\x4d\x0d\x37\x0d\x22\x0d\x0d\x0d\xf8\x0c\xe4\x0c\xd0\x0c\xbc\x0c", - 16); - memcpy (buf + 0x000000e0, - "\xa8\x0c\x95\x0c\x82\x0c\x6f\x0c\x5c\x0c\x4a\x0c\x37\x0c\x25\x0c", - 16); - memcpy (buf + 0x000000f0, - "\x14\x0c\x02\x0c\xf0\x0b\xdf\x0b\xce\x0b\xbd\x0b\xac\x0b\x9c\x0b", - 16); - memcpy (buf + 0x00000100, "\x8c\x0b\x7c\x0b", 4); + count = 260; + make_slope_table (count, top_value, 0x06, 0.0089185, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x80\x25\x18\x1f\x8f\x1a\x2d\x17\x8f\x14\x79\x12", - 16); - memcpy (buf + 0x00000010, - "\xc6\x10\x5b\x0f\x2a\x0e\x24\x0d\x41\x0c\x7c\x0b\xe3\x1e\x70\x1e", - 16); - memcpy (buf + 0x00000020, "\x01\x1e\x95\x1d", 4); count = 36; + make_slope_table (count, top_value, 0x06, 0.102968, buf); + write_buf (fd, count, buf, 0x03, 0x04); write_buf (fd, count, buf, 0x03, 0x08); @@ -838,6 +783,14 @@ startblob_2225_0300 (CANON_Handle * chndl, unsigned char *buf) fd = chndl->fd; size_t count; + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x2a; + +/* original: + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x2a; + ratio 228 decimal +*/ cp2155_set (fd, 0x90, 0xd8); cp2155_set (fd, 0x90, 0xd8); cp2155_set (fd, 0xb0, 0x01); @@ -854,7 +807,7 @@ startblob_2225_0300 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x2a); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0x80); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -915,75 +868,20 @@ startblob_2225_0300 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, chndl->value_67); cp2155_set (fd, 0x68, chndl->value_68); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x83); - cp2155_set (fd, 0x14, 0x7c); - cp2155_set (fd, 0x17, 0x02); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x14); - cp2155_set (fd, 0x33, 0x14); - cp2155_set (fd, 0x24, 0x14); - cp2155_set (fd, 0x34, 0x14); - cp2155_set (fd, 0x25, 0x14); - cp2155_set (fd, 0x35, 0x14); - cp2155_set (fd, 0x26, 0x14); - cp2155_set (fd, 0x36, 0x14); - cp2155_set (fd, 0x27, 0x14); - cp2155_set (fd, 0x37, 0x14); - cp2155_set (fd, 0x28, 0x14); - cp2155_set (fd, 0x38, 0x14); - cp2155_set (fd, 0x29, 0x14); - cp2155_set (fd, 0x39, 0x14); - cp2155_set (fd, 0x2a, 0x14); - cp2155_set (fd, 0x3a, 0x14); - cp2155_set (fd, 0x2b, 0x14); - cp2155_set (fd, 0x3b, 0x14); - cp2155_set (fd, 0x2c, 0x14); - cp2155_set (fd, 0x3c, 0x14); - cp2155_set (fd, 0x2d, 0x14); - cp2155_set (fd, 0x3d, 0x14); - cp2155_set (fd, 0x2e, 0x14); - cp2155_set (fd, 0x3e, 0x14); - cp2155_set (fd, 0x2f, 0x14); - cp2155_set (fd, 0x3f, 0x14); - cp2155_set (fd, 0x30, 0x14); - cp2155_set (fd, 0x40, 0x14); - cp2155_set (fd, 0x31, 0x14); - cp2155_set (fd, 0x41, 0x14); - cp2155_set (fd, 0x32, 0x14); - cp2155_set (fd, 0x42, 0x14); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); + + register_table (fd, 0x14, buf); cp2155_set (fd, 0x18, 0x00); - memcpy (buf + 0x00000000, - "\x04\x70\x30\x00\x80\x25\x36\x25\xee\x24\xa8\x24\x62\x24\x1d\x24", - 16); - memcpy (buf + 0x00000010, - "\xd9\x23\x96\x23\x54\x23\x13\x23\xd3\x22\x94\x22\x56\x22\x19\x22", - 16); - memcpy (buf + 0x00000020, - "\xdc\x21\xa1\x21\x66\x21\x2c\x21\xf3\x20\xba\x20\x82\x20\x4b\x20", - 16); - memcpy (buf + 0x00000030, "\x15\x20\xe0\x1f", 4); count = 52; + make_slope_table (count, top_value, 0x06, 0.0038363, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x80\x25\xe8\x24\x55\x24\xc7\x23\x3d\x23\xb7\x22", - 16); - memcpy (buf + 0x00000010, - "\x35\x22\xb6\x21\x3c\x21\xc4\x20\x50\x20\xe0\x1f\x56\x22\x19\x22", - 16); - memcpy (buf + 0x00000020, "\xdc\x21\xa1\x21", 4); count = 36; + make_slope_table (count, top_value, 0x06, 0.0080213, buf); + write_buf (fd, count, buf, 0x03, 0x04); write_buf (fd, count, buf, 0x03, 0x08); @@ -998,6 +896,14 @@ startblob_2225_0600 (CANON_Handle * chndl, unsigned char *buf) fd = chndl->fd; size_t count; + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x15; + +/* original: + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x15; + ratio 457 decimal +*/ cp2155_set (fd, 0x90, 0xd8); cp2155_set (fd, 0x90, 0xd8); cp2155_set (fd, 0xb0, 0x00); @@ -1014,7 +920,7 @@ startblob_2225_0600 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x15); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0xe0); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -1072,229 +978,20 @@ startblob_2225_0600 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, chndl->value_67); cp2155_set (fd, 0x68, chndl->value_68); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x01); - cp2155_set (fd, 0x14, 0x01); - cp2155_set (fd, 0x17, 0x01); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x14); - cp2155_set (fd, 0x33, 0x14); - cp2155_set (fd, 0x24, 0x14); - cp2155_set (fd, 0x34, 0x14); - cp2155_set (fd, 0x25, 0x14); - cp2155_set (fd, 0x35, 0x14); - cp2155_set (fd, 0x26, 0x14); - cp2155_set (fd, 0x36, 0x14); - cp2155_set (fd, 0x27, 0x14); - cp2155_set (fd, 0x37, 0x14); - cp2155_set (fd, 0x28, 0x14); - cp2155_set (fd, 0x38, 0x14); - cp2155_set (fd, 0x29, 0x14); - cp2155_set (fd, 0x39, 0x14); - cp2155_set (fd, 0x2a, 0x14); - cp2155_set (fd, 0x3a, 0x14); - cp2155_set (fd, 0x2b, 0x14); - cp2155_set (fd, 0x3b, 0x14); - cp2155_set (fd, 0x2c, 0x14); - cp2155_set (fd, 0x3c, 0x14); - cp2155_set (fd, 0x2d, 0x14); - cp2155_set (fd, 0x3d, 0x14); - cp2155_set (fd, 0x2e, 0x14); - cp2155_set (fd, 0x3e, 0x14); - cp2155_set (fd, 0x2f, 0x14); - cp2155_set (fd, 0x3f, 0x14); - cp2155_set (fd, 0x30, 0x14); - cp2155_set (fd, 0x40, 0x14); - cp2155_set (fd, 0x31, 0x14); - cp2155_set (fd, 0x41, 0x14); - cp2155_set (fd, 0x32, 0x14); - cp2155_set (fd, 0x42, 0x14); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); + + register_table (fd, 0x14, buf); cp2155_set (fd, 0x18, 0x00); - memcpy (buf + 0x0000, - "\x04\x70\x50\x00\x80\x25\x58\x25\x32\x25\x0b\x25\xe5\x24\xc0\x24", - 16); - memcpy (buf + 0x0010, - "\x9a\x24\x75\x24\x50\x24\x2b\x24\x07\x24\xe3\x23\xbf\x23\x9c\x23", - 16); - memcpy (buf + 0x0020, - "\x79\x23\x56\x23\x33\x23\x11\x23\xee\x22\xcd\x22\xab\x22\x8a\x22", - 16); - memcpy (buf + 0x0030, - "\x68\x22\x48\x22\x27\x22\x07\x22\xe6\x21\xc7\x21\xa7\x21\x87\x21", - 16); - memcpy (buf + 0x0040, - "\x68\x21\x49\x21\x2a\x21\x0c\x21\xee\x20\xd0\x20\x00\x00\x00\x00", - 16); - memcpy (buf + 0x0050, "\x00\x00\x00\x00", 4); count = 84; + make_slope_table (count, top_value, 0x06, 0.0020408, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); - memcpy (buf + 0x0000, - "\x04\x70\x20\x00\x80\x25\x04\x25\x8c\x24\x18\x24\xa5\x23\x36\x23", - 16); - memcpy (buf + 0x0010, - "\xca\x22\x60\x22\xf8\x21\x93\x21\x30\x21\xd0\x20\x00\x00\x00\x00", - 16); - memcpy (buf + 0x0020, "\x00\x00\x00\x00", 4); count = 36; - write_buf (fd, count, buf, 0x03, 0x04); - write_buf (fd, count, buf, 0x03, 0x08); - - general_motor_2225 (fd); -} - -void -startblob_2225_0600_extra (CANON_Handle * chndl, unsigned char *buf) -{ - - int fd; - fd = chndl->fd; - size_t count; - - cp2155_set (fd, 0x90, 0xd8); - cp2155_set (fd, 0x90, 0xd8); - cp2155_set (fd, 0xb0, 0x00); - cp2155_set (fd, 0x07, 0x00); - cp2155_set (fd, 0x07, 0x00); - cp2155_set (fd, 0x08, chndl->value_08); - cp2155_set (fd, 0x09, chndl->value_09); - cp2155_set (fd, 0x0a, chndl->value_0a); - cp2155_set (fd, 0x0b, chndl->value_0b); - cp2155_set (fd, 0xa0, 0x1d); - cp2155_set (fd, 0xa1, 0x00); - cp2155_set (fd, 0xa2, 0x31); - cp2155_set (fd, 0xa3, 0xf0); - cp2155_set (fd, 0x64, 0x00); - cp2155_set (fd, 0x65, 0x00); - cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x55); - cp2155_set (fd, 0x63, 0x00); - cp2155_set (fd, 0x50, 0x04); - cp2155_set (fd, 0x50, 0x04); - cp2155_set (fd, 0x51, chndl->value_51); - cp2155_set (fd, 0x5a, 0x32); - cp2155_set (fd, 0x5b, 0x32); - cp2155_set (fd, 0x5c, 0x32); - cp2155_set (fd, 0x5d, 0x32); - cp2155_set (fd, 0x52, 0x09); - cp2155_set (fd, 0x53, 0x5a); - cp2155_set (fd, 0x54, 0x06); - cp2155_set (fd, 0x55, 0x08); - cp2155_set (fd, 0x56, 0x05); - cp2155_set (fd, 0x57, 0x5f); - cp2155_set (fd, 0x58, 0xa9); - cp2155_set (fd, 0x59, 0xce); - cp2155_set (fd, 0x5e, 0x02); - cp2155_set (fd, 0x5f, 0x00); - cp2155_set (fd, 0x5f, 0x03); - cp2155_set (fd, 0x60, 0x15); - cp2155_set (fd, 0x60, 0x15); - cp2155_set (fd, 0x60, 0x15); - cp2155_set (fd, 0x60, 0x15); - cp2155_set (fd, 0x50, 0x04); - cp2155_set (fd, 0x51, chndl->value_51); - cp2155_set (fd, 0x81, 0x29); - cp2155_set (fd, 0x81, 0x29); - cp2155_set (fd, 0x82, 0x09); - cp2155_set (fd, 0x82, 0x09); - cp2155_set (fd, 0x83, 0x02); - cp2155_set (fd, 0x84, 0x06); - cp2155_set (fd, 0x80, 0x12); - cp2155_set (fd, 0x80, 0x12); - cp2155_set (fd, 0xb0, 0x08); - - big_write (fd, 0x5174, buf); - - cp2155_set (fd, 0x10, 0x05); - cp2155_set (fd, 0x10, 0x05); - cp2155_set (fd, 0x9b, 0x01); - cp2155_set (fd, 0x10, 0x05); - cp2155_set (fd, 0x11, 0x81); - cp2155_set (fd, 0x11, 0x81); - cp2155_set (fd, 0x11, 0x81); - cp2155_set (fd, 0x11, 0x81); - cp2155_set (fd, 0x11, 0x81); - cp2155_set (fd, 0x11, 0x81); - cp2155_set (fd, 0x11, 0x81); - cp2155_set (fd, 0x12, 0x06); - cp2155_set (fd, 0x13, 0x06); - cp2155_set (fd, 0x16, 0x06); - cp2155_set (fd, 0x21, 0x06); - cp2155_set (fd, 0x22, 0x06); - cp2155_set (fd, 0x20, 0x06); - cp2155_set (fd, 0x1d, 0x00); - cp2155_set (fd, 0x1e, 0x00); - cp2155_set (fd, 0x1f, 0x04); - cp2155_set (fd, 0x66, 0x00); - cp2155_set (fd, 0x67, 0x0f); - cp2155_set (fd, 0x68, 0x39); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x80); - cp2155_set (fd, 0x14, 0x7c); - cp2155_set (fd, 0x17, 0x01); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x14); - cp2155_set (fd, 0x33, 0x14); - cp2155_set (fd, 0x24, 0x14); - cp2155_set (fd, 0x34, 0x14); - cp2155_set (fd, 0x25, 0x14); - cp2155_set (fd, 0x35, 0x14); - cp2155_set (fd, 0x26, 0x14); - cp2155_set (fd, 0x36, 0x14); - cp2155_set (fd, 0x27, 0x14); - cp2155_set (fd, 0x37, 0x14); - cp2155_set (fd, 0x28, 0x14); - cp2155_set (fd, 0x38, 0x14); - cp2155_set (fd, 0x29, 0x14); - cp2155_set (fd, 0x39, 0x14); - cp2155_set (fd, 0x2a, 0x14); - cp2155_set (fd, 0x3a, 0x14); - cp2155_set (fd, 0x2b, 0x14); - cp2155_set (fd, 0x3b, 0x14); - cp2155_set (fd, 0x2c, 0x14); - cp2155_set (fd, 0x3c, 0x14); - cp2155_set (fd, 0x2d, 0x14); - cp2155_set (fd, 0x3d, 0x14); - cp2155_set (fd, 0x2e, 0x14); - cp2155_set (fd, 0x3e, 0x14); - cp2155_set (fd, 0x2f, 0x14); - cp2155_set (fd, 0x3f, 0x14); - cp2155_set (fd, 0x30, 0x14); - cp2155_set (fd, 0x40, 0x14); - cp2155_set (fd, 0x31, 0x14); - cp2155_set (fd, 0x41, 0x14); - cp2155_set (fd, 0x32, 0x14); - cp2155_set (fd, 0x42, 0x14); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0x18, 0x00); + make_slope_table (count, top_value, 0x06, 0.0064935, buf); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000010, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x00\x00\x00\x00", - 16); - memcpy (buf + 0x00000020, "\x00\x00\x00\x00", 4); - count = 36; - write_buf (fd, count, buf, 0x03, 0x00); - write_buf (fd, count, buf, 0x03, 0x02); - write_buf (fd, count, buf, 0x03, 0x06); write_buf (fd, count, buf, 0x03, 0x04); write_buf (fd, count, buf, 0x03, 0x08); @@ -1309,6 +1006,13 @@ startblob_2225_1200 (CANON_Handle * chndl, unsigned char *buf) fd = chndl->fd; size_t count; + unsigned int top_value = 0xff00; + unsigned char value_62 = 0xaa; + +/* original: + unsigned int top_value = 0xff00; + unsigned char value_62 = 0xaa; +*/ cp2155_set (fd, 0x90, 0xc8); cp2155_set (fd, 0x90, 0xe8); cp2155_set (fd, 0xb0, 0x00); @@ -1325,7 +1029,7 @@ startblob_2225_1200 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0xaa); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0x00); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -1386,60 +1090,14 @@ startblob_2225_1200 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, chndl->value_67); cp2155_set (fd, 0x68, chndl->value_68); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x80); - cp2155_set (fd, 0x14, 0x7c); - cp2155_set (fd, 0x17, 0x01); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x14); - cp2155_set (fd, 0x33, 0x14); - cp2155_set (fd, 0x24, 0x14); - cp2155_set (fd, 0x34, 0x14); - cp2155_set (fd, 0x25, 0x12); - cp2155_set (fd, 0x35, 0x12); - cp2155_set (fd, 0x26, 0x11); - cp2155_set (fd, 0x36, 0x11); - cp2155_set (fd, 0x27, 0x0e); - cp2155_set (fd, 0x37, 0x0e); - cp2155_set (fd, 0x28, 0x0b); - cp2155_set (fd, 0x38, 0x0b); - cp2155_set (fd, 0x29, 0x08); - cp2155_set (fd, 0x39, 0x08); - cp2155_set (fd, 0x2a, 0x04); - cp2155_set (fd, 0x3a, 0x04); - cp2155_set (fd, 0x2b, 0x00); - cp2155_set (fd, 0x3b, 0x00); - cp2155_set (fd, 0x2c, 0x04); - cp2155_set (fd, 0x3c, 0x04); - cp2155_set (fd, 0x2d, 0x08); - cp2155_set (fd, 0x3d, 0x08); - cp2155_set (fd, 0x2e, 0x0b); - cp2155_set (fd, 0x3e, 0x0b); - cp2155_set (fd, 0x2f, 0x0e); - cp2155_set (fd, 0x3f, 0x0e); - cp2155_set (fd, 0x30, 0x11); - cp2155_set (fd, 0x40, 0x11); - cp2155_set (fd, 0x31, 0x12); - cp2155_set (fd, 0x41, 0x12); - cp2155_set (fd, 0x32, 0x14); - cp2155_set (fd, 0x42, 0x14); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); + + memcpy (buf, "\x14\x14\x12\x11\x0e\x0b\x08\x04\x00", 9); + register_table (fd, 0, buf); cp2155_set (fd, 0x18, 0x01); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff", - 16); - memcpy (buf + 0x00000010, - "\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\xff\x00\x00\x00\x00", - 16); - memcpy (buf + 0x00000020, "\x00\x00\x00\x00", 4); count = 36; + make_slope_table (count, top_value, 0x06, 0.0, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); @@ -1457,6 +1115,14 @@ startblob_2224_0075 (CANON_Handle * chndl, unsigned char *buf) fd = chndl->fd; size_t count; + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x2e; + +/* original: + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x2e; + ratio 208 decimal +*/ cp2155_set (fd, 0x90, 0xe8); cp2155_set (fd, 0x9b, 0x06); cp2155_set (fd, 0x9b, 0x04); @@ -1475,7 +1141,7 @@ startblob_2224_0075 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x2e); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0x00); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -1537,162 +1203,20 @@ startblob_2224_0075 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, chndl->value_67); cp2155_set (fd, 0x68, chndl->value_68); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x83); - cp2155_set (fd, 0x14, 0x7c); - cp2155_set (fd, 0x17, 0x02); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x0f); - cp2155_set (fd, 0x33, 0x0f); - cp2155_set (fd, 0x24, 0x0f); - cp2155_set (fd, 0x34, 0x0f); - cp2155_set (fd, 0x25, 0x0f); - cp2155_set (fd, 0x35, 0x0f); - cp2155_set (fd, 0x26, 0x0f); - cp2155_set (fd, 0x36, 0x0f); - cp2155_set (fd, 0x27, 0x0f); - cp2155_set (fd, 0x37, 0x0f); - cp2155_set (fd, 0x28, 0x0f); - cp2155_set (fd, 0x38, 0x0f); - cp2155_set (fd, 0x29, 0x0f); - cp2155_set (fd, 0x39, 0x0f); - cp2155_set (fd, 0x2a, 0x0f); - cp2155_set (fd, 0x3a, 0x0f); - cp2155_set (fd, 0x2b, 0x0f); - cp2155_set (fd, 0x3b, 0x0f); - cp2155_set (fd, 0x2c, 0x0f); - cp2155_set (fd, 0x3c, 0x0f); - cp2155_set (fd, 0x2d, 0x0f); - cp2155_set (fd, 0x3d, 0x0f); - cp2155_set (fd, 0x2e, 0x0f); - cp2155_set (fd, 0x3e, 0x0f); - cp2155_set (fd, 0x2f, 0x0f); - cp2155_set (fd, 0x3f, 0x0f); - cp2155_set (fd, 0x30, 0x0f); - cp2155_set (fd, 0x40, 0x0f); - cp2155_set (fd, 0x31, 0x0f); - cp2155_set (fd, 0x41, 0x0f); - cp2155_set (fd, 0x32, 0x0f); - cp2155_set (fd, 0x42, 0x0f); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); + + register_table (fd, 0x0f, buf); cp2155_set (fd, 0x18, 0x00); - memcpy (buf + 0x00000000, - "\x04\x70\xf4\x01\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000010, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000020, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000030, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000040, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000050, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000060, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\xe1\x24\x47\x24\xb2\x23", - 16); - memcpy (buf + 0x00000070, - "\x22\x23\x97\x22\x0f\x22\x8c\x21\x0d\x21\x91\x20\x19\x20\xa4\x1f", - 16); - memcpy (buf + 0x00000080, - "\x33\x1f\xc5\x1e\x59\x1e\xf1\x1d\x8b\x1d\x29\x1d\xc8\x1c\x6a\x1c", - 16); - memcpy (buf + 0x00000090, - "\x0f\x1c\xb5\x1b\x5e\x1b\x09\x1b\xb6\x1a\x65\x1a\x16\x1a\xc9\x19", - 16); - memcpy (buf + 0x000000a0, - "\x7d\x19\x34\x19\xec\x18\xa5\x18\x60\x18\x1c\x18\xda\x17\x9a\x17", - 16); - memcpy (buf + 0x000000b0, - "\x5a\x17\x1c\x17\xe0\x16\xa4\x16\x6a\x16\x31\x16\xf9\x15\xc2\x15", - 16); - memcpy (buf + 0x000000c0, - "\x8c\x15\x57\x15\x23\x15\xf1\x14\xbf\x14\x8e\x14\x5e\x14\x2e\x14", - 16); - memcpy (buf + 0x000000d0, - "\x00\x14\xd2\x13\xa6\x13\x7a\x13\x4f\x13\x24\x13\xfa\x12\xd1\x12", - 16); - memcpy (buf + 0x000000e0, - "\xa9\x12\x81\x12\x5a\x12\x34\x12\x0e\x12\xe9\x11\xc5\x11\xa1\x11", - 16); - memcpy (buf + 0x000000f0, - "\x7d\x11\x5a\x11\x38\x11\x16\x11\xf5\x10\xd4\x10\xb4\x10\x94\x10", - 16); - memcpy (buf + 0x00000100, - "\x75\x10\x56\x10\x37\x10\x19\x10\xfc\x0f\xdf\x0f\xc2\x0f\xa6\x0f", - 16); - memcpy (buf + 0x00000110, - "\x8a\x0f\x6e\x0f\x53\x0f\x38\x0f\x1e\x0f\x04\x0f\xea\x0e\xd1\x0e", - 16); - memcpy (buf + 0x00000120, - "\xb8\x0e\x9f\x0e\x86\x0e\x6e\x0e\x57\x0e\x3f\x0e\x28\x0e\x11\x0e", - 16); - memcpy (buf + 0x00000130, - "\xfa\x0d\xe4\x0d\xce\x0d\xb8\x0d\xa3\x0d\x8e\x0d\x79\x0d\x64\x0d", - 16); - memcpy (buf + 0x00000140, - "\x4f\x0d\x3b\x0d\x27\x0d\x14\x0d\x00\x0d\xed\x0c\xda\x0c\xc7\x0c", - 16); - memcpy (buf + 0x00000150, - "\xb4\x0c\xa2\x0c\x8f\x0c\x7d\x0c\x6c\x0c\x5a\x0c\x49\x0c\x37\x0c", - 16); - memcpy (buf + 0x00000160, - "\x26\x0c\x15\x0c\x05\x0c\xf4\x0b\xe4\x0b\xd4\x0b\xc4\x0b\xb4\x0b", - 16); - memcpy (buf + 0x00000170, - "\xa4\x0b\x95\x0b\x85\x0b\x76\x0b\x67\x0b\x58\x0b\x4a\x0b\x3b\x0b", - 16); - memcpy (buf + 0x00000180, - "\x2d\x0b\x1e\x0b\x10\x0b\x02\x0b\xf4\x0a\xe7\x0a\xd9\x0a\xcc\x0a", - 16); - memcpy (buf + 0x00000190, - "\xbe\x0a\xb1\x0a\xa4\x0a\x97\x0a\x8a\x0a\x7e\x0a\x71\x0a\x65\x0a", - 16); - memcpy (buf + 0x000001a0, - "\x58\x0a\x4c\x0a\x40\x0a\x34\x0a\x28\x0a\x1c\x0a\x10\x0a\x05\x0a", - 16); - memcpy (buf + 0x000001b0, - "\xf9\x09\xee\x09\xe3\x09\xd8\x09\xcc\x09\xc1\x09\xb7\x09\xac\x09", - 16); - memcpy (buf + 0x000001c0, - "\xa1\x09\x96\x09\x8c\x09\x82\x09\x77\x09\x6d\x09\x63\x09\x59\x09", - 16); - memcpy (buf + 0x000001d0, - "\x4f\x09\x45\x09\x3b\x09\x31\x09\x28\x09\x1e\x09\x14\x09\x0b\x09", - 16); - memcpy (buf + 0x000001e0, - "\x02\x09\xf8\x08\xef\x08\xe6\x08\xdd\x08\xd4\x08\xcb\x08\xc2\x08", - 16); - memcpy (buf + 0x000001f0, - "\xb9\x08\xb1\x08\xa8\x08\xa0\x08\x00\x00\x00\x00\x00\x00\x00\x00", - 16); - memcpy (buf + 0x00000200, "\x00\x00\x00\x00", 4); count = 516; + make_slope_table (count, top_value, 0x6a, 0.0084116, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x80\x25\xc0\x1c\x4f\x17\x9a\x13\xe9\x10\xde\x0e", - 16); - memcpy (buf + 0x00000010, - "\x44\x0d\xfa\x0b\xea\x0a\x07\x0a\x46\x09\xa0\x08\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000020, "\x80\x25\x80\x25", 4); count = 36; + make_slope_table (count, top_value, 0x06, 0.15217, buf); + write_buf (fd, count, buf, 0x03, 0x04); write_buf (fd, count, buf, 0x03, 0x08); @@ -1708,6 +1232,14 @@ startblob_2224_0150 (CANON_Handle * chndl, unsigned char *buf) fd = chndl->fd; size_t count; + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x1e; + +/* original: + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x1e; + ratio 320 decimal +*/ cp2155_set (fd, 0x90, 0xe8); cp2155_set (fd, 0x9b, 0x06); cp2155_set (fd, 0x9b, 0x04); @@ -1726,7 +1258,7 @@ startblob_2224_0150 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x1e); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0xa0); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -1788,114 +1320,20 @@ startblob_2224_0150 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, chndl->value_67); cp2155_set (fd, 0x68, chndl->value_68); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x84); - cp2155_set (fd, 0x14, 0x7c); - cp2155_set (fd, 0x17, 0x02); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x0d); - cp2155_set (fd, 0x33, 0x0d); - cp2155_set (fd, 0x24, 0x0d); - cp2155_set (fd, 0x34, 0x0d); - cp2155_set (fd, 0x25, 0x0d); - cp2155_set (fd, 0x35, 0x0d); - cp2155_set (fd, 0x26, 0x0d); - cp2155_set (fd, 0x36, 0x0d); - cp2155_set (fd, 0x27, 0x0d); - cp2155_set (fd, 0x37, 0x0d); - cp2155_set (fd, 0x28, 0x0d); - cp2155_set (fd, 0x38, 0x0d); - cp2155_set (fd, 0x29, 0x0d); - cp2155_set (fd, 0x39, 0x0d); - cp2155_set (fd, 0x2a, 0x0d); - cp2155_set (fd, 0x3a, 0x0d); - cp2155_set (fd, 0x2b, 0x0d); - cp2155_set (fd, 0x3b, 0x0d); - cp2155_set (fd, 0x2c, 0x0d); - cp2155_set (fd, 0x3c, 0x0d); - cp2155_set (fd, 0x2d, 0x0d); - cp2155_set (fd, 0x3d, 0x0d); - cp2155_set (fd, 0x2e, 0x0d); - cp2155_set (fd, 0x3e, 0x0d); - cp2155_set (fd, 0x2f, 0x0d); - cp2155_set (fd, 0x3f, 0x0d); - cp2155_set (fd, 0x30, 0x0d); - cp2155_set (fd, 0x40, 0x0d); - cp2155_set (fd, 0x31, 0x0d); - cp2155_set (fd, 0x41, 0x0d); - cp2155_set (fd, 0x32, 0x0d); - cp2155_set (fd, 0x42, 0x0d); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); + + register_table (fd, 0x0d, buf); cp2155_set (fd, 0x18, 0x00); - memcpy (buf + 0x00000000, - "\x04\x70\x00\x01\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000010, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000020, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000030, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000040, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000050, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000060, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000070, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000080, - "\x80\x25\x80\x25\x80\x25\x32\x24\xfb\x22\xd9\x21\xc8\x20\xc9\x1f", - 16); - memcpy (buf + 0x00000090, - "\xd8\x1e\xf5\x1d\x1f\x1d\x54\x1c\x95\x1b\xdf\x1a\x32\x1a\x8d\x19", - 16); - memcpy (buf + 0x000000a0, - "\xf1\x18\x5c\x18\xce\x17\x46\x17\xc3\x16\x47\x16\xd0\x15\x5d\x15", - 16); - memcpy (buf + 0x000000b0, - "\xef\x14\x86\x14\x21\x14\xbf\x13\x61\x13\x07\x13\xaf\x12\x5b\x12", - 16); - memcpy (buf + 0x000000c0, - "\x0a\x12\xbb\x11\x6f\x11\x26\x11\xdf\x10\x9a\x10\x57\x10\x17\x10", - 16); - memcpy (buf + 0x000000d0, - "\xd8\x0f\x9c\x0f\x61\x0f\x27\x0f\xf0\x0e\xba\x0e\x85\x0e\x52\x0e", - 16); - memcpy (buf + 0x000000e0, - "\x21\x0e\xf0\x0d\xc1\x0d\x93\x0d\x67\x0d\x3b\x0d\x11\x0d\xe7\x0c", - 16); - memcpy (buf + 0x000000f0, - "\xbf\x0c\x98\x0c\x71\x0c\x4b\x0c\x27\x0c\x03\x0c\xe0\x0b\xbe\x0b", - 16); - memcpy (buf + 0x00000100, "\x9c\x0b\x7c\x0b", 4); count = 260; + make_slope_table (count, top_value, 0x86, 0.017979, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x80\x25\x18\x1f\x8f\x1a\x2d\x17\x8f\x14\x79\x12", - 16); - memcpy (buf + 0x00000010, - "\xc6\x10\x5b\x0f\x2a\x0e\x24\x0d\x41\x0c\x7c\x0b\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000020, "\x80\x25\x80\x25", 4); count = 36; + make_slope_table (count, top_value, 0x06, 0.102968, buf); + write_buf (fd, count, buf, 0x03, 0x04); write_buf (fd, count, buf, 0x03, 0x08); @@ -1906,11 +1344,18 @@ startblob_2224_0150 (CANON_Handle * chndl, unsigned char *buf) void startblob_2224_0300 (CANON_Handle * chndl, unsigned char *buf) { - int fd; fd = chndl->fd; size_t count; + unsigned int top_value = 0x3200; + unsigned char value_62 = 0x15; + +/* original: + unsigned int top_value = 0x3200; + unsigned char value_62 = 0x15; + ratio 609.52 decimal +*/ cp2155_set (fd, 0x90, 0xe8); cp2155_set (fd, 0x9b, 0x06); cp2155_set (fd, 0x9b, 0x04); @@ -1929,7 +1374,7 @@ startblob_2224_0300 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x15); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0xe0); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -1988,114 +1433,20 @@ startblob_2224_0300 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, chndl->value_67); cp2155_set (fd, 0x68, chndl->value_68); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x01); - cp2155_set (fd, 0x14, 0x01); - cp2155_set (fd, 0x17, 0x01); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x0a); - cp2155_set (fd, 0x33, 0x0a); - cp2155_set (fd, 0x24, 0x0a); - cp2155_set (fd, 0x34, 0x0a); - cp2155_set (fd, 0x25, 0x0a); - cp2155_set (fd, 0x35, 0x0a); - cp2155_set (fd, 0x26, 0x0a); - cp2155_set (fd, 0x36, 0x0a); - cp2155_set (fd, 0x27, 0x0a); - cp2155_set (fd, 0x37, 0x0a); - cp2155_set (fd, 0x28, 0x0a); - cp2155_set (fd, 0x38, 0x0a); - cp2155_set (fd, 0x29, 0x0a); - cp2155_set (fd, 0x39, 0x0a); - cp2155_set (fd, 0x2a, 0x0a); - cp2155_set (fd, 0x3a, 0x0a); - cp2155_set (fd, 0x2b, 0x0a); - cp2155_set (fd, 0x3b, 0x0a); - cp2155_set (fd, 0x2c, 0x0a); - cp2155_set (fd, 0x3c, 0x0a); - cp2155_set (fd, 0x2d, 0x0a); - cp2155_set (fd, 0x3d, 0x0a); - cp2155_set (fd, 0x2e, 0x0a); - cp2155_set (fd, 0x3e, 0x0a); - cp2155_set (fd, 0x2f, 0x0a); - cp2155_set (fd, 0x3f, 0x0a); - cp2155_set (fd, 0x30, 0x0a); - cp2155_set (fd, 0x40, 0x0a); - cp2155_set (fd, 0x31, 0x0a); - cp2155_set (fd, 0x41, 0x0a); - cp2155_set (fd, 0x32, 0x0a); - cp2155_set (fd, 0x42, 0x0a); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); + + register_table (fd, 0x0a, buf); cp2155_set (fd, 0x18, 0x00); - memcpy (buf + 0x0000, - "\x04\x70\x00\x01\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32", - 16); - memcpy (buf + 0x0010, - "\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32", - 16); - memcpy (buf + 0x0020, - "\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32", - 16); - memcpy (buf + 0x0030, - "\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32", - 16); - memcpy (buf + 0x0040, - "\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32", - 16); - memcpy (buf + 0x0050, - "\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32\x00\x32", - 16); - memcpy (buf + 0x0060, - "\x00\x32\x00\x32\x00\x32\xbc\x30\x89\x2f\x64\x2e\x4d\x2d\x43\x2c", - 16); - memcpy (buf + 0x0070, - "\x45\x2b\x52\x2a\x69\x29\x8a\x28\xb5\x27\xe8\x26\x23\x26\x66\x25", - 16); - memcpy (buf + 0x0080, - "\xaf\x24\x00\x24\x57\x23\xb5\x22\x17\x22\x80\x21\xee\x20\x60\x20", - 16); - memcpy (buf + 0x0090, - "\xd7\x1f\x53\x1f\xd3\x1e\x57\x1e\xde\x1d\x6a\x1d\xf9\x1c\x8b\x1c", - 16); - memcpy (buf + 0x00a0, - "\x20\x1c\xb9\x1b\x54\x1b\xf3\x1a\x93\x1a\x37\x1a\xdd\x19\x85\x19", - 16); - memcpy (buf + 0x00b0, - "\x30\x19\xdd\x18\x8c\x18\x3d\x18\xf0\x17\xa5\x17\x5c\x17\x14\x17", - 16); - memcpy (buf + 0x00c0, - "\xce\x16\x8a\x16\x47\x16\x06\x16\xc7\x15\x88\x15\x4b\x15\x10\x15", - 16); - memcpy (buf + 0x00d0, - "\xd6\x14\x9d\x14\x65\x14\x2e\x14\xf9\x13\xc4\x13\x91\x13\x5f\x13", - 16); - memcpy (buf + 0x00e0, - "\x2d\x13\xfd\x12\xce\x12\x9f\x12\x72\x12\x45\x12\x19\x12\xee\x11", - 16); - memcpy (buf + 0x00f0, - "\xc4\x11\x9a\x11\x71\x11\x49\x11\x22\x11\xfb\x10\xd5\x10\xb0\x10", - 16); - memcpy (buf + 0x0100, "\x8c\x10\x68\x10", 4); count = 260; + make_slope_table (count, top_value, 0x66, 0.0129596, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); - memcpy (buf + 0x0000, - "\x04\x70\x20\x00\x00\x32\x27\x2a\x6f\x24\x15\x20\xa8\x1c\xe5\x19", - 16); - memcpy (buf + 0x0010, - "\x9e\x17\xb5\x15\x16\x14\xb0\x12\x79\x11\x68\x10\x00\x00\x00\x00", - 16); - memcpy (buf + 0x0020, "\x00\x00\x00\x00", 4); count = 36; + make_slope_table (count, top_value, 0x06, 0.09307359, buf); + write_buf (fd, count, buf, 0x03, 0x04); write_buf (fd, count, buf, 0x03, 0x08); @@ -2111,6 +1462,14 @@ startblob_2224_0600 (CANON_Handle * chndl, unsigned char *buf) fd = chndl->fd; size_t count; + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x19; + +/* original: + unsigned int top_value = 0x7f80; + unsigned char value_62 = 0x55; + ratio 384 decimal +*/ cp2155_set (fd, 0x90, 0xe8); cp2155_set (fd, 0x9b, 0x06); cp2155_set (fd, 0x9b, 0x04); @@ -2129,7 +1488,7 @@ startblob_2224_0600 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x55); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0x00); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -2166,7 +1525,7 @@ startblob_2224_0600 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x80, 0x12); cp2155_set (fd, 0xb0, 0x08); - big_write (fd, 0x5694, buf); + big_write_2224 (fd, 0x5694, buf); cp2155_set (fd, 0x10, 0x05); cp2155_set (fd, 0x10, 0x05); @@ -2191,59 +1550,13 @@ startblob_2224_0600 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, chndl->value_67); cp2155_set (fd, 0x68, chndl->value_68); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x80); - cp2155_set (fd, 0x14, 0x7a); - cp2155_set (fd, 0x17, 0x02); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x0c); - cp2155_set (fd, 0x33, 0x0c); - cp2155_set (fd, 0x24, 0x0c); - cp2155_set (fd, 0x34, 0x0c); - cp2155_set (fd, 0x25, 0x0c); - cp2155_set (fd, 0x35, 0x0c); - cp2155_set (fd, 0x26, 0x0c); - cp2155_set (fd, 0x36, 0x0c); - cp2155_set (fd, 0x27, 0x0c); - cp2155_set (fd, 0x37, 0x0c); - cp2155_set (fd, 0x28, 0x0c); - cp2155_set (fd, 0x38, 0x0c); - cp2155_set (fd, 0x29, 0x0c); - cp2155_set (fd, 0x39, 0x0c); - cp2155_set (fd, 0x2a, 0x0c); - cp2155_set (fd, 0x3a, 0x0c); - cp2155_set (fd, 0x2b, 0x0c); - cp2155_set (fd, 0x3b, 0x0c); - cp2155_set (fd, 0x2c, 0x0c); - cp2155_set (fd, 0x3c, 0x0c); - cp2155_set (fd, 0x2d, 0x0c); - cp2155_set (fd, 0x3d, 0x0c); - cp2155_set (fd, 0x2e, 0x0c); - cp2155_set (fd, 0x3e, 0x0c); - cp2155_set (fd, 0x2f, 0x0c); - cp2155_set (fd, 0x3f, 0x0c); - cp2155_set (fd, 0x30, 0x0c); - cp2155_set (fd, 0x40, 0x0c); - cp2155_set (fd, 0x31, 0x0c); - cp2155_set (fd, 0x41, 0x0c); - cp2155_set (fd, 0x32, 0x0c); - cp2155_set (fd, 0x42, 0x0c); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); + + register_table (fd, 0x0c, buf); cp2155_set (fd, 0x18, 0x00); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000010, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x00\x00\x00\x00", - 16); - memcpy (buf + 0x00000020, "\x00\x00\x00\x00", 4); + count = 36; + make_slope_table (count, top_value, 0x06, 0.0, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); @@ -2257,17 +1570,36 @@ startblob_2224_0600 (CANON_Handle * chndl, unsigned char *buf) void startblob_2224_1200 (CANON_Handle * chndl, unsigned char *buf) { - +/* + chndl->value_51 = 0x0f; +*/ int fd; fd = chndl->fd; size_t count; - cp2155_set (fd, 0x90, 0xe8); - cp2155_set (fd, 0x9b, 0x06); - cp2155_set (fd, 0x9b, 0x04); - cp2155_set (fd, 0x9b, 0x06); - cp2155_set (fd, 0x9b, 0x04); - cp2155_set (fd, 0x90, 0xf8); + unsigned int top_value = 0x7c71; + unsigned char value_62 = 0x29; + +/* + unsigned int top_value = 0x3fc7; + unsigned char value_62 = 0x15; + ratio 777 decimal +*/ + + cp2155_set (fd, 0x90, 0xe0); /* e8 */ + + double n_msec = 10.0; + int n_9b = 10; /* 2 */ + while (n_9b > 0) + { + cp2155_set (fd, 0x9b, 0x06); + usleep (n_msec * MSEC); + cp2155_set (fd, 0x9b, 0x04); + usleep (n_msec * MSEC); + n_9b--; + } + + cp2155_set (fd, 0x90, 0xf0); /* f8 */ cp2155_set (fd, 0xb0, 0x00); cp2155_set (fd, 0x07, 0x00); cp2155_set (fd, 0x07, 0x00); @@ -2282,7 +1614,7 @@ startblob_2224_1200 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0xaa); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0x00); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -2319,7 +1651,8 @@ startblob_2224_1200 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x80, 0x12); cp2155_set (fd, 0xb0, 0x08); - big_write (fd, 0xa714, buf); + big_write (fd, 0xa1a4, buf); +/* big_write_film (fd, 0xf004, buf); */ cp2155_set (fd, 0x10, 0x05); cp2155_set (fd, 0x10, 0x05); @@ -2344,127 +1677,434 @@ startblob_2224_1200 (CANON_Handle * chndl, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, chndl->value_67); cp2155_set (fd, 0x68, chndl->value_68); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x80); - cp2155_set (fd, 0x14, 0x7a); - cp2155_set (fd, 0x17, 0x02); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x01); - cp2155_set (fd, 0x33, 0x01); - cp2155_set (fd, 0x24, 0x03); - cp2155_set (fd, 0x34, 0x03); - cp2155_set (fd, 0x25, 0x05); - cp2155_set (fd, 0x35, 0x05); - cp2155_set (fd, 0x26, 0x07); - cp2155_set (fd, 0x36, 0x07); - cp2155_set (fd, 0x27, 0x09); - cp2155_set (fd, 0x37, 0x09); - cp2155_set (fd, 0x28, 0x0a); - cp2155_set (fd, 0x38, 0x0a); - cp2155_set (fd, 0x29, 0x0b); - cp2155_set (fd, 0x39, 0x0b); - cp2155_set (fd, 0x2a, 0x0c); - cp2155_set (fd, 0x3a, 0x0c); - cp2155_set (fd, 0x2b, 0x0c); - cp2155_set (fd, 0x3b, 0x0c); - cp2155_set (fd, 0x2c, 0x0b); - cp2155_set (fd, 0x3c, 0x0b); - cp2155_set (fd, 0x2d, 0x0a); - cp2155_set (fd, 0x3d, 0x0a); - cp2155_set (fd, 0x2e, 0x09); - cp2155_set (fd, 0x3e, 0x09); - cp2155_set (fd, 0x2f, 0x07); - cp2155_set (fd, 0x3f, 0x07); - cp2155_set (fd, 0x30, 0x05); - cp2155_set (fd, 0x40, 0x05); - cp2155_set (fd, 0x31, 0x03); - cp2155_set (fd, 0x41, 0x03); - cp2155_set (fd, 0x32, 0x01); - cp2155_set (fd, 0x42, 0x01); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); + + memcpy (buf, "\x01\x03\x05\x07\x09\x0a\x0b\x0c\x0c", 9); + register_table (fd, 0, buf); + cp2155_set (fd, 0x18, 0x00); + + count = 324; + make_slope_table (count, top_value, 0x06, 0.0, buf); + + write_buf (fd, count, buf, 0x03, 0x00); + write_buf (fd, count, buf, 0x03, 0x02); + write_buf (fd, count, buf, 0x03, 0x06); + + count = 36; + make_slope_table (count, top_value, 0x06, 0.0, buf); + + write_buf (fd, count, buf, 0x03, 0x04); + write_buf (fd, count, buf, 0x03, 0x08); + + general_motor_2224 (fd); + +} + +void +startblob_2224_2400 (CANON_Handle * chndl, unsigned char *buf) +{ + + int fd; + fd = chndl->fd; + size_t count; + + unsigned int top_value = 0x5555; /* was 0x7c71 */ + unsigned char value_62 = 0x0e; /* at 0x15 ratio 1517 decimal, value_62 was 0x29 */ + + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0x11, 0x83); +/* + unsigned int top_value = 0x3fc7; + unsigned char value_62 = 0x15; + ratio 777 decimal + + cp2155_set (fd, 0x01, 0x2b); + cp2155_set (fd, 0x04, 0x08); + cp2155_set (fd, 0x05, 0x00); + cp2155_set (fd, 0x06, 0x00); +*/ + cp2155_set (fd, 0x90, 0xe0); + + double n_msec = 10.0; + int n_9b = 11; + while (n_9b > 0) + { + cp2155_set (fd, 0x9b, 0x06); + usleep (n_msec * MSEC); + cp2155_set (fd, 0x9b, 0x04); + usleep (n_msec * MSEC); + n_9b--; + } + + cp2155_set (fd, 0x90, 0xf0); + cp2155_set (fd, 0xb0, 0x00); + cp2155_set (fd, 0x07, 0x00); + cp2155_set (fd, 0x07, 0x00); + cp2155_set (fd, 0x08, chndl->value_08); + cp2155_set (fd, 0x09, chndl->value_09); + cp2155_set (fd, 0x0a, chndl->value_0a); + cp2155_set (fd, 0x0b, chndl->value_0b); + cp2155_set (fd, 0xa0, 0x25); + cp2155_set (fd, 0xa1, 0x00); + cp2155_set (fd, 0xa2, 0x92); + cp2155_set (fd, 0xa3, 0x10); + cp2155_set (fd, 0x64, 0x00); + cp2155_set (fd, 0x65, 0x00); + cp2155_set (fd, 0x61, 0x00); + cp2155_set (fd, 0x62, value_62); + cp2155_set (fd, 0x63, 0x00); + cp2155_set (fd, 0x50, 0x04); + cp2155_set (fd, 0x50, 0x04); + cp2155_set (fd, 0x90, 0xf1); + cp2155_set (fd, 0x51, chndl->value_51); + cp2155_set (fd, 0x5a, 0xff); + cp2155_set (fd, 0x5b, 0xff); + cp2155_set (fd, 0x5c, 0xff); + cp2155_set (fd, 0x5d, 0xff); + cp2155_set (fd, 0x52, 0x47); + cp2155_set (fd, 0x53, 0x3d); + cp2155_set (fd, 0x54, 0x2b); + cp2155_set (fd, 0x55, 0xd1); + cp2155_set (fd, 0x56, 0x20); + cp2155_set (fd, 0x57, 0x3d); + cp2155_set (fd, 0x58, 0x13); + cp2155_set (fd, 0x59, 0x25); + cp2155_set (fd, 0x5e, 0x02); + cp2155_set (fd, 0x5f, 0x00); + cp2155_set (fd, 0x5f, 0x03); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x50, 0x04); + cp2155_set (fd, 0x51, chndl->value_51); + cp2155_set (fd, 0x81, 0x31); /* 0x29); = darker */ + cp2155_set (fd, 0x81, 0x31); /* 0x29); */ + cp2155_set (fd, 0x82, 0x11); + cp2155_set (fd, 0x82, 0x11); + cp2155_set (fd, 0x83, 0x01); + cp2155_set (fd, 0x84, 0x05); + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0xb0, 0x08); + + big_write (fd, 0xa1a4, buf); + big_write_film (fd, 0xf004, buf); + + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x81); + cp2155_set (fd, 0x11, 0x81); + cp2155_set (fd, 0x12, 0x50); + cp2155_set (fd, 0x13, 0x50); + cp2155_set (fd, 0x16, 0x50); + cp2155_set (fd, 0x21, 0x06); + cp2155_set (fd, 0x22, 0x50); + cp2155_set (fd, 0x20, 0x06); + cp2155_set (fd, 0x1d, 0x00); + cp2155_set (fd, 0x1e, 0x00); + cp2155_set (fd, 0x1f, 0x04); + cp2155_set (fd, 0x66, chndl->value_66); + cp2155_set (fd, 0x67, chndl->value_67); + cp2155_set (fd, 0x68, chndl->value_68); + + memcpy (buf, "\x02\x04\x04\x06\x06\x08\x08\x0a\x0a", 9); + register_table (fd, 0, buf); + cp2155_set (fd, 0x18, 0x00); + + count = 324; + make_slope_table (count, top_value, 0x06, 0.0, buf); + + write_buf (fd, count, buf, 0x03, 0x00); + write_buf (fd, count, buf, 0x03, 0x02); + write_buf (fd, count, buf, 0x03, 0x06); + + count = 36; + make_slope_table (count, top_value, 0x06, 0.0, buf); + + write_buf (fd, count, buf, 0x03, 0x04); + write_buf (fd, count, buf, 0x03, 0x08); + + general_motor_2224 (fd); + +} + +void +startblob_2224_4800 (CANON_Handle * chndl, unsigned char *buf) +{ + + int fd; + fd = chndl->fd; + size_t count; + + unsigned int top_value = 0x3fc7; /* was 0x7c71 */ + unsigned char value_62 = 0x15; /* at 0x15 ratio 1517 decimal, value_62 was 0x29 */ + + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0x11, 0x83); +/* + unsigned int top_value = 0x3fc7; + unsigned char value_62 = 0x15; + ratio 777 decimal + + cp2155_set (fd, 0x01, 0x2b); + cp2155_set (fd, 0x04, 0x08); + cp2155_set (fd, 0x05, 0x00); + cp2155_set (fd, 0x06, 0x00); +*/ + cp2155_set (fd, 0x90, 0xe0); + + double n_msec = 10.0; + int n_9b = 12; + while (n_9b > 0) + { + cp2155_set (fd, 0x9b, 0x06); + usleep (n_msec * MSEC); + cp2155_set (fd, 0x9b, 0x04); + usleep (n_msec * MSEC); + n_9b--; + } + + cp2155_set (fd, 0x90, 0xf0); + cp2155_set (fd, 0xb0, 0x00); + cp2155_set (fd, 0x07, 0x00); + cp2155_set (fd, 0x07, 0x00); + cp2155_set (fd, 0x08, chndl->value_08); + cp2155_set (fd, 0x09, chndl->value_09); + cp2155_set (fd, 0x0a, chndl->value_0a); + cp2155_set (fd, 0x0b, chndl->value_0b); + cp2155_set (fd, 0xa0, 0x25); + cp2155_set (fd, 0xa1, 0x00); + cp2155_set (fd, 0xa2, 0x92); + cp2155_set (fd, 0xa3, 0x10); + cp2155_set (fd, 0x64, 0x00); + cp2155_set (fd, 0x65, 0x00); + cp2155_set (fd, 0x61, 0x00); + cp2155_set (fd, 0x62, value_62); + cp2155_set (fd, 0x63, 0x00); + cp2155_set (fd, 0x50, 0x04); + cp2155_set (fd, 0x50, 0x04); + cp2155_set (fd, 0x90, 0xf1); + cp2155_set (fd, 0x51, chndl->value_51); + cp2155_set (fd, 0x5a, 0xff); + cp2155_set (fd, 0x5b, 0xff); + cp2155_set (fd, 0x5c, 0xff); + cp2155_set (fd, 0x5d, 0xff); + cp2155_set (fd, 0x52, 0x47); + cp2155_set (fd, 0x53, 0x3d); + cp2155_set (fd, 0x54, 0x2b); + cp2155_set (fd, 0x55, 0xd1); + cp2155_set (fd, 0x56, 0x20); + cp2155_set (fd, 0x57, 0x3d); + cp2155_set (fd, 0x58, 0x13); + cp2155_set (fd, 0x59, 0x25); + cp2155_set (fd, 0x5e, 0x02); + cp2155_set (fd, 0x5f, 0x00); + cp2155_set (fd, 0x5f, 0x03); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x50, 0x04); + cp2155_set (fd, 0x51, chndl->value_51); + cp2155_set (fd, 0x81, 0x31); /* 0x29); = darker */ + cp2155_set (fd, 0x81, 0x31); /* 0x29); */ + cp2155_set (fd, 0x82, 0x11); + cp2155_set (fd, 0x82, 0x11); + cp2155_set (fd, 0x83, 0x01); + cp2155_set (fd, 0x84, 0x05); + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0xb0, 0x08); + + big_write (fd, 0xa1a4, buf); + big_write_film (fd, 0xf004, buf); + + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x81); + cp2155_set (fd, 0x11, 0x81); + cp2155_set (fd, 0x12, 0x50); + cp2155_set (fd, 0x13, 0x50); + cp2155_set (fd, 0x16, 0x50); + cp2155_set (fd, 0x21, 0x06); + cp2155_set (fd, 0x22, 0x50); + cp2155_set (fd, 0x20, 0x06); + cp2155_set (fd, 0x1d, 0x00); + cp2155_set (fd, 0x1e, 0x00); + cp2155_set (fd, 0x1f, 0x04); + cp2155_set (fd, 0x66, chndl->value_66); + cp2155_set (fd, 0x67, chndl->value_67); + cp2155_set (fd, 0x68, chndl->value_68); + + memcpy (buf, "\x02\x04\x04\x06\x06\x08\x08\x0a\x0a", 9); + register_table (fd, 0, buf); cp2155_set (fd, 0x18, 0x00); - memcpy (buf + 0x00000000, - "\x04\x70\x40\x01\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000010, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000020, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000030, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000040, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000050, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000060, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000070, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000080, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000090, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x000000a0, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x000000b0, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x000000c0, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x000000d0, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x000000e0, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x000000f0, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000100, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000110, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000120, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000130, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000140, "\x80\x7f\x80\x7f", 4); count = 324; + make_slope_table (count, top_value, 0x06, 0.0, buf); write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000010, - "\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f\x80\x7f", - 16); - memcpy (buf + 0x00000020, "\x80\x7f\x80\x7f", 4); count = 36; + make_slope_table (count, top_value, 0x06, 0.0, buf); + + write_buf (fd, count, buf, 0x03, 0x04); + write_buf (fd, count, buf, 0x03, 0x08); + + general_motor_2224 (fd); + +} + +void +startblob_2224_4799 (CANON_Handle * chndl, unsigned char *buf) +{ + + int fd; + fd = chndl->fd; + size_t count; + + unsigned int top_value = 0x1400; /* was 0x7c71 */ + unsigned char value_62 = 0x14; /* at 0x15 ratio 1517 decimal, value_62 was 0x29 */ + + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0x11, 0x83); + +/* + unsigned int top_value = 0x3fc7; + unsigned char value_62 = 0x15; + ratio 777 decimal + + cp2155_set (fd, 0x01, 0x2b); + cp2155_set (fd, 0x04, 0x08); + cp2155_set (fd, 0x05, 0x00); + cp2155_set (fd, 0x06, 0x00); +*/ + cp2155_set (fd, 0x90, 0xe0); + + double n_msec = 10.0; + int n_9b = 12; + while (n_9b > 0) + { + cp2155_set (fd, 0x9b, 0x06); + usleep (n_msec * MSEC); + cp2155_set (fd, 0x9b, 0x04); + usleep (n_msec * MSEC); + n_9b--; + } + + cp2155_set (fd, 0x90, 0xf0); + cp2155_set (fd, 0xb0, 0x00); + cp2155_set (fd, 0x07, 0x00); + cp2155_set (fd, 0x07, 0x00); + cp2155_set (fd, 0x08, chndl->value_08); + cp2155_set (fd, 0x09, chndl->value_09); + cp2155_set (fd, 0x0a, chndl->value_0a); + cp2155_set (fd, 0x0b, chndl->value_0b); + cp2155_set (fd, 0xa0, 0x25); + cp2155_set (fd, 0xa1, 0x01); + cp2155_set (fd, 0xa2, 0x23); + cp2155_set (fd, 0xa3, 0x10); + cp2155_set (fd, 0x64, 0x00); + cp2155_set (fd, 0x65, 0x00); + cp2155_set (fd, 0x61, 0x00); + cp2155_set (fd, 0x62, value_62); + cp2155_set (fd, 0x63, 0x00); + cp2155_set (fd, 0x50, 0x04); + cp2155_set (fd, 0x50, 0x04); + cp2155_set (fd, 0x90, 0xf1); + cp2155_set (fd, 0x51, chndl->value_51); + cp2155_set (fd, 0x5a, 0xff); + cp2155_set (fd, 0x5b, 0xff); + cp2155_set (fd, 0x5c, 0xff); + cp2155_set (fd, 0x5d, 0xff); + cp2155_set (fd, 0x52, 0x92); + cp2155_set (fd, 0x53, 0xa0); + cp2155_set (fd, 0x54, 0x58); + cp2155_set (fd, 0x55, 0x29); + cp2155_set (fd, 0x56, 0x40); + cp2155_set (fd, 0x57, 0x08); + cp2155_set (fd, 0x58, 0x27); + cp2155_set (fd, 0x59, 0xc7); + cp2155_set (fd, 0x5e, 0x02); + cp2155_set (fd, 0x5f, 0x00); + cp2155_set (fd, 0x5f, 0x03); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x60, 0x01); + cp2155_set (fd, 0x50, 0x04); + cp2155_set (fd, 0x51, chndl->value_51); + cp2155_set (fd, 0x81, 0x29); + cp2155_set (fd, 0x81, 0x29); + cp2155_set (fd, 0x82, 0x11); + cp2155_set (fd, 0x82, 0x11); + cp2155_set (fd, 0x83, 0x01); + cp2155_set (fd, 0x84, 0x05); + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0x80, 0x12); + cp2155_set (fd, 0xb0, 0x08); + + big_write (fd, 0xa1a4, buf); + big_write_film (fd, 0xf004, buf); + + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x10, 0x05); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x83); + cp2155_set (fd, 0x11, 0x81); + cp2155_set (fd, 0x11, 0x81); + cp2155_set (fd, 0x12, 0x50); + cp2155_set (fd, 0x13, 0x50); + cp2155_set (fd, 0x16, 0x50); + cp2155_set (fd, 0x21, 0x06); + cp2155_set (fd, 0x22, 0x50); + cp2155_set (fd, 0x20, 0x06); + cp2155_set (fd, 0x1d, 0x00); + cp2155_set (fd, 0x1e, 0x00); + cp2155_set (fd, 0x1f, 0x04); + cp2155_set (fd, 0x66, chndl->value_66); + cp2155_set (fd, 0x67, chndl->value_67); + cp2155_set (fd, 0x68, chndl->value_68); + + register_table_4800 (fd, 0x05, buf); + cp2155_set (fd, 0x18, 0x02); + + count = 324; + make_slope_table (count, top_value, 0x06, 0.0, buf); + + write_buf (fd, count, buf, 0x03, 0x00); + write_buf (fd, count, buf, 0x03, 0x02); + write_buf (fd, count, buf, 0x03, 0x06); + + count = 36; + make_slope_table (count, top_value, 0x06, 0.0, buf); write_buf (fd, count, buf, 0x03, 0x04); write_buf (fd, count, buf, 0x03, 0x08); @@ -2476,16 +2116,18 @@ startblob_2224_1200 (CANON_Handle * chndl, unsigned char *buf) void send_start_blob (CANON_Handle * chndl) { - unsigned char buf[0xf000]; + unsigned char buf[0xfff0]; int fd; fd = chndl->fd; /* value_51: lamp colors - bit 0 set: red on, bit 1 set: green on, bit 2 set: blue on + bit 0 set: red on, bit 1 set: green on, bit 2 set: blue on, + bit 3 set: infrared on all bits off: no scan is made */ chndl->value_51 = 0x07; + chndl->value_66 = 0x00; switch (chndl->val[opt_resolution].w) { @@ -2508,21 +2150,33 @@ send_start_blob (CANON_Handle * chndl) case 1200: chndl->value_67 = 0xab; /* 6*7300 */ chndl->value_68 = 0x18; + break; + case 2400: + chndl->value_66 = 0x01; + chndl->value_67 = 0x56; /* 12*7300 */ + chndl->value_68 = 0x30; + break; + case 4800: + chndl->value_66 = 0x02; + chndl->value_67 = 0xac; /* 24*7300 */ + chndl->value_68 = 0x60; } + unsigned char value_11 = 0xc1; /* 0x00; */ + cp2155_set (fd, 0x80, 0x12); - cp2155_set (fd, 0x11, 0xc1); + cp2155_set (fd, 0x11, value_11); cp2155_set (fd, 0x80, 0x12); - cp2155_set (fd, 0x11, 0xc1); + cp2155_set (fd, 0x11, value_11); cp2155_set (fd, 0x90, 0xf8); cp2155_set (fd, 0x80, 0x12); - cp2155_set (fd, 0x11, 0xc1); + cp2155_set (fd, 0x11, value_11); cp2155_set (fd, 0x01, 0x29); cp2155_set (fd, 0x04, 0x0c); cp2155_set (fd, 0x05, 0x00); cp2155_set (fd, 0x06, 0x00); cp2155_set (fd, 0x01, 0x29); - cp2155_set_gamma (fd); + cp2155_set_gamma (fd, chndl); switch (chndl->val[opt_resolution].w) { @@ -2553,14 +2207,14 @@ send_start_blob (CANON_Handle * chndl) } else { - cp2155_set_gamma_red_enhanced (fd); + cp2155_set_gamma_red_enhanced (fd, chndl); startblob_2224_0300 (chndl, buf); } break; case 600: if (chndl->productcode == 0x2225) { - cp2155_set_gamma_red_enhanced (fd); + cp2155_set_gamma_red_enhanced (fd, chndl); startblob_2225_0600 (chndl, buf); /* startblob_2225_0600_extra (chndl, buf); @@ -2581,6 +2235,26 @@ send_start_blob (CANON_Handle * chndl) startblob_2224_1200 (chndl, buf); } break; + case 2400: + if (chndl->productcode == 0x2225) + { + startblob_2225_1200 (chndl, buf); + } + else + { + startblob_2224_2400 (chndl, buf); + } + break; + case 4800: + if (chndl->productcode == 0x2225) + { + startblob_2225_1200 (chndl, buf); + } + else + { + startblob_2224_4800 (chndl, buf); + } + break; } } @@ -2658,7 +2332,7 @@ init_2225 (CANON_Handle * chndl) /* Detect if scanner is plugged in */ if (value != 0x81 && value != 0x40) { - DBG (0, "INIT: unexpected value: %x\n", value); + DBG (1, "INIT: unexpected value: %x\n", value); } if (value == 0x00) @@ -2774,10 +2448,20 @@ init (CANON_Handle * chndl) int result; if (chndl->productcode == 0x2225) { + chndl->table_gamma = 2.2; + chndl->table_gamma_blue = 2.2; + chndl->highlight_red_enhanced = 190; + chndl->highlight_other = 240; + chndl->highlight_blue_reduced = 240; result = init_2225 (chndl); } else { + chndl->table_gamma = 2.2; + chndl->table_gamma_blue = 1.95; + chndl->highlight_red_enhanced = 190; + chndl->highlight_other = 215; + chndl->highlight_blue_reduced = 255; result = init_2224 (chndl); } return result; @@ -2787,6 +2471,14 @@ void back2225 (int fd, unsigned char *buf) { size_t count; + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x2e; + +/* original: + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x2e; + ratio 320 decimal +*/ cp2155_set (fd, 0x90, 0xc8); cp2155_set (fd, 0x90, 0xc8); cp2155_set (fd, 0xb0, 0x03); @@ -2803,7 +2495,7 @@ back2225 (int fd, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x2e); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0x00); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -2861,114 +2553,21 @@ back2225 (int fd, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, 0x00); cp2155_set (fd, 0x68, 0x06); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x83); - cp2155_set (fd, 0x14, 0x7c); - cp2155_set (fd, 0x17, 0x02); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x28); - cp2155_set (fd, 0x33, 0x28); - cp2155_set (fd, 0x24, 0x27); - cp2155_set (fd, 0x34, 0x27); - cp2155_set (fd, 0x25, 0x25); - cp2155_set (fd, 0x35, 0x25); - cp2155_set (fd, 0x26, 0x21); - cp2155_set (fd, 0x36, 0x21); - cp2155_set (fd, 0x27, 0x1c); - cp2155_set (fd, 0x37, 0x1c); - cp2155_set (fd, 0x28, 0x16); - cp2155_set (fd, 0x38, 0x16); - cp2155_set (fd, 0x29, 0x0f); - cp2155_set (fd, 0x39, 0x0f); - cp2155_set (fd, 0x2a, 0x08); - cp2155_set (fd, 0x3a, 0x08); - cp2155_set (fd, 0x2b, 0x00); - cp2155_set (fd, 0x3b, 0x00); - cp2155_set (fd, 0x2c, 0x08); - cp2155_set (fd, 0x3c, 0x08); - cp2155_set (fd, 0x2d, 0x0f); - cp2155_set (fd, 0x3d, 0x0f); - cp2155_set (fd, 0x2e, 0x16); - cp2155_set (fd, 0x3e, 0x16); - cp2155_set (fd, 0x2f, 0x1c); - cp2155_set (fd, 0x3f, 0x1c); - cp2155_set (fd, 0x30, 0x21); - cp2155_set (fd, 0x40, 0x21); - cp2155_set (fd, 0x31, 0x25); - cp2155_set (fd, 0x41, 0x25); - cp2155_set (fd, 0x32, 0x27); - cp2155_set (fd, 0x42, 0x27); - cp2155_set (fd, 0xca, 0x02); - cp2155_set (fd, 0xca, 0x02); - cp2155_set (fd, 0xca, 0x22); + + memcpy (buf, "\x28\x27\x25\x21\x1c\x16\x0f\x08\x00", 9); + register_table (fd, 0, buf); cp2155_set (fd, 0x18, 0x00); - memcpy (buf + 0x00000000, - "\x04\x70\x00\x01\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000010, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000020, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000030, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000040, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000050, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000060, - "\x80\x25\x80\x25\x80\x25\x80\x25\x80\x25\xf0\x23\x80\x22\x2c\x21", - 16); - memcpy (buf + 0x00000070, - "\xf1\x1f\xcd\x1e\xbd\x1d\xc0\x1c\xd2\x1b\xf4\x1a\x22\x1a\x5e\x19", - 16); - memcpy (buf + 0x00000080, - "\xa4\x18\xf5\x17\x4f\x17\xb2\x16\x1d\x16\x90\x15\x09\x15\x89\x14", - 16); - memcpy (buf + 0x00000090, - "\x0e\x14\x9a\x13\x2a\x13\xc0\x12\x59\x12\xf8\x11\x9a\x11\x3f\x11", - 16); - memcpy (buf + 0x000000a0, - "\xe9\x10\x96\x10\x46\x10\xf8\x0f\xae\x0f\x66\x0f\x21\x0f\xde\x0e", - 16); - memcpy (buf + 0x000000b0, - "\x9e\x0e\x60\x0e\x23\x0e\xe9\x0d\xb0\x0d\x7a\x0d\x44\x0d\x11\x0d", - 16); - memcpy (buf + 0x000000c0, - "\xdf\x0c\xaf\x0c\x80\x0c\x52\x0c\x25\x0c\xfa\x0b\xd0\x0b\xa7\x0b", - 16); - memcpy (buf + 0x000000d0, - "\x80\x0b\x59\x0b\x33\x0b\x0e\x0b\xea\x0a\xc8\x0a\xa5\x0a\x84\x0a", - 16); - memcpy (buf + 0x000000e0, - "\x64\x0a\x44\x0a\x25\x0a\x07\x0a\xe9\x09\xcd\x09\xb0\x09\x95\x09", - 16); - memcpy (buf + 0x000000f0, - "\x7a\x09\x60\x09\x46\x09\x2c\x09\x14\x09\xfc\x08\xe4\x08\xcd\x08", - 16); - memcpy (buf + 0x00000100, "\xb6\x08\xa0\x08", 4); count = 260; + make_slope_table (count, top_value, 0x6a, 0.021739, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x80\x25\xc0\x1c\x4f\x17\x9a\x13\xe9\x10\xde\x0e", - 16); - memcpy (buf + 0x00000010, - "\x44\x0d\xfa\x0b\xea\x0a\x07\x0a\x46\x09\xa0\x08\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000020, "\x80\x25\x80\x25", 4); count = 36; + make_slope_table (count, top_value, 0x06, 0.15217, buf); + write_buf (fd, count, buf, 0x03, 0x04); write_buf (fd, count, buf, 0x03, 0x08); @@ -2985,10 +2584,18 @@ back2224 (int fd, unsigned char *buf) { size_t count; -/* cp2155_set (fd, 0x90, 0xe8); */ + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x2e; + +/* original: + unsigned int top_value = 0x2580; + unsigned char value_62 = 0x2e; + ratio 320 decimal +*/ + cp2155_set (fd, 0x90, 0xe8); cp2155_set (fd, 0x9b, 0x06); cp2155_set (fd, 0x9b, 0x04); -/* cp2155_set (fd, 0x90, 0xf8); */ + cp2155_set (fd, 0x90, 0xf8); cp2155_set (fd, 0xb0, 0x03); cp2155_set (fd, 0x07, 0x00); cp2155_set (fd, 0x07, 0x00); @@ -3003,7 +2610,7 @@ back2224 (int fd, unsigned char *buf) cp2155_set (fd, 0x64, 0x00); cp2155_set (fd, 0x65, 0x00); cp2155_set (fd, 0x61, 0x00); - cp2155_set (fd, 0x62, 0x2e); + cp2155_set (fd, 0x62, value_62); cp2155_set (fd, 0x63, 0x00); cp2155_set (fd, 0x50, 0x04); cp2155_set (fd, 0x50, 0x04); @@ -3062,162 +2669,20 @@ back2224 (int fd, unsigned char *buf) cp2155_set (fd, 0x66, 0x00); cp2155_set (fd, 0x67, 0x00); cp2155_set (fd, 0x68, 0x06); - cp2155_set (fd, 0x1a, 0x00); - cp2155_set (fd, 0x1b, 0x00); - cp2155_set (fd, 0x1c, 0x02); - cp2155_set (fd, 0x15, 0x83); - cp2155_set (fd, 0x14, 0x7c); - cp2155_set (fd, 0x17, 0x02); - cp2155_set (fd, 0x43, 0x1c); - cp2155_set (fd, 0x44, 0x9c); - cp2155_set (fd, 0x45, 0x38); - cp2155_set (fd, 0x23, 0x0d); - cp2155_set (fd, 0x33, 0x0d); - cp2155_set (fd, 0x24, 0x0d); - cp2155_set (fd, 0x34, 0x0d); - cp2155_set (fd, 0x25, 0x0d); - cp2155_set (fd, 0x35, 0x0d); - cp2155_set (fd, 0x26, 0x0d); - cp2155_set (fd, 0x36, 0x0d); - cp2155_set (fd, 0x27, 0x0d); - cp2155_set (fd, 0x37, 0x0d); - cp2155_set (fd, 0x28, 0x0d); - cp2155_set (fd, 0x38, 0x0d); - cp2155_set (fd, 0x29, 0x0d); - cp2155_set (fd, 0x39, 0x0d); - cp2155_set (fd, 0x2a, 0x0d); - cp2155_set (fd, 0x3a, 0x0d); - cp2155_set (fd, 0x2b, 0x0d); - cp2155_set (fd, 0x3b, 0x0d); - cp2155_set (fd, 0x2c, 0x0d); - cp2155_set (fd, 0x3c, 0x0d); - cp2155_set (fd, 0x2d, 0x0d); - cp2155_set (fd, 0x3d, 0x0d); - cp2155_set (fd, 0x2e, 0x0d); - cp2155_set (fd, 0x3e, 0x0d); - cp2155_set (fd, 0x2f, 0x0d); - cp2155_set (fd, 0x3f, 0x0d); - cp2155_set (fd, 0x30, 0x0d); - cp2155_set (fd, 0x40, 0x0d); - cp2155_set (fd, 0x31, 0x0d); - cp2155_set (fd, 0x41, 0x0d); - cp2155_set (fd, 0x32, 0x0d); - cp2155_set (fd, 0x42, 0x0d); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); - cp2155_set (fd, 0xca, 0x00); + + register_table (fd, 0x0d, buf); cp2155_set (fd, 0x18, 0x00); - memcpy (buf + 0x0000, - "\x04\x70\xf4\x01\x80\x25\x00\x25\x84\x24\x0b\x24\x96\x23\x23\x23", - 16); - memcpy (buf + 0x0010, - "\xb3\x22\x46\x22\xdb\x21\x73\x21\x0e\x21\xab\x20\x4a\x20\xeb\x1f", - 16); - memcpy (buf + 0x0020, - "\x8f\x1f\x34\x1f\xdc\x1e\x85\x1e\x31\x1e\xde\x1d\x8d\x1d\x3e\x1d", - 16); - memcpy (buf + 0x0030, - "\xf0\x1c\xa4\x1c\x59\x1c\x10\x1c\xc9\x1b\x83\x1b\x3e\x1b\xfa\x1a", - 16); - memcpy (buf + 0x0040, - "\xb8\x1a\x77\x1a\x38\x1a\xf9\x19\xbc\x19\x80\x19\x44\x19\x0a\x19", - 16); - memcpy (buf + 0x0050, - "\xd1\x18\x99\x18\x62\x18\x2c\x18\xf7\x17\xc3\x17\x8f\x17\x5d\x17", - 16); - memcpy (buf + 0x0060, - "\x2b\x17\xfa\x16\xca\x16\x9b\x16\x6c\x16\x3e\x16\x11\x16\xe5\x15", - 16); - memcpy (buf + 0x0070, - "\xb9\x15\x8e\x15\x64\x15\x3a\x15\x11\x15\xe9\x14\xc1\x14\x9a\x14", - 16); - memcpy (buf + 0x0080, - "\x73\x14\x4d\x14\x27\x14\x02\x14\xde\x13\xba\x13\x96\x13\x74\x13", - 16); - memcpy (buf + 0x0090, - "\x51\x13\x2f\x13\x0d\x13\xec\x12\xcc\x12\xab\x12\x8c\x12\x6c\x12", - 16); - memcpy (buf + 0x00a0, - "\x4d\x12\x2f\x12\x11\x12\xf3\x11\xd5\x11\xb8\x11\x9c\x11\x80\x11", - 16); - memcpy (buf + 0x00b0, - "\x64\x11\x48\x11\x2d\x11\x12\x11\xf7\x10\xdd\x10\xc3\x10\xa9\x10", - 16); - memcpy (buf + 0x00c0, - "\x90\x10\x77\x10\x5e\x10\x46\x10\x2e\x10\x16\x10\xfe\x0f\xe7\x0f", - 16); - memcpy (buf + 0x00d0, - "\xd0\x0f\xb9\x0f\xa2\x0f\x8c\x0f\x76\x0f\x60\x0f\x4b\x0f\x35\x0f", - 16); - memcpy (buf + 0x00e0, - "\x20\x0f\x0b\x0f\xf7\x0e\xe2\x0e\xce\x0e\xba\x0e\xa6\x0e\x92\x0e", - 16); - memcpy (buf + 0x00f0, - "\x7f\x0e\x6c\x0e\x59\x0e\x46\x0e\x33\x0e\x21\x0e\x0f\x0e\xfd\x0d", - 16); - memcpy (buf + 0x0100, - "\xeb\x0d\xd9\x0d\xc8\x0d\xb6\x0d\xa5\x0d\x94\x0d\x83\x0d\x73\x0d", - 16); - memcpy (buf + 0x0110, - "\x62\x0d\x52\x0d\x41\x0d\x31\x0d\x22\x0d\x12\x0d\x02\x0d\xf3\x0c", - 16); - memcpy (buf + 0x0120, - "\xe3\x0c\xd4\x0c\xc5\x0c\xb6\x0c\xa7\x0c\x99\x0c\x8a\x0c\x7c\x0c", - 16); - memcpy (buf + 0x0130, - "\x6e\x0c\x60\x0c\x52\x0c\x44\x0c\x36\x0c\x28\x0c\x1b\x0c\x0d\x0c", - 16); - memcpy (buf + 0x0140, - "\x00\x0c\xf3\x0b\xe6\x0b\xd9\x0b\xcc\x0b\xbf\x0b\xb3\x0b\xa6\x0b", - 16); - memcpy (buf + 0x0150, - "\x9a\x0b\x8e\x0b\x81\x0b\x75\x0b\x69\x0b\x5d\x0b\x52\x0b\x46\x0b", - 16); - memcpy (buf + 0x0160, - "\x3a\x0b\x2f\x0b\x23\x0b\x18\x0b\x0d\x0b\x02\x0b\xf6\x0a\xeb\x0a", - 16); - memcpy (buf + 0x0170, - "\xe1\x0a\xd6\x0a\xcb\x0a\xc0\x0a\xb6\x0a\xab\x0a\xa1\x0a\x97\x0a", - 16); - memcpy (buf + 0x0180, - "\x8c\x0a\x82\x0a\x78\x0a\x6e\x0a\x64\x0a\x5a\x0a\x50\x0a\x47\x0a", - 16); - memcpy (buf + 0x0190, - "\x3d\x0a\x33\x0a\x2a\x0a\x20\x0a\x17\x0a\x0e\x0a\x04\x0a\xfb\x09", - 16); - memcpy (buf + 0x01a0, - "\xf2\x09\xe9\x09\xe0\x09\xd7\x09\xce\x09\xc6\x09\xbd\x09\xb4\x09", - 16); - memcpy (buf + 0x01b0, - "\xab\x09\xa3\x09\x9a\x09\x92\x09\x8a\x09\x81\x09\x79\x09\x71\x09", - 16); - memcpy (buf + 0x01c0, - "\x69\x09\x61\x09\x59\x09\x51\x09\x49\x09\x41\x09\x39\x09\x31\x09", - 16); - memcpy (buf + 0x01d0, - "\x29\x09\x22\x09\x1a\x09\x12\x09\x0b\x09\x03\x09\xfc\x08\xf5\x08", - 16); - memcpy (buf + 0x01e0, - "\xed\x08\xe6\x08\xdf\x08\xd8\x08\xd0\x08\xc9\x08\xc2\x08\xbb\x08", - 16); - memcpy (buf + 0x01f0, - "\xb4\x08\xad\x08\xa6\x08\xa0\x08\x00\x00\x00\x00\x00\x00\x00\x00", - 16); - memcpy (buf + 0x0200, "\x00\x00\x00\x00", 4); count = 516; + make_slope_table (count, top_value, 0x06, 0.0067225, buf); + write_buf (fd, count, buf, 0x03, 0x00); write_buf (fd, count, buf, 0x03, 0x02); write_buf (fd, count, buf, 0x03, 0x06); - memcpy (buf + 0x00000000, - "\x04\x70\x18\x00\x80\x25\xc0\x1c\x4f\x17\x9a\x13\xe9\x10\xde\x0e", - 16); - memcpy (buf + 0x00000010, - "\x44\x0d\xfa\x0b\xea\x0a\x07\x0a\x46\x09\xa0\x08\x80\x25\x80\x25", - 16); - memcpy (buf + 0x00000020, "\x80\x25\x80\x25", 4); count = 36; + make_slope_table (count, top_value, 0x06, 0.15217, buf); + write_buf (fd, count, buf, 0x03, 0x04); write_buf (fd, count, buf, 0x03, 0x08); @@ -3281,14 +2746,6 @@ go_home (CANON_Handle * chndl) return 0; } - -/* Scanner init, called at calibration and scan time. - Returns: - 1 if this was the first time the scanner was plugged in, - 0 afterward, and - -1 on error. */ - - /* Scan and save the resulting image as r,g,b non-interleaved PPM file */ static SANE_Status preread (CANON_Handle * chndl, SANE_Byte * data, FILE * fp) @@ -3487,7 +2944,27 @@ do_scan (CANON_Handle * chndl) case 1200: if (chndl->productcode == 0x2224) { - left_edge = 0x1e3; + left_edge = 0x1b2; + } + else + { + left_edge = 0x87; + } + break; + case 2400: + if (chndl->productcode == 0x2224) + { + left_edge = 0x287; /* 0x2eb; */ + } + else + { + left_edge = 0x87; + } + break; + case 4800: + if (chndl->productcode == 0x2224) + { + left_edge = 0x2e3; /* should be adjusted; 0x23e; 0x2eb; */ } else { @@ -3533,14 +3010,14 @@ do_scan (CANON_Handle * chndl) } /* Scan sequence */ -/* resolution is 75,150,300,600,1200 +/* resolution is 75,150,300,600,1200,2400,4800 scan coordinates in 600-dpi pixels */ static SANE_Status scan (CANON_Handle * chndl) { SANE_Status status = SANE_STATUS_GOOD; - /* Resolution: dpi 75, 150, 300, 600, 1200 */ + /* Resolution: dpi 75, 150, 300, 600, 1200, 2400, 4800 */ switch (chndl->val[opt_resolution].w) { case 75: @@ -3548,6 +3025,8 @@ scan (CANON_Handle * chndl) case 300: case 600: case 1200: + case 2400: + case 4800: break; default: chndl->val[opt_resolution].w = 600; @@ -3584,11 +3063,15 @@ CANON_set_scan_parameters (CANON_Handle * chndl) int widthi; int heighti; - int top_edge = 7; + int top_edge = 7; /* in mm */ if (chndl->val[opt_resolution].w < 300) { top_edge = 0; } + if (chndl->val[opt_resolution].w == 300 && chndl->productcode == 0x2224) + { + top_edge = 0; + } left = SANE_UNFIX (chndl->val[opt_tl_x].w) / MM_IN_INCH * 600; top = (top_edge + SANE_UNFIX (chndl->val[opt_tl_y].w)) / MM_IN_INCH * 600; @@ -3633,7 +3116,9 @@ CANON_set_scan_parameters (CANON_Handle * chndl) (chndl->val[opt_resolution].w != 150) && (chndl->val[opt_resolution].w != 300) && (chndl->val[opt_resolution].w != 600) && - (chndl->val[opt_resolution].w != 1200)) + (chndl->val[opt_resolution].w != 1200) && + (chndl->val[opt_resolution].w != 2400) && + (chndl->val[opt_resolution].w != 4800)) { return SANE_STATUS_INVAL; } @@ -3789,7 +3274,7 @@ CANON_start_scan (CANON_Handle * chndl) return status; } - /* read the temp file back out */ + /* prepare for reading the temp file back out */ chndl->fp = fopen (chndl->fname, "r"); DBG (4, "reading %s\n", chndl->fname); diff --git a/backend/canon_lide70.c b/backend/canon_lide70.c index 8f18ed9..4cc8999 100644 --- a/backend/canon_lide70.c +++ b/backend/canon_lide70.c @@ -225,10 +225,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (2, "sane_init: version_code %s 0, authorize %s 0\n", version_code == 0 ? "=" : "!=", authorize == 0 ? "=" : "!="); DBG (1, "sane_init: SANE Canon LiDE70 backend version %d.%d.%d from %s\n", - V_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); if (version_code) - *version_code = SANE_VERSION_CODE (V_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); sanei_usb_init (); diff --git a/backend/canon_pp.c b/backend/canon_pp.c index 5a23892..b933102 100644 --- a/backend/canon_pp.c +++ b/backend/canon_pp.c @@ -147,7 +147,7 @@ sane_init (SANE_Int *vc, SANE_Auth_Callback cb) #endif if(vc) - *vc = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *vc = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); DBG(2,"sane_init: >> ieee1284_find_ports\n"); /* Find lp ports */ diff --git a/backend/cardscan.c b/backend/cardscan.c index 8090006..2adad7c 100644 --- a/backend/cardscan.c +++ b/backend/cardscan.c @@ -279,10 +279,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) sanei_usb_init(); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (5, "sane_init: cardscan backend %d.%d.%d, from %s\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); DBG (10, "sane_init: finish\n"); diff --git a/backend/coolscan.c b/backend/coolscan.c index a7760c3..e51b499 100644 --- a/backend/coolscan.c +++ b/backend/coolscan.c @@ -3244,7 +3244,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (10, "sane_init\n"); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (COOLSCAN_CONFIG_FILE); if (!fp) diff --git a/backend/coolscan2.c b/backend/coolscan2.c index 9b1f570..f0d897f 100644 --- a/backend/coolscan2.c +++ b/backend/coolscan2.c @@ -348,7 +348,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) if (version_code) *version_code = - SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); sanei_usb_init (); diff --git a/backend/coolscan3.c b/backend/coolscan3.c index 5bc5b5e..f279c9c 100644 --- a/backend/coolscan3.c +++ b/backend/coolscan3.c @@ -317,7 +317,7 @@ sane_init(SANE_Int * version_code, SANE_Auth_Callback authorize) authorize = authorize; /* to shut up compiler */ if (version_code) - *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); sanei_usb_init(); diff --git a/backend/dc210.c b/backend/dc210.c index f2d1ec3..b6eae40 100644 --- a/backend/dc210.c +++ b/backend/dc210.c @@ -663,7 +663,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG_INIT (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (DC210_CONFIG_FILE); diff --git a/backend/dc240.c b/backend/dc240.c index 47aeab9..bdab777 100644 --- a/backend/dc240.c +++ b/backend/dc240.c @@ -820,7 +820,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG_INIT (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (DC240_CONFIG_FILE); diff --git a/backend/dc25.c b/backend/dc25.c index 1d9032d..59597a5 100644 --- a/backend/dc25.c +++ b/backend/dc25.c @@ -1833,7 +1833,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG_INIT (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (DC25_CONFIG_FILE); diff --git a/backend/dell1600n_net.c b/backend/dell1600n_net.c index 2436dd4..41be589 100644 --- a/backend/dell1600n_net.c +++ b/backend/dell1600n_net.c @@ -86,7 +86,7 @@ #define MAX_SCANNERS 32 /* version number */ -#define DRIVER_VERSION SANE_VERSION_CODE( SANE_CURRENT_MAJOR, V_MINOR, 0 ) +#define DRIVER_VERSION SANE_VERSION_CODE( SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0 ) /* size of buffer for socket communication */ #define SOCK_BUF_SIZE 2048 diff --git a/backend/dmc.c b/backend/dmc.c index 5edb417..b1a3b5a 100644 --- a/backend/dmc.c +++ b/backend/dmc.c @@ -816,7 +816,7 @@ sane_init(SANE_Int *version_code, SANE_Auth_Callback authorize) DBG_INIT(); if (version_code) { - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); } fp = sanei_config_open(DMC_CONFIG_FILE); diff --git a/backend/epjitsu.c b/backend/epjitsu.c index 90ef148..6fda662 100644 --- a/backend/epjitsu.c +++ b/backend/epjitsu.c @@ -271,10 +271,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (10, "sane_init: start\n"); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (5, "sane_init: epjitsu backend %d.%d.%d, from %s\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); DBG (10, "sane_init: finish\n"); diff --git a/backend/epson.c b/backend/epson.c index 8c1a41d..d0f5e54 100644 --- a/backend/epson.c +++ b/backend/epson.c @@ -2663,7 +2663,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) #endif if (version_code != NULL) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, SANE_EPSON_BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, SANE_EPSON_BUILD); sanei_usb_init (); diff --git a/backend/epson2-io.c b/backend/epson2-io.c index 9d23e2a..293a825 100644 --- a/backend/epson2-io.c +++ b/backend/epson2-io.c @@ -77,7 +77,8 @@ e2_send(Epson_Scanner * s, void *buf, size_t buf_size, size_t reply_len, if (reply_len == 0) { DBG(0, "Cannot send this command to a networked scanner\n"); - return SANE_STATUS_INVAL; + *status = SANE_STATUS_INVAL; + return 0; /* nothing actually sent */ } return sanei_epson_net_write(s, 0x2000, buf, buf_size, reply_len, status); diff --git a/backend/epson2-ops.c b/backend/epson2-ops.c index 83a0169..faf0ffa 100644 --- a/backend/epson2-ops.c +++ b/backend/epson2-ops.c @@ -291,14 +291,14 @@ e2_dev_post_init(struct Epson_Device *dev) dev->need_reset_on_source_change = SANE_FALSE; if (e2_dev_model(dev, "ES-9000H") || e2_dev_model(dev, "GT-30000")) { - dev->cmd->set_focus_position = 0; + dev->focusSupport = SANE_FALSE; dev->cmd->feed = 0x19; } if (e2_dev_model(dev, "GT-8200") || e2_dev_model(dev, "Perfection1650") || e2_dev_model(dev, "Perfection1640") || e2_dev_model(dev, "GT-8700")) { + dev->focusSupport = SANE_FALSE; dev->cmd->feed = 0; - dev->cmd->set_focus_position = 0; dev->need_reset_on_source_change = SANE_TRUE; } @@ -588,7 +588,7 @@ e2_discover_capabilities(Epson_Scanner *s) /* ESC F, request status */ status = esci_request_status(s, &scanner_status); if (status != SANE_STATUS_GOOD) - return status;; + return status; /* set capabilities */ if (scanner_status & STATUS_OPTION) @@ -817,20 +817,17 @@ e2_discover_capabilities(Epson_Scanner *s) DBG(1, "maximum supported color depth: %d\n", dev->maxDepth); /* - * Check for "request focus position" command. If this command is - * supported, then the scanner does also support the "set focus - * position" command. - * XXX ??? + * We assume that setting focus is supported when we can get the focus. + * This assumption may be overridden in e2_dev_post_init() */ - if (esci_request_focus_position(s, &s->currentFocusPosition) == SANE_STATUS_GOOD) { - DBG(1, "setting focus is supported, current focus: %u\n", s->currentFocusPosition); + DBG(1, "getting focus is supported, current focus: %u\n", s->currentFocusPosition); dev->focusSupport = SANE_TRUE; s->opt[OPT_FOCUS_POS].cap &= ~SANE_CAP_INACTIVE; s->val[OPT_FOCUS_POS].w = s->currentFocusPosition; } else { - DBG(1, "setting focus is not supported\n"); + DBG(1, "getting focus is not supported\n"); dev->focusSupport = SANE_FALSE; s->opt[OPT_FOCUS_POS].cap |= SANE_CAP_INACTIVE; s->val[OPT_FOCUS_POS].w = FOCUS_ON_GLASS; /* just in case */ @@ -1596,7 +1593,7 @@ e2_check_adf(Epson_Scanner * s) status = esci_request_extended_status(s, &buf, NULL); if (status != SANE_STATUS_GOOD) - return status;; + return status; t = buf[1]; @@ -1649,11 +1646,23 @@ e2_start_ext_scan(Epson_Scanner * s) if (buf[0] != STX) return SANE_STATUS_INVAL; - if (buf[1] & 0x80) { + if (buf[1] & STATUS_FER) { DBG(1, "%s: fatal error\n", __func__); return SANE_STATUS_IO_ERROR; } + /* + * The 12000XL signals busy only with FS+G, all other status queries + * say non-busy. Probably because you can in deed communicate with the + * device, just scanning is not yet possible. I tried polling with FS+G + * every 5 seconds, but that made scary noises. So, bail out and let + * the user retry manually. + */ + if (buf[1] & STATUS_NOT_READY) { + DBG(1, "%s: device not ready\n", __func__); + return SANE_STATUS_DEVICE_BUSY; + } + s->ext_block_len = le32atoh(&buf[2]); s->ext_blocks = le32atoh(&buf[6]); s->ext_last_len = le32atoh(&buf[10]); diff --git a/backend/epson2.c b/backend/epson2.c index a15a620..5bb75d4 100644 --- a/backend/epson2.c +++ b/backend/epson2.c @@ -15,10 +15,6 @@ * published by the Free Software Foundation, version 2. */ -#define EPSON2_VERSION 1 -#define EPSON2_REVISION 0 -#define EPSON2_BUILD 124 - /* debugging levels: * * 127 e2_recv buffer @@ -900,16 +896,14 @@ 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, "epson2 backend, version %i.%i.%i\n", - EPSON2_VERSION, EPSON2_REVISION, EPSON2_BUILD); + DBG(1, "%s: version " VERSION "\n", __func__); - if (version_code != NULL) - *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, - EPSON2_BUILD); + /* Keep '124' as our build version. The arg is obsolete by now */ + if (version_code) + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 124); sanei_usb_init(); + sanei_usb_set_timeout(60 * 1000); return SANE_STATUS_GOOD; } diff --git a/backend/epson2_usb.c b/backend/epson2_usb.c index 3977ee3..8c850ab 100644 --- a/backend/epson2_usb.c +++ b/backend/epson2_usb.c @@ -5,184 +5,193 @@ /* 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 */ - 0x1116, /* XP-243 245 247 Series, XP-427 */ - 0x112, /* GT-9700F, Perfection 2450 PHOTO */ + 0x0101, /* GT-7000U, Perfection 636U */ + 0x0103, /* GT-6600U, Perfection 610 */ + 0x0104, /* GT-7600U, GT-7600UF, Perfection 1200U, Perfection 1200U PHOTO */ + 0x0105, /* Stylus Scan 2000 */ + 0x0106, /* Stylus Scan 2500 */ + 0x0107, /* ES-2000, Expression 1600 */ + 0x0109, /* ES-8500, Expression 1640XL */ + 0x010a, /* GT-8700, GT-8700F, Perfection 1640SU, Perfection 1640SU PHOTO */ + 0x010b, /* GT-7700U, Perfection 1240U */ + 0x010c, /* GT-6700U, Perfection 640U */ + 0x010e, /* ES-2200, Expression 1680 */ + 0x0110, /* GT-8200U, GT-8200UF, Perfection 1650, Perfection 1650 PHOTO */ + 0x0112, /* GT-9700F, Perfection 2450 PHOTO */ + 0x011b, /* GT-9300UF, Perfection 2400 PHOTO */ + 0x011c, /* GT-9800F, Perfection 3200 PHOTO */ + 0x011e, /* GT-8300UF, Perfection 1660 PHOTO */ + 0x0126, /* ES-7000H, GT-15000 */ + 0x0128, /* GT-X700, Perfection 4870 PHOTO */ + 0x0129, /* ES-10000G, Expression 10000XL */ + 0x012a, /* GT-X800, Perfection 4990 PHOTO */ + 0x012b, /* ES-H300, GT-2500 */ + 0x012c, /* GT-X900, Perfection V700 Photo, Perfection V750 Photo */ + 0x0135, /* GT-X970 */ + 0x0138, /* ES-H7200, GT-20000 */ + 0x014b, /* ES-G11000, Expression 11000XL */ + 0x0151, /* GT-X980, Perfection V800 Photo, Perfection V850 Pro */ + 0x015b, /* DS-G20000, Expression 12000XL */ + 0x0801, /* CC-600PX, Stylus CX5100, Stylus CX5200 */ + 0x0802, /* CC-570L, Stylus CX3100, Stylus CX3200 */ + 0x0805, /* Stylus CX6300, Stylus CX6400 */ + 0x0806, /* PM-A850, Stylus Photo RX600 */ + 0x0807, /* Stylus Photo RX500, Stylus Photo RX510 */ + 0x0808, /* Stylus CX5300, Stylus CX5400 */ + 0x080d, /* Stylus CX4500, Stylus CX4600 */ + 0x080e, /* PX-A550, Stylus CX3500, Stylus CX3600, Stylus CX3650 */ + 0x080f, /* Stylus Photo RX420, Stylus Photo RX425, Stylus Photo RX430 */ + 0x0810, /* PM-A900, Stylus Photo RX700 */ + 0x0811, /* PM-A870, Stylus Photo RX620, Stylus Photo RX630 */ + 0x0813, /* Stylus CX6500, Stylus CX6600 */ + 0x0814, /* PM-A700 */ + 0x0815, /* AcuLaser CX11, AcuLaser CX11NF, LP-A500 */ + 0x0817, /* LP-M5500, LP-M5500F */ + 0x0818, /* Stylus CX3700, Stylus CX3800, Stylus CX3810, Stylus DX3800 */ + 0x0819, /* PX-A650, Stylus CX4700, Stylus CX4800, Stylus DX4800, Stylus DX4850 */ + 0x081a, /* PM-A750, Stylus Photo RX520, Stylus Photo RX530 */ + 0x081c, /* PM-A890, Stylus Photo RX640, Stylus Photo RX650 */ + 0x081d, /* PM-A950 */ + 0x081f, /* Stylus CX7700, Stylus CX7800 */ + 0x0820, /* Stylus CX4100, Stylus CX4200, Stylus DX4200 */ + 0x0827, /* PM-A820, Stylus Photo RX560, Stylus Photo RX580, Stylus Photo RX590 */ + 0x0828, /* PM-A970 */ + 0x0829, /* PM-T990 */ + 0x082a, /* PM-A920 */ + 0x082b, /* Stylus CX4900, Stylus CX5000, Stylus DX5000 */ + 0x082e, /* PX-A720, Stylus CX5900, Stylus CX6000, Stylus DX6000 */ + 0x082f, /* PX-A620, Stylus CX3900, Stylus DX4000 */ + 0x0830, /* ME 200, Stylus CX2800, Stylus CX2900 */ + 0x0833, /* LP-M5600 */ + 0x0834, /* LP-M6000 */ + 0x0835, /* AcuLaser CX21 */ + 0x0836, /* PM-T960 */ + 0x0837, /* PM-A940, Stylus Photo RX680, Stylus Photo RX685, Stylus Photo RX690 */ + 0x0838, /* PX-A640, Stylus CX7300, Stylus CX7400, Stylus DX7400 */ + 0x0839, /* PX-A740, Stylus CX8300, Stylus CX8400, Stylus DX8400 */ + 0x083a, /* PX-FA700, Stylus CX9300F, Stylus CX9400Fax, Stylus DX9400F */ + 0x083c, /* PM-A840, PM-A840S, Stylus Photo RX585, Stylus Photo RX595, Stylus Photo RX610 */ + 0x0841, /* ME 300, PX-401A, Stylus NX100, Stylus SX100, Stylus TX100 */ + 0x0843, /* LP-M5000 */ + 0x0844, /* Artisan 800, EP-901A, EP-901F, Stylus Photo PX800FW, Stylus Photo TX800FW */ + 0x0846, /* Artisan 700, EP-801A, Stylus Photo PX700W, Stylus Photo TX700W */ + 0x0847, /* ME Office 700FW, PX-601F, Stylus Office BX600FW, Stylus Office TX600FW, Stylus SX600FW, WorkForce 600 */ + 0x0848, /* ME Office 600F, Stylus Office BX300F, Stylus Office TX300F, Stylus NX300 Series */ + 0x0849, /* Stylus NX200, Stylus SX200, Stylus SX205, Stylus TX200, Stylus TX203, Stylus TX209 */ + 0x084a, /* PX-501A, Stylus NX400, Stylus SX400, Stylus SX405, Stylus TX400 */ + 0x084c, /* WorkForce 500 */ + 0x084d, /* PX-402A, Stylus NX110 Series, Stylus SX110 Series, Stylus TX110 Series */ + 0x084f, /* ME OFFICE 510, Stylus NX210 Series, Stylus SX210 Series, Stylus TX210 Series */ + 0x0850, /* EP-702A, Stylus Photo PX650 Series, Stylus Photo TX650 Series */ + 0x0851, /* Stylus NX410 Series, Stylus SX410 Series, Stylus TX410 Series */ + 0x0852, /* Artisan 710 Series, EP-802A, Stylus Photo PX710W Series, Stylus Photo TX710W Series */ + 0x0853, /* Artisan 810 Series, EP-902A, Stylus Photo PX810FW Series */ + 0x0854, /* ME OFFICE 650FN Series, Stylus Office BX310FN Series, Stylus Office TX510FN Series, WorkForce 310 Series */ + 0x0855, /* PX-602F, Stylus Office BX610FW Series, Stylus Office TX610FW Series, Stylus SX610FW Series, WorkForce 610 Series */ + 0x0856, /* PX-502A, Stylus NX510 Series, Stylus SX510W Series, Stylus TX550W Series */ + 0x085c, /* ME 320 Series, ME 330 Series, Stylus NX125, Stylus NX127, Stylus SX125, Stylus TX120 Series */ + 0x085d, /* ME OFFICE 960FWD Series, PX-603F, Stylus Office BX625FWD, Stylus Office TX620FWD Series, Stylus SX620FW Series, WorkForce 630 Series */ + 0x085e, /* ME OFFICE 900WD Series, PX-503A, Stylus Office BX525WD, Stylus NX625, Stylus SX525WD, Stylus TX560WD Series, WorkForce 625 */ + 0x085f, /* Stylus Office BX320FW Series, Stylus Office TX525FW, WorkForce 520 Series */ + 0x0860, /* Artisan 835, EP-903A, EP-903F, Stylus Photo PX820FWD Series, Stylus Photo TX820FWD Series */ + 0x0861, /* Artisan 725, EP-803A, EP-803AW, Stylus Photo PX720WD Series, Stylus Photo TX720WD Series */ + 0x0862, /* EP-703A, Stylus Photo PX660 Series */ + 0x0863, /* ME OFFICE 620F Series, Stylus Office BX305F, Stylus Office BX305FW, Stylus Office TX320F Series, WorkForce 320 Series */ + 0x0864, /* ME OFFICE 560W Series, Stylus NX420 Series, Stylus SX420W Series, Stylus TX420W Series */ + 0x0865, /* ME OFFICE 520 Series, Stylus NX220 Series, Stylus SX218, Stylus TX220 Series */ + 0x0866, /* AcuLaser MX20DN, AcuLaser MX20DNF, AcuLaser MX21DNF */ + 0x0869, /* PX-1600F, WF-7510 Series */ + 0x086a, /* PX-673F, Stylus Office BX925FWD, WorkForce 840 Series */ + 0x0870, /* Stylus Office BX305FW Plus, WorkForce 435 */ + 0x0871, /* K200 Series */ + 0x0872, /* K300 Series, WorkForce K301 */ + 0x0873, /* L200 Series */ + 0x0878, /* Artisan 635, EP-704A */ + 0x0879, /* Artisan 837, EP-904A, EP-904F, Stylus Photo PX830FWD Series */ + 0x087b, /* Artisan 730 Series, EP-804A, EP-804AR, EP-804AW, Stylus Photo PX730WD Series, Stylus Photo TX730WD Series */ + 0x087c, /* PX-1700F, WF-7520 Series */ + 0x087d, /* PX-B750F, WP-4511, WP-4515, WP-4521, WP-4525, WP-4530 Series, WP-4540 Series */ + 0x087e, /* WP-4590 Series */ + 0x087f, /* PX-403A */ + 0x0880, /* ME OFFICE 570W Series, PX-434A, Stylus NX330 Series, Stylus SX430W Series, Stylus TX430W Series */ + 0x0881, /* ME OFFICE 535, PX-404A, Stylus SX230 Series, Stylus TX235 */ + 0x0883, /* ME 340 Series, Stylus NX130 Series, Stylus SX130 Series, Stylus TX130 Series */ + 0x0884, /* Stylus NX430W Series, Stylus SX440W Series, Stylus TX435W */ + 0x0885, /* Stylus NX230 Series, Stylus SX235W, Stylus TX230W Series */ + 0x088d, /* Epson ME 350 */ + 0x088f, /* Stylus Office BX635FWD, WorkForce 645 */ + 0x0890, /* ME OFFICE 940FW Series, Stylus Office BX630FW Series, WorkForce 545 */ + 0x0891, /* PX-504A, Stylus Office BX535WD, Stylus NX530 Series, Stylus NX635, Stylus SX535WD */ + 0x0892, /* Stylus Office BX935FWD, WorkForce 845 */ + 0x0893, /* EP-774A */ + 0x0894, /* LP-M5300 Series */ + 0x0895, /* PX-045A, XP-100 Series */ + 0x0896, /* ME-301, XP-200 Series */ + 0x0897, /* ME-303, PX-405A */ + 0x0898, /* ME-401, PX-435A, XP-300 Series, XP-400 Series */ + 0x0899, /* PX-605F, PX-675F, WF-3520 Series, WF-3530 Series, WF-3540 Series */ + 0x089a, /* EP-905F, XP-850 Series */ + 0x089b, /* EP-905A, XP-800 Series */ + 0x089c, /* EP-805A, EP-805AR, EP-805AW, XP-750 Series */ + 0x089d, /* XP-700 Series */ + 0x089e, /* EP-775A, EP-775AW, XP-600 Series */ + 0x089f, /* EP-705A */ + 0x08a0, /* ME-101 */ + 0x08a1, /* L210 Series, L350, L351 */ + 0x08a5, /* PX-505F, WF-2510 Series */ + 0x08a6, /* PX-535F, WF-2520 Series, WF-2530 Series, WF-2540 Series */ + 0x08a7, /* WP-M4525, WP-M4521, PX-K751F, WP-M4595 */ + 0x08a8, /* L355, L358 */ + 0x08a9, /* L550 Series */ + 0x08aa, /* M200 Series */ + 0x08ab, /* WF-M1560 Series */ + 0x08ac, /* AL-MX300DN Series, AL-MX300DNF Series */ + 0x08ad, /* LP-M8040, LP-M8040A, LP-M8040F */ + 0x08ae, /* PX-046A, XP-211, XP-212, XP-215 */ + 0x08af, /* PX-436A, XP-310 Series */ + 0x08b0, /* XP-410 Series */ + 0x08b3, /* EP-976A3, XP-950 Series */ + 0x08b4, /* EP-906F, XP-810 Series */ + 0x08b5, /* EP-806AB, EP-806AR, EP-806AW, XP-710 Series */ + 0x08b6, /* EP-776AB, EP-776AW, XP-610 Series */ + 0x08b7, /* EP-706A, XP-510 Series */ + 0x08b8, /* PX-M740F, PX-M741F, WF-3620 Series, WF-3640 Series */ + 0x08b9, /* PX-M5040F, PX-M5041F, WF-7610 Series, WF-7620 Series */ + 0x08bd, /* PX-M840F, WF-5620 Series, WF-5690 Series */ + 0x08be, /* WF-4630 Series, WF-4640 Series */ + 0x08bf, /* PX-437A, XP-320 Series */ + 0x08c0, /* PX-047A, XP-225 */ + 0x08c1, /* XP-420 Series */ + 0x08c3, /* PX-M650A, PX-M650F, WF-2650 Series, WF-2660 Series */ + 0x08c4, /* WF-2630 Series */ + 0x08c5, /* EP-977A3 */ + 0x08c6, /* EP-907F, XP-820 Series, XP-860 Series */ + 0x08c7, /* EP-807AB, EP-807AR, EP-807AW, XP-720 Series, XP-760 Series */ + 0x08c8, /* EP-777A, XP-520 Series, XP-620 Series */ + 0x08c9, /* EP-707A */ + 0x08ca, /* L850 Series */ + 0x08cd, /* WF-R4640 Series, WF-R5690 Series */ + 0x08d0, /* PX-M350F, WF-M5690 Series */ + 0x08d2, /* L365 Series, L366 Series */ + 0x1102, /* PX-048A Series, XP-230 Series, XP-235 Series */ + 0x1105, /* ET-2500 Series, L375 Series */ + 0x110f, /* PX-M160T Series */ + 0x1116, /* XP-240 243 245 247 Series, XP-427, PX-049A Series */ 0x1120, /* L380 */ 0x1121, /* ET-2650, L495 */ - 0x1122, /* ET-2600 */ + 0x1122, /* ET-2600 Series, ET-2610 Series, L3050 Series, L3060 Series, L395 Series, L396 Series */ 0x113d, /* XP-255 */ - 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 */ - 0x15b, /* DS-G20000, Expression 12000XL */ - 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>" */ + 0x113e, /* XP-452 455 Series */ + 0x1141, /* L3100 Series */ + 0x1142, /* L3110 Series */ + 0x1188, /* L3210 Series */ + 0x1189, /* L3200 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) +sanei_epson_getNumberOfUSBProductIds(void) { return sizeof (sanei_epson_usb_product_ids) / sizeof (SANE_Word); } diff --git a/backend/epsonds-cmd.c b/backend/epsonds-cmd.c index 5141e07..6f0ec64 100644 --- a/backend/epsonds-cmd.c +++ b/backend/epsonds-cmd.c @@ -134,6 +134,7 @@ static SANE_Status esci2_cmd(epsonds_scanner* s, SANE_Status status; unsigned int more; char header[13], rbuf[64]; /* add one more byte for header buffer to correct buffer overflow issue,*/ + char *buf; DBG(8, "%s: %4s len %lu, payload len: %lu\n", __func__, cmd, len, plen); @@ -151,6 +152,21 @@ static SANE_Status esci2_cmd(epsonds_scanner* s, // send RequestBlock, request immediate response if there's no payload status = eds_txrx(s, header, len, rbuf, (plen > 0) ? 0 : 64); + + /* pointer to the token's value */ + buf = rbuf + 12; + /* nrd / nrdBUSY */ + DBG(8, "buf = %s\n",buf); + if (strncmp("#nrd", buf, 4) == 0) { + buf += 4; + DBG(8, "buf = %s\n",buf); + if (strncmp("BUSY", buf, 4) == 0) { + DBG(8, "device busy\n"); + DBG(8, "SANE_STATUS:%d\n", SANE_STATUS_DEVICE_BUSY); + return SANE_STATUS_DEVICE_BUSY; + } + } + if (status != SANE_STATUS_GOOD) { return status; } @@ -227,6 +243,21 @@ SANE_Status esci2_fin(epsonds_scanner *s) DBG(5, "%s\n", __func__); status = esci2_cmd_simple(s, "FIN x0000000", NULL); + + for(int i = 0; i < 10; i++) { + + if(status == SANE_STATUS_DEVICE_BUSY || status == SANE_STATUS_IO_ERROR) { + status = esci2_cmd_simple(s, "FIN x0000000", NULL); + } + else { + DBG(1, "break\n"); + break; + } + DBG(1, "sleep(5)\n"); + sleep(5); + + } + s->locked = 0; return status; } @@ -264,13 +295,13 @@ static char *decode_binary(char *buf, int len) memcpy(tmp, buf, 4); tmp[4] = '\0'; - len -= 4; if (buf[0] != 'h') return NULL; hl = strtol(tmp + 1, NULL, 16); - if (hl > len) hl = len; + if (hl > len) + hl = len; if (hl) { char *v = malloc(hl + 1); @@ -313,9 +344,6 @@ 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; @@ -333,7 +361,6 @@ static SANE_Status info_cb(void *userdata, char *token, int len) s->hw->model = decode_string(value, len); 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) { @@ -421,6 +448,7 @@ static SANE_Status info_cb(void *userdata, char *token, int len) int max = decode_value(value + 4 + 8, 8); DBG(1, " ADF: area %dx%d @ 100dpi\n", min, max); + eds_set_adf_area(s->hw, min, max, 100); } if (strncmp("AMIN", value, 4) == 0) { @@ -437,11 +465,40 @@ static SANE_Status info_cb(void *userdata, char *token, int len) int max = decode_value(value + 4 + 8, 8); DBG(1, " ADF: max %dx%d @ 100dpi\n", min, max); + } + } + + + + + + + if (len == 16) { + + if (strncmp("AREA", value, 4) == 0) { + + int min = decode_value(value + 4, 4); + int max = decode_value(value + 4 + 4, 8); + + DBG(1, " ADF: area %dx%d @ 100dpi\n", min, max); eds_set_adf_area(s->hw, min, max, 100); } + + if (strncmp("AMAX", value, 4) == 0) { + + // d + int min = decode_value(value + 4, 4); + // i + int max = decode_value(value + 4 + 4, 8); + + DBG(1, " ADF: max %dx%d @ 100dpi\n", min, max); + } } + + + if (len == 12) { /* RESOi0000600 */ @@ -483,6 +540,22 @@ static SANE_Status info_cb(void *userdata, char *token, int len) } } + + if (len == 16) { + + /* AREAi0000850i0001400 */ + if (strncmp("AREA", value, 4) == 0) { + //d + int min = decode_value(value + 4, 4); + //i + int max = decode_value(value + 4 + 4, 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) { @@ -602,6 +675,7 @@ static SANE_Status capa_cb(void *userdata, char *token, int len) if (strncmp("ADFCRP ", token, 3 + 4) == 0) { DBG(1, " ADF: image cropping\n"); + s->hw->adf_has_crp = 1; } if (strncmp("ADFFAST", token, 3 + 4) == 0) { @@ -636,6 +710,23 @@ static SANE_Status capa_cb(void *userdata, char *token, int len) } } + + if (strncmp("COLLIST", token, 3 + 4) == 0) + { + char *p = token + 3 + 4; + int count = (len - 4); + int readBytes = 0; + s->hw->has_mono = 0; + while (readBytes < count) { + if (strncmp(p, "M001", 4) == 0) + { + s->hw->has_mono = 1; + } + readBytes+=4; + p+=4; + } + } + /* RSMRANGi0000050i0000600 */ if (strncmp("RSMRANG", token, 3 + 4) == 0) { @@ -659,17 +750,24 @@ static SANE_Status capa_cb(void *userdata, char *token, int len) char *p = token + 3 + 4; - if (p[0] == 'i') { - - int i; - int count = (len - 4) / 8; - for (i = 0; i < count; i++) { + int count = (len - 4); + int readBytes = 0; + while (readBytes < count) { + if(*p == 'i') + { eds_add_resolution(s->hw, decode_value(p, 8)); p += 8; + readBytes += 8; + }else if(*p == 'd') + { + eds_add_resolution(s->hw, decode_value(p, 4)); + p += 4; + readBytes +=4; + } } - } + } return SANE_STATUS_GOOD; @@ -684,16 +782,26 @@ SANE_Status esci2_capa(epsonds_scanner *s) 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); } + if (strncmp("ERR", token, 3) == 0) { + if (strncmp("ADF PE ", value, len) == 0) { + DBG(1, " PE : paper empty\n"); + return SANE_STATUS_NO_DOCS; + } + + if (strncmp("ADF OPN", value, len) == 0) { + DBG(1, " conver open\n"); + return SANE_STATUS_COVER_OPEN; + } + } + return SANE_STATUS_GOOD; } @@ -742,10 +850,10 @@ static SANE_Status para_cb(void *userdata, char *token, int len) return SANE_STATUS_GOOD; } -SANE_Status esci2_para(epsonds_scanner *s, char *parameters) +SANE_Status esci2_para(epsonds_scanner *s, char *parameters, int len) { DBG(8, "%s: %s\n", __func__, parameters); - return esci2_cmd(s, "PARAx0000000", 12, parameters, strlen(parameters), NULL, ¶_cb); + return esci2_cmd(s, "PARAx0000000", 12, parameters, len, NULL, ¶_cb); } SANE_Status esci2_mech(epsonds_scanner *s, char *parameters) @@ -784,12 +892,105 @@ static SANE_Status img_cb(void *userdata, char *token, int len) return SANE_STATUS_GOOD; } + if (len == 12 && strncmp("pst", token, 3) == 0) { + + s->dummy = decode_value(token + 3 + 4, 4); + + DBG(10, "%s: pst width: %d, height: %d, dummy: %d\n", + __func__, + decode_value(token + 3, 4), + decode_value(token + 3 + 4 + 4, 4), + s->dummy); + + return SANE_STATUS_GOOD; + } + + if (len == 16 && strncmp("pst", token, 3) == 0) { + + s->dummy = decode_value(token + 3 + 4, 4); + + DBG(10, "%s: pst width: %d, height: %d, dummy: %d\n", + __func__, + decode_value(token + 3, 4), + decode_value(token + 3 + 4 + 4, 8), + s->dummy); + + return SANE_STATUS_GOOD; + } + + if (len == 20 && strncmp("pst", token, 3) == 0) { + + s->dummy = decode_value(token + 3 + 8, 4); + + DBG(10, "%s: pst width: %d, height: %d, dummy: %d\n", + __func__, + decode_value(token + 3, 8), + decode_value(token + 3 + 8 + 4, 8), + s->dummy); + + return SANE_STATUS_GOOD; + } + + + // i0001696i0002347 if (len == 16 && strncmp("pen", token, 3) == 0) { DBG(10, "%s: page end\n", __func__); s->eof = 1; + if (s->isflatbedScan) + { + s->scanning = 0; + } + DBG(10, "%s: pen width: %d, height: %d, dummy: %d\n", + __func__, + decode_value(token + 3, 8), + decode_value(token + 3 + 8, 8), + s->dummy); + s->width_temp = decode_value(token + 3, 8); + s->height_temp = decode_value(token + 3 + 8, 8); return SANE_STATUS_EOF; } + // d696i0002347 + if (len == 12 && strncmp("pen", token, 3) == 0) { + DBG(10, "%s: page end\n", __func__); + s->eof = 1; + if (s->isflatbedScan) + { + s->scanning = 0; + } + + DBG(10, "%s: pen width: %d, height: %d, dummy: %d\n", + __func__, + decode_value(token + 3, 4), + decode_value(token + 3 + 4, 8), + s->dummy); + + s->width_temp = decode_value(token + 3, 4); + s->height_temp = decode_value(token + 3 + 4, 8); + return SANE_STATUS_EOF; + } + + // d696d2347 + if (len == 8 && strncmp("pen", token, 3) == 0) { + DBG(10, "%s: page end\n", __func__); + s->eof = 1; + if (s->isflatbedScan) + { + s->scanning = 0; + } + DBG(10, "%s: pen width: %d, height: %d, dummy: %d\n", + __func__, + decode_value(token + 3, 4), + decode_value(token + 3 + 4, 4), + s->dummy); + + s->width_temp = decode_value(token + 3, 4); + s->height_temp = decode_value(token + 3 + 4, 4); + + return SANE_STATUS_EOF; + } + + /* typIMGA or typIMGB */ if (len == 4 && strncmp("typ", token, 3) == 0) { @@ -807,6 +1008,7 @@ static SANE_Status img_cb(void *userdata, char *token, int len) char *cause = token + 3 + 4; /* OPN, PJ, PE, ERR, LTF, LOCK, DFED, DTCL, AUT, PERM */ s->scanning = 0; + s->scanEnd = 1; DBG(1, "%s: error on option %3.3s, cause %4.4s\n", __func__, option, cause); @@ -831,6 +1033,8 @@ static SANE_Status img_cb(void *userdata, char *token, int len) } if (len == 4 && strncmp("lftd000", token, 3 + 4) == 0) { + DBG(1, "%s:lft ok\n", __func__); + s->scanEnd = 1; s->scanning = 0; } @@ -846,6 +1050,8 @@ esci2_img(struct epsonds_scanner *s, SANE_Int *length) unsigned int more; ssize_t read; + DBG(15, "esci2_img start\n"); + *length = 0; if (s->canceling) @@ -856,6 +1062,7 @@ esci2_img(struct epsonds_scanner *s, SANE_Int *length) if (status != SANE_STATUS_GOOD) { return status; } + DBG(15, "request img OK\n"); /* receive DataHeaderBlock */ memset(s->buf, 0x00, 64); @@ -863,6 +1070,7 @@ esci2_img(struct epsonds_scanner *s, SANE_Int *length) if (status != SANE_STATUS_GOOD) { return status; } + DBG(15, "receive img OK\n"); /* check if we need to read any image data */ more = 0; @@ -873,6 +1081,17 @@ esci2_img(struct epsonds_scanner *s, SANE_Int *length) /* this handles eof and errors */ parse_status = esci2_parse_block((char *)s->buf + 12, 64 - 12, s, &img_cb); + if (s->backside) + { + s->width_back = s->width_temp; + s->height_back = s->height_temp; + }else{ + s->width_front = s->width_temp; + s->height_front = s->height_temp; + + } + + /* no more data? return using the status of the esci2_parse_block * call, which might hold other error conditions. */ @@ -884,7 +1103,6 @@ esci2_img(struct epsonds_scanner *s, SANE_Int *length) if (more > s->bsz) { return SANE_STATUS_IO_ERROR; } - /* ALWAYS read image data */ if (s->hw->connection == SANE_EPSONDS_NET) { epsonds_net_request_read(s, more); diff --git a/backend/epsonds-cmd.h b/backend/epsonds-cmd.h index 973609a..2bd19db 100644 --- a/backend/epsonds-cmd.h +++ b/backend/epsonds-cmd.h @@ -20,7 +20,7 @@ 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_para(epsonds_scanner *s, char *parameters, int len); 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) ; diff --git a/backend/epsonds-jpeg.c b/backend/epsonds-jpeg.c index 244f442..99ca53a 100644 --- a/backend/epsonds-jpeg.c +++ b/backend/epsonds-jpeg.c @@ -20,19 +20,39 @@ #include "epsonds.h" #include "epsonds-jpeg.h" #include "epsonds-ops.h" +#include <setjmp.h> -#define min(A,B) (((A)<(B)) ? (A) : (B)) +struct my_error_mgr { + struct jpeg_error_mgr pub; + jmp_buf setjmp_buffer; +}; + +typedef struct my_error_mgr * my_error_ptr; + + +METHODDEF(void) my_error_exit (j_common_ptr cinfo) +{ + + char buffer[JMSG_LENGTH_MAX]; + (*cinfo->err->format_message) (cinfo, buffer); + + DBG(10,"Jpeg decode error [%s]", buffer); +} + +LOCAL(struct jpeg_error_mgr *) jpeg_custom_error (struct my_error_mgr * err) +{ + + struct jpeg_error_mgr* pRet = jpeg_std_error(&(err->pub)); + err->pub.error_exit = my_error_exit; + + return pRet; +} typedef struct { struct jpeg_source_mgr pub; - - epsonds_scanner *s; JOCTET *buffer; - - SANE_Byte *linebuffer; - SANE_Int linebuffer_size; - SANE_Int linebuffer_index; + int length; } epsonds_src_mgr; @@ -50,22 +70,11 @@ 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; + src->pub.bytes_in_buffer = src->length; + DBG(18, "reading from ring buffer, %d left\n", src->length); return TRUE; } @@ -87,140 +96,140 @@ jpeg_skip_input_data(j_decompress_ptr cinfo, long 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) +void eds_decode_jpeg(epsonds_scanner*s, SANE_Byte *data, SANE_Int size, ring_buffer* ringBuffer, SANE_Int isBackSide, SANE_Int needToConvertBW) { - 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", + struct jpeg_decompress_struct jpeg_cinfo; + struct my_error_mgr jpeg_err; + + { + epsonds_src_mgr *src; + + jpeg_cinfo.err = jpeg_custom_error(&jpeg_err); + + jpeg_create_decompress(&jpeg_cinfo); + + jpeg_cinfo.src = (struct jpeg_source_mgr *)(*jpeg_cinfo.mem->alloc_small)((j_common_ptr)&jpeg_cinfo, + JPOOL_PERMANENT, sizeof(epsonds_src_mgr)); + + memset(jpeg_cinfo.src, 0x00, sizeof(epsonds_src_mgr)); +; + src = (epsonds_src_mgr *)jpeg_cinfo.src; + 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; + src->buffer = (JOCTET*)data; + src->length = size; + } + { + if (jpeg_read_header(&jpeg_cinfo, TRUE)) { + + if (jpeg_start_decompress(&jpeg_cinfo)) { + + DBG(10,"%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; + jpeg_cinfo.output_width, jpeg_cinfo.output_height, + jpeg_cinfo.output_components); + } + } + } + { + int sum = 0; + int bufSize = jpeg_cinfo.output_width * jpeg_cinfo.output_components; + + int monoBufSize = (jpeg_cinfo.output_width + 7)/8; + + JSAMPARRAY scanlines = (jpeg_cinfo.mem->alloc_sarray)((j_common_ptr)&jpeg_cinfo, JPOOL_IMAGE, bufSize, 1); + while (jpeg_cinfo.output_scanline < jpeg_cinfo.output_height) { + int l = jpeg_read_scanlines(&jpeg_cinfo, scanlines, 1); + if (l == 0) { + break; + } + sum += l; + + if (needToConvertBW) + { + SANE_Byte* bytes = scanlines[0]; + + SANE_Int imgPos = 0; + + for (int i = 0; i < monoBufSize; i++) + { + SANE_Byte outByte = 0; + + for(SANE_Int bitIndex = 0; bitIndex < 8 && imgPos < bufSize; bitIndex++) { + //DBG(10,"bytes[imgPos] = %d\n", bytes[imgPos]); + + if(bytes[imgPos] >= 110) { + SANE_Byte bit = 7 - (bitIndex % 8); + outByte |= (1<< bit); + } + imgPos += 1; + } + //DBG(10,"outByte = %d\n", outByte); + eds_ring_write(ringBuffer, &outByte, 1); + } + } + else + { + eds_ring_write(ringBuffer, scanlines[0], bufSize); + } + + // decode until valida data + if (isBackSide) + { + if (sum >= s->height_back) + { + break; + } + }else + { + if (sum >= s->height_front) + { + break; + } + } + } + DBG(10,"decodded lines = %d\n", sum); + + // abandon unncessary data + if ((JDIMENSION)sum < jpeg_cinfo.output_height) + { + // unncessary data + while(1) + { + int l = jpeg_read_scanlines(&jpeg_cinfo, scanlines, 1); + if (l == 0) + { + break; + } + } } - } 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; + // if not auto crop mode padding to lines + if (s->val[OPT_ADF_CRP].w == 0) + { + unsigned char* padding = malloc(s->params.bytes_per_line); + memset(padding, 255, s->params.bytes_per_line); + DBG(10,"padding data lines = %d to %d pa \n", sum, s->params.lines); + + while(sum < s->params.lines) + { + eds_ring_write(ringBuffer, padding, bufSize); + sum++; + } + + free(padding); + padding = NULL; + } + } + { + jpeg_finish_decompress(&jpeg_cinfo); + jpeg_destroy_decompress(&jpeg_cinfo); + } + return; } diff --git a/backend/epsonds-jpeg.h b/backend/epsonds-jpeg.h index a804dec..42f542d 100644 --- a/backend/epsonds-jpeg.h +++ b/backend/epsonds-jpeg.h @@ -10,8 +10,4 @@ * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation, version 2. */ - -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); +void eds_decode_jpeg(epsonds_scanner*s, SANE_Byte *data, SANE_Int size, ring_buffer* ringBuffer, SANE_Int isBackSide, SANE_Int needToConvertBW); diff --git a/backend/epsonds-net.c b/backend/epsonds-net.c index 3c8be29..4f4c1e2 100644 --- a/backend/epsonds-net.c +++ b/backend/epsonds-net.c @@ -32,10 +32,19 @@ #include "sane/sanei_debug.h" + static ssize_t epsonds_net_read_raw(epsonds_scanner *s, unsigned char *buf, ssize_t wanted, SANE_Status *status) { + DBG(15, "%s: wanted: %ld\n", __func__, wanted); + + if (wanted == 0) + { + *status = SANE_STATUS_GOOD; + return 0; + } + int ready; ssize_t read = -1; fd_set readable; @@ -284,3 +293,228 @@ epsonds_net_unlock(struct epsonds_scanner *s) /* epsonds_net_read(s, buf, 1, &status); */ return status; } +#if WITH_AVAHI + +#include <assert.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <avahi-client/lookup.h> +#include <avahi-common/error.h> +#include <avahi-common/simple-watch.h> +#include <sys/time.h> +#include <errno.h> + +static AvahiSimplePoll *simple_poll = NULL; + +static struct timeval borowseEndTime; + +static int resolvedCount = 0; +static int browsedCount = 0; +static int waitResolver = 0; + +typedef struct { + AvahiClient* client; + Device_Found_CallBack callBack; +}EDSAvahiUserData; + +static int my_avahi_simple_poll_loop(AvahiSimplePoll *s) { + struct timeval currentTime; + + for (;;) + { + int r = avahi_simple_poll_iterate(s, 1); + if (r != 0) + { + if (r >= 0 || errno != EINTR) + { + DBG(10, "my_avahi_simple_poll_loop end\n"); + return r; + } + } + + if (waitResolver) { + gettimeofday(¤tTime, NULL); + + if ((currentTime.tv_sec - borowseEndTime.tv_sec) >= 3) + { + avahi_simple_poll_quit(simple_poll); + DBG(10, "resolve timeout\n"); + return 0; + } + } + } +} + +static void +epsonds_resolve_callback(AvahiServiceResolver *r, AVAHI_GCC_UNUSED AvahiIfIndex interface, + AVAHI_GCC_UNUSED AvahiProtocol protocol, + AvahiResolverEvent event, const char *name, + const char *type, + const char *domain, + const char *host_name, + const AvahiAddress *address, uint16_t port, AvahiStringList *txt, + AvahiLookupResultFlags flags, + void *userdata) +{ + // unused parameter + (void)r; + (void)type; + (void)domain; + (void)host_name; + (void)port; + (void)flags; + EDSAvahiUserData* data = userdata; + char ipAddr[AVAHI_ADDRESS_STR_MAX]; + + DBG(10, "epsonds_searchDevices resolve_callback\n"); + + + resolvedCount++; + + switch (event) { + case AVAHI_RESOLVER_FAILURE: + break; + case AVAHI_RESOLVER_FOUND: + avahi_address_snprint(ipAddr, sizeof(ipAddr), address); + DBG(10, "epsonds_searchDevices name = %s \n", name); + if (strlen(name) > 7) + { + if (strncmp(name, "EPSON", 5) == 0) + { + while(txt != NULL) + { + char* text = (char*)avahi_string_list_get_text(txt); + DBG(10, "avahi string = %s\n", text); + + if (strlen(text) > 4 && strncmp(text, "mdl=", 4) == 0) + { + if (data->callBack) + { + data->callBack(&text[4], ipAddr); + break; + } + } + txt = avahi_string_list_get_next(txt); + } + + } + } + break; + } +} + +static void +browse_callback(AvahiServiceBrowser *b, AvahiIfIndex interface, + AvahiProtocol protocol, AvahiBrowserEvent event, + const char *name, const char *type, + const char *domain, + AvahiLookupResultFlags flags, + void* userdata) +{ + DBG(10, "browse_callback event = %d\n", event); + + //unused parameter + (void)b; + (void)flags; + + EDSAvahiUserData *data = userdata; + switch (event) { + case AVAHI_BROWSER_FAILURE: + avahi_simple_poll_quit(simple_poll); + return; + case AVAHI_BROWSER_NEW: + DBG(10, "browse_callback name = %s\n", name); + browsedCount++; + if (!(avahi_service_resolver_new(data->client, interface, protocol, name, + type, domain, + AVAHI_PROTO_UNSPEC, 0, + epsonds_resolve_callback, data))) + { + DBG(10, "avahi_service_resolver_new fails\n"); + break; + } + case AVAHI_BROWSER_REMOVE: + break; + case AVAHI_BROWSER_ALL_FOR_NOW: + DBG(10, "AVAHI_BROWSER_ALL_FOR_NOW\n"); + gettimeofday(&borowseEndTime, NULL); + + if (browsedCount > resolvedCount) + { + DBG(10, "WAIT RESOLVER\n"); + waitResolver = 1; + }else{ + DBG(10, "QUIT POLL\n"); + avahi_simple_poll_quit(simple_poll); + } + break; + case AVAHI_BROWSER_CACHE_EXHAUSTED: + DBG(10, "AVAHI_BROWSER_CACHE_EXHAUSTED\n"); + break; + } +} + +static void +client_callback(AvahiClient *c, AvahiClientState state, + AVAHI_GCC_UNUSED void *userdata) +{ + assert(c); + if (state == AVAHI_CLIENT_FAILURE) + avahi_simple_poll_quit(simple_poll); +} + +SANE_Status epsonds_searchDevices(Device_Found_CallBack deviceFoundCallBack) +{ + int result = SANE_STATUS_GOOD; + + AvahiClient *client = NULL; + AvahiServiceBrowser *sb = NULL; + + EDSAvahiUserData data; + + resolvedCount = 0; + browsedCount = 0; + waitResolver = 0; + + + int error = 0; + DBG(10, "epsonds_searchDevices\n"); + + if (!(simple_poll = avahi_simple_poll_new())) { + DBG(10, "avahi_simple_poll_new failed\n"); + result = SANE_STATUS_INVAL; + goto fail; + } + client = avahi_client_new(avahi_simple_poll_get(simple_poll), 0, + client_callback, NULL, &error); + if (!client) { + DBG(10, "avahi_client_new failed %s\n", avahi_strerror(error)); + result = SANE_STATUS_INVAL; + goto fail; + } + data.client = client; + data.callBack = deviceFoundCallBack; + + if (!(sb = avahi_service_browser_new(client, AVAHI_IF_UNSPEC, + AVAHI_PROTO_UNSPEC, "_scanner._tcp", + NULL, 0, browse_callback, &data))) { + DBG(10, "avahi_service_browser_new failed: %s\n", + avahi_strerror(avahi_client_errno(client))); + result = SANE_STATUS_INVAL; + goto fail; + } + my_avahi_simple_poll_loop(simple_poll); +fail: + if (sb) + avahi_service_browser_free(sb); + if (client) + avahi_client_free(client); + if (simple_poll) + avahi_simple_poll_free(simple_poll); + + DBG(10, "epsonds_searchDevices fin\n"); + + return result; +} +#endif diff --git a/backend/epsonds-net.h b/backend/epsonds-net.h index 107301b..2431c35 100644 --- a/backend/epsonds-net.h +++ b/backend/epsonds-net.h @@ -4,6 +4,8 @@ #include <sys/types.h> #include "../include/sane/sane.h" +typedef void (*Device_Found_CallBack) (const char* name, const char* ip); + extern ssize_t epsonds_net_read(struct epsonds_scanner *s, unsigned char *buf, ssize_t buf_size, SANE_Status *status); extern size_t epsonds_net_write(struct epsonds_scanner *s, unsigned int cmd, const unsigned char *buf, @@ -13,4 +15,8 @@ extern SANE_Status epsonds_net_lock(struct epsonds_scanner *s); extern SANE_Status epsonds_net_unlock(struct epsonds_scanner *s); extern SANE_Status epsonds_net_request_read(epsonds_scanner *s, size_t len); +#if WITH_AVAHI +extern SANE_Status epsonds_searchDevices(Device_Found_CallBack deviceFoundCallBack); +#endif + #endif diff --git a/backend/epsonds-ops.c b/backend/epsonds-ops.c index 8b9d115..56194c4 100644 --- a/backend/epsonds-ops.c +++ b/backend/epsonds-ops.c @@ -28,10 +28,9 @@ 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") +#define STRING_FLATBED SANE_I18N("Flatbed") +#define STRING_ADFFRONT SANE_I18N("ADF Front") +#define STRING_ADFDUPLEX SANE_I18N("ADF Duplex") extern SANE_String_Const source_list[]; @@ -53,10 +52,13 @@ eds_dev_post_init(struct epsonds_device *dev) DBG(10, "%s\n", __func__); if (dev->has_fb) - *source_list_add++ = FBF_STR; + *source_list_add++ = STRING_FLATBED; if (dev->has_adf) - *source_list_add++ = ADF_STR; + *source_list_add++ = STRING_ADFFRONT; + + if (dev->adf_is_duplex) + *source_list_add++ = STRING_ADFDUPLEX; if (source_list[0] == 0 || (dev->res_list[0] == 0 && dev->dpi_range.min == 0) @@ -209,8 +211,6 @@ eds_init_parameters(epsonds_scanner *s) memset(&s->params, 0, sizeof(SANE_Parameters)); - s->dummy = 0; - /* setup depth according to our mode table */ if (mode_params[s->val[OPT_MODE].w].depth == 1) s->params.depth = 1; @@ -314,6 +314,7 @@ eds_init_parameters(epsonds_scanner *s) return SANE_STATUS_GOOD; } +#define min(A,B) (((A)<(B)) ? (A) : (B)) void eds_copy_image_from_ring(epsonds_scanner *s, SANE_Byte *data, SANE_Int max_length, @@ -322,17 +323,13 @@ eds_copy_image_from_ring(epsonds_scanner *s, SANE_Byte *data, SANE_Int max_lengt 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; + lines = min(max_length / s->params.bytes_per_line, available / hw_line_size); - DBG(18, "copying %d lines (%d, %d)\n", lines, s->params.bytes_per_line, s->dummy); + DBG(18, "copying %d lines (%d, %d, %d)\n", lines, s->params.bytes_per_line, s->dummy, s->params.depth); /* need more data? */ if (lines == 0) { @@ -490,3 +487,12 @@ void eds_ring_flush(ring_buffer *ring) { eds_ring_skip(ring, ring->fill); } + +void eds_ring_destory(ring_buffer *ring) +{ + if (ring->ring) + { + free(ring->ring); + ring->ring = NULL; + } +} diff --git a/backend/epsonds-ops.h b/backend/epsonds-ops.h index fe503d6..108d544 100644 --- a/backend/epsonds-ops.h +++ b/backend/epsonds-ops.h @@ -38,3 +38,4 @@ 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) ; +extern void eds_ring_destory(ring_buffer *ring) ; diff --git a/backend/epsonds-usb.c b/backend/epsonds-usb.c index c7e514c..dacfd5f 100644 --- a/backend/epsonds-usb.c +++ b/backend/epsonds-usb.c @@ -12,22 +12,3 @@ */ #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 index 96c77b5..9baab70 100644 --- a/backend/epsonds-usb.h +++ b/backend/epsonds-usb.h @@ -18,7 +18,4 @@ #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 index 1d557c9..0815535 100644 --- a/backend/epsonds.c +++ b/backend/epsonds.c @@ -50,6 +50,7 @@ #include <sys/types.h> #include <sys/socket.h> #include <unistd.h> +#include <math.h> #include "sane/saneopts.h" #include "sane/sanei_config.h" @@ -64,7 +65,8 @@ #include "epsonds-jpeg.h" #include "epsonds-net.h" - +static SANE_Status +setvalue(SANE_Handle handle, SANE_Int option, void *value, SANE_Int *info); /* * Definition of the mode_param struct, that is used to * specify the valid parameters for the different scan modes. @@ -72,6 +74,1234 @@ * The depth variable gets updated when the bit depth is modified. */ + +static unsigned char LUT[][256] = +{ + {// 0 + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF + }, + { // 1 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03,0x04,0x06,0x07,0x09,0x0B,0x0D, + 0x10,0x12,0x14,0x17,0x19,0x1B,0x1E,0x20, + 0x22,0x24,0x26,0x28,0x2A,0x2C,0x2E,0x30, + 0x32,0x33,0x35,0x37,0x39,0x3B,0x3C,0x3E, + 0x40,0x41,0x43,0x45,0x46,0x48,0x4A,0x4B, + 0x4D,0x4F,0x50,0x52,0x53,0x55,0x57,0x58, + 0x5A,0x5B,0x5D,0x5E,0x60,0x61,0x63,0x64, + 0x66,0x67,0x69,0x6A,0x6C,0x6D,0x6F,0x70, + 0x71,0x73,0x74,0x76,0x77,0x79,0x7A,0x7B, + 0x7D,0x7E,0x7F,0x81,0x82,0x84,0x85,0x86, + 0x88,0x89,0x8A,0x8C,0x8D,0x8E,0x90,0x91, + 0x92,0x94,0x95,0x96,0x98,0x99,0x9A,0x9C, + 0x9D,0x9E,0xA0,0xA1,0xA2,0xA3,0xA5,0xA6, + 0xA7,0xA8,0xAA,0xAB,0xAC,0xAE,0xAF,0xB0, + 0xB1,0xB3,0xB4,0xB5,0xB6,0xB8,0xB9,0xBA, + 0xBB,0xBC,0xBE,0xBF,0xC0,0xC1,0xC3,0xC4, + 0xC5,0xC6,0xC7,0xC9,0xCA,0xCB,0xCC,0xCD, + 0xCF,0xD0,0xD1,0xD2,0xD3,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDC,0xDD,0xDE,0xDF,0xE0, + 0xE1,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9, + 0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF3, + 0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFB,0xFC, + 0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + }, + { // 2 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03,0x04,0x05,0x07,0x08,0x0A,0x0C, + 0x0E,0x10,0x12,0x14,0x16,0x16,0x19,0x1B, + 0x1D,0x1F,0x21,0x23,0x25,0x27,0x28,0x2A, + 0x2C,0x2E,0x30,0x32,0x33,0x35,0x37,0x39, + 0x3A,0x3C,0x3E,0x40,0x41,0x43,0x45,0x46, + 0x48,0x4A,0x4B,0x4D,0x4F,0x50,0x52,0x53, + 0x55,0x57,0x58,0x5A,0x5B,0x5D,0x5F,0x60, + 0x62,0x63,0x65,0x66,0x68,0x69,0x6B,0x6C, + 0x6E,0x6F,0x71,0x72,0x74,0x75,0x77,0x78, + 0x7A,0x7B,0x7D,0x7E,0x80,0x81,0x83,0x84, + 0x86,0x87,0x88,0x8A,0x8B,0x8D,0x8E,0x90, + 0x91,0x92,0x94,0x95,0x97,0x98,0x99,0x9B, + 0x9C,0x9E,0x9F,0xA0,0xA2,0xA3,0xA5,0xA7, + 0xA9,0xAA,0xAB,0xAD,0xAE,0xB0,0xB1,0xB2, + 0xB4,0xB5,0xB6,0xB8,0xB9,0xBA,0xBC,0xBD, + 0xBE,0xC0,0xC1,0xC2,0xC4,0xC5,0xC6,0xC8, + 0xC9,0xCA,0xCC,0xCD,0xCE,0xD0,0xD1,0xD2, + 0xD4,0xD5,0xD6,0xD7,0xD9,0xDA,0xDB,0xDD, + 0xDE,0xDF,0xE1,0xE2,0xE3,0xE4,0xE6,0xE7, + 0xE8,0xE9,0xEB,0xEC,0xED,0xEF,0xF0,0xF1, + 0xF2,0xF4,0xF5,0xF6,0xF7,0xF9,0xFA,0xFB, + 0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { // 3 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x07, + 0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14,0x16, + 0x18,0x1A,0x1C,0x1E,0x20,0x22,0x24,0x26, + 0x28,0x2A,0x2B,0x2D,0x2F,0x31,0x33,0x34, + 0x36,0x38,0x39,0x3B,0x3D,0x3E,0x40,0x42, + 0x43,0x45,0x47,0x48,0x4A,0x4B,0x4D,0x4F, + 0x50,0x52,0x53,0x55,0x56,0x58,0x59,0x5B, + 0x5D,0x5E,0x60,0x61,0x63,0x64,0x66,0x67, + 0x69,0x6A,0x6B,0x6D,0x6E,0x70,0x71,0x73, + 0x74,0x76,0x77,0x79,0x7A,0x7B,0x7D,0x7E, + 0x80,0x81,0x83,0x84,0x85,0x87,0x88,0x8A, + 0x8B,0x8C,0x8E,0x8F,0x90,0x92,0x93,0x95, + 0x96,0x97,0x99,0x9A,0x9B,0x9D,0x9E,0x9F, + 0xA1,0xA2,0xA3,0xA5,0xA6,0xA7,0xA9,0xAA, + 0xAB,0xAD,0xAE,0xAF,0xB1,0xB2,0xB3,0xB5, + 0xB6,0xB7,0xB9,0xBA,0xBB,0xBD,0xBE,0xBF, + 0xC0,0xC2,0xC3,0xC4,0xC6,0xC7,0xC8,0xC9, + 0xCB,0xCC,0xCD,0xCF,0xD0,0xD1,0xD2,0xD4, + 0xD5,0xD6,0xD7,0xD9,0xDA,0xDB,0xDC,0xDF, + 0xE0,0xE1,0xE3,0xE4,0xE5,0xE6,0xE8,0xE9, + 0xEA,0xEB,0xED,0xEE,0xEF,0xF0,0xF2,0xF3, + 0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFD, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { //4 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03, + 0x04,0x05,0x07,0x08,0x0A,0x0C,0x0E,0x10, + 0x12,0x14,0x16,0x18,0x1A,0x1C,0x1E,0x20, + 0x22,0x24,0x26,0x28,0x2A,0x2B,0x2D,0x2F, + 0x31,0x33,0x34,0x36,0x38,0x39,0x3B,0x3D, + 0x3E,0x40,0x42,0x43,0x45,0x47,0x48,0x4A, + 0x4B,0x4D,0x4F,0x50,0x52,0x53,0x55,0x56, + 0x58,0x59,0x5B,0x5D,0x5E,0x60,0x61,0x63, + 0x64,0x66,0x67,0x69,0x6A,0x6B,0x6D,0x6E, + 0x70,0x71,0x73,0x74,0x76,0x77,0x79,0x7A, + 0x7B,0x7D,0x7E,0x80,0x81,0x83,0x84,0x85, + 0x87,0x88,0x8A,0x8B,0x8C,0x8E,0x8F,0x90, + 0x92,0x93,0x95,0x96,0x97,0x99,0x9A,0x9B, + 0x9D,0x9E,0x9F,0xA1,0xA2,0xA3,0xA5,0xA6, + 0xA7,0xA9,0xAA,0xAB,0xAD,0xAE,0xAF,0xB1, + 0xB2,0xB3,0xB5,0xB6,0xB7,0xB9,0xBA,0xBB, + 0xBD,0xBE,0xBF,0xC0,0xC2,0xC3,0xC4,0xC6, + 0xC7,0xC8,0xC9,0xCB,0xCC,0xCD,0xCF,0xD0, + 0xD1,0xD2,0xD4,0xD5,0xD6,0xD7,0xD9,0xDA, + 0xDB,0xDC,0xDE,0xDF,0xE0,0xE1,0xE3,0xE5, + 0xE6,0xE8,0xE9,0xEA,0xEB,0xED,0xEE,0xEF, + 0xF0,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9, + 0xFA,0xFB,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { // 5 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0x05,0x07,0x08,0x0A, + 0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A, + 0x1C,0x1E,0x20,0x22,0x24,0x26,0x28,0x2A, + 0x2B,0x2D,0x2F,0x31,0x33,0x34,0x36,0x38, + 0x39,0x3B,0x3D,0x3E,0x40,0x42,0x43,0x45, + 0x47,0x48,0x4A,0x4B,0x4D,0x4F,0x50,0x52, + 0x53,0x55,0x56,0x58,0x59,0x5B,0x5D,0x5E, + 0x60,0x61,0x63,0x64,0x66,0x67,0x69,0x6A, + 0x6B,0x6D,0x6E,0x70,0x71,0x73,0x74,0x76, + 0x77,0x79,0x7A,0x7B,0x7D,0x7E,0x80,0x81, + 0x83,0x84,0x85,0x87,0x88,0x8A,0x8B,0x8C, + 0x8E,0x8F,0x90,0x92,0x93,0x95,0x96,0x97, + 0x99,0x9A,0x9B,0x9D,0x9E,0x9F,0xA1,0xA2, + 0xA3,0xA5,0xA6,0xA7,0xA9,0xAA,0xAB,0xAD, + 0xAE,0xAF,0xB1,0xB2,0xB3,0xB5,0xB6,0xB7, + 0xB9,0xBA,0xBB,0xBD,0xBE,0xBF,0xC0,0xC2, + 0xC3,0xC4,0xC6,0xC7,0xC8,0xC9,0xCB,0xCC, + 0xCD,0xCF,0xD0,0xD1,0xD2,0xD4,0xD5,0xD6, + 0xD7,0xD9,0xDA,0xDB,0xDC,0xDE,0xDF,0xE0, + 0xE3,0xE4,0xE5,0xE6,0xE8,0xE9,0xEA,0xEB, + 0xED,0xEE,0xEF,0xF0,0xF2,0xF3,0xF4,0xF5, + 0xF6,0xF8,0xF9,0xFA,0xFB,0xFD,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { // 6 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, + 0x03,0x04,0x05,0x07,0x08,0x0A,0x0C,0x0E, + 0x10,0x12,0x14,0x16,0x18,0x18,0x1A,0x1C, + 0x1E,0x20,0x22,0x24,0x26,0x27,0x29,0x2B, + 0x2C,0x2E,0x30,0x31,0x33,0x35,0x36,0x38, + 0x39,0x3B,0x3C,0x3E,0x40,0x41,0x43,0x44, + 0x45,0x47,0x48,0x4A,0x4B,0x4D,0x4E,0x50, + 0x51,0x52,0x54,0x55,0x56,0x58,0x59,0x5B, + 0x5C,0x5D,0x5F,0x60,0x61,0x63,0x64,0x65, + 0x67,0x68,0x69,0x6A,0x6C,0x6D,0x6E,0x70, + 0x71,0x72,0x73,0x75,0x76,0x77,0x78,0x7A, + 0x7B,0x7C,0x7D,0x7E,0x80,0x81,0x82,0x83, + 0x85,0x86,0x87,0x88,0x89,0x8A,0x8C,0x8D, + 0x8E,0x8F,0x90,0x92,0x93,0x94,0x95,0x96, + 0x97,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8, + 0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1, + 0xB2,0xB3,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA, + 0xBB,0xBC,0xBD,0xBE,0xBF,0xC0,0xC2,0xC4, + 0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC, + 0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD4,0xD5, + 0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD, + 0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5, + 0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED, + 0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5, + 0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { // 7 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, + 0x03,0x04,0x05,0x06,0x07,0x09,0x0B,0x0C, + 0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x1C, + 0x1E,0x20,0x21,0x23,0x25,0x27,0x28,0x2A, + 0x2C,0x2D,0x2F,0x31,0x32,0x34,0x36,0x37, + 0x39,0x3B,0x3C,0x3E,0x3F,0x41,0x42,0x44, + 0x45,0x47,0x48,0x4A,0x4B,0x4D,0x4E,0x50, + 0x51,0x53,0x54,0x56,0x57,0x59,0x5A,0x5C, + 0x5D,0x5F,0x60,0x61,0x63,0x64,0x66,0x67, + 0x68,0x6A,0x6B,0x6D,0x6E,0x6F,0x71,0x72, + 0x73,0x75,0x76,0x78,0x79,0x7A,0x7C,0x7D, + 0x7E,0x80,0x81,0x82,0x84,0x85,0x86,0x88, + 0x89,0x8A,0x8B,0x8D,0x8E,0x8F,0x91,0x92, + 0x93,0x95,0x96,0x97,0x98,0x9A,0x9B,0x9C, + 0x9E,0x9F,0xA0,0xA1,0xA3,0xA4,0xA5,0xA6, + 0xA8,0xA9,0xAA,0xAB,0xAD,0xAE,0xAF,0xB0, + 0xB2,0xB3,0xB4,0xB5,0xB7,0xB8,0xB9,0xBA, + 0xBC,0xBD,0xBE,0xBF,0xC0,0xC2,0xC3,0xC4, + 0xC5,0xC7,0xC8,0xC9,0xCA,0xCB,0xCD,0xCE, + 0xCF,0xD0,0xD1,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xE0,0xE1, + 0xE2,0xE3,0xE4,0xE6,0xE7,0xE8,0xE9,0xEA, + 0xEB,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3, + 0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFC,0xFD, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + } +}; + +static unsigned char LUT_R[][256] = +{ + { // 0 + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF + }, + { // 1 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03,0x04,0x06,0x07,0x09,0x0B,0x0D, + 0x10,0x12,0x14,0x17,0x19,0x1B,0x1E,0x20, + 0x22,0x24,0x26,0x28,0x2A,0x2C,0x2E,0x30, + 0x32,0x33,0x35,0x37,0x39,0x3B,0x3C,0x3E, + 0x40,0x41,0x43,0x45,0x46,0x48,0x4A,0x4B, + 0x4D,0x4F,0x50,0x52,0x53,0x55,0x57,0x58, + 0x5A,0x5B,0x5D,0x5E,0x60,0x61,0x63,0x64, + 0x66,0x67,0x69,0x6A,0x6C,0x6D,0x6F,0x70, + 0x71,0x73,0x74,0x76,0x77,0x79,0x7A,0x7B, + 0x7D,0x7E,0x7F,0x81,0x82,0x84,0x85,0x86, + 0x88,0x89,0x8A,0x8C,0x8D,0x8E,0x90,0x91, + 0x92,0x94,0x95,0x96,0x98,0x99,0x9A,0x9C, + 0x9D,0x9E,0xA0,0xA1,0xA2,0xA3,0xA5,0xA6, + 0xA7,0xA8,0xAA,0xAB,0xAC,0xAE,0xAF,0xB0, + 0xB1,0xB3,0xB4,0xB5,0xB6,0xB8,0xB9,0xBA, + 0xBB,0xBC,0xBE,0xBF,0xC0,0xC1,0xC3,0xC4, + 0xC5,0xC6,0xC7,0xC9,0xCA,0xCB,0xCC,0xCD, + 0xCF,0xD0,0xD1,0xD2,0xD3,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDC,0xDD,0xDE,0xDF,0xE0, + 0xE1,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9, + 0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF3, + 0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFB,0xFC, + 0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + }, + { // 2 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, + 0x03,0x04,0x05,0x07,0x08,0x0A,0x0C,0x0E, + 0x10,0x12,0x14,0x16,0x19,0x1B,0x1D,0x1F, + 0x21,0x23,0x25,0x27,0x28,0x2A,0x2C,0x2E, + 0x30,0x32,0x33,0x35,0x37,0x39,0x3A,0x3C, + 0x3E,0x40,0x41,0x43,0x45,0x46,0x48,0x4A, + 0x4B,0x4D,0x4F,0x50,0x52,0x53,0x55,0x57, + 0x58,0x5A,0x5B,0x5D,0x5F,0x60,0x62,0x63, + 0x65,0x66,0x68,0x69,0x6B,0x6C,0x6E,0x6F, + 0x71,0x72,0x74,0x75,0x77,0x78,0x7A,0x7B, + 0x7D,0x7E,0x80,0x81,0x83,0x84,0x86,0x87, + 0x88,0x8A,0x8B,0x8D,0x8E,0x90,0x91,0x92, + 0x94,0x95,0x97,0x98,0x99,0x9B,0x9C,0x9E, + 0x9F,0xA0,0xA2,0xA3,0xA5,0xA6,0xA7,0xA9, + 0xAA,0xAB,0xAD,0xAE,0xB0,0xB1,0xB2,0xB4, + 0xB5,0xB6,0xB8,0xB9,0xBA,0xBC,0xBD,0xBE, + 0xC0,0xC1,0xC2,0xC4,0xC5,0xC6,0xC8,0xC9, + 0xCA,0xCC,0xCD,0xCE,0xD0,0xD1,0xD2,0xD4, + 0xD5,0xD6,0xD7,0xD9,0xDA,0xDB,0xDD,0xDE, + 0xDF,0xE1,0xE2,0xE3,0xE4,0xE6,0xE7,0xE8, + 0xE9,0xEB,0xEC,0xED,0xEF,0xF0,0xF1,0xF2, + 0xF4,0xF5,0xF6,0xF7,0xF9,0xFA,0xFB,0xFC, + 0xFE,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0x05,0x07,0x08,0x0A, + 0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A, + 0x1C,0x1E,0x20,0x22,0x24,0x26,0x28,0x2A, + 0x2B,0x2D,0x2F,0x31,0x33,0x34,0x36,0x38, + 0x39,0x3B,0x3D,0x3E,0x40,0x42,0x43,0x45, + 0x47,0x48,0x4A,0x4B,0x4D,0x4F,0x50,0x52, + 0x53,0x55,0x56,0x58,0x59,0x5B,0x5D,0x5E, + 0x60,0x61,0x63,0x64,0x66,0x67,0x69,0x6A, + 0x6B,0x6D,0x6E,0x70,0x71,0x73,0x74,0x76, + 0x77,0x79,0x7A,0x7B,0x7D,0x7E,0x80,0x81, + 0x83,0x84,0x85,0x87,0x88,0x8A,0x8B,0x8C, + 0x8E,0x8F,0x90,0x92,0x93,0x95,0x96,0x97, + 0x99,0x9A,0x9B,0x9D,0x9E,0x9F,0xA1,0xA2, + 0xA3,0xA5,0xA6,0xA7,0xA9,0xAA,0xAB,0xAD, + 0xAE,0xAF,0xB1,0xB2,0xB3,0xB5,0xB6,0xB7, + 0xB9,0xBA,0xBB,0xBD,0xBE,0xBF,0xC0,0xC2, + 0xC3,0xC4,0xC6,0xC7,0xC8,0xC9,0xCB,0xCC, + 0xCD,0xCF,0xD0,0xD1,0xD2,0xD4,0xD5,0xD6, + 0xD7,0xD9,0xDA,0xDB,0xDC,0xDE,0xDF,0xE0, + 0xE1,0xE3,0xE4,0xE5,0xE5,0xE6,0xE8,0xE9, + 0xEA,0xEB,0xED,0xEE,0xEF,0xF0,0xF2,0xF3, + 0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFD, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x01,0x02,0x03,0x04,0x05, + 0x07,0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14, + 0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22,0x24, + 0x26,0x28,0x2A,0x2B,0x2D,0x2F,0x31,0x33, + 0x34,0x36,0x38,0x39,0x3B,0x3D,0x3E,0x40, + 0x42,0x43,0x45,0x47,0x48,0x4A,0x4B,0x4D, + 0x4F,0x50,0x52,0x53,0x55,0x56,0x58,0x59, + 0x5B,0x5D,0x5E,0x60,0x61,0x63,0x64,0x66, + 0x67,0x69,0x6A,0x6B,0x6D,0x6E,0x70,0x71, + 0x73,0x74,0x76,0x77,0x79,0x7A,0x7B,0x7D, + 0x7E,0x80,0x81,0x83,0x84,0x85,0x87,0x88, + 0x8A,0x8B,0x8C,0x8E,0x8F,0x90,0x92,0x93, + 0x95,0x96,0x97,0x99,0x9A,0x9B,0x9D,0x9E, + 0x9F,0xA1,0xA2,0xA3,0xA5,0xA6,0xA7,0xA9, + 0xAA,0xAB,0xAD,0xAE,0xAF,0xB1,0xB2,0xB3, + 0xB5,0xB6,0xB7,0xB9,0xBA,0xBB,0xBD,0xBE, + 0xBF,0xC0,0xC2,0xC3,0xC4,0xC6,0xC7,0xC8, + 0xC9,0xCB,0xCC,0xCD,0xCF,0xD0,0xD1,0xD2, + 0xD4,0xD5,0xD6,0xD7,0xD9,0xDA,0xDB,0xDC, + 0xDE,0xDF,0xE0,0xE1,0xE3,0xE4,0xE5,0xE6, + 0xE8,0xE9,0xEA,0xEB,0xEB,0xED,0xEE,0xEF, + 0xF0,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9, + 0xFA,0xFB,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, + 0x03,0x04,0x05,0x07,0x08,0x0A,0x0C,0x0E, + 0x10,0x12,0x14,0x16,0x18,0x1A,0x1C,0x1E, + 0x20,0x22,0x24,0x26,0x28,0x2A,0x2B,0x2D, + 0x2F,0x31,0x33,0x34,0x36,0x38,0x39,0x3B, + 0x3D,0x3E,0x40,0x42,0x43,0x45,0x47,0x48, + 0x4A,0x4B,0x4D,0x4F,0x50,0x52,0x53,0x55, + 0x56,0x58,0x59,0x5B,0x5D,0x5E,0x60,0x61, + 0x63,0x64,0x66,0x67,0x69,0x6A,0x6B,0x6D, + 0x6E,0x70,0x71,0x73,0x74,0x76,0x77,0x79, + 0x7A,0x7B,0x7D,0x7E,0x80,0x81,0x83,0x84, + 0x85,0x87,0x88,0x8A,0x8B,0x8C,0x8E,0x8F, + 0x90,0x92,0x93,0x95,0x96,0x97,0x99,0x9A, + 0x9B,0x9D,0x9E,0x9F,0xA1,0xA2,0xA3,0xA5, + 0xA6,0xA7,0xA9,0xAA,0xAB,0xAD,0xAE,0xAF, + 0xB1,0xB2,0xB3,0xB5,0xB6,0xB7,0xB9,0xBA, + 0xBB,0xBD,0xBE,0xBF,0xC0,0xC2,0xC3,0xC4, + 0xC6,0xC7,0xC8,0xC9,0xCB,0xCC,0xCD,0xCF, + 0xD0,0xD1,0xD2,0xD4,0xD5,0xD6,0xD7,0xD9, + 0xDA,0xDB,0xDC,0xDE,0xDF,0xE0,0xE1,0xE3, + 0xE4,0xE5,0xE6,0xE8,0xE9,0xEA,0xEB,0xED, + 0xEE,0xEF,0xF0,0xF2,0xF3,0xF4,0xF5,0xF6, + 0xF8,0xF9,0xFA,0xFB,0xFD,0xFE,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03,0x04,0x05,0x06,0x08,0x0A,0x0C, + 0x0E,0x10,0x12,0x14,0x16,0x19,0x1B,0x1D, + 0x1F,0x20,0x22,0x24,0x26,0x28,0x2A,0x2B, + 0x2D,0x2F,0x31,0x32,0x34,0x35,0x37,0x39, + 0x3A,0x3C,0x3D,0x3F,0x41,0x42,0x44,0x45, + 0x47,0x48,0x4A,0x4B,0x4D,0x4E,0x4F,0x51, + 0x52,0x54,0x55,0x57,0x58,0x59,0x5B,0x5C, + 0x5E,0x5F,0x60,0x62,0x63,0x64,0x66,0x67, + 0x68,0x6A,0x6B,0x6C,0x6E,0x6F,0x70,0x72, + 0x73,0x74,0x75,0x77,0x78,0x79,0x7B,0x7C, + 0x7D,0x7E,0x80,0x81,0x82,0x83,0x85,0x86, + 0x87,0x88,0x89,0x8B,0x8C,0x8D,0x8E,0x90, + 0x91,0x92,0x93,0x94,0x96,0x97,0x98,0x99, + 0x9A,0x9B,0x9D,0x9E,0x9F,0xA0,0xA1,0xA2, + 0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAB,0xAC, + 0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB4,0xB5, + 0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBD,0xBE, + 0xBF,0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD6,0xD7,0xD8, + 0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF,0xE0, + 0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xEA, + 0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2, + 0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA, + 0xFB,0xFC,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, + 0x03,0x04,0x05,0x06,0x07,0x09,0x0B,0x0C, + 0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x1C, + 0x1E,0x20,0x21,0x23,0x25,0x27,0x28,0x2A, + 0x2C,0x2D,0x2F,0x31,0x32,0x34,0x36,0x37, + 0x39,0x3B,0x3C,0x3E,0x3F,0x41,0x42,0x44, + 0x45,0x47,0x48,0x4A,0x4B,0x4D,0x4E,0x50, + 0x51,0x53,0x54,0x56,0x57,0x59,0x5A,0x5C, + 0x5D,0x5F,0x60,0x61,0x63,0x64,0x66,0x67, + 0x68,0x6A,0x6B,0x6D,0x6E,0x6F,0x71,0x72, + 0x73,0x75,0x76,0x78,0x79,0x7A,0x7C,0x7D, + 0x7E,0x80,0x81,0x82,0x84,0x85,0x86,0x88, + 0x89,0x8A,0x8B,0x8D,0x8E,0x8F,0x91,0x92, + 0x93,0x95,0x96,0x97,0x98,0x9A,0x9B,0x9C, + 0x9E,0x9F,0xA0,0xA1,0xA3,0xA4,0xA5,0xA6, + 0xA8,0xA9,0xAA,0xAB,0xAD,0xAE,0xAF,0xB0, + 0xB2,0xB3,0xB4,0xB5,0xB7,0xB8,0xB9,0xBA, + 0xBC,0xBD,0xBE,0xBF,0xC0,0xC2,0xC3,0xC4, + 0xC5,0xC7,0xC8,0xC9,0xCA,0xCB,0xCD,0xCE, + 0xCF,0xD0,0xD1,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xE0,0xE1, + 0xE2,0xE3,0xE4,0xE6,0xE7,0xE8,0xE9,0xEA, + 0xEB,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3, + 0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFC,0xFD, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + } +}; + +static unsigned char LUT_G[][256] = +{ + { + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03,0x04,0x06,0x07,0x09,0x0B,0x0D, + 0x10,0x12,0x14,0x17,0x19,0x1B,0x1E,0x20, + 0x22,0x24,0x26,0x28,0x2A,0x2C,0x2E,0x30, + 0x32,0x33,0x35,0x37,0x39,0x3B,0x3C,0x3E, + 0x40,0x41,0x43,0x45,0x46,0x48,0x4A,0x4B, + 0x4D,0x4F,0x50,0x52,0x53,0x55,0x57,0x58, + 0x5A,0x5B,0x5D,0x5E,0x60,0x61,0x63,0x64, + 0x66,0x67,0x69,0x6A,0x6C,0x6D,0x6F,0x70, + 0x71,0x73,0x74,0x76,0x77,0x79,0x7A,0x7B, + 0x7D,0x7E,0x7F,0x81,0x82,0x84,0x85,0x86, + 0x88,0x89,0x8A,0x8C,0x8D,0x8E,0x90,0x91, + 0x92,0x94,0x95,0x96,0x98,0x99,0x9A,0x9C, + 0x9D,0x9E,0xA0,0xA1,0xA2,0xA3,0xA5,0xA6, + 0xA7,0xA8,0xAA,0xAB,0xAC,0xAE,0xAF,0xB0, + 0xB1,0xB3,0xB4,0xB5,0xB6,0xB8,0xB9,0xBA, + 0xBB,0xBC,0xBE,0xBF,0xC0,0xC1,0xC3,0xC4, + 0xC5,0xC6,0xC7,0xC9,0xCA,0xCB,0xCC,0xCD, + 0xCF,0xD0,0xD1,0xD2,0xD3,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDC,0xDD,0xDE,0xDF,0xE0, + 0xE1,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9, + 0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF3, + 0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFB,0xFC, + 0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03,0x04,0x05,0x07,0x08,0x0A,0x0C, + 0x0E,0x10,0x12,0x14,0x16,0x16,0x19,0x1B, + 0x1D,0x1F,0x21,0x23,0x25,0x27,0x28,0x2A, + 0x2C,0x2E,0x30,0x32,0x33,0x35,0x37,0x39, + 0x3A,0x3C,0x3E,0x40,0x41,0x43,0x45,0x46, + 0x48,0x4A,0x4B,0x4D,0x4F,0x50,0x52,0x53, + 0x55,0x57,0x58,0x5A,0x5B,0x5D,0x5F,0x60, + 0x62,0x63,0x65,0x66,0x68,0x69,0x6B,0x6C, + 0x6E,0x6F,0x71,0x72,0x74,0x75,0x77,0x78, + 0x7A,0x7B,0x7D,0x7E,0x80,0x81,0x83,0x84, + 0x86,0x87,0x88,0x8A,0x8B,0x8D,0x8E,0x90, + 0x91,0x92,0x94,0x95,0x97,0x98,0x99,0x9B, + 0x9C,0x9E,0x9F,0xA0,0xA2,0xA3,0xA5,0xA7, + 0xA9,0xAA,0xAB,0xAD,0xAE,0xB0,0xB1,0xB2, + 0xB4,0xB5,0xB6,0xB8,0xB9,0xBA,0xBC,0xBD, + 0xBE,0xC0,0xC1,0xC2,0xC4,0xC5,0xC6,0xC8, + 0xC9,0xCA,0xCC,0xCD,0xCE,0xD0,0xD1,0xD2, + 0xD4,0xD5,0xD6,0xD7,0xD9,0xDA,0xDB,0xDD, + 0xDE,0xDF,0xE1,0xE2,0xE3,0xE4,0xE6,0xE7, + 0xE8,0xE9,0xEB,0xEC,0xED,0xEF,0xF0,0xF1, + 0xF2,0xF4,0xF5,0xF6,0xF7,0xF9,0xFA,0xFB, + 0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x01,0x02,0x03,0x04,0x05,0x07, + 0x08,0x0A,0x0C,0x0E,0x10,0x12,0x14,0x16, + 0x18,0x1A,0x1C,0x1E,0x20,0x22,0x24,0x26, + 0x28,0x2A,0x2B,0x2D,0x2F,0x31,0x33,0x34, + 0x36,0x38,0x39,0x3B,0x3D,0x3E,0x40,0x42, + 0x43,0x45,0x47,0x48,0x4A,0x4B,0x4D,0x4F, + 0x50,0x52,0x53,0x55,0x56,0x58,0x59,0x5B, + 0x5D,0x5E,0x60,0x61,0x63,0x64,0x66,0x67, + 0x69,0x6A,0x6B,0x6D,0x6E,0x70,0x71,0x73, + 0x74,0x76,0x77,0x79,0x7A,0x7B,0x7D,0x7E, + 0x80,0x81,0x83,0x84,0x85,0x87,0x88,0x8A, + 0x8B,0x8C,0x8E,0x8F,0x90,0x92,0x93,0x95, + 0x96,0x97,0x99,0x9A,0x9B,0x9D,0x9E,0x9F, + 0xA1,0xA2,0xA3,0xA5,0xA6,0xA7,0xA9,0xAA, + 0xAB,0xAD,0xAE,0xAF,0xB1,0xB2,0xB3,0xB5, + 0xB6,0xB7,0xB9,0xBA,0xBB,0xBD,0xBE,0xBF, + 0xC0,0xC2,0xC3,0xC4,0xC6,0xC7,0xC8,0xC9, + 0xCB,0xCC,0xCD,0xCF,0xD0,0xD1,0xD2,0xD4, + 0xD5,0xD6,0xD7,0xD9,0xDA,0xDB,0xDC,0xDF, + 0xE0,0xE1,0xE3,0xE4,0xE5,0xE6,0xE8,0xE9, + 0xEA,0xEB,0xED,0xEE,0xEF,0xF0,0xF2,0xF3, + 0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFD, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03, + 0x04,0x05,0x07,0x08,0x0A,0x0C,0x0E,0x10, + 0x12,0x14,0x16,0x18,0x1A,0x1C,0x1E,0x20, + 0x22,0x24,0x26,0x28,0x2A,0x2B,0x2D,0x2F, + 0x31,0x33,0x34,0x36,0x38,0x39,0x3B,0x3D, + 0x3E,0x40,0x42,0x43,0x45,0x47,0x48,0x4A, + 0x4B,0x4D,0x4F,0x50,0x52,0x53,0x55,0x56, + 0x58,0x59,0x5B,0x5D,0x5E,0x60,0x61,0x63, + 0x64,0x66,0x67,0x69,0x6A,0x6B,0x6D,0x6E, + 0x70,0x71,0x73,0x74,0x76,0x77,0x79,0x7A, + 0x7B,0x7D,0x7E,0x80,0x81,0x83,0x84,0x85, + 0x87,0x88,0x8A,0x8B,0x8C,0x8E,0x8F,0x90, + 0x92,0x93,0x95,0x96,0x97,0x99,0x9A,0x9B, + 0x9D,0x9E,0x9F,0xA1,0xA2,0xA3,0xA5,0xA6, + 0xA7,0xA9,0xAA,0xAB,0xAD,0xAE,0xAF,0xB1, + 0xB2,0xB3,0xB5,0xB6,0xB7,0xB9,0xBA,0xBB, + 0xBD,0xBE,0xBF,0xC0,0xC2,0xC3,0xC4,0xC6, + 0xC7,0xC8,0xC9,0xCB,0xCC,0xCD,0xCF,0xD0, + 0xD1,0xD2,0xD4,0xD5,0xD6,0xD7,0xD9,0xDA, + 0xDB,0xDC,0xDE,0xDF,0xE0,0xE1,0xE3,0xE5, + 0xE6,0xE8,0xE9,0xEA,0xEB,0xED,0xEE,0xEF, + 0xF0,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9, + 0xFA,0xFB,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x01,0x02,0x03,0x04,0x05,0x07,0x08,0x0A, + 0x0C,0x0E,0x10,0x12,0x14,0x16,0x18,0x1A, + 0x1C,0x1E,0x20,0x22,0x24,0x26,0x28,0x2A, + 0x2B,0x2D,0x2F,0x31,0x33,0x34,0x36,0x38, + 0x39,0x3B,0x3D,0x3E,0x40,0x42,0x43,0x45, + 0x47,0x48,0x4A,0x4B,0x4D,0x4F,0x50,0x52, + 0x53,0x55,0x56,0x58,0x59,0x5B,0x5D,0x5E, + 0x60,0x61,0x63,0x64,0x66,0x67,0x69,0x6A, + 0x6B,0x6D,0x6E,0x70,0x71,0x73,0x74,0x76, + 0x77,0x79,0x7A,0x7B,0x7D,0x7E,0x80,0x81, + 0x83,0x84,0x85,0x87,0x88,0x8A,0x8B,0x8C, + 0x8E,0x8F,0x90,0x92,0x93,0x95,0x96,0x97, + 0x99,0x9A,0x9B,0x9D,0x9E,0x9F,0xA1,0xA2, + 0xA3,0xA5,0xA6,0xA7,0xA9,0xAA,0xAB,0xAD, + 0xAE,0xAF,0xB1,0xB2,0xB3,0xB5,0xB6,0xB7, + 0xB9,0xBA,0xBB,0xBD,0xBE,0xBF,0xC0,0xC2, + 0xC3,0xC4,0xC6,0xC7,0xC8,0xC9,0xCB,0xCC, + 0xCD,0xCF,0xD0,0xD1,0xD2,0xD4,0xD5,0xD6, + 0xD7,0xD9,0xDA,0xDB,0xDC,0xDE,0xDF,0xE0, + 0xE3,0xE4,0xE5,0xE6,0xE8,0xE9,0xEA,0xEB, + 0xED,0xEE,0xEF,0xF0,0xF2,0xF3,0xF4,0xF5, + 0xF6,0xF8,0xF9,0xFA,0xFB,0xFD,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, + 0x03,0x04,0x05,0x07,0x08,0x0A,0x0C,0x0E, + 0x10,0x12,0x14,0x16,0x18,0x18,0x1A,0x1C, + 0x1E,0x20,0x22,0x24,0x26,0x27,0x29,0x2B, + 0x2C,0x2E,0x30,0x31,0x33,0x35,0x36,0x38, + 0x39,0x3B,0x3C,0x3E,0x40,0x41,0x43,0x44, + 0x45,0x47,0x48,0x4A,0x4B,0x4D,0x4E,0x50, + 0x51,0x52,0x54,0x55,0x56,0x58,0x59,0x5B, + 0x5C,0x5D,0x5F,0x60,0x61,0x63,0x64,0x65, + 0x67,0x68,0x69,0x6A,0x6C,0x6D,0x6E,0x70, + 0x71,0x72,0x73,0x75,0x76,0x77,0x78,0x7A, + 0x7B,0x7C,0x7D,0x7E,0x80,0x81,0x82,0x83, + 0x85,0x86,0x87,0x88,0x89,0x8A,0x8C,0x8D, + 0x8E,0x8F,0x90,0x92,0x93,0x94,0x95,0x96, + 0x97,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8, + 0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1, + 0xB2,0xB3,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA, + 0xBB,0xBC,0xBD,0xBE,0xBF,0xC0,0xC2,0xC4, + 0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC, + 0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD4,0xD5, + 0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD, + 0xDE,0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5, + 0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED, + 0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5, + 0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { // 7 + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, + 0x03,0x04,0x05,0x06,0x07,0x09,0x0B,0x0C, + 0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x1C, + 0x1E,0x20,0x21,0x23,0x25,0x27,0x28,0x2A, + 0x2C,0x2D,0x2F,0x31,0x32,0x34,0x36,0x37, + 0x39,0x3B,0x3C,0x3E,0x3F,0x41,0x42,0x44, + 0x45,0x47,0x48,0x4A,0x4B,0x4D,0x4E,0x50, + 0x51,0x53,0x54,0x56,0x57,0x59,0x5A,0x5C, + 0x5D,0x5F,0x60,0x61,0x63,0x64,0x66,0x67, + 0x68,0x6A,0x6B,0x6D,0x6E,0x6F,0x71,0x72, + 0x73,0x75,0x76,0x78,0x79,0x7A,0x7C,0x7D, + 0x7E,0x80,0x81,0x82,0x84,0x85,0x86,0x88, + 0x89,0x8A,0x8B,0x8D,0x8E,0x8F,0x91,0x92, + 0x93,0x95,0x96,0x97,0x98,0x9A,0x9B,0x9C, + 0x9E,0x9F,0xA0,0xA1,0xA3,0xA4,0xA5,0xA6, + 0xA8,0xA9,0xAA,0xAB,0xAD,0xAE,0xAF,0xB0, + 0xB2,0xB3,0xB4,0xB5,0xB7,0xB8,0xB9,0xBA, + 0xBC,0xBD,0xBE,0xBF,0xC0,0xC2,0xC3,0xC4, + 0xC5,0xC7,0xC8,0xC9,0xCA,0xCB,0xCD,0xCE, + 0xCF,0xD0,0xD1,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xE0,0xE1, + 0xE2,0xE3,0xE4,0xE6,0xE7,0xE8,0xE9,0xEA, + 0xEB,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3, + 0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFC,0xFD, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + } +}; + +static unsigned char LUT_B[][256] = +{ + { + 0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07, + 0x08,0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F, + 0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17, + 0x18,0x19,0x1A,0x1B,0x1C,0x1D,0x1E,0x1F, + 0x20,0x21,0x22,0x23,0x24,0x25,0x26,0x27, + 0x28,0x29,0x2A,0x2B,0x2C,0x2D,0x2E,0x2F, + 0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37, + 0x38,0x39,0x3A,0x3B,0x3C,0x3D,0x3E,0x3F, + 0x40,0x41,0x42,0x43,0x44,0x45,0x46,0x47, + 0x48,0x49,0x4A,0x4B,0x4C,0x4D,0x4E,0x4F, + 0x50,0x51,0x52,0x53,0x54,0x55,0x56,0x57, + 0x58,0x59,0x5A,0x5B,0x5C,0x5D,0x5E,0x5F, + 0x60,0x61,0x62,0x63,0x64,0x65,0x66,0x67, + 0x68,0x69,0x6A,0x6B,0x6C,0x6D,0x6E,0x6F, + 0x70,0x71,0x72,0x73,0x74,0x75,0x76,0x77, + 0x78,0x79,0x7A,0x7B,0x7C,0x7D,0x7E,0x7F, + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F, + 0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97, + 0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7, + 0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF, + 0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7, + 0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7, + 0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF, + 0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7, + 0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF, + 0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7, + 0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03,0x04,0x06,0x07,0x09,0x0B,0x0D, + 0x10,0x12,0x14,0x17,0x19,0x1B,0x1E,0x20, + 0x22,0x24,0x26,0x28,0x2A,0x2C,0x2E,0x30, + 0x32,0x33,0x35,0x37,0x39,0x3B,0x3C,0x3E, + 0x40,0x41,0x43,0x45,0x46,0x48,0x4A,0x4B, + 0x4D,0x4F,0x50,0x52,0x53,0x55,0x57,0x58, + 0x5A,0x5B,0x5D,0x5E,0x60,0x61,0x63,0x64, + 0x66,0x67,0x69,0x6A,0x6C,0x6D,0x6F,0x70, + 0x71,0x73,0x74,0x76,0x77,0x79,0x7A,0x7B, + 0x7D,0x7E,0x7F,0x81,0x82,0x84,0x85,0x86, + 0x88,0x89,0x8A,0x8C,0x8D,0x8E,0x90,0x91, + 0x92,0x94,0x95,0x96,0x98,0x99,0x9A,0x9C, + 0x9D,0x9E,0xA0,0xA1,0xA2,0xA3,0xA5,0xA6, + 0xA7,0xA8,0xAA,0xAB,0xAC,0xAE,0xAF,0xB0, + 0xB1,0xB3,0xB4,0xB5,0xB6,0xB8,0xB9,0xBA, + 0xBB,0xBC,0xBE,0xBF,0xC0,0xC1,0xC3,0xC4, + 0xC5,0xC6,0xC7,0xC9,0xCA,0xCB,0xCC,0xCD, + 0xCF,0xD0,0xD1,0xD2,0xD3,0xD5,0xD6,0xD7, + 0xD8,0xD9,0xDA,0xDC,0xDD,0xDE,0xDF,0xE0, + 0xE1,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9, + 0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF3, + 0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFB,0xFC, + 0xFD,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03,0x04,0x05,0x07,0x08,0x0A,0x0C, + 0x0E,0x10,0x12,0x14,0x16,0x16,0x19,0x1B, + 0x1D,0x1F,0x21,0x23,0x25,0x27,0x28,0x2A, + 0x2C,0x2E,0x30,0x32,0x33,0x35,0x37,0x39, + 0x3A,0x3C,0x3E,0x40,0x41,0x43,0x45,0x46, + 0x48,0x4A,0x4B,0x4D,0x4F,0x50,0x52,0x53, + 0x55,0x57,0x58,0x5A,0x5B,0x5D,0x5F,0x60, + 0x62,0x63,0x65,0x66,0x68,0x69,0x6B,0x6C, + 0x6E,0x6F,0x71,0x72,0x74,0x75,0x77,0x78, + 0x7A,0x7B,0x7D,0x7E,0x80,0x81,0x83,0x84, + 0x86,0x87,0x88,0x8A,0x8B,0x8D,0x8E,0x90, + 0x91,0x92,0x94,0x95,0x97,0x98,0x99,0x9B, + 0x9C,0x9E,0x9F,0xA0,0xA2,0xA3,0xA5,0xA7, + 0xA9,0xAA,0xAB,0xAD,0xAE,0xB0,0xB1,0xB2, + 0xB4,0xB5,0xB6,0xB8,0xB9,0xBA,0xBC,0xBD, + 0xBE,0xC0,0xC1,0xC2,0xC4,0xC5,0xC6,0xC8, + 0xC9,0xCA,0xCC,0xCD,0xCE,0xD0,0xD1,0xD2, + 0xD4,0xD5,0xD6,0xD7,0xD9,0xDA,0xDB,0xDD, + 0xDE,0xDF,0xE1,0xE2,0xE3,0xE4,0xE6,0xE7, + 0xE8,0xE9,0xEB,0xEC,0xED,0xEF,0xF0,0xF1, + 0xF2,0xF4,0xF5,0xF6,0xF7,0xF9,0xFA,0xFB, + 0xFC,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x01,0x02,0x03,0x04,0x05,0x07,0x08, + 0x0A,0x0C,0x0E,0x10,0x12,0x14,0x16,0x18, + 0x1A,0x1C,0x1E,0x20,0x22,0x24,0x26,0x28, + 0x2A,0x2B,0x2D,0x2F,0x31,0x33,0x34,0x36, + 0x38,0x39,0x3B,0x3D,0x3E,0x40,0x42,0x43, + 0x45,0x47,0x48,0x4A,0x4B,0x4D,0x4F,0x50, + 0x52,0x53,0x55,0x56,0x58,0x59,0x5B,0x5D, + 0x5E,0x60,0x61,0x63,0x64,0x66,0x67,0x69, + 0x6A,0x6B,0x6D,0x6E,0x70,0x71,0x73,0x74, + 0x76,0x77,0x79,0x7A,0x7B,0x7D,0x7E,0x80, + 0x81,0x83,0x84,0x85,0x87,0x88,0x8A,0x8B, + 0x8C,0x8E,0x8F,0x90,0x92,0x93,0x95,0x96, + 0x97,0x99,0x9A,0x9B,0x9D,0x9E,0x9F,0xA1, + 0xA2,0xA3,0xA5,0xA6,0xA7,0xA9,0xAA,0xAB, + 0xAD,0xAE,0xAF,0xB1,0xB2,0xB3,0xB5,0xB6, + 0xB7,0xB9,0xBA,0xBB,0xBD,0xBE,0xBF,0xC0, + 0xC2,0xC3,0xC4,0xC6,0xC7,0xC8,0xC9,0xCB, + 0xCC,0xCD,0xCF,0xD0,0xD1,0xD2,0xD4,0xD5, + 0xD6,0xD7,0xD9,0xDA,0xDB,0xDC,0xDE,0xDF, + 0xE0,0xE1,0xE3,0xE4,0xE5,0xE6,0xE8,0xE9, + 0xEA,0xEB,0xED,0xEE,0xEF,0xF0,0xF2,0xF3, + 0xF4,0xF5,0xF6,0xF8,0xF9,0xFA,0xFB,0xFD, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x01,0x02,0x03,0x04, + 0x05,0x07,0x08,0x0A,0x0C,0x0E,0x10,0x12, + 0x14,0x16,0x18,0x1A,0x1C,0x1E,0x20,0x22, + 0x24,0x26,0x28,0x2A,0x2B,0x2D,0x2F,0x31, + 0x33,0x34,0x36,0x38,0x39,0x3B,0x3D,0x3E, + 0x40,0x42,0x43,0x45,0x47,0x48,0x4A,0x4B, + 0x4D,0x4F,0x50,0x52,0x53,0x55,0x56,0x58, + 0x59,0x5B,0x5D,0x5E,0x60,0x61,0x63,0x64, + 0x66,0x67,0x69,0x6A,0x6B,0x6D,0x6E,0x70, + 0x71,0x73,0x74,0x76,0x77,0x79,0x7A,0x7B, + 0x7D,0x7E,0x80,0x81,0x83,0x84,0x85,0x87, + 0x88,0x8A,0x8B,0x8C,0x8E,0x8F,0x90,0x92, + 0x93,0x95,0x96,0x97,0x99,0x9A,0x9B,0x9D, + 0x9E,0x9F,0xA1,0xA2,0xA3,0xA5,0xA6,0xA7, + 0xA9,0xAA,0xAB,0xAD,0xAE,0xAF,0xB1,0xB2, + 0xB3,0xB5,0xB6,0xB7,0xB9,0xBA,0xBB,0xBD, + 0xBE,0xBF,0xC0,0xC2,0xC3,0xC4,0xC6,0xC7, + 0xC8,0xC9,0xCB,0xCC,0xCD,0xCF,0xD0,0xD1, + 0xD2,0xD4,0xD5,0xD6,0xD7,0xD9,0xDA,0xDB, + 0xDC,0xDE,0xDF,0xE0,0xE1,0xE3,0xE4,0xE5, + 0xE6,0xE8,0xE9,0xEA,0xEB,0xED,0xEE,0xEF, + 0xF0,0xF2,0xF3,0xF4,0xF5,0xF6,0xF8,0xF9, + 0xFA,0xFB,0xFD,0xFE,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01, + 0x02,0x03,0x04,0x05,0x07,0x08,0x0A,0x0C, + 0x0E,0x10,0x12,0x14,0x16,0x16,0x18,0x1A, + 0x1C,0x1E,0x20,0x22,0x24,0x26,0x28,0x2A, + 0x2B,0x2D,0x2F,0x31,0x33,0x34,0x36,0x38, + 0x39,0x3B,0x3D,0x3E,0x40,0x42,0x43,0x45, + 0x47,0x48,0x4A,0x4B,0x4D,0x4F,0x50,0x52, + 0x53,0x55,0x56,0x58,0x59,0x5B,0x5D,0x5E, + 0x60,0x61,0x63,0x64,0x66,0x67,0x69,0x6A, + 0x6B,0x6D,0x6E,0x70,0x71,0x73,0x74,0x76, + 0x77,0x79,0x7A,0x7B,0x7D,0x7E,0x80,0x81, + 0x83,0x84,0x85,0x87,0x88,0x8A,0x8B,0x8C, + 0x8E,0x8F,0x90,0x92,0x93,0x95,0x96,0x97, + 0x99,0x9A,0x9B,0x9D,0x9E,0x9F,0xA1,0xA3, + 0xA5,0xA6,0xA7,0xA9,0xAA,0xAB,0xAD,0xAE, + 0xAF,0xB1,0xB2,0xB3,0xB5,0xB6,0xB7,0xB9, + 0xBA,0xBB,0xBD,0xBE,0xBF,0xC0,0xC2,0xC3, + 0xC4,0xC6,0xC7,0xC8,0xC9,0xCB,0xCC,0xCD, + 0xCF,0xD0,0xD1,0xD2,0xD4,0xD5,0xD6,0xD7, + 0xD9,0xDA,0xDB,0xDC,0xDE,0xDF,0xE0,0xE1, + 0xE3,0xE4,0xE5,0xE6,0xE8,0xE9,0xEA,0xEB, + 0xED,0xEE,0xEF,0xF0,0xF2,0xF3,0xF4,0xF5, + 0xF6,0xF8,0xF9,0xFA,0xFB,0xFD,0xFE,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x01,0x02,0x03, + 0x04,0x05,0x07,0x08,0x0A,0x0C,0x0E,0x10, + 0x12,0x14,0x16,0x18,0x1A,0x1C,0x1E,0x20, + 0x22,0x24,0x26,0x27,0x29,0x2B,0x2C,0x2E, + 0x30,0x31,0x33,0x35,0x36,0x38,0x39,0x3B, + 0x3C,0x3E,0x40,0x41,0x43,0x44,0x45,0x47, + 0x48,0x4B,0x4D,0x4E,0x50,0x51,0x52,0x54, + 0x55,0x56,0x58,0x59,0x5B,0x5C,0x5D,0x5F, + 0x60,0x61,0x63,0x64,0x65,0x67,0x68,0x69, + 0x6A,0x6C,0x6D,0x6E,0x70,0x71,0x72,0x73, + 0x75,0x76,0x77,0x78,0x7A,0x7B,0x7C,0x7D, + 0x7E,0x80,0x81,0x82,0x83,0x85,0x86,0x87, + 0x88,0x89,0x8A,0x8C,0x8D,0x8E,0x8F,0x90, + 0x92,0x93,0x94,0x95,0x96,0x96,0x97,0x99, + 0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xA1,0xA2, + 0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xAA,0xAB, + 0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3, + 0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC, + 0xBD,0xBE,0xBF,0xC0,0xC2,0xC3,0xC4,0xC5, + 0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD, + 0xCE,0xCF,0xD0,0xD1,0xD2,0xD4,0xD5,0xD6, + 0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE, + 0xDF,0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6, + 0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE, + 0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6, + 0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + }, + { + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, + 0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x02, + 0x03,0x04,0x05,0x06,0x07,0x09,0x0B,0x0C, + 0x0E,0x10,0x12,0x14,0x16,0x18,0x1A,0x1C, + 0x1E,0x20,0x21,0x23,0x25,0x27,0x28,0x2A, + 0x2C,0x2D,0x2F,0x31,0x32,0x34,0x36,0x37, + 0x39,0x3B,0x3C,0x3E,0x3F,0x41,0x42,0x44, + 0x45,0x47,0x48,0x4A,0x4B,0x4D,0x4E,0x50, + 0x51,0x53,0x54,0x56,0x57,0x59,0x5A,0x5C, + 0x5D,0x5F,0x60,0x61,0x63,0x64,0x66,0x67, + 0x68,0x6A,0x6B,0x6D,0x6E,0x6F,0x71,0x72, + 0x73,0x75,0x76,0x78,0x79,0x7A,0x7C,0x7D, + 0x7E,0x80,0x81,0x82,0x84,0x85,0x86,0x88, + 0x89,0x8A,0x8B,0x8D,0x8E,0x8F,0x91,0x92, + 0x93,0x95,0x96,0x97,0x98,0x9A,0x9B,0x9C, + 0x9E,0x9F,0xA0,0xA1,0xA3,0xA4,0xA5,0xA6, + 0xA8,0xA9,0xAA,0xAB,0xAD,0xAE,0xAF,0xB0, + 0xB2,0xB3,0xB4,0xB5,0xB7,0xB8,0xB9,0xBA, + 0xBC,0xBD,0xBE,0xBF,0xC0,0xC2,0xC3,0xC4, + 0xC5,0xC7,0xC8,0xC9,0xCA,0xCB,0xCD,0xCE, + 0xCF,0xD0,0xD1,0xD3,0xD4,0xD5,0xD6,0xD7, + 0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xE0,0xE1, + 0xE2,0xE3,0xE4,0xE6,0xE7,0xE8,0xE9,0xEA, + 0xEB,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3, + 0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFC,0xFD, + 0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF, + } +}; +//// profile array //// + +typedef struct +{ + int productID; // USB PID + char productName[50]; // ESCI/2 procduct name + char deviceID[50]; // device ID (same as bonjour mdl name) + int lutID; // look up table no +}epsonds_profile_map; + +const epsonds_profile_map epsonds_models_predefined[] = { + {0x0145, "DS-5500","DS-5500", 7}, + {0x0145, "DS-6500","DS-6500", 7}, + {0x0145, "DS-7500","DS-7500", 7}, + {0x0146, "DS-50000","DS-50000", 7}, + {0x0146, "DS-60000","DS-60000", 7}, + {0x0146, "DS-70000","DS-70000", 7}, + {0x014C, "DS-510","DS-510", 7}, + {0x0150, "DS-560","DS-560", 7}, + {0x0152, "DS-40","DS-40", 7}, + {0x014D, "DS-760","DS-760", 7}, + {0x014D, "DS-860","DS-860", 7}, + {0x0154, "DS-520","DS-520", 7}, + {0x08BC, "PID 08BC","PX-M7050 Series", 7}, + {0x08BC, "PID 08BC","WF-8510 Series", 7}, + {0x08BC, "PID 08BC","WF-8590 Series", 7}, + {0x08CC, "PID 08CC","PX-M7050FX Series", 7}, + {0x08CC, "PID 08CC","WF-R8590 Series", 7}, + {0x0165, "DS-410","DS-410", 7}, + {0x016C, "ES-50","ES-50", 6}, + {0x0160, "DS-70","DS-70", 6}, + {0x016D, "ES-55R","ES-55R", 6}, + {0x018C, "RR-60","RR-60", 6}, + {0x016E, "ES-60W","ES-60W", 6}, + {0x0166, "DS-80W","DS-80W", 6}, + {0x016F, "ES-65WR","ES-65WR", 6}, + {0x018B, "RR-70W","RR-70W", 6}, + {0x016E, "ES-60WW","ES-60WW", 6}, + {0x016E, "ES-60WB","ES-60WB", 6}, + {0x015C, "DS-1630","DS-1630", 4}, + {0x015D, "DS-1610","DS-1610", 4}, + {0x015E, "DS-1660W","DS-1660W", 4}, + {0x0159, "DS-310","DS-310", 5}, + {0x0159, "ES-200","ES-200", 5}, + {0x0162, "DS-320","DS-320", 5}, + {0x015A, "DS-360W","DS-360W", 5}, + {0x015A, "ES-300W","ES-300W", 5}, + {0x0177, "ES-300WR","ES-300WR", 5}, + {0x0181, "ES-400II","ES-400II", 2}, + {0x0183, "DS-535II","DS-535II", 2}, + {0x0184, "DS-531","DS-531", 2}, + {0x0182, "DS-530II","DS-530II", 2}, + {0x0185, "ES-500WII","ES-500WII", 2}, + {0x0188, "DS-571W","DS-571W", 2}, + {0x0187, "DS-575WII","DS-575WII", 2}, + {0x0186, "DS-570WII","DS-570WII", 2}, + {0x017F, "ES-580W","ES-580W", 2}, + {0x0180, "RR-600W","RR-600W", 2}, + {0x0167, "DS-535","DS-535", 2}, + {0x017A, "DS-535H","DS-535H", 2}, + {0x0156, "ES-400","ES-400", 2}, + {0x0155, "DS-530","DS-530", 2}, + {0x016B, "FF-680W","FF-680W", 2}, + {0x0157, "DS-570W","DS-570W", 2}, + {0x0157, "ES-500W","ES-500W", 2}, + {0x0169, "DS-575W","DS-575W", 2}, + {0x0176, "ES-500WR","ES-500WR", 2}, + {0x114E, "PID 114E","EW-052A Series", 7}, + {0x114E, "PID 114E","XP-2100 Series", 7}, + {0x1135, "PID 1135","ET-2700 Series", 7}, + {0x1135, "PID 1135","L4150 Series", 7}, + {0x114A, "PID 114A","ET-M2140 Series", 7}, + {0x114A, "PID 114A","M2140 Series", 7}, + {0x114F, "PID 114F","ET-M3140 Series", 7}, + {0x114F, "PID 114F","M3140 Series", 7}, + {0x1143, "PID 1143","L3150 Series", 7}, + {0x1143, "PID 1143","ET-2710 Series", 7}, + {0x118A, "PID 118A","ET-2810 Series", 7}, + {0x118A, "PID 118A","L3250 Series", 7}, + {0x119B, "PID 119B","XP-2150 Series", 7}, + {0x00, "","", 0x00 } +}; + +typedef struct +{ + epsonds_profile_map *array; + int used; + int size; +}epsonds_profile_map_array; + + +static epsonds_profile_map_array stProfileMapArray; + +static void insert_profile_map(epsonds_profile_map_array *a, epsonds_profile_map element); + +static void init_profile_maps(epsonds_profile_map_array *a, size_t initialSize) { + a->array = malloc(initialSize * sizeof(epsonds_profile_map)); + a->used = 0; + a->size = initialSize; + + for (int i = 0; epsonds_models_predefined[i].productID != 0; i++) { + + //DBG(6, "epsonds_models_predefined[i].productID = %x\n", epsonds_models_predefined[i].productID ); + + insert_profile_map(a, epsonds_models_predefined[i]); + } +} + +static void insert_profile_map(epsonds_profile_map_array *a, epsonds_profile_map element) { + if (a->used == a->size) { + a->size *= 2; + a->array = realloc(a->array, a->size * sizeof(epsonds_profile_map)); + } + a->array[a->used++] = element; +} + +static void free_profile_maps(epsonds_profile_map_array *a) { + free(a->array); + a->array = NULL; + a->used = a->size = 0; +} +///////////////////////// + + struct mode_param mode_params[] = { {0, 0x00, 0x30, 1}, {0, 0x00, 0x30, 8}, @@ -86,16 +1316,12 @@ static SANE_String_Const mode_list[] = { 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") +#define STRING_FLATBED SANE_I18N("Flatbed") +#define STRING_ADFFRONT SANE_I18N("ADF Front") +#define STRING_ADFDUPLEX SANE_I18N("ADF Duplex") /* order will be fixed: fb, adf, tpu */ SANE_String_Const source_list[] = { @@ -129,6 +1355,9 @@ max_string_size(const SANE_String_Const strings[]) static SANE_Status attach_one_usb(SANE_String_Const devname); static SANE_Status attach_one_net(SANE_String_Const devname); +static SANE_Status acquire_jpeg_data(epsonds_scanner* s); +static SANE_Status acquire_and_decode_jpeg_data(epsonds_scanner* s); +static SANE_Status acquire_raw_data(epsonds_scanner* s); static void print_params(const SANE_Parameters params) @@ -146,6 +1375,11 @@ close_scanner(epsonds_scanner *s) { DBG(7, "%s: fd = %d\n", __func__, s->fd); + if (s->scanning) + { + sane_cancel(s); + } + if (s->fd == -1) goto free; @@ -171,49 +1405,6 @@ free: DBG(7, "%s: ZZZ\n", __func__); } -static void -e2_network_discovery(void) -{ - fd_set rfds; - int fd, len; - SANE_Status status; - - char *ip, *query = "EPSONP\x00\xff\x00\x00\x00\x00\x00\x00\x00"; - unsigned char buf[76]; - - struct timeval to; - - status = sanei_udp_open_broadcast(&fd); - if (status != SANE_STATUS_GOOD) - return; - - sanei_udp_write_broadcast(fd, 3289, (unsigned char *) query, 15); - - DBG(5, "%s, sent discovery packet\n", __func__); - - to.tv_sec = 1; - to.tv_usec = 0; - - FD_ZERO(&rfds); - FD_SET(fd, &rfds); - - sanei_udp_set_nonblock(fd, SANE_TRUE); - 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 */ - if (strncmp((char *) buf, "EPSON", 5) == 0) - attach_one_net(ip); - } - } - - DBG(5, "%s, end\n", __func__); - - sanei_udp_close(fd); -} - - static SANE_Status open_scanner(epsonds_scanner *s) { @@ -230,7 +1421,7 @@ open_scanner(epsonds_scanner *s) unsigned char buf[5]; /* device name has the form net:ipaddr */ - status = sanei_tcp_open(&s->hw->sane.name[4], 1865, &s->fd); + status = sanei_tcp_open(&s->hw->name[4], 1865, &s->fd); if (status == SANE_STATUS_GOOD) { ssize_t read; @@ -272,12 +1463,10 @@ open_scanner(epsonds_scanner *s) } } else if (s->hw->connection == SANE_EPSONDS_USB) { - status = sanei_usb_open(s->hw->sane.name, &s->fd); if (status == SANE_STATUS_GOOD) { sanei_usb_set_timeout(USB_TIMEOUT); - sanei_usb_clear_halt(s->fd); } } else { @@ -307,7 +1496,6 @@ 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; @@ -428,7 +1616,32 @@ device_detect(const char *name, int type, SANE_Status *status) DBG(1, "scanner model: %s\n", dev->model); - /* add this scanner to the device list */ + + s->hw->lut_id = 0; + + for (int i = 0; i < stProfileMapArray.used; i++) { + + epsonds_profile_map* map = &stProfileMapArray.array[i]; + + + if (strcmp(map->productName, dev->model) == 0) { + + {//Convert to user friendly model name + free(s->hw->model); + + char* deviceName = (char*)malloc(strlen(map->deviceID) + 1); + memset(deviceName, 0, strlen(map->deviceID) + 1); + strncpy(deviceName, map->deviceID, strlen(map->deviceID)); + s->hw->model = deviceName; + s->hw->sane.model = s->hw->model; + } + {// set lutid + s->hw->lut_id = map->lutID; + } + break; + } + } + DBG(1, "scanner lut_id: %d\n", s->hw->lut_id); num_devices++; dev->next = first_dev; @@ -479,6 +1692,67 @@ attach_one_net(const char *dev) return attach(name, SANE_EPSONDS_NET); } +static void found_net_device(const char* device_name, const char* ip) +{ + DBG(7, "Found %s: ip = %s\n", device_name, ip); + + int foundSupportedDevice = 0; + + // search models + for (int i = 0; i < stProfileMapArray.used; i++) { + if (strcmp(stProfileMapArray.array[i].deviceID, device_name) == 0) { + foundSupportedDevice = 1; + break; + } + } + + + if (foundSupportedDevice) + { + char name[39 + 4]; + + strcpy(name, "net:"); + strncat(name, ip, 39); + + int foundCache = 0; + // search cache and prents duplicated model + for (epsonds_device* dev = first_dev; dev; dev = dev->next) { + if (strcmp(dev->sane.name, name) == 0) { + foundCache = 1; + } + } + if (foundCache == 0) + { + attach(name, SANE_EPSONDS_NET); + } + } +} + +static void +splitProfileName(const char* input, int* outProductID, char *outProductName, char* outDeviceID, int* outLutID) +{ + char target[1024]; + strncpy(target, input, 1023); + + strtok(target, ":");//profile + + //productID + char* pid = strtok(NULL, ","); + sscanf(pid, "%x", (unsigned int*)outProductID); + + //productName + char* productName = strtok(NULL, ","); + strncpy(outProductName, productName, 49); + + //deviceID + char* deviceID = strtok(NULL, ","); + strncpy(outDeviceID, deviceID, 49); + + //lutID + char* lutID = strtok(NULL, ","); + sscanf(lutID, "%d", outLutID); +} + static SANE_Status attach_one_config(SANEI_Config __sane_unused__ *config, const char *line, @@ -489,8 +1763,17 @@ attach_one_config(SANEI_Config __sane_unused__ *config, const char *line, int len = strlen(line); DBG(7, "%s: len = %d, line = %s\n", __func__, len, line); + if (strncmp(line, "profile", 7) == 0 ) { + DBG(7, " found profile device profile\n"); + + epsonds_profile_map profle_map; + + splitProfileName(line, &profle_map.productID, profle_map.productName, profle_map.deviceID, &profle_map.lutID); - if (sscanf(line, "usb %i %i", &vendor, &product) == 2) { + DBG(7, "Found profile : %x %s %s %d\n", profle_map.productID, profle_map.productName, profle_map.deviceID, profle_map.lutID); + + insert_profile_map(&stProfileMapArray, profle_map); + }else if (sscanf(line, "usb %i %i", &vendor, &product) == 2) { DBG(7, " user configured device\n"); @@ -501,15 +1784,11 @@ attach_one_config(SANEI_Config __sane_unused__ *config, const char *line, } 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); + for (int i = 0; i < stProfileMapArray.used; i++) { + int usbPid = stProfileMapArray.array[i].productID; + sanei_usb_find_devices(SANE_EPSONDS_VENDOR_ID, usbPid, attach_one_usb); } } else if (strncmp(line, "net", 3) == 0) { @@ -520,11 +1799,17 @@ attach_one_config(SANEI_Config __sane_unused__ *config, const char *line, sanei_config_skip_whitespace(line + 3); if (strncmp(name, "autodiscovery", 13) == 0) - e2_network_discovery(); + { + #if WITH_AVAHI + epsonds_searchDevices(found_net_device); + #else + // currently does not support + //e2_network_discovery(); + #endif + } else attach_one_net(name); } - } else { DBG(0, "unable to parse config line: %s\n", line); } @@ -564,13 +1849,16 @@ SANE_Status sane_init(SANE_Int *version_code, SANE_Auth_Callback __sane_unused__ authorize) { DBG_INIT(); + + init_profile_maps(&stProfileMapArray, 100); + 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, + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, EPSONDS_BUILD); sanei_usb_init(); @@ -582,6 +1870,7 @@ void sane_exit(void) { DBG(5, "** %s\n", __func__); + free_profile_maps(&stProfileMapArray); free_devices(); } @@ -591,7 +1880,8 @@ sane_get_devices(const SANE_Device ***device_list, SANE_Bool local_only) int i; epsonds_device *dev; - DBG(5, "** %s\n", __func__); + DBG(5, "** %s local_only = %d \n", __func__, local_only); + probe_devices(local_only); @@ -612,12 +1902,14 @@ sane_get_devices(const SANE_Device ***device_list, SANE_Bool local_only) *device_list = devlist; + return SANE_STATUS_GOOD; } static SANE_Status init_options(epsonds_scanner *s) { + DBG(5, "init_options\n"); int i; for (i = 0; i < NUM_OPTIONS; i++) { @@ -632,11 +1924,11 @@ init_options(epsonds_scanner *s) 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; + s->opt[OPT_STANDARD_GROUP].name = SANE_NAME_STANDARD; + s->opt[OPT_STANDARD_GROUP].title = SANE_TITLE_STANDARD; + s->opt[OPT_STANDARD_GROUP].desc = SANE_DESC_STANDARD; + s->opt[OPT_STANDARD_GROUP].type = SANE_TYPE_GROUP; + s->opt[OPT_STANDARD_GROUP].cap = 0; /* scan mode */ s->opt[OPT_MODE].name = SANE_NAME_SCAN_MODE; @@ -761,18 +2053,6 @@ init_options(epsonds_scanner *s) 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"); @@ -781,8 +2061,26 @@ init_options(epsonds_scanner *s) s->opt[OPT_ADF_SKEW].type = SANE_TYPE_BOOL; s->val[OPT_ADF_SKEW].w = 0; + + s->opt[OPT_ADF_CRP].name = "adf-crp"; + s->opt[OPT_ADF_CRP].title = SANE_I18N("ADF CRP Correction"); + s->opt[OPT_ADF_CRP].desc = + SANE_I18N("Enables ADF auto cropping"); // + s->opt[OPT_ADF_CRP].type = SANE_TYPE_BOOL; + s->val[OPT_ADF_CRP].w = 0; + + if (!s->hw->adf_has_skew) + { + s->val[OPT_ADF_SKEW].w = 0; s->opt[OPT_ADF_SKEW].cap |= SANE_CAP_INACTIVE; + } + + if(!s->hw->adf_has_crp) + { + s->val[OPT_ADF_CRP].w = 0; + s->opt[OPT_ADF_CRP].cap |= SANE_CAP_INACTIVE; + } return SANE_STATUS_GOOD; } @@ -793,6 +2091,8 @@ 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 */ @@ -848,6 +2148,8 @@ sane_open(SANE_String_Const name, SANE_Handle *handle) status = eds_lock(s); } + setvalue((SANE_Handle)s, OPT_MODE, (void*)SANE_VALUE_SCAN_MODE_COLOR, NULL); + return status; } @@ -881,24 +2183,6 @@ search_string_list(const SANE_String_Const *list, SANE_String value) 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)). @@ -911,7 +2195,6 @@ 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); @@ -928,26 +2211,17 @@ change_source(epsonds_scanner *s, SANE_Int optindex, char *value) force_max = SANE_TRUE; } - if (strcmp(ADF_STR, value) == 0) { - + if (strcmp(STRING_ADFFRONT, value) == 0 || strcmp(STRING_ADFDUPLEX, 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 */ @@ -995,7 +2269,6 @@ getvalue(SANE_Handle handle, SANE_Int option, void *value) break; case OPT_MODE: - case OPT_ADF_MODE: case OPT_SOURCE: strcpy((char *) value, sopt->constraint.string_list[sval->w]); break; @@ -1045,12 +2318,9 @@ setvalue(SANE_Handle handle, SANE_Int option, void *value, SANE_Int *info) switch (option) { - case OPT_ADF_MODE: /* simple lists */ - sval->w = optindex; - break; - case OPT_ADF_SKEW: case OPT_RESOLUTION: + case OPT_ADF_CRP: sval->w = *((SANE_Word *) value); reload = SANE_TRUE; break; @@ -1064,9 +2334,29 @@ setvalue(SANE_Handle handle, SANE_Int option, void *value, SANE_Int *info) // fall through case OPT_TL_X: case OPT_TL_Y: + sval->w = *((SANE_Word *) value); if (NULL != info) *info |= SANE_INFO_RELOAD_PARAMS; + + if (option == OPT_BR_X) + { + DBG(17, "OPT_BR_X = %d\n", sval->w); + } + if (option == OPT_BR_Y) + { + DBG(17, "OPT_BR_Y = %d\n", sval->w); + } + if (option == OPT_TL_X) + { + DBG(17, "OPT_TL_X = %d\n", sval->w); + } + if (option == OPT_TL_Y) + { + DBG(17, "OPT_TL_Y = %d\n", sval->w); + } + // adf crop set to off + s->val[OPT_ADF_CRP].w = 0; break; case OPT_SOURCE: @@ -1076,6 +2366,8 @@ setvalue(SANE_Handle handle, SANE_Int option, void *value, SANE_Int *info) case OPT_MODE: { + DBG(17, " OPT_MODE = index %d\n", optindex); + /* use JPEG mode if RAW is not available when bpp > 1 */ if (optindex > 0 && !s->hw->has_raw) { s->mode_jpeg = 1; @@ -1152,6 +2444,183 @@ sane_control_option(SANE_Handle handle, SANE_Int option, SANE_Action action, return SANE_STATUS_INVAL; } + +static void setBit (SANE_Byte* bytes, SANE_Int bitIndex, SANE_Bool isTrue) +{ + SANE_Int octet = bitIndex / 8; + SANE_Byte bit = 7 - (bitIndex % 8); + + if (isTrue) { + bytes[octet] |= (1 << bit); + } else { + bytes[octet] &= ~(1 << bit); + } +} + +static SANE_Bool getBit (SANE_Byte* bytes, SANE_Int bitIndex) +{ + SANE_Int octet = bitIndex / 8; + SANE_Byte mask = 1 << (7 - (bitIndex % 8)); + + if( bytes[octet] & mask ){ + return SANE_TRUE; + } + + return SANE_FALSE; +} + +static void swapPixel1(SANE_Int x1, + SANE_Int y1, + SANE_Int x2, + SANE_Int y2, + SANE_Byte* bytes, + SANE_Byte bitsPerSample, + SANE_Int samplesPerPixel, + SANE_Int bytesPerRow) +{ + SANE_Int pixelBits = bitsPerSample * samplesPerPixel; + SANE_Int widthBits = bytesPerRow * 8; + + SANE_Byte temp = getBit(bytes, widthBits * y1 + x1 * pixelBits); + { + SANE_Byte right = getBit(bytes, widthBits * y2 + x2 * pixelBits); + setBit(bytes, widthBits * y1 + x1 * pixelBits, right); + } + setBit(bytes, widthBits * y2 + x2 * pixelBits, temp); +} + +static void swapPixel8(SANE_Int x1, + SANE_Int y1, + SANE_Int x2, + SANE_Int y2, + SANE_Byte* bytes, + SANE_Byte bitsPerSample, + SANE_Int samplesPerPixel, + SANE_Int bytesPerRow) +{ + SANE_Int pixelBytes = samplesPerPixel * bitsPerSample / 8; + + for (SANE_Byte i = 0; i < pixelBytes; i++) { + SANE_Byte temp = bytes[y1 * bytesPerRow + (pixelBytes * x1 + i)]; + bytes[y1 * bytesPerRow + (pixelBytes * x1 + i)] = bytes[y2 * bytesPerRow + (pixelBytes * x2 + i)]; + bytes[y2 * bytesPerRow + (pixelBytes * x2 + i)] = temp; + } +} + + + +static void swapPixel(SANE_Int x1, + SANE_Int y1, + SANE_Int x2, + SANE_Int y2, + SANE_Byte* bytes, + SANE_Byte bitsPerSample, + SANE_Int samplesPerPixel, + SANE_Int bytesPerRow) +{ + if (bitsPerSample == 1) { + swapPixel1(x1, y1, x2, y2, bytes, bitsPerSample, samplesPerPixel, bytesPerRow); + }else if(bitsPerSample == 8 || bitsPerSample == 16){ + swapPixel8(x1, y1, x2, y2, bytes, bitsPerSample, samplesPerPixel, bytesPerRow); + } +} + + +void +upside_down_backside_image(epsonds_scanner *s) +{ + // get all data from ring_buffer + if (eds_ring_avail(&s->back) && + (strcmp(s->hw->sane.model, (char*)"DS-1630") == 0 + || strcmp(s->hw->sane.model, (char*)"DS-1610") == 0 + || strcmp(s->hw->sane.model, (char*)"DS-1660W") == 0)) + { + SANE_Int bytesPerLine = s->params.bytes_per_line; + SANE_Int imageSize = bytesPerLine * s->height_back; + + SANE_Byte* workBuffer = malloc(imageSize); + // if there is not enough memory, do nothing. + if (workBuffer) + { + eds_ring_read(&s->back, workBuffer, imageSize); + SANE_Int samplesPerPxel = 3; + if (s->params.format == SANE_FRAME_RGB) + { + samplesPerPxel = 3; + } + else if (s->params.format == SANE_FRAME_GRAY) + { + samplesPerPxel = 1; + } + + SANE_Int half = (s->height_back / 2) - 1; + if (half < 0) { + half = 0; + } + + if((s->height_back % 2) == 1) { + SANE_Int ymid = ( (s->height_back - 1 ) / 2 ); + for(SANE_Int x = 0;x < (s->width_back / 2); x++) { + swapPixel(x, ymid, s->width_back - x - 1, ymid, workBuffer, s->params.depth, samplesPerPxel, s->params.bytes_per_line); + } + } + + if (s->height_back != 1) { + for(SANE_Int x = 0; x < s->width_back; x++) { + for(SANE_Int y = 0;y <= half; y++) { + swapPixel(x, y, s->width_back - x - 1, s->height_back - y -1, workBuffer, s->params.depth, samplesPerPxel, s->params.bytes_per_line); + } + } + } + + eds_ring_write(&s->back, workBuffer, imageSize); + free(workBuffer); + workBuffer = NULL; + + } + } + +} + + +SANE_Status +get_next_image(epsonds_scanner *s) +{ + SANE_Status status = SANE_STATUS_GOOD; + + if (s->acquirePage == 0 && s->current == &s->front) + { + DBG(20, "** %s: get_next_image\n", __func__); + + + /*page info will be updatted by pen*/ + s->width_back = 0; + s->width_front = 0; + s->height_back = 0; + s->height_front = 0; + + if (s->mode_jpeg) + { + status = acquire_and_decode_jpeg_data(s); + }else{ + status = acquire_raw_data(s); + } + if (status != SANE_STATUS_GOOD) + { + eds_ring_flush(&s->front); + eds_ring_flush(&s->back); + eds_ring_destory(&s->front); + eds_ring_destory(&s->back); + } + DBG(20," ringFront = %d ringBack = %d\n", eds_ring_avail(&s->front), eds_ring_avail(&s->back)); + + s->acquirePage = 1; + } + + return status; +} + + SANE_Status sane_get_parameters(SANE_Handle handle, SANE_Parameters *params) { @@ -1173,25 +2642,186 @@ sane_get_parameters(SANE_Handle handle, SANE_Parameters *params) eds_init_parameters(s); } + + SANE_Status status = SANE_STATUS_GOOD; + + status = get_next_image(s); + + // if size auto, update page size value + if(s->val[OPT_ADF_CRP].w) + { + // frontside + if (s->current == &s->front) + { + DBG(20, "front side \n"); + if (s->width_front != 0 && s->height_front != 0) + { + if (s->params.format == SANE_FRAME_RGB) + { + s->params.bytes_per_line = s->width_front * 3; + s->params.pixels_per_line = s->width_front; + } + + if (s->params.format == SANE_FRAME_GRAY && s->params.depth == 8) + { + s->params.bytes_per_line = s->width_front; + s->params.pixels_per_line = s->width_front; + } + + if (s->params.format == SANE_FRAME_GRAY && s->params.depth == 1) + { + s->params.bytes_per_line = (s->width_front + 7)/8; + s->params.pixels_per_line = s->width_front; + } + s->params.lines = s->height_front; + } + } + // backside + if (s->current == &s->back) + { + DBG(20, "back side \n"); + if (s->width_back != 0 && s->height_back != 0) + { + if (s->params.format == SANE_FRAME_RGB) + { + s->params.bytes_per_line = s->width_back * 3; + s->params.pixels_per_line = s->width_back; + } + + if (s->params.format == SANE_FRAME_GRAY && s->params.depth == 8) + { + s->params.bytes_per_line = s->width_back; + s->params.pixels_per_line = s->width_back; + } + + if (s->params.format == SANE_FRAME_GRAY && s->params.depth == 1) + { + s->params.bytes_per_line = (s->width_back + 7)/8; + s->params.pixels_per_line = s->width_back; + } + s->params.lines = s->height_back; + } + } + } if (params != NULL) *params = s->params; print_params(s->params); - return SANE_STATUS_GOOD; + DBG(20, "s->params.line = %d s->params.bytes_per_line = %d s->params.pixels_per_line = %d \n", s->params.lines, s->params.bytes_per_line , s->params.pixels_per_line ); + return status; +} + + + +typedef float ColorMatrix[3][3]; + +#define CCT_TABLE_SIZE 9 +static int get_roundup_index(double frac[], int n) +{ + int i, index = -1; + double max_val = 0.0; + + for (i=0; i<n; i++) { + if (frac[i]<0) continue; + if (max_val<frac[i]) { + index = i; + max_val = frac[i]; + } + } + return index; +} + +static int get_rounddown_index(double frac[], int n) +{ + int i, index = -1; + double min_val = 1.0; + + for (i=0; i<n; i++) { + if (frac[i]>0) continue; + if (min_val>frac[i]) { + index = i; + min_val = frac[i]; + } + } + return index; } + +void ESCIRoundColorCorrectionMatrix(int mult, double org_cct[], int rnd_cct[]) +{ + int i, j, index; + double mult_cct[CCT_TABLE_SIZE], frac[CCT_TABLE_SIZE]; + int sum[3]; + int loop; + + for (i=0; i<CCT_TABLE_SIZE; i++) { + mult_cct[i] = org_cct[i] * mult; + } + + // round value multiplied by 'mult' off to integer. + for (i=0; i<CCT_TABLE_SIZE; i++) { + rnd_cct[i] = (int)floor(org_cct[i] * mult + 0.5); + } + + loop=0; + do { + // If all element equal to 11, diagonal element is set to 10. + for (i=0; i<3; i++) { + if ( (rnd_cct[i*3]==11) && + (rnd_cct[i*3]==rnd_cct[i*3+1]) && + (rnd_cct[i*3]==rnd_cct[i*3+2]) ) { + rnd_cct[i*3+i] --; + mult_cct[i*3+i] = rnd_cct[i*3+i]; + } + } + // calc. summation of each line. + for (i=0; i<3; i++) { + sum[i] = 0; + for (j=0; j<3; j++) { + sum[i] += rnd_cct[i*3+j]; + } + } + // calc. values rounded up or down. + for (i=0; i<CCT_TABLE_SIZE; i++) { + frac[i] = mult_cct[i] - rnd_cct[i]; + } + + // if summation does not equal to 'mult', adjust rounded up or down value. + for (i=0; i<3; i++) { + if (sum[i]<mult) { + index = get_roundup_index(&frac[i*3], 3); + if (index!=-1) { + rnd_cct[i*3+index] ++; + mult_cct[i*3+index] = rnd_cct[i*3+index]; + sum[i]++; + } + } else if (sum[i]>mult) { + index = get_rounddown_index(&frac[i*3], 3); + if (index!=-1) { + rnd_cct[i*3+index] --; + mult_cct[i*3+index] = rnd_cct[i*3+index]; + sum[i]--; + } + } + } + + } while ((++loop<2)&&((sum[0]!=mult)||(sum[1]!=mult)||(sum[2]!=mult))); +} + + + /* * This function is part of the SANE API and gets called from the front end to * start the scan process. */ - +#define CMD_BUF_SIZE 1000 SANE_Status sane_start(SANE_Handle handle) { epsonds_scanner *s = (epsonds_scanner *)handle; char buf[65]; /* add one more byte to correct buffer overflow issue */ - char cmd[100]; /* take care not to overflow */ + char cmd[CMD_BUF_SIZE]; /* take care not to overflow */ SANE_Status status = 0; s->pages++; @@ -1203,26 +2833,28 @@ sane_start(SANE_Handle handle) s->eof = 0; s->canceling = 0; + s->acquirePage = 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) { + if (s->scanning || eds_ring_avail(&s->back) > 0) { DBG(5, " scan in progress, returning early\n"); - return SANE_STATUS_GOOD; + return get_next_image(s); + } + if (strcmp(source_list[s->val[OPT_SOURCE].w], STRING_ADFFRONT) == 0 || strcmp(source_list[s->val[OPT_SOURCE].w], STRING_ADFDUPLEX) == 0) { + if (s->scanEnd) + { + s->scanEnd = 0; + return SANE_STATUS_NO_DOCS; + } + }else{ + s->scanEnd = 0; } /* calc scanning parameters */ @@ -1239,13 +2871,7 @@ sane_start(SANE_Handle handle) /* transfer buffer size, bsz */ /* XXX read value from scanner */ - s->bsz = (65536 * 4); - - /* ring buffer for front page */ - status = eds_ring_init(&s->front, s->bsz * 2); - if (status != SANE_STATUS_GOOD) { - return status; - } + s->bsz = (1048576 * 4); /* transfer buffer */ s->buf = realloc(s->buf, s->bsz); @@ -1256,29 +2882,34 @@ sane_start(SANE_Handle handle) /* set scanning parameters */ + s->isDuplexScan = 0; /* document source */ - if (strcmp(source_list[s->val[OPT_SOURCE].w], ADF_STR) == 0) { + if (strcmp(source_list[s->val[OPT_SOURCE].w], STRING_ADFFRONT) == 0 || strcmp(source_list[s->val[OPT_SOURCE].w], STRING_ADFDUPLEX) == 0) { - sprintf(buf, "#ADF%s%s", - s->val[OPT_ADF_MODE].w ? "DPLX" : "", - s->val[OPT_ADF_SKEW].w ? "SKEW" : ""); + SANE_Int status = esci2_stat(s); + if (status == SANE_STATUS_NO_DOCS) + { + return SANE_STATUS_NO_DOCS; + } - /* it seems that DFL only works in duplex mode, but it's - * also required to be enabled or duplex will be rejected. - */ + SANE_Int duplexMode = (strcmp(source_list[s->val[OPT_SOURCE].w], STRING_ADFDUPLEX) == 0); - if (s->val[OPT_ADF_MODE].w) { + sprintf(buf, "#ADF%s%s%s", + duplexMode ? "DPLX" : "", + s->val[OPT_ADF_SKEW].w ? "SKEW" : "", + s->val[OPT_ADF_CRP].w ? "CRP " : "" + ); - if (s->hw->adf_has_dfd == 2) { - strcat(buf, "DFL2"); - } else if (s->hw->adf_has_dfd == 1) { - strcat(buf, "DFL1"); - } + if (duplexMode) + { + s->isDuplexScan = 1; } - - } else if (strcmp(source_list[s->val[OPT_SOURCE].w], FBF_STR) == 0) { + s->isflatbedScan = 0; + } + else if (strcmp(source_list[s->val[OPT_SOURCE].w], STRING_FLATBED) == 0) { strcpy(buf, "#FB "); + s->isflatbedScan = 1; } else { /* XXX */ @@ -1286,8 +2917,18 @@ sane_start(SANE_Handle handle) strcpy(cmd, buf); + s->needToConvertBW = 0; + if (s->params.format == SANE_FRAME_GRAY) { - sprintf(buf, "#COLM%03d", s->params.depth); + if (s->params.depth == 1 && s->hw->has_mono == 0) + { + sprintf(buf, "#COLM008"); + s->needToConvertBW = 1; + s->mode_jpeg = 1; + }else + { + sprintf(buf, "#COLM%03d", s->params.depth); + } } else if (s->params.format == SANE_FRAME_RGB) { sprintf(buf, "#COLC%03d", s->params.depth * 3); } @@ -1303,9 +2944,29 @@ sane_start(SANE_Handle handle) strcat(cmd, "#FMTJPG #JPGd090"); } + /* set GMM */ + if (s->params.depth == 1) + { + sprintf(buf, "#GMMUG10"); + } else + { + sprintf(buf, "#GMMUG18"); + } + strcat(cmd, buf); + /* resolution (RSMi not always supported) */ - if (s->val[OPT_RESOLUTION].w > 999) { + if (strcmp(source_list[s->val[OPT_SOURCE].w], STRING_ADFFRONT) == 0 && s->val[OPT_RESOLUTION].w > 600) { + DBG(0, "Automatic Document Feeder supported resolution of 600dpi or less. \n"); + } else if (s->val[OPT_RESOLUTION].w > 999) { + sprintf(buf, "#RSMi%07d#RSSi%07d", s->val[OPT_RESOLUTION].w, s->val[OPT_RESOLUTION].w); + } else { + sprintf(buf, "#RSMd%03d#RSSd%03d", s->val[OPT_RESOLUTION].w, s->val[OPT_RESOLUTION].w); + } + + if (strcmp(source_list[s->val[OPT_SOURCE].w], STRING_ADFDUPLEX) == 0 && s->val[OPT_RESOLUTION].w > 600) { + DBG(0, "Automatic Document Feeder supported resolution of 600dpi or less. \n"); + } else if (s->val[OPT_RESOLUTION].w > 999) { sprintf(buf, "#RSMi%07d#RSSi%07d", s->val[OPT_RESOLUTION].w, s->val[OPT_RESOLUTION].w); } else { sprintf(buf, "#RSMd%03d#RSSd%03d", s->val[OPT_RESOLUTION].w, s->val[OPT_RESOLUTION].w); @@ -1313,13 +2974,321 @@ sane_start(SANE_Handle handle) strcat(cmd, buf); + if (strcmp(s->hw->sane.model, (char*)"DS-70") == 0 || strcmp(s->hw->sane.model, (char*)"ES-65WR") == 0 || strcmp(s->hw->sane.model, (char*)"ES-60W") == 0 + || strcmp(s->hw->sane.model, (char*)"DS-80W") == 0 || strcmp(s->hw->sane.model, (char*)"ES-55R") == 0 || strcmp(s->hw->sane.model, (char*)"ES-50") == 0){ + sprintf(buf, "#BSZi0262144"); + strcat(cmd, buf); + } + else { + sprintf(buf, "#BSZi1048576"); + strcat(cmd, buf); + } + + /* scanning area */ + sprintf(buf, "#ACQi%07di%07di%07di%07d", s->left, s->top, s->params.pixels_per_line, s->params.lines); + + if (strcmp(source_list[s->val[OPT_SOURCE].w], STRING_ADFFRONT) == 0 || strcmp(source_list[s->val[OPT_SOURCE].w], STRING_ADFDUPLEX) == 0) { + status = esci2_stat(s); + if (status != SANE_STATUS_GOOD) { + goto end; + } + } + strcat(cmd, buf); - status = esci2_para(s, cmd); + + int pos = 0; + + { + for (int i = 0; i < CMD_BUF_SIZE; i++) + { + // find end of string + if(cmd[i] == 0) + { + pos = i; + break; + } + } + + + if (s->params.format == SANE_FRAME_GRAY && s->params.depth == 8) { + DBG(10, "SANE_FRAME_GRAY\n"); + cmd[pos++] = '#'; + cmd[pos++] = 'G'; + cmd[pos++] = 'M'; + cmd[pos++] = 'T'; + cmd[pos++] = 'M'; + cmd[pos++] = 'O'; + cmd[pos++] = 'N'; + cmd[pos++] = 'O'; + cmd[pos++] = 'h'; + cmd[pos++] = '1'; + cmd[pos++] = '0'; + cmd[pos++] = '0'; + + for(int count = 0; count < 256; count++) { + cmd[pos++] = LUT[s->hw->lut_id][count]; + } + } + if (s->params.format == SANE_FRAME_GRAY && s->params.depth == 1) { + DBG(10, "SANE_FRAME_GRAY\n"); + cmd[pos++] = '#'; + cmd[pos++] = 'G'; + cmd[pos++] = 'M'; + cmd[pos++] = 'T'; + cmd[pos++] = 'M'; + cmd[pos++] = 'O'; + cmd[pos++] = 'N'; + cmd[pos++] = 'O'; + cmd[pos++] = 'h'; + cmd[pos++] = '1'; + cmd[pos++] = '0'; + cmd[pos++] = '0'; + + for(int count = 0; count < 256; count++) { + cmd[pos++] = LUT[0][count]; + } + } + else if (s->params.format == SANE_FRAME_RGB) { + DBG(10, "SANE_FRAME_RGB\n"); + cmd[pos++] = '#'; + cmd[pos++] = 'G'; + cmd[pos++] = 'M'; + cmd[pos++] = 'T'; + cmd[pos++] = 'R'; + cmd[pos++] = 'E'; + cmd[pos++] = 'D'; + cmd[pos++] = ' '; + cmd[pos++] = 'h'; + cmd[pos++] = '1'; + cmd[pos++] = '0'; + cmd[pos++] = '0'; + + for(int count = 0; count < 256; count++) { + cmd[pos++] = LUT_R[s->hw->lut_id][count]; + } + + cmd[pos++] = '#'; + cmd[pos++] = 'G'; + cmd[pos++] = 'M'; + cmd[pos++] = 'T'; + cmd[pos++] = 'G'; + cmd[pos++] = 'R'; + cmd[pos++] = 'N'; + cmd[pos++] = ' '; + cmd[pos++] = 'h'; + cmd[pos++] = '1'; + cmd[pos++] = '0'; + cmd[pos++] = '0'; + + for(int count = 0; count < 256; count++) { + cmd[pos++] = LUT_G[s->hw->lut_id][count]; + } + + cmd[pos++] = '#'; + cmd[pos++] = 'G'; + cmd[pos++] = 'M'; + cmd[pos++] = 'T'; + cmd[pos++] = 'B'; + cmd[pos++] = 'L'; + cmd[pos++] = 'U'; + cmd[pos++] = ' '; + cmd[pos++] = 'h'; + cmd[pos++] = '1'; + cmd[pos++] = '0'; + cmd[pos++] = '0'; + + for(int count = 0; count < 256; count++) { + cmd[pos++] = LUT_B[s->hw->lut_id][count]; + } + } + cmd[pos] = 0; + + } + {// Set Color Matrix + if (s->params.format == SANE_FRAME_RGB && s->hw->lut_id != 0 )/*Color Matrix Target devide and color Scan*/ + { + ColorMatrix matrix; + + // DS-530 + + if (s->hw->lut_id == 2) + { + // R + matrix[0][0] = 1.0229; + matrix[0][1] = 0.0009; + matrix[0][2] = -0.0238; + + // G + matrix[1][0] = 0.0031; + matrix[1][1] = 1.0287; + matrix[1][2] = -0.0318; + + //B + matrix[2][0] = 0.0044; + matrix[2][1] = -0.1150; + matrix[2][2] = 1.1106; + } + + // DS-1660W Flatbed + + if (s->hw->lut_id == 4) + { + // R + matrix[0][0] = 1.0229; + matrix[0][1] = 0.0009; + matrix[0][2] = -0.0238; + + // G + matrix[1][0] = 0.0031; + matrix[1][1] = 1.0287; + matrix[1][2] = -0.0318; + + //B + matrix[2][0] = 0.0044; + matrix[2][1] = -0.1150; + matrix[2][2] = 1.1106; + } + + + // DS-320 + + if (s->hw->lut_id == 5) + { + // R + matrix[0][0] = 1.0250; + matrix[0][1] = 0.0004; + matrix[0][2] = -0.0254; + + // G + matrix[1][0] = 0.0003; + matrix[1][1] = 1.0022; + matrix[1][2] = -0.0025; + + //B + matrix[2][0] = 0.0049; + matrix[2][1] = -0.0949; + matrix[2][2] = 1.0900; + } + + + // ES-50 + + if (s->hw->lut_id == 6) + { + // R + matrix[0][0] = 1.0383; + matrix[0][1] = -0.0021; + matrix[0][2] = -0.0362; + + // G + matrix[1][0] = 0.0046; + matrix[1][1] = 1.0576; + matrix[1][2] = -0.0622; + + //B + matrix[2][0] = 0.0235; + matrix[2][1] = -0.2396; + matrix[2][2] = 1.2161; + } + + + // R + matrix[0][0] = 0.9864; + matrix[0][1] = 0.0248; + matrix[0][2] = -0.0112; + + // G + matrix[1][0] = 0.0021; + matrix[1][1] = 1.0100; + matrix[1][2] = -0.0112; + + //B + matrix[2][0] = 0.0139; + matrix[2][1] = -0.1249; + matrix[2][2] = 1.1110; + + + // Set Matrix value + { + cmd[pos++] = '#'; + cmd[pos++] = 'C'; + cmd[pos++] = 'M'; + cmd[pos++] = 'X'; + cmd[pos++] = 'U'; + cmd[pos++] = 'M'; + cmd[pos++] = '0'; + cmd[pos++] = '8'; + cmd[pos++] = 'h'; + cmd[pos++] = '0'; + cmd[pos++] = '0'; + cmd[pos++] = '9'; + } + + + // Matrix to be sent to scanner must be following d1-d9 order: + // + // G R B + // G [d1 d4 d7] + // R [d2 d5 d8] + // B [d3 d6 d9] + // + // So, we will convert it with index table. + char index[9] = {4, 1, 7, 3, 0, 6, 5, 2, 8}; + + double flatten[9] = {0}; + for (int row = 0; row < 3; row++) { + for (int col = 0; col < 3; col++) { + flatten[row * 3 + col] = matrix[row][col]; + } + } + + int rounded[9] = {0}; + ESCIRoundColorCorrectionMatrix(32, flatten, rounded); + + + char ordered[9] = {0}; + for (int row = 0; row < 3; row++) { + for (int col = 0; col < 3; col++) { + int val = rounded[row * 3 + col]; + unsigned char oct = (unsigned char)abs(val); + oct |= ((val < 0) ? (1 << 7) : 0); + ordered[(signed char)index[row * 3 + col]] = oct; + } + } + { + cmd[pos++] = ordered[0]; + cmd[pos++] = ordered[1]; + cmd[pos++] = ordered[2]; + cmd[pos++] = ordered[3]; + cmd[pos++] = ordered[4]; + cmd[pos++] = ordered[5]; + cmd[pos++] = ordered[6]; + cmd[pos++] = ordered[7]; + cmd[pos++] = ordered[8]; + cmd[pos++] = 0; //padding + cmd[pos++] = 0; //padding + cmd[pos++] = 0; //padding + + + DBG(1, "color matrix\n"); + for (int i = 0; i < 9; i++) + { + DBG(1, "%d\n", ordered[i]); + } + + } + cmd[pos] = 0; + } + + } + + + status = esci2_para(s, cmd, pos); if (status != SANE_STATUS_GOOD) { goto end; } @@ -1336,7 +3305,8 @@ sane_start(SANE_Handle handle) /* first page is page 1 */ s->pages = 1; s->scanning = 1; - + s->dummy = 0; + s->scanEnd = 0; end: if (status != SANE_STATUS_GOOD) { DBG(1, "%s: start failed: %s\n", __func__, sane_strstatus(status)); @@ -1345,140 +3315,305 @@ end: 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) +static SANE_Status acquire_jpeg_data(epsonds_scanner* s) { - SANE_Int read = 0, tries = 3; - SANE_Int available; - SANE_Status status = 0; - epsonds_scanner *s = (epsonds_scanner *)handle; - *length = read = 0; + SANE_Int 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; + SANE_Int jpegBufSize = s->params.bytes_per_line * s->params.lines; + if (s->needToConvertBW) + { + jpegBufSize = s->params.pixels_per_line * s->params.lines; } - /* 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); + s->frontJpegBuf = malloc(jpegBufSize); + s->backJpegBuf = malloc(jpegBufSize); + s->frontJpegBufLen = 0; + s->backJpegBufLen = 0; + + // load all images, decode and fill buffer + SANE_Int status = SANE_STATUS_GOOD; - if (s->mode_jpeg && !s->jpeg_header_seen) { + int eofFront = 0; + int eofBack = 0; - status = eds_jpeg_read_header(s); - if (status != SANE_STATUS_GOOD && --tries) { - goto read_again; + + status = eds_ring_init(&s->front, (s->params.bytes_per_line) * s->params.lines); + if (status != SANE_STATUS_GOOD) { + return status; + } + + status = eds_ring_init(&s->back, (s->params.bytes_per_line) * s->params.lines); + if (status != SANE_STATUS_GOOD) { + return status; + } + + while (1) + { + status = esci2_img(s, &read); + DBG(20, "acquire_jpeg_data read: %d, eof: %d, backside: %d, status: %d\n", read, s->eof, s->backside, status); + if (read) + { + if (s->backside) + { + SANE_Byte* backBuffer = s->backJpegBuf + s->backJpegBufLen; + memcpy(backBuffer, s->buf, read); + s->backJpegBufLen += read; + }else{ + SANE_Byte* frontBuffer = s->frontJpegBuf + s->frontJpegBufLen ; + memcpy(frontBuffer, s->buf, read); + s->frontJpegBufLen += read; } } + if (status == SANE_STATUS_GOOD) + { - if (s->mode_jpeg) { - eds_jpeg_read(handle, data, max_length, &read); - } else { - eds_copy_image_from_ring(s, data, max_length, &read); + DBG(20, "continue acquire image\n"); + continue; } - - if (read == 0) { - goto read_again; + else if (status == SANE_STATUS_EOF) + { + if (s->backside) + { + DBG(20, "eofBack\n"); + eofBack = 1; + }else{ + DBG(20, "eofFront\n"); + eofFront = 1; + } + }else if (status == SANE_STATUS_CANCELLED) + { + // cancel cleanup + esci2_can(s); + + free(s->frontJpegBuf); + free(s->backJpegBuf); + s->frontJpegBuf = NULL; + s->backJpegBuf = NULL; + return status; + }else{ + // error occurs cleanup + free(s->frontJpegBuf); + free(s->backJpegBuf); + s->frontJpegBuf = NULL; + s->backJpegBuf = NULL; + return status; } - *length = read; - return SANE_STATUS_GOOD; + if (s->isDuplexScan) + { + DBG(20, "eofFront = %d eofBack = %d\n", eofFront, eofBack); + // acquire finish + if (eofFront && eofBack) + { + DBG(20, "eofFront && eofBack end\n"); + break; + } + }else{ + if (eofFront) + { + DBG(20, "eofFront end\n"); + break; + } + } + } + return SANE_STATUS_GOOD; +} - } else if (s->current == &s->back) { +static SANE_Status +acquire_raw_data(epsonds_scanner* s) +{ + SANE_Int read = 0; - /* finished reading the back page, next - * command should give us the EOF - */ - DBG(18, "back side ring buffer empty\n"); - } + // load all images, decode and fill buffer + SANE_Int status = SANE_STATUS_GOOD; - /* read until data or error */ + int eofFront = 0; + int eofBack = 0; + int firstWrite = 1; -read_again: + while (1) + { + DBG(20, "acquire_raw_data loop start\n"); + status = esci2_img(s, &read); + DBG(20, "acquire_raw_data read: %d, eof: %d, backside: %d, status: %d\n", read, s->eof, s->backside, status); + + if (read) + { + if (firstWrite) + { + status = eds_ring_init(&s->front, (s->params.bytes_per_line + s->dummy) * s->params.lines); + if (status != SANE_STATUS_GOOD) { + return status; + } + + status = eds_ring_init(&s->back, (s->params.bytes_per_line + s->dummy) * s->params.lines); + if (status != SANE_STATUS_GOOD) { + return status; + } + firstWrite = 0; + } - 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); - } + DBG(20, "eds_ring_write start\n"); + status = eds_ring_write(s->backside ? &s->back : &s->front, s->buf, read); + DBG(20, "eds_ring_write end\n"); + } + DBG(20, "acquire_raw_data3\n"); - /* just got a back side page, alloc ring buffer if necessary - * we didn't before because dummy was not known - */ - if (s->backside) { + if (status == SANE_STATUS_GOOD) + { + DBG(20, "contiune acquire image\n"); + continue; + } + else if (status == SANE_STATUS_EOF) + { + if (s->backside) + { + eofBack = 1; + }else{ + eofFront = 1; + } + } + else if (status == SANE_STATUS_CANCELLED) + { + esci2_can(s); + return status; + }else{ + // error occurs cleanup + return status; + } - int required = s->params.lines * (s->params.bytes_per_line + s->dummy); + if (s->isDuplexScan) + { + // acquire finish + if (eofFront && eofBack) + { + break; + } + }else{ + if (eofFront) + { + break; + } + } + } - if (s->back.size < required) { - DBG(20, "allocating buffer for the back side\n"); + int needBytes = (s->params.bytes_per_line + s->dummy) * s->params.lines; + { + int available = eds_ring_avail(&s->front); + if (available < needBytes) + { + int required = needBytes - available; + unsigned char* padding = (unsigned char*)malloc(required); + memset(padding, 255, required); + eds_ring_write(&s->front, padding, required); + free(padding); - 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; } + { + int available = eds_ring_avail(&s->back); + if (available > 0 && available < needBytes) + { + int required = needBytes - available; + unsigned char* padding = (unsigned char*)malloc(required); + memset(padding, 255, required); + eds_ring_write(&s->back, padding, required); + free(padding); + } - 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; + if (s->isDuplexScan) + { + upside_down_backside_image(s); } - /* 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); + DBG(20, "acquire_raw_data finish"); + return SANE_STATUS_GOOD; - /* 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) { +static SANE_Status +acquire_and_decode_jpeg_data(epsonds_scanner* s) +{ + SANE_Int status = acquire_jpeg_data(s); + if (status == SANE_STATUS_GOOD) + { + DBG(20, "** %s: sane status = %d needToConvertBW = %d \n", __func__, status, s->needToConvertBW); + + // process front page + if (s->frontJpegBufLen > 0) + { + eds_decode_jpeg(s, s->frontJpegBuf, s->frontJpegBufLen, &s->front,0, s->needToConvertBW); + free(s->frontJpegBuf); + s->frontJpegBuf = NULL; + } + // process back page + if (s->backJpegBufLen > 0) + { + eds_decode_jpeg(s, s->backJpegBuf, s->backJpegBufLen, &s->back, 1, s->needToConvertBW); + free(s->backJpegBuf); + s->backJpegBuf = NULL; + } - status = eds_jpeg_read_header(s); - if (status != SANE_STATUS_GOOD && --tries) { - goto read_again; + if (s->isDuplexScan) + { + upside_down_backside_image(s); } + }else{ + DBG(20, "** %s: sane finish status = %d\n", __func__, status); + return status; } - } - - /* continue reading if appropriate */ - if (status == SANE_STATUS_GOOD) return status; +} - /* cleanup */ - DBG(5, "** %s: cleaning up\n", __func__); +int sumLength = 0; +/* 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) +{ + epsonds_scanner *s = (epsonds_scanner *)handle; + SANE_Int read = 0; - if (s->mode_jpeg) { - eds_jpeg_finish(s); + if (s->canceling) + { + esci2_can(s); + *length = 0; + return SANE_STATUS_CANCELLED; } - eds_ring_flush(s->current); + int available = eds_ring_avail(s->current); + /* anything in the buffer? pass it to the frontend */ + if (available > 0) { - return status; + DBG(18, "reading from ring buffer, %d left\n", available); + + eds_copy_image_from_ring(s, data, max_length, &read); + + // data is empty fin + if (read == 0) { + *length = 0; + eds_ring_flush(s->current); + eds_ring_destory(s->current); + DBG(18, "returns EOF 2\n"); + return SANE_STATUS_EOF; + } + *length = read; + + return SANE_STATUS_GOOD; + }else{ + *length = 0; + eds_ring_flush(s->current); + eds_ring_destory(s->current); + DBG(18, "returns EOF 1\n"); + return SANE_STATUS_EOF; + } } /* diff --git a/backend/epsonds.conf.in b/backend/epsonds.conf.in index 1967a00..e2880fa 100644 --- a/backend/epsonds.conf.in +++ b/backend/epsonds.conf.in @@ -10,7 +10,8 @@ usb # e.g.: # usb 0x4b8 0x14c -# Network (not yet supported!) +# +# Network # # net 192.168.1.123 -#net autodiscovery +net autodiscovery diff --git a/backend/epsonds.h b/backend/epsonds.h index 04cb724..7f1b650 100644 --- a/backend/epsonds.h +++ b/backend/epsonds.h @@ -66,9 +66,14 @@ #define TPU_STR SANE_I18N("Transparency Unit") #define ADF_STR SANE_I18N("Automatic Document Feeder") +#define STRING_FLATBED SANE_I18N("Flatbed") +#define STRING_ADFFRONT SANE_I18N("ADF Front") +#define STRING_ADFDUPLEX SANE_I18N("ADF Duplex") + enum { OPT_NUM_OPTS = 0, - OPT_MODE_GROUP, + OPT_STANDARD_GROUP, + OPT_SOURCE, OPT_MODE, OPT_DEPTH, OPT_RESOLUTION, @@ -78,11 +83,10 @@ enum { OPT_BR_X, OPT_BR_Y, OPT_EQU_GROUP, - OPT_SOURCE, OPT_EJECT, OPT_LOAD, - OPT_ADF_MODE, OPT_ADF_SKEW, + OPT_ADF_CRP, NUM_OPTIONS }; @@ -119,6 +123,8 @@ struct epsonds_device SANE_Bool has_raw; /* supports RAW format */ + SANE_Bool has_mono; /*supprt M001*/ + SANE_Bool has_fb; /* flatbed */ SANE_Range fbf_x_range; /* x range */ SANE_Range fbf_y_range; /* y range */ @@ -136,9 +142,13 @@ struct epsonds_device SANE_Byte adf_alignment; /* left, center, right */ SANE_Byte adf_has_dfd; /* supports double feed detection */ + SANE_Byte adf_has_crp; /* supports crp */ + SANE_Bool has_tpu; /* tpu */ SANE_Range tpu_x_range; /* transparency unit x range */ SANE_Range tpu_y_range; /* transparency unit y range */ + + SANE_Int lut_id; }; typedef struct epsonds_device epsonds_device; @@ -171,6 +181,10 @@ struct epsonds_scanner SANE_Int left, top, pages, dummy; + SANE_Int width_front, height_front; + SANE_Int width_back , height_back; + SANE_Int width_temp, height_temp; + /* jpeg stuff */ djpeg_dest_ptr jdst; @@ -181,7 +195,18 @@ struct epsonds_scanner /* network buffers */ unsigned char *netbuf, *netptr; size_t netlen; -}; + + SANE_Byte *frontJpegBuf, *backJpegBuf; + SANE_Int frontJpegBufLen, backJpegBufLen; + SANE_Int acquirePage; + + SANE_Int isflatbedScan; + SANE_Int isDuplexScan; + + SANE_Int needToConvertBW; + + SANE_Int scanEnd; + }; typedef struct epsonds_scanner epsonds_scanner; diff --git a/backend/escl.conf.in b/backend/escl.conf.in index 18ea516..8c6bb04 100644 --- a/backend/escl.conf.in +++ b/backend/escl.conf.in @@ -11,6 +11,11 @@ # You can also configure a device on a single line starting with 'device' # by writing a complete URL and an optional model name. + +# Name of the device not using the PDF format. Spaces are replaced by _. Please report the devices having this problem on sane-devel +# Uncomment the line to add your device +#pdfblacklist Brother_DCP-L2530DW_series + #device http://123.456.789.10:8080 OptionalModel1 #device https://123.456.789.10:443 "Optional Model 2" #device https://123.456.789.10:443 "HP Color LaserJet FlowMFP M578" "hack=localhost" diff --git a/backend/escl/escl.c b/backend/escl/escl.c index bb62219..5f02ec8 100644 --- a/backend/escl/escl.c +++ b/backend/escl/escl.c @@ -432,7 +432,8 @@ attach_one_config(SANEI_Config __sane_unused__ *config, const char *line, int port = 0; SANE_Status status; static ESCL_Device *escl_device = NULL; - + if (*line == '#') return SANE_STATUS_GOOD; + if (!strncmp(line, "pdfblacklist", 12)) return SANE_STATUS_GOOD; if (strncmp(line, "device", 6) == 0) { char *name_str = NULL; char *opt_model = NULL; @@ -1135,6 +1136,37 @@ finish_hack: fclose(fp); } +static char* +_get_blacklist_pdf(void) +{ + FILE *fp; + char *blacklist = NULL; + SANE_Char line[PATH_MAX]; + + /* open configuration file */ + fp = sanei_config_open (ESCL_CONFIG_FILE); + if (!fp) + { + DBG (2, "_get_blacklit: couldn't access %s\n", ESCL_CONFIG_FILE); + DBG (3, "_get_blacklist: exit\n"); + } + + /* loop reading the configuration file, all line beginning by "option " are + * parsed for value to store in configuration structure, other line are + * used are device to try to attach + */ + while (sanei_config_read (line, PATH_MAX, fp)) + { + if (!strncmp(line, "pdfblacklist", 12)) { + blacklist = strdup(line); + goto finish_; + } + } +finish_: + DBG (3, "_get_blacklist_pdf: finish\n"); + fclose(fp); + return blacklist; +} /** @@ -1149,6 +1181,7 @@ finish_hack: SANE_Status sane_open(SANE_String_Const name, SANE_Handle *h) { + char *blacklist = NULL; DBG (10, "escl sane_open\n"); SANE_Status status; escl_sane_t *handler = NULL; @@ -1173,7 +1206,8 @@ sane_open(SANE_String_Const name, SANE_Handle *h) return (SANE_STATUS_NO_MEM); } handler->device = device; // Handler owns device now. - handler->scanner = escl_capabilities(device, &status); + blacklist = _get_blacklist_pdf(); + handler->scanner = escl_capabilities(device, blacklist, &status); if (status != SANE_STATUS_GOOD) { escl_free_handler(handler); return (status); @@ -1222,9 +1256,11 @@ sane_cancel(SANE_Handle h) } handler->scanner->work = SANE_FALSE; handler->cancel = SANE_TRUE; - escl_scanner(handler->device, handler->result); + escl_scanner(handler->device, handler->scanner->scanJob, handler->result); free(handler->result); handler->result = NULL; + free(handler->scanner->scanJob); + handler->scanner->scanJob = NULL; } /** @@ -1381,6 +1417,7 @@ sane_control_option(SANE_Handle h, SANE_Int n, SANE_Action a, void *v, SANE_Int break; case OPT_RESOLUTION: handler->val[n].w = _get_resolution(handler, (int)(*(SANE_Word *) v)); + handler->scanner->caps[handler->scanner->source].default_resolution = handler->val[n].w; if (i) *i |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS | SANE_INFO_INEXACT; break; @@ -1591,7 +1628,7 @@ sane_start(SANE_Handle h) return SANE_STATUS_NO_DOCS; } } - status = escl_scan(handler->scanner, handler->device, handler->result); + status = escl_scan(handler->scanner, handler->device, handler->scanner->scanJob, handler->result); if (status != SANE_STATUS_GOOD) return (status); if (!strcmp(handler->scanner->caps[handler->scanner->source].default_format, "image/jpeg")) diff --git a/backend/escl/escl.h b/backend/escl/escl.h index 67b11c7..142b4b4 100644 --- a/backend/escl/escl.h +++ b/backend/escl/escl.h @@ -156,6 +156,7 @@ typedef struct capabilities SANE_String_Const *Sources; int SourcesSize; FILE *tmp; + char *scanJob; unsigned char *img_data; long img_size; long img_read; @@ -230,6 +231,7 @@ SANE_Status escl_status(const ESCL_Device *device, SANE_Status *job); capabilities_t *escl_capabilities(ESCL_Device *device, + char *blacklist, SANE_Status *status); char *escl_newjob(capabilities_t *scanner, @@ -238,9 +240,11 @@ char *escl_newjob(capabilities_t *scanner, SANE_Status escl_scan(capabilities_t *scanner, const ESCL_Device *device, + char *scanJob, char *result); void escl_scanner(const ESCL_Device *device, + char *scanJob, char *result); typedef void CURL; diff --git a/backend/escl/escl_capabilities.c b/backend/escl/escl_capabilities.c index db194f9..7422896 100644 --- a/backend/escl/escl_capabilities.c +++ b/backend/escl/escl_capabilities.c @@ -40,6 +40,25 @@ struct cap size_t size; }; +static size_t +header_callback(void *str, size_t size, size_t nmemb, void *userp) +{ + struct cap *header = (struct cap *)userp; + size_t realsize = size * nmemb; + char *content = realloc(header->memory, header->size + realsize + 1); + + if (content == NULL) { + DBG( 1, "Not enough memory (realloc returned NULL)\n"); + return (0); + } + header->memory = content; + memcpy(&(header->memory[header->size]), str, realsize); + header->size = header->size + realsize; + header->memory[header->size] = 0; + return (realsize); +} + + /** * \fn static SANE_String_Const convert_elements(SANE_String_Const str) * \brief Function that converts the 'color modes' of the scanner (color/gray) to be understood by SANE. @@ -182,10 +201,10 @@ find_valor_of_array_variables(xmlNode *node, capabilities_t *scanner, int type) { const char *name = (const char *)node->name; if (strcmp(name, "ColorMode") == 0) { - const char *color = (SANE_String_Const)xmlNodeGetContent(node); - if (type == PLATEN || strcmp(color, "BlackAndWhite1")) + const char *color = (SANE_String_Const)xmlNodeGetContent(node); + if (type == PLATEN || strcmp(color, "BlackAndWhite1")) scanner->caps[type].ColorModes = char_to_array(scanner->caps[type].ColorModes, &scanner->caps[type].ColorModesSize, (SANE_String_Const)xmlNodeGetContent(node), 1); - } + } else if (strcmp(name, "ContentType") == 0) scanner->caps[type].ContentTypes = char_to_array(scanner->caps[type].ContentTypes, &scanner->caps[type].ContentTypesSize, (SANE_String_Const)xmlNodeGetContent(node), 0); else if (strcmp(name, "DocumentFormat") == 0) @@ -385,6 +404,16 @@ find_true_variables(xmlNode *node, capabilities_t *scanner, int type) return (0); } +static char* +replace_char(char* str, char find, char replace){ + char *current_pos = strchr(str,find); + while (current_pos) { + *current_pos = replace; + current_pos = strchr(current_pos,find); + } + return str; +} + /** * \fn static int print_xml_c(xmlNode *node, capabilities_t *scanner) * \brief Function that browses the xml file, node by node. @@ -454,6 +483,37 @@ _reduce_color_modes(capabilities_t *scanner) } } +static void +_delete_pdf(capabilities_t *scanner) +{ + int type = 0; + for (type = 0; type < 3; type++) { + if (scanner->caps[type].ColorModesSize) { + if (scanner->caps[type].default_format) { + scanner->caps[type].have_pdf = -1; + if (!strcmp(scanner->caps[type].default_format, "application/pdf")) { + free(scanner->caps[type].default_format); + if (scanner->caps[type].have_tiff > -1) + scanner->caps[type].default_format = strdup("image/tiff"); + else if (scanner->caps[type].have_png > -1) + scanner->caps[type].default_format = strdup("image/png"); + else if (scanner->caps[type].have_jpeg > -1) + scanner->caps[type].default_format = strdup("image/jpeg"); + } + free(scanner->caps[type].ColorModes); + scanner->caps[type].ColorModes = NULL; + scanner->caps[type].ColorModesSize = 0; + scanner->caps[type].ColorModes = char_to_array(scanner->caps[type].ColorModes, + &scanner->caps[type].ColorModesSize, + (SANE_String_Const)SANE_VALUE_SCAN_MODE_GRAY, 0); + scanner->caps[type].ColorModes = char_to_array(scanner->caps[type].ColorModes, + &scanner->caps[type].ColorModesSize, + (SANE_String_Const)SANE_VALUE_SCAN_MODE_COLOR, 0); + } + } + } +} + /** * \fn capabilities_t *escl_capabilities(const ESCL_Device *device, SANE_Status *status) * \brief Function that finally recovers all the capabilities of the scanner, using curl. @@ -463,15 +523,17 @@ _reduce_color_modes(capabilities_t *scanner) * \return scanner (the structure that stocks all the capabilities elements) */ capabilities_t * -escl_capabilities(ESCL_Device *device, SANE_Status *status) +escl_capabilities(ESCL_Device *device, char *blacklist, SANE_Status *status) { capabilities_t *scanner = (capabilities_t*)calloc(1, sizeof(capabilities_t)); CURL *curl_handle = NULL; struct cap *var = NULL; + struct cap *header = NULL; xmlDoc *data = NULL; xmlNode *node = NULL; int i = 0; const char *scanner_capabilities = "/eSCL/ScannerCapabilities"; + SANE_Bool use_pdf = SANE_TRUE; *status = SANE_STATUS_GOOD; if (device == NULL) @@ -481,11 +543,22 @@ escl_capabilities(ESCL_Device *device, SANE_Status *status) *status = SANE_STATUS_NO_MEM; var->memory = malloc(1); var->size = 0; + header = (struct cap *)calloc(1, sizeof(struct cap)); + if (header == NULL) + *status = SANE_STATUS_NO_MEM; + header->memory = malloc(1); + header->size = 0; curl_handle = curl_easy_init(); escl_curl_url(curl_handle, device, scanner_capabilities); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, memory_callback_c); curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)var); + curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, header_callback); + curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, (void *)header); + curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L); CURLcode res = curl_easy_perform(curl_handle); + if (res == CURLE_OK) + DBG( 1, "Create NewJob : the scanner header responded : [%s]\n", header->memory); if (res != CURLE_OK) { DBG( 1, "The scanner didn't respond: %s\n", curl_easy_strerror(res)); *status = SANE_STATUS_INVAL; @@ -503,18 +576,46 @@ escl_capabilities(ESCL_Device *device, SANE_Status *status) goto clean; } + if (device->hack && + header && + header->memory && + strstr(header->memory, "Server: HP_Compact_Server")) + device->hack = curl_slist_append(NULL, "Host: localhost"); + scanner->source = 0; scanner->Sources = (SANE_String_Const *)malloc(sizeof(SANE_String_Const) * 4); for (i = 0; i < 4; i++) scanner->Sources[i] = NULL; print_xml_c(node, device, scanner, -1); - _reduce_color_modes(scanner); + DBG (3, "1-blacklist_pdf: %s\n", (use_pdf ? "TRUE" : "FALSE") ); + if (device->model_name != NULL) { + if (strcasestr(device->model_name, "MFC-J985DW")) { + DBG (3, "blacklist_pdf: device not support PDF\n"); + use_pdf = SANE_FALSE; + } + else if (blacklist) { + char *model = strdup(device->model_name); + replace_char(model, ' ', '_'); + if (strcasestr(blacklist, model)) { + use_pdf = SANE_FALSE; + } + free(model); + } + } + DBG (3, "1-blacklist_pdf: %s\n", (use_pdf ? "TRUE" : "FALSE") ); + if (use_pdf) + _reduce_color_modes(scanner); + else + _delete_pdf(scanner); clean: xmlFreeDoc(data); clean_data: xmlCleanupParser(); xmlMemoryDump(); curl_easy_cleanup(curl_handle); + if (header) + free(header->memory); + free(header); if (var) free(var->memory); free(var); diff --git a/backend/escl/escl_devices.c b/backend/escl/escl_devices.c index 3ca28de..92e064b 100644 --- a/backend/escl/escl_devices.c +++ b/backend/escl/escl_devices.c @@ -74,6 +74,7 @@ resolve_callback(AvahiServiceResolver *r, AVAHI_GCC_UNUSED AvahiIfIndex interfac avahi_address_snprint(a, sizeof(a), address); t = avahi_string_list_to_string(txt); if (strstr(t, "\"rs=eSCL\"") || strstr(t, "\"rs=/eSCL\"")) { + char ip_add[PATH_MAX] = {0}; s = avahi_string_list_find(txt, "is"); if (s && s->size > 3) is = (const char*)s->text + 3; @@ -84,7 +85,14 @@ resolve_callback(AvahiServiceResolver *r, AVAHI_GCC_UNUSED AvahiIfIndex interfac uuid = (const char*)s->text + 5; else uuid = (const char*)NULL; - escl_device_add(port, name, a, is, uuid, (char*)type); + DBG (10, "resolve_callback [%s]\n", a); + if (strstr(a, "127.0.0.1") != NULL) { + snprintf(ip_add, sizeof(ip_add), "%s", "localhost"); + DBG (10,"resolve_callback fix redirect [localhost]\n"); + } + else + snprintf(ip_add, sizeof(ip_add), "%s", a); + escl_device_add(port, name, ip_add, is, uuid, (char*)type); } } } diff --git a/backend/escl/escl_jpeg.c b/backend/escl/escl_jpeg.c index 651e7c5..1dd3ec9 100644 --- a/backend/escl/escl_jpeg.c +++ b/backend/escl/escl_jpeg.c @@ -192,34 +192,41 @@ get_JPEG_data(capabilities_t *scanner, int *width, int *height, int *bps) cinfo.out_color_space = JCS_RGB; cinfo.quantize_colors = FALSE; jpeg_calc_output_dimensions(&cinfo); - if (cinfo.output_width < (unsigned int)scanner->caps[scanner->source].width) - scanner->caps[scanner->source].width = cinfo.output_width; - if (scanner->caps[scanner->source].pos_x < 0) - scanner->caps[scanner->source].pos_x = 0; - - if (cinfo.output_height < (unsigned int)scanner->caps[scanner->source].height) - scanner->caps[scanner->source].height = cinfo.output_height; - if (scanner->caps[scanner->source].pos_y < 0) - scanner->caps[scanner->source].pos_y = 0; + double ratio = (double)cinfo.output_width / (double)scanner->caps[scanner->source].width; + int rw = (int)((double)scanner->caps[scanner->source].width * ratio); + int rh = (int)((double)scanner->caps[scanner->source].height * ratio); + int rx = (int)((double)scanner->caps[scanner->source].pos_x * ratio); + int ry = (int)((double)scanner->caps[scanner->source].pos_y * ratio); + + + if (cinfo.output_width < (unsigned int)rw) + rw = cinfo.output_width; + if (rx < 0) + rx = 0; + + if (cinfo.output_height < (unsigned int)rh) + rh = cinfo.output_height; + if (ry < 0) + ry = 0; DBG(10, "1-JPEF Geometry [%dx%d|%dx%d]\n", - scanner->caps[scanner->source].pos_x, - scanner->caps[scanner->source].pos_y, - scanner->caps[scanner->source].width, - scanner->caps[scanner->source].height); - x_off = scanner->caps[scanner->source].pos_x; - if (x_off > (unsigned int)scanner->caps[scanner->source].width) { - w = scanner->caps[scanner->source].width; + rx, + ry, + rw, + rh); + x_off = rx; + if (x_off > (unsigned int)rw) { + w = rw; x_off = 0; } else - w = scanner->caps[scanner->source].width - x_off; - y_off = scanner->caps[scanner->source].pos_y; - if(y_off > (unsigned int)scanner->caps[scanner->source].height) { - h = scanner->caps[scanner->source].height; + w = rw - x_off; + y_off = ry; + if(y_off > (unsigned int)rh) { + h = rh; y_off = 0; } else - h = scanner->caps[scanner->source].height - y_off; + h = rh - y_off; DBG(10, "2-JPEF Geometry [%dx%d|%dx%d]\n", x_off, y_off, @@ -242,7 +249,7 @@ get_JPEG_data(capabilities_t *scanner, int *width, int *height, int *bps) if (y_off > 0) jpeg_skip_scanlines(&cinfo, y_off); pos = 0; - while (cinfo.output_scanline < (unsigned int)scanner->caps[scanner->source].height) { + while (cinfo.output_scanline < (unsigned int)rh) { rowptr[0] = (JSAMPROW)surface + (lineSize * pos); // ..cinfo.output_scanline); jpeg_read_scanlines(&cinfo, rowptr, (JDIMENSION) 1); pos++; @@ -253,7 +260,7 @@ get_JPEG_data(capabilities_t *scanner, int *width, int *height, int *bps) *width = w; *height = h; *bps = cinfo.output_components; - jpeg_finish_decompress(&cinfo); + // jpeg_finish_decompress(&cinfo); jpeg_destroy_decompress(&cinfo); fclose(scanner->tmp); scanner->tmp = NULL; diff --git a/backend/escl/escl_newjob.c b/backend/escl/escl_newjob.c index 24bfbc9..98a953f 100644 --- a/backend/escl/escl_newjob.c +++ b/backend/escl/escl_newjob.c @@ -277,6 +277,8 @@ wake_up_device: curl_easy_setopt(curl_handle, CURLOPT_POSTFIELDSIZE, upload->size); curl_easy_setopt(curl_handle, CURLOPT_HEADERFUNCTION, download_callback); curl_easy_setopt(curl_handle, CURLOPT_HEADERDATA, (void *)download); + curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L); CURLcode res = curl_easy_perform(curl_handle); if (res != CURLE_OK) { DBG( 1, "Create NewJob : the scanner responded incorrectly: %s\n", curl_easy_strerror(res)); @@ -296,7 +298,17 @@ wake_up_device: result = strdup(location); DBG( 1, "Create NewJob : %s\n", result); *temporary = '\n'; + *location = '\0'; + location = strrchr(tmp_location,'/'); wakup_count = 0; + if (location) { + location++; + scanner->scanJob = strdup(location); + DBG( 1, "Full location header [%s]\n", scanner->scanJob); + } + else + scanner->scanJob = strdup("ScanJobs"); + *location = '/'; } } if (result == NULL) { diff --git a/backend/escl/escl_reset.c b/backend/escl/escl_reset.c index 7494dda..95e3f2d 100644 --- a/backend/escl/escl_reset.c +++ b/backend/escl/escl_reset.c @@ -44,10 +44,10 @@ write_callback(void __sane_unused__*str, * This function is called in the 'sane_cancel' function. */ void -escl_scanner(const ESCL_Device *device, char *result) +escl_scanner(const ESCL_Device *device, char *scanJob, char *result) { CURL *curl_handle = NULL; - const char *scan_jobs = "/eSCL/ScanJobs"; + const char *scan_jobs = "/eSCL/"; const char *scanner_start = "/NextDocument"; char scan_cmd[PATH_MAX] = { 0 }; int i = 0; @@ -58,10 +58,12 @@ escl_scanner(const ESCL_Device *device, char *result) CURL_CALL: curl_handle = curl_easy_init(); if (curl_handle != NULL) { - snprintf(scan_cmd, sizeof(scan_cmd), "%s%s%s", - scan_jobs, result, scanner_start); + snprintf(scan_cmd, sizeof(scan_cmd), "%s%s%s%s", + scan_jobs, scanJob, result, scanner_start); escl_curl_url(curl_handle, device, scan_cmd); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L); if (curl_easy_perform(curl_handle) == CURLE_OK) { curl_easy_getinfo(curl_handle, CURLINFO_RESPONSE_CODE, &answer); i++; diff --git a/backend/escl/escl_scan.c b/backend/escl/escl_scan.c index 53bd438..3350c83 100644 --- a/backend/escl/escl_scan.c +++ b/backend/escl/escl_scan.c @@ -57,10 +57,10 @@ write_callback(void *str, size_t size, size_t nmemb, void *userp) * \return status (if everything is OK, status = SANE_STATUS_GOOD, otherwise, SANE_STATUS_NO_MEM/SANE_STATUS_INVAL) */ SANE_Status -escl_scan(capabilities_t *scanner, const ESCL_Device *device, char *result) +escl_scan(capabilities_t *scanner, const ESCL_Device *device, char *scanJob, char *result) { CURL *curl_handle = NULL; - const char *scan_jobs = "/eSCL/ScanJobs"; + const char *scan_jobs = "/eSCL/"; const char *scanner_start = "/NextDocument"; char scan_cmd[PATH_MAX] = { 0 }; SANE_Status status = SANE_STATUS_GOOD; @@ -70,10 +70,12 @@ escl_scan(capabilities_t *scanner, const ESCL_Device *device, char *result) scanner->real_read = 0; curl_handle = curl_easy_init(); if (curl_handle != NULL) { - snprintf(scan_cmd, sizeof(scan_cmd), "%s%s%s", - scan_jobs, result, scanner_start); + snprintf(scan_cmd, sizeof(scan_cmd), "%s%s%s%s", + scan_jobs, scanJob, result, scanner_start); escl_curl_url(curl_handle, device, scan_cmd); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_callback); + curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L); if (scanner->tmp) fclose(scanner->tmp); scanner->tmp = tmpfile(); diff --git a/backend/escl/escl_status.c b/backend/escl/escl_status.c index a68f6ea..1f848a2 100644 --- a/backend/escl/escl_status.c +++ b/backend/escl/escl_status.c @@ -220,6 +220,8 @@ reload: escl_curl_url(curl_handle, device, scanner_status); curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, memory_callback_s); curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, (void *)var); + curl_easy_setopt(curl_handle, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl_handle, CURLOPT_MAXREDIRS, 3L); CURLcode res = curl_easy_perform(curl_handle); if (res != CURLE_OK) { DBG( 1, "The scanner didn't respond: %s\n", curl_easy_strerror(res)); diff --git a/backend/fujitsu.c b/backend/fujitsu.c index 6c1c8f6..d17e015 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-2019 m. allan noah + Copyright (C) 2003-2021 m. allan noah JPEG output and low memory usage support funded by: Archivista GmbH, www.archivista.ch @@ -770,10 +770,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (10, "sane_init: start\n"); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (5, "sane_init: fujitsu backend %d.%d.%d, from %s\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); sanei_magic_init(); diff --git a/backend/fujitsu.conf.in b/backend/fujitsu.conf.in index 8e2115f..1645e87 100644 --- a/backend/fujitsu.conf.in +++ b/backend/fujitsu.conf.in @@ -264,3 +264,6 @@ usb 0x04c5 0x160a #fi-7800 usb 0x04c5 0x160b + +#ScanSnap iX1600 +usb 0x04c5 0x1632 diff --git a/backend/genesys.conf.in b/backend/genesys.conf.in index 21506f6..d9c596a 100644 --- a/backend/genesys.conf.in +++ b/backend/genesys.conf.in @@ -131,6 +131,9 @@ usb 0x07b3 0x0900 # Plustek OpticFilm 7200 usb 0x07b3 0x0807 +# Plustek OpticFilm 7200 V2 +usb 0x07b3 0x0c07 + # Plustek OpticFilm 7200i usb 0x07b3 0x0c04 diff --git a/backend/genesys/calibration.h b/backend/genesys/calibration.h index fc82850..fd0f627 100644 --- a/backend/genesys/calibration.h +++ b/backend/genesys/calibration.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_CALIBRATION_H diff --git a/backend/genesys/command_set.h b/backend/genesys/command_set.h index 47bdfbd..b031a8c 100644 --- a/backend/genesys/command_set.h +++ b/backend/genesys/command_set.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_COMMAND_SET_H diff --git a/backend/genesys/device.cpp b/backend/genesys/device.cpp index 4b1940b..5411d7b 100644 --- a/backend/genesys/device.cpp +++ b/backend/genesys/device.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/device.h b/backend/genesys/device.h index f998714..842856b 100644 --- a/backend/genesys/device.h +++ b/backend/genesys/device.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_DEVICE_H diff --git a/backend/genesys/enums.cpp b/backend/genesys/enums.cpp index ce0ad10..460e73f 100644 --- a/backend/genesys/enums.cpp +++ b/backend/genesys/enums.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -279,6 +258,7 @@ std::ostream& operator<<(std::ostream& out, GpioId id) case GpioId::CANON_8600F: out << "CANON_8600F"; break; case GpioId::DP665: out << "DP665"; break; case GpioId::DP685: out << "DP685"; break; + case GpioId::G4010: out << "G4010"; break; case GpioId::G4050: out << "G4050"; break; case GpioId::HP2300: out << "HP2300"; break; case GpioId::HP2400: out << "HP2400"; break; diff --git a/backend/genesys/enums.h b/backend/genesys/enums.h index ae5dedd..88fc9c3 100644 --- a/backend/genesys/enums.h +++ b/backend/genesys/enums.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_ENUMS_H @@ -372,6 +351,7 @@ enum class GpioId : unsigned DP665, DP685, G4050, + G4010, HP2300, HP2400, HP3670, @@ -525,6 +505,9 @@ enum class ModelFlag : unsigned // disable fast feeding mode on this scanner DISABLE_FAST_FEEDING = 1 << 14, + // scan gray scans as color and combine on host side + HOST_SIDE_GRAY = 1 << 15, + // the scanner uses multi-segment sensors that must be handled during calibration SIS_SENSOR = 1 << 16, diff --git a/backend/genesys/error.cpp b/backend/genesys/error.cpp index e302e22..6f892de 100644 --- a/backend/genesys/error.cpp +++ b/backend/genesys/error.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/error.h b/backend/genesys/error.h index e95313f..93a428b 100644 --- a/backend/genesys/error.h +++ b/backend/genesys/error.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_ERROR_H diff --git a/backend/genesys/fwd.h b/backend/genesys/fwd.h index 89ca150..9937654 100644 --- a/backend/genesys/fwd.h +++ b/backend/genesys/fwd.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_FWD_H diff --git a/backend/genesys/genesys.cpp b/backend/genesys/genesys.cpp index 9552fa9..5aba58c 100644 --- a/backend/genesys/genesys.cpp +++ b/backend/genesys/genesys.cpp @@ -29,27 +29,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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. */ /* @@ -674,9 +653,9 @@ void scanner_setup_sensor(Genesys_Device& dev, const Genesys_Sensor& sensor, regs.set8(custom_reg.address, custom_reg.value); } - if (dev.model->asic_type != AsicType::GL841 && - dev.model->asic_type != AsicType::GL843) + if (dev.model->asic_type != AsicType::GL843) { + // FIXME: remove the above check regs_set_exposure(dev.model->asic_type, regs, sensor.exposure); } @@ -795,6 +774,8 @@ void scanner_move(Genesys_Device& dev, ScanMethod scan_method, unsigned steps, D session.params.scan_method = scan_method; session.params.scan_mode = ScanColorMode::GRAY; session.params.color_filter = ColorFilter::GREEN; + session.params.contrast_adjustment = dev.settings.contrast; + session.params.brightness_adjustment = dev.settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA | @@ -959,6 +940,8 @@ void scanner_move_back_home(Genesys_Device& dev, bool wait_until_home) session.params.scan_method = dev.settings.scan_method; session.params.scan_mode = ScanColorMode::GRAY; session.params.color_filter = ColorFilter::GREEN; + session.params.contrast_adjustment = dev.settings.contrast; + session.params.brightness_adjustment = dev.settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA | @@ -1100,6 +1083,8 @@ void scanner_move_back_home_ta(Genesys_Device& dev) session.params.scan_method = scan_method; session.params.scan_mode = ScanColorMode::GRAY; session.params.color_filter = ColorFilter::GREEN; + session.params.contrast_adjustment = dev.settings.contrast; + session.params.brightness_adjustment = dev.settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA | @@ -1210,6 +1195,8 @@ void scanner_search_strip(Genesys_Device& dev, bool forward, bool black) session.params.scan_method = dev.settings.scan_method; session.params.scan_mode = ScanColorMode::GRAY; session.params.color_filter = ColorFilter::RED; + session.params.contrast_adjustment = dev.settings.contrast; + session.params.brightness_adjustment = dev.settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA; if (dev.model->asic_type != AsicType::GL841 && !forward) { @@ -1506,6 +1493,8 @@ void scanner_offset_calibration(Genesys_Device& dev, const Genesys_Sensor& senso session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev.model->asic_type == AsicType::GL843 ? ColorFilter::RED : dev.settings.color_filter; + session.params.contrast_adjustment = dev.settings.contrast; + session.params.brightness_adjustment = dev.settings.brightness; session.params.flags = flags; compute_session(&dev, session, *calib_sensor); @@ -1815,6 +1804,8 @@ void scanner_coarse_gain_calibration(Genesys_Device& dev, const Genesys_Sensor& session.params.scan_method = dev.settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev.settings.color_filter; + session.params.contrast_adjustment = dev.settings.contrast; + session.params.brightness_adjustment = dev.settings.brightness; session.params.flags = flags; compute_session(&dev, session, *calib_sensor); @@ -1873,7 +1864,8 @@ void scanner_coarse_gain_calibration(Genesys_Device& dev, const Genesys_Sensor& float curr_output = 0; float target_value = 0; - if (dev.model->asic_type == AsicType::GL842 || + if (dev.model->asic_type == AsicType::GL841 || + dev.model->asic_type == AsicType::GL842 || dev.model->asic_type == AsicType::GL843) { std::vector<uint16_t> values; @@ -1889,18 +1881,6 @@ void scanner_coarse_gain_calibration(Genesys_Device& dev, const Genesys_Sensor& curr_output = static_cast<float>(values[unsigned((values.size() - 1) * 0.95)]); target_value = calib_sensor->gain_white_ref * coeff; - } else if (dev.model->asic_type == AsicType::GL841) { - // FIXME: use the GL843 approach - unsigned max = 0; - for (std::size_t x = 0; x < image.get_width(); x++) { - auto value = image.get_raw_channel(x, 0, ch); - if (value > max) { - max = value; - } - } - - curr_output = max; - target_value = 65535.0f; } else { // FIXME: use the GL843 approach auto width = image.get_width(); @@ -1998,7 +1978,8 @@ SensorExposure scanner_led_calibration(Genesys_Device& dev, const Genesys_Sensor const auto& calib_sensor = sanei_genesys_find_sensor(&dev, resolution, channels, dev.settings.scan_method); - if (dev.model->asic_type == AsicType::GL845 || + if (dev.model->asic_type == AsicType::GL841 || + dev.model->asic_type == AsicType::GL845 || dev.model->asic_type == AsicType::GL846 || dev.model->asic_type == AsicType::GL847 || dev.model->asic_type == AsicType::GL124) @@ -2006,14 +1987,9 @@ SensorExposure scanner_led_calibration(Genesys_Device& dev, const Genesys_Sensor regs = dev.reg; // FIXME: apply this to all ASICs } - unsigned yres = resolution; - if (dev.model->asic_type == AsicType::GL841) { - yres = dev.settings.yres; // FIXME: remove this - } - ScanSession session; session.params.xres = resolution; - session.params.yres = yres; + session.params.yres = resolution; session.params.startx = 0; session.params.starty = 0; session.params.pixels = dev.model->x_size_calib_mm * resolution / MM_PER_INCH; @@ -2023,6 +1999,8 @@ SensorExposure scanner_led_calibration(Genesys_Device& dev, const Genesys_Sensor session.params.scan_method = dev.settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev.settings.color_filter; + session.params.contrast_adjustment = dev.settings.contrast; + session.params.brightness_adjustment = dev.settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA | ScanFlag::SINGLE_LINE | @@ -2032,27 +2010,14 @@ SensorExposure scanner_led_calibration(Genesys_Device& dev, const Genesys_Sensor dev.cmd_set->init_regs_for_scan_session(&dev, calib_sensor, ®s, session); - if (dev.model->asic_type == AsicType::GL841) { - dev.interface->write_registers(regs); // FIXME: remove this - } - std::uint16_t exp[3]; - if (dev.model->asic_type == AsicType::GL841) { - exp[0] = sensor.exposure.red; - exp[1] = sensor.exposure.green; - exp[2] = sensor.exposure.blue; - } else { - exp[0] = calib_sensor.exposure.red; - exp[1] = calib_sensor.exposure.green; - exp[2] = calib_sensor.exposure.blue; - } + exp[0] = calib_sensor.exposure.red; + exp[1] = calib_sensor.exposure.green; + exp[2] = calib_sensor.exposure.blue; std::uint16_t target = sensor.gain_white_ref * 256; - std::uint16_t min_exposure = 500; // only gl841 - std::uint16_t max_exposure = ((exp[0] + exp[1] + exp[2]) / 3) * 2; // only gl841 - std::uint16_t top[3] = {}; std::uint16_t bottom[3] = {}; @@ -2088,16 +2053,6 @@ SensorExposure scanner_led_calibration(Genesys_Device& dev, const Genesys_Sensor for (unsigned i_test = 0; i_test < 100 && !acceptable; ++i_test) { regs_set_exposure(dev.model->asic_type, regs, { exp[0], exp[1], exp[2] }); - if (dev.model->asic_type == AsicType::GL841) { - // FIXME: remove - dev.interface->write_register(0x10, (exp[0] >> 8) & 0xff); - dev.interface->write_register(0x11, exp[0] & 0xff); - dev.interface->write_register(0x12, (exp[1] >> 8) & 0xff); - dev.interface->write_register(0x13, exp[1] & 0xff); - dev.interface->write_register(0x14, (exp[2] >> 8) & 0xff); - dev.interface->write_register(0x15, exp[2] & 0xff); - } - dev.interface->write_registers(regs); dbg.log(DBG_info, "starting line reading"); @@ -2108,15 +2063,13 @@ SensorExposure scanner_led_calibration(Genesys_Device& dev, const Genesys_Sensor if (dev.model->asic_type == AsicType::GL841) { scanner_stop_action(dev); dev.cmd_set->move_back_home(&dev, true); - return { exp[0], exp[1], exp[2] }; } else if (dev.model->asic_type == AsicType::GL124) { scanner_stop_action(dev); - return calib_sensor.exposure; } else { scanner_stop_action(dev); dev.cmd_set->move_back_home(&dev, true); - return calib_sensor.exposure; } + return { exp[0], exp[1], exp[2] }; } auto image = read_unshuffled_image_from_scanner(&dev, session, session.output_line_bytes); @@ -2142,57 +2095,8 @@ SensorExposure scanner_led_calibration(Genesys_Device& dev, const Genesys_Sensor acceptable = true; - if (dev.model->asic_type == AsicType::GL841) { - 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 = 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 = false; - } - - // for scanners using target value - if (target > 0) { - acceptable = true; - for (unsigned i = 0; i < 3; i++) { - // we accept +- 2% delta from target - if (std::abs(avg[i] - target) > target / 50) { - exp[i] = (exp[i] * target) / avg[i]; - acceptable = false; - } - } - } else { - if (!acceptable) { - unsigned 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 - */ - unsigned 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; - } - - } - } - } else if (dev.model->asic_type == AsicType::GL845 || - dev.model->asic_type == AsicType::GL846) + if (dev.model->asic_type == AsicType::GL845 || + dev.model->asic_type == AsicType::GL846) { for (unsigned i = 0; i < 3; i++) { if (avg[i] < bottom[i]) { @@ -2225,7 +2129,9 @@ SensorExposure scanner_led_calibration(Genesys_Device& dev, const Genesys_Sensor acceptable = false; } } - } else if (dev.model->asic_type == AsicType::GL124) { + } else if (dev.model->asic_type == AsicType::GL841 || + dev.model->asic_type == AsicType::GL124) + { for (unsigned i = 0; i < 3; i++) { // we accept +- 2% delta from target if (std::abs(avg[i] - target) > target / 50) { @@ -4366,12 +4272,6 @@ static Genesys_Settings calculate_scan_settings(Genesys_Scanner* s) settings.color_filter = ColorFilter::NONE; } - if (s->color_filter == "None") { - settings.true_gray = 1; - } else { - settings.true_gray = 0; - } - // brightness and contrast only for for 8 bit scans if (s->bit_depth == 8) { settings.contrast = (s->contrast * 127) / 100; @@ -4992,16 +4892,28 @@ static void init_options(Genesys_Scanner* s) s->opt[OPT_POWER_SW].cap = SANE_CAP_INACTIVE; /* extra button */ - s->opt[OPT_EXTRA_SW].name = "extra"; - s->opt[OPT_EXTRA_SW].title = SANE_I18N ("Extra button"); - s->opt[OPT_EXTRA_SW].desc = SANE_I18N ("Extra button"); - s->opt[OPT_EXTRA_SW].type = SANE_TYPE_BOOL; - s->opt[OPT_EXTRA_SW].unit = SANE_UNIT_NONE; - if (model->buttons & GENESYS_HAS_EXTRA_SW) - s->opt[OPT_EXTRA_SW].cap = - SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED; - else - s->opt[OPT_EXTRA_SW].cap = SANE_CAP_INACTIVE; + s->opt[OPT_EXTRA_SW].name = "extra"; + s->opt[OPT_EXTRA_SW].title = SANE_I18N("Extra button"); + s->opt[OPT_EXTRA_SW].desc = SANE_I18N("Extra button"); + s->opt[OPT_EXTRA_SW].type = SANE_TYPE_BOOL; + s->opt[OPT_EXTRA_SW].unit = SANE_UNIT_NONE; + if (model->buttons & GENESYS_HAS_EXTRA_SW) { + s->opt[OPT_EXTRA_SW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED; + } else { + s->opt[OPT_EXTRA_SW].cap = SANE_CAP_INACTIVE; + } + + // transparency/scan_film button + s->opt[OPT_TRANSP_SW].name = "transparency"; + s->opt[OPT_TRANSP_SW].title = SANE_I18N ("Transparency button"); + s->opt[OPT_TRANSP_SW].desc = SANE_I18N ("Transparency button"); + s->opt[OPT_TRANSP_SW].type = SANE_TYPE_BOOL; + s->opt[OPT_TRANSP_SW].unit = SANE_UNIT_NONE; + if (model->buttons & GENESYS_HAS_TRANSP_SW) { + s->opt[OPT_TRANSP_SW].cap = SANE_CAP_SOFT_DETECT | SANE_CAP_HARD_SELECT | SANE_CAP_ADVANCED; + } else { + s->opt[OPT_TRANSP_SW].cap = SANE_CAP_INACTIVE; + } /* calibration needed */ s->opt[OPT_NEED_CALIBRATION_SW].name = "need-calibration"; @@ -5231,7 +5143,7 @@ static void probe_genesys_devices() of Genesys_Calibration_Cache as is. */ static const char* CALIBRATION_IDENT = "sane_genesys"; -static const int CALIBRATION_VERSION = 31; +static const int CALIBRATION_VERSION = 32; bool read_calibration(std::istream& str, Genesys_Device::Calibration& calibration, const std::string& path) @@ -5821,6 +5733,7 @@ static void get_option_value(Genesys_Scanner* s, int option, void* val) case OPT_OCR_SW: case OPT_POWER_SW: case OPT_EXTRA_SW: + case OPT_TRANSP_SW: s->dev->cmd_set->update_hardware_sensors(s); *reinterpret_cast<SANE_Bool*>(val) = s->buttons[genesys_option_to_button(option)].read(); break; @@ -6456,6 +6369,7 @@ GenesysButtonName genesys_option_to_button(int option) case OPT_OCR_SW: return BUTTON_OCR_SW; case OPT_POWER_SW: return BUTTON_POWER_SW; case OPT_EXTRA_SW: return BUTTON_EXTRA_SW; + case OPT_TRANSP_SW: return BUTTON_TRANSP_SW; default: throw std::runtime_error("Unknown option to convert to button index"); } } diff --git a/backend/genesys/genesys.h b/backend/genesys/genesys.h index 19d6feb..272beaa 100644 --- a/backend/genesys/genesys.h +++ b/backend/genesys/genesys.h @@ -19,27 +19,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 GENESYS_H @@ -124,6 +103,7 @@ enum Genesys_Option OPT_OCR_SW, OPT_POWER_SW, OPT_EXTRA_SW, + OPT_TRANSP_SW, OPT_NEED_CALIBRATION_SW, OPT_BUTTON_GROUP, OPT_CALIBRATE, @@ -144,6 +124,7 @@ enum GenesysButtonName : unsigned { BUTTON_OCR_SW, BUTTON_POWER_SW, BUTTON_EXTRA_SW, + BUTTON_TRANSP_SW, NUM_BUTTONS }; diff --git a/backend/genesys/gl124.cpp b/backend/genesys/gl124.cpp index ed733b8..1fa4d99 100644 --- a/backend/genesys/gl124.cpp +++ b/backend/genesys/gl124.cpp @@ -17,27 +17,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -113,7 +92,7 @@ gl124_init_registers (Genesys_Device * dev) dev->reg.init_reg(0x09, 0x00); dev->reg.init_reg(0x0a, 0xc0); dev->reg.init_reg(0x0b, 0x2a); - dev->reg.init_reg(0x0c, 0x12); + dev->reg.init_reg(0x0c, 0x12); // SENSOR_DEF dev->reg.init_reg(0x11, 0x00); dev->reg.init_reg(0x12, 0x00); dev->reg.init_reg(0x13, 0x0f); @@ -453,7 +432,6 @@ static void gl124_init_motor_regs_scan(Genesys_Device* dev, ScanFlag flags) { DBG_HELPER(dbg); - int use_fast_fed; unsigned int lincnt, fast_dpi; unsigned int feedl,dist; uint32_t z1, z2; @@ -467,9 +445,6 @@ static void gl124_init_motor_regs_scan(Genesys_Device* dev, feed_steps, static_cast<unsigned>(scan_mode), static_cast<unsigned>(flags)); - /* we never use fast fed since we do manual feed for the scans */ - use_fast_fed=0; - /* enforce motor minimal scan speed * @TODO extend motor struct for this value */ if (scan_mode == ScanColorMode::COLOR_SINGLE_PASS) @@ -516,12 +491,6 @@ static void gl124_init_motor_regs_scan(Genesys_Device* dev, /* compute register 02 value */ uint8_t r02 = REG_0x02_NOTHOME; - if (use_fast_fed) { - r02 |= REG_0x02_FASTFED; - } else { - r02 &= ~REG_0x02_FASTFED; - } - if (has_flag(flags, ScanFlag::AUTO_GO_HOME)) { r02 |= REG_0x02_AGOHOME; } @@ -573,9 +542,6 @@ static void gl124_init_motor_regs_scan(Genesys_Device* dev, if (has_flag(flags, ScanFlag::FEEDING)) { dist *= 2; } - if (use_fast_fed) { - dist += fast_table.table.size() * 2; - } /* get sure we don't use insane value */ if (dist < feedl) { @@ -587,7 +553,7 @@ static void gl124_init_motor_regs_scan(Genesys_Device* dev, reg->set24(REG_FEEDL, feedl); /* doesn't seem to matter that much */ - sanei_genesys_calculate_zmod(use_fast_fed, + sanei_genesys_calculate_zmod(false, scan_exposure_time, scan_table.table, scan_table.table.size(), @@ -815,6 +781,8 @@ ScanSession CommandSetGl124::calculate_scan_session(const Genesys_Device* dev, session.params.scan_method = settings.scan_method; session.params.scan_mode = settings.scan_mode; session.params.color_filter = settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::NONE; compute_session(dev, session, sensor); @@ -983,6 +951,8 @@ void CommandSetGl124::init_regs_for_shading(Genesys_Device* dev, const Genesys_S session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = ColorFilter::RED; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA | ScanFlag::DISABLE_BUFFER_FULL_MOVE; @@ -1116,6 +1086,8 @@ void move_to_calibration_area(Genesys_Device* dev, const Genesys_Sensor& sensor, session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA | ScanFlag::SINGLE_LINE | @@ -1202,6 +1174,8 @@ void CommandSetGl124::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = flags; compute_session(dev, session, sensor); diff --git a/backend/genesys/gl124.h b/backend/genesys/gl124.h index b722e67..02b733b 100644 --- a/backend/genesys/gl124.h +++ b/backend/genesys/gl124.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_GL124_H diff --git a/backend/genesys/gl124_registers.h b/backend/genesys/gl124_registers.h index 66c5fda..dfc25f6 100644 --- a/backend/genesys/gl124_registers.h +++ b/backend/genesys/gl124_registers.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_GL124_REGISTERS_H diff --git a/backend/genesys/gl646.cpp b/backend/genesys/gl646.cpp index acc1a4b..bdde703 100644 --- a/backend/genesys/gl646.cpp +++ b/backend/genesys/gl646.cpp @@ -23,27 +23,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -605,7 +584,9 @@ void CommandSetGl646::init_regs_for_scan_session(Genesys_Device* dev, const Gene } /* true CIS gray if needed */ - if (dev->model->is_cis && session.params.channels == 1 && dev->settings.true_gray) { + if (dev->model->is_cis && session.params.channels == 1 && + session.params.color_filter == ColorFilter::NONE) + { regs->find_reg(0x05).value |= REG_0x05_LEDADD; } else { regs->find_reg(0x05).value &= ~REG_0x05_LEDADD; @@ -1707,6 +1688,8 @@ void CommandSetGl646::move_back_home(Genesys_Device* dev, bool wait_until_home) session.params.scan_method = dev->model->default_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = ColorFilter::RED; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::REVERSE | ScanFlag::AUTO_GO_HOME | ScanFlag::DISABLE_GAMMA; @@ -1823,6 +1806,8 @@ void CommandSetGl646::init_regs_for_shading(Genesys_Device* dev, const Genesys_S session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA | ScanFlag::IGNORE_COLOR_OFFSET | @@ -1931,6 +1916,8 @@ SensorExposure CommandSetGl646::led_calibration(Genesys_Device* dev, const Genes session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = scan_mode; session.params.color_filter = ColorFilter::RED; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING; if (dev->settings.scan_method == ScanMethod::TRANSPARENCY) { session.params.flags |= ScanFlag::USE_XPA; @@ -2110,6 +2097,8 @@ static void ad_fe_offset_calibration(Genesys_Device* dev, const Genesys_Sensor& session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = ColorFilter::RED; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING; if (dev->settings.scan_method == ScanMethod::TRANSPARENCY) { session.params.flags |= ScanFlag::USE_XPA; @@ -2222,6 +2211,8 @@ void CommandSetGl646::offset_calibration(Genesys_Device* dev, const Genesys_Sens session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = ColorFilter::RED; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING; if (dev->settings.scan_method == ScanMethod::TRANSPARENCY) { session.params.flags |= ScanFlag::USE_XPA; @@ -2373,6 +2364,8 @@ void CommandSetGl646::coarse_gain_calibration(Genesys_Device* dev, const Genesys session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = ColorFilter::RED; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING; if (dev->settings.scan_method == ScanMethod::TRANSPARENCY) { session.params.flags |= ScanFlag::USE_XPA; @@ -2485,6 +2478,8 @@ void CommandSetGl646::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::GRAY; session.params.color_filter = ColorFilter::RED; + session.params.contrast_adjustment = 0; + session.params.brightness_adjustment = 0; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA; if (dev->settings.scan_method == ScanMethod::TRANSPARENCY) { @@ -2966,6 +2961,8 @@ ScanSession CommandSetGl646::calculate_scan_session(const Genesys_Device* dev, session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = settings.scan_mode; session.params.color_filter = settings.color_filter; + session.params.contrast_adjustment = settings.contrast; + session.params.brightness_adjustment = settings.brightness; session.params.flags = ScanFlag::AUTO_GO_HOME; if (settings.scan_method == ScanMethod::TRANSPARENCY) { session.params.flags |= ScanFlag::USE_XPA; diff --git a/backend/genesys/gl646.h b/backend/genesys/gl646.h index e4c8d6b..04e5fb2 100644 --- a/backend/genesys/gl646.h +++ b/backend/genesys/gl646.h @@ -19,27 +19,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_GL646_H diff --git a/backend/genesys/gl646_registers.h b/backend/genesys/gl646_registers.h index 1c50888..b20bdbd 100644 --- a/backend/genesys/gl646_registers.h +++ b/backend/genesys/gl646_registers.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_GL646_REGISTERS_H diff --git a/backend/genesys/gl841.cpp b/backend/genesys/gl841.cpp index 62e0e9d..27a6a36 100644 --- a/backend/genesys/gl841.cpp +++ b/backend/genesys/gl841.cpp @@ -25,27 +25,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -149,15 +128,6 @@ gl841_init_registers (Genesys_Device * dev) dev->reg.init_reg(0x13, 0x00); // SENSOR_DEF dev->reg.init_reg(0x14, 0x00); // SENSOR_DEF dev->reg.init_reg(0x15, 0x00); // SENSOR_DEF - if (dev->model->model_id == ModelId::CANON_LIDE_80) { - dev->reg.init_reg(0x10, 0x40); - dev->reg.init_reg(0x11, 0x00); - dev->reg.init_reg(0x12, 0x40); - dev->reg.init_reg(0x13, 0x00); - dev->reg.init_reg(0x14, 0x40); - dev->reg.init_reg(0x15, 0x00); - } - dev->reg.init_reg(0x16, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below dev->reg.init_reg(0x17, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below dev->reg.init_reg(0x18, 0x00); // SENSOR_DEF, overwritten in scanner_setup_sensor() below @@ -184,36 +154,21 @@ gl841_init_registers (Genesys_Device * dev) dev->reg.init_reg(0x27, 0x00); dev->reg.init_reg(0x29, 0xff); - dev->reg.init_reg(0x2c, 0x00); - dev->reg.init_reg(0x2d, 0x00); - if (dev->model->model_id == ModelId::CANON_LIDE_80) { - dev->reg.init_reg(0x2c, sensor.full_resolution >> 8); - dev->reg.init_reg(0x2d, sensor.full_resolution & 0xff); - } + dev->reg.init_reg(0x2c, 0x02); // DPISET: overwritten during scanner setup + dev->reg.init_reg(0x2d, 0x58); // DPISET: overwritten during scanner setup dev->reg.init_reg(0x2e, 0x80); dev->reg.init_reg(0x2f, 0x80); - dev->reg.init_reg(0x30, 0x00); - dev->reg.init_reg(0x31, 0x00); - dev->reg.init_reg(0x32, 0x00); - dev->reg.init_reg(0x33, 0x00); - dev->reg.init_reg(0x34, 0x00); - dev->reg.init_reg(0x35, 0x00); - dev->reg.init_reg(0x36, 0x00); - dev->reg.init_reg(0x37, 0x00); - dev->reg.init_reg(0x38, 0x4f); - dev->reg.init_reg(0x39, 0xc1); - if (dev->model->model_id == ModelId::CANON_LIDE_80) { - dev->reg.init_reg(0x31, 0x10); - dev->reg.init_reg(0x32, 0x15); - dev->reg.init_reg(0x33, 0x0e); - dev->reg.init_reg(0x34, 0x40); - dev->reg.init_reg(0x35, 0x00); - dev->reg.init_reg(0x36, 0x2a); - dev->reg.init_reg(0x37, 0x30); - dev->reg.init_reg(0x38, 0x2a); - dev->reg.init_reg(0x39, 0xf8); - } + dev->reg.init_reg(0x30, 0x00); // STRPIXEL: overwritten during scanner setup + dev->reg.init_reg(0x31, 0x00); // STRPIXEL: overwritten during scanner setup + dev->reg.init_reg(0x32, 0x00); // ENDPIXEL: overwritten during scanner setup + dev->reg.init_reg(0x33, 0x00); // ENDPIXEL: overwritten during scanner setup + dev->reg.init_reg(0x34, 0x00); // DUMMY: overwritten during scanner setup + dev->reg.init_reg(0x35, 0x00); // MAXWD: overwritten during scanner setup + dev->reg.init_reg(0x36, 0x00); // MAXWD: overwritten during scanner setup + dev->reg.init_reg(0x37, 0x00); // MAXWD: overwritten during scanner setup + dev->reg.init_reg(0x38, 0x4f); // LPERIOD: overwritten during scanner setup + dev->reg.init_reg(0x39, 0xc1); // LPERIOD: overwritten during scanner setup dev->reg.init_reg(0x3d, 0x00); dev->reg.init_reg(0x3e, 0x00); @@ -330,11 +285,6 @@ gl841_init_registers (Genesys_Device * dev) dev->interface->write_0x8c(0x10, 0x94); dev->interface->write_register(0x09, 0x10); - - // FIXME: the following code originally changed 0x6b, but due to bug the 0x6c register was - // effectively changed. The current behavior matches the old code, but should probably be fixed. - dev->reg.find_reg(0x6c).value |= REG_0x6B_GPO18; - dev->reg.find_reg(0x6c).value &= ~REG_0x6B_GPO17; } } @@ -541,7 +491,6 @@ static void gl841_init_motor_regs_feed(Genesys_Device* dev, const Genesys_Sensor { DBG_HELPER_ARGS(dbg, "feed_steps=%d, flags=%x", feed_steps, static_cast<unsigned>(flags)); unsigned step_multiplier = 2; - int use_fast_fed = 0; unsigned int feedl; /*number of scan lines to add in a scan_lines line*/ @@ -572,10 +521,6 @@ static void gl841_init_motor_regs_feed(Genesys_Device* dev, const Genesys_Sensor // BUG: fast table is counted in base_ydpi / 4 feedl = feed_steps - fast_table.table.size() * 2; - use_fast_fed = 1; - if (has_flag(dev->model->flags, ModelFlag::DISABLE_FAST_FEEDING)) { - use_fast_fed = false; - } reg->set8(0x3d, (feedl >> 16) & 0xf); reg->set8(0x3e, (feedl >> 8) & 0xff); @@ -590,10 +535,6 @@ static void gl841_init_motor_regs_feed(Genesys_Device* dev, const Genesys_Sensor reg->find_reg(0x02).value &= ~0x80; /*NOT_HOME OFF*/ reg->find_reg(0x02).value |= REG_0x02_MTRPWR; - - if (use_fast_fed) - reg->find_reg(0x02).value |= 0x08; - else reg->find_reg(0x02).value &= ~0x08; if (has_flag(flags, ScanFlag::AUTO_GO_HOME)) { @@ -640,9 +581,6 @@ static void gl841_init_motor_regs_scan(Genesys_Device* dev, const Genesys_Sensor unsigned step_multiplier = 2; - int use_fast_fed = 0; - unsigned int fast_time; - unsigned int slow_time; unsigned int feedl; unsigned int min_restep = 0x20; @@ -679,54 +617,11 @@ static void gl841_init_motor_regs_scan(Genesys_Device* dev, const Genesys_Sensor fast_table.slice_steps(max_fast_slope_steps_count, step_multiplier); } - /* fast fed special cases handling */ - if (dev->model->gpio_id == GpioId::XP300 - || dev->model->gpio_id == GpioId::DP685) - { - /* quirk: looks like at least this scanner is unable to use - 2-feed mode */ - use_fast_fed = 0; - } - else if (feed_steps < fast_table.table.size() * 2 + - (slow_table.table.size() >> static_cast<unsigned>(motor_profile.step_type))) - { - use_fast_fed = 0; - DBG(DBG_info, "%s: feed too short, slow move forced.\n", __func__); - } 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 - 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_table.table.back() << static_cast<unsigned>(fast_profile->step_type)) / 4 * - (feed_steps - fast_table.table.size()*2 - - (slow_table.table.size() >> static_cast<unsigned>(motor_profile.step_type))) - + fast_table.pixeltime_sum() * 2 + slow_table.pixeltime_sum(); - slow_time = - (scan_exposure_time * scan_yres) / dev->motor.base_ydpi * - (feed_steps - (slow_table.table.size() >> static_cast<unsigned>(motor_profile.step_type))) - + slow_table.pixeltime_sum(); - - use_fast_fed = fast_time < slow_time; - } - - if (has_flag(dev->model->flags, ModelFlag::DISABLE_FAST_FEEDING)) { - use_fast_fed = false; - } - - if (use_fast_fed) { - feedl = feed_steps - fast_table.table.size() * 2 - - (slow_table.table.size() >> static_cast<unsigned>(motor_profile.step_type)); - } else if ((feed_steps << static_cast<unsigned>(motor_profile.step_type)) < slow_table.table.size()) { + if ((feed_steps << static_cast<unsigned>(motor_profile.step_type)) < slow_table.table.size()) { feedl = 0; } else { feedl = (feed_steps << static_cast<unsigned>(motor_profile.step_type)) - slow_table.table.size(); } - DBG(DBG_info, "%s: Decided to use %s mode\n", __func__, use_fast_fed?"fast feed":"slow feed"); reg->set8(0x3d, (feedl >> 16) & 0xf); reg->set8(0x3e, (feedl >> 8) & 0xff); @@ -743,9 +638,6 @@ static void gl841_init_motor_regs_scan(Genesys_Device* dev, const Genesys_Sensor reg->find_reg(0x02).value &= ~REG_0x02_MTRREV; } - if (use_fast_fed) - reg->find_reg(0x02).value |= 0x08; - else reg->find_reg(0x02).value &= ~0x08; if (has_flag(flags, ScanFlag::AUTO_GO_HOME)) @@ -819,8 +711,6 @@ static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens const ScanSession& session) { DBG_HELPER_ARGS(dbg, "exposure_time=%d", exposure_time); - uint16_t expavg, expr, expb, expg; - dev->cmd_set->set_fe(dev, sensor, AFE_SET); /* gpio part.*/ @@ -876,11 +766,7 @@ static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens /* AFEMOD should depend on FESET, and we should set these * bits separately */ reg->find_reg(0x04).value &= ~(REG_0x04_FILTER | REG_0x04_AFEMOD); - if (has_flag(session.params.flags, ScanFlag::ENABLE_LEDADD)) { - reg->find_reg(0x04).value |= 0x10; /* no filter */ - } - else if (session.params.channels == 1) - { + if (session.params.channels == 1) { switch (session.params.color_filter) { case ColorFilter::RED: @@ -910,23 +796,6 @@ static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens /* CIS scanners can do true gray by setting LEDADD */ reg->find_reg(0x87).value &= ~REG_0x87_LEDADD; - if (has_flag(session.params.flags, ScanFlag::ENABLE_LEDADD)) { - reg->find_reg(0x87).value |= REG_0x87_LEDADD; - expr = reg->get16(REG_EXPR); - expg = reg->get16(REG_EXPG); - expb = reg->get16(REG_EXPB); - - /* use minimal exposure for best image quality */ - expavg = expg; - if (expr < expg) - expavg = expr; - if (expb < expavg) - expavg = expb; - - dev->reg.set16(REG_EXPR, expavg); - dev->reg.set16(REG_EXPG, expavg); - dev->reg.set16(REG_EXPB, expavg); - } // enable gamma tables if (should_enable_gamma(session, sensor)) { @@ -946,27 +815,6 @@ static void gl841_init_optical_regs_scan(Genesys_Device* dev, const Genesys_Sens reg->set8(0x34, sensor.dummy_pixel); } -static int -gl841_get_led_exposure(Genesys_Device * dev, const Genesys_Sensor& sensor) -{ - int d,r,g,b,m; - if (!dev->model->is_cis) - return 0; - d = dev->reg.find_reg(0x19).value; - - r = sensor.exposure.red; - g = sensor.exposure.green; - b = sensor.exposure.blue; - - m = r; - if (m < g) - 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 */ @@ -975,9 +823,13 @@ static int gl841_exposure_time(Genesys_Device *dev, const Genesys_Sensor& sensor int start, int used_pixels) { -int led_exposure; - - led_exposure=gl841_get_led_exposure(dev, sensor); + int led_exposure = 0; + if (dev->model->is_cis) { + unsigned dummy = dev->reg.find_reg(0x19).value; + unsigned max_sensor_exposure = std::max({sensor.exposure.red, sensor.exposure.green, + sensor.exposure.blue}); + led_exposure = dummy + max_sensor_exposure; + } return sanei_genesys_exposure_time2(dev, profile, slope_dpi, start + used_pixels,/*+tgtime? currently done in sanei_genesys_exposure_time2 with tgtime = 32 pixel*/ led_exposure); @@ -1069,6 +921,9 @@ dummy \ scanned lines dev->total_bytes_read = 0; dev->total_bytes_to_read = session.output_line_bytes_requested * session.params.lines; + if (session.use_host_side_gray) { + dev->total_bytes_to_read /= 3; + } DBG(DBG_info, "%s: total bytes to send = %zu\n", __func__, dev->total_bytes_to_read); } @@ -1106,19 +961,6 @@ ScanSession CommandSetGl841::calculate_scan_session(const Genesys_Device* dev, start += dev->settings.tl_x; start = static_cast<float>((start * dev->settings.xres) / MM_PER_INCH); - // we enable true gray for cis scanners only, and just when doing - // scan since color calibration is OK for this mode - ScanFlag flags = ScanFlag::NONE; - - // true gray (led add for cis scanners) - if (dev->model->is_cis && dev->settings.true_gray && - dev->settings.scan_mode != ScanColorMode::COLOR_SINGLE_PASS && - dev->model->sensor_id != SensorId::CIS_CANON_LIDE_80) - { - // on Lide 80 the LEDADD bit results in only red LED array being lit - flags |= ScanFlag::ENABLE_LEDADD; - } - ScanSession session; session.params.xres = dev->settings.xres; session.params.yres = dev->settings.yres; @@ -1132,7 +974,9 @@ ScanSession CommandSetGl841::calculate_scan_session(const Genesys_Device* dev, session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = dev->settings.scan_mode; session.params.color_filter = dev->settings.color_filter; - session.params.flags = flags; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; + session.params.flags = ScanFlag::NONE; compute_session(dev, session, sensor); return session; @@ -1613,6 +1457,8 @@ void CommandSetGl841::init_regs_for_shading(Genesys_Device* dev, const Genesys_S session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA; compute_session(dev, session, calib_sensor); @@ -1690,6 +1536,8 @@ static void ad_fe_offset_calibration(Genesys_Device* dev, const Genesys_Sensor& session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA | ScanFlag::SINGLE_LINE | @@ -1760,14 +1608,10 @@ static void ad_fe_offset_calibration(Genesys_Device* dev, const Genesys_Sensor& turn++; } while ((top-bottom)>1 && turn < 100); - // FIXME: don't overwrite the calibrated values - dev->frontend.set_offset(0, 0); - dev->frontend.set_offset(1, 0); - dev->frontend.set_offset(2, 0); - DBG(DBG_info, "%s: offset=(%d,%d,%d)\n", __func__, - dev->frontend.get_offset(0), - dev->frontend.get_offset(1), - dev->frontend.get_offset(2)); + DBG(DBG_info, "%s: offset=(%d,%d,%d)\n", __func__, + dev->frontend.get_offset(0), + dev->frontend.get_offset(1), + dev->frontend.get_offset(2)); } /* this function does the offset calibration by scanning one line of the calibration @@ -1811,6 +1655,8 @@ void CommandSetGl841::offset_calibration(Genesys_Device* dev, const Genesys_Sens session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = ScanFlag::DISABLE_SHADING | ScanFlag::DISABLE_GAMMA | ScanFlag::SINGLE_LINE | @@ -2160,6 +2006,8 @@ void CommandSetGl841::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = 0; + session.params.brightness_adjustment = 0; session.params.flags = flags; compute_session(dev, session, sensor); diff --git a/backend/genesys/gl841.h b/backend/genesys/gl841.h index dbe2e59..64b23c8 100644 --- a/backend/genesys/gl841.h +++ b/backend/genesys/gl841.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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. */ #include "genesys.h" diff --git a/backend/genesys/gl841_registers.h b/backend/genesys/gl841_registers.h index a8d924d..0a59aac 100644 --- a/backend/genesys/gl841_registers.h +++ b/backend/genesys/gl841_registers.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_GL841_REGISTERS_H diff --git a/backend/genesys/gl842.cpp b/backend/genesys/gl842.cpp index 9d3da67..a593040 100644 --- a/backend/genesys/gl842.cpp +++ b/backend/genesys/gl842.cpp @@ -17,9 +17,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - As a special exception, the authors of SANE give permission for - additional uses of the libraries contained in this release of SANE. */ #define DEBUG_DECLARE_ONLY @@ -629,6 +626,8 @@ ScanSession CommandSetGl842::calculate_scan_session(const Genesys_Device* dev, session.params.scan_method = settings.scan_method; session.params.scan_mode = settings.scan_mode; session.params.color_filter = settings.color_filter; + session.params.contrast_adjustment = settings.contrast; + session.params.brightness_adjustment = settings.brightness; session.params.flags = flags; compute_session(dev, session, sensor); @@ -823,6 +822,8 @@ void CommandSetGl842::init_regs_for_shading(Genesys_Device* dev, const Genesys_S session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = dev->settings.scan_mode; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = flags; compute_session(dev, session, calib_sensor); @@ -916,6 +917,8 @@ void CommandSetGl842::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = 0; + session.params.brightness_adjustment = 0; session.params.flags = flags; compute_session(dev, session, calib_sensor); diff --git a/backend/genesys/gl842.h b/backend/genesys/gl842.h index b20ef5e..3636bac 100644 --- a/backend/genesys/gl842.h +++ b/backend/genesys/gl842.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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. */ #include "genesys.h" diff --git a/backend/genesys/gl842_registers.h b/backend/genesys/gl842_registers.h index ceb540b..7c5957a 100644 --- a/backend/genesys/gl842_registers.h +++ b/backend/genesys/gl842_registers.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_gl842_REGISTERS_H diff --git a/backend/genesys/gl843.cpp b/backend/genesys/gl843.cpp index e768ac0..6180bf9 100644 --- a/backend/genesys/gl843.cpp +++ b/backend/genesys/gl843.cpp @@ -17,27 +17,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -1122,6 +1101,8 @@ ScanSession CommandSetGl843::calculate_scan_session(const Genesys_Device* dev, session.params.scan_method = settings.scan_method; session.params.scan_mode = settings.scan_mode; session.params.color_filter = settings.color_filter; + session.params.contrast_adjustment = settings.contrast; + session.params.brightness_adjustment = settings.brightness; session.params.flags = flags; compute_session(dev, session, sensor); @@ -1240,6 +1221,7 @@ void CommandSetGl843::begin_scan(Genesys_Device* dev, const Genesys_Sensor& sens dev->interface->write_register(0x7e, 0x04); break; case GpioId::G4050: + case GpioId::G4010: dev->interface->write_register(REG_0xA7, 0xfe); dev->interface->write_register(REG_0xA8, 0x3e); dev->interface->write_register(REG_0xA9, 0x06); @@ -1432,6 +1414,8 @@ void CommandSetGl843::init_regs_for_shading(Genesys_Device* dev, const Genesys_S session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = dev->settings.scan_mode; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = flags; compute_session(dev, session, calib_sensor); @@ -1535,6 +1519,8 @@ void CommandSetGl843::init_regs_for_warmup(Genesys_Device* dev, const Genesys_Se session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = 0; + session.params.brightness_adjustment = 0; session.params.flags = flags; compute_session(dev, session, calib_sensor); @@ -1680,6 +1666,7 @@ void CommandSetGl843::update_hardware_sensors(Genesys_Scanner* s) const */ uint8_t val = s->dev->interface->read_register(REG_0x6D); + DBG(DBG_io, "%s: read buttons_gpio value=0x%x\n", __func__, (int)val); switch (s->dev->model->gpio_id) { @@ -1692,6 +1679,12 @@ void CommandSetGl843::update_hardware_sensors(Genesys_Scanner* s) const s->buttons[BUTTON_EMAIL_SW].write((val & 0x04) == 0); s->buttons[BUTTON_COPY_SW].write((val & 0x08) == 0); break; + case GpioId::G4010: + s->buttons[BUTTON_FILE_SW].write((val & 0x01) == 0); + s->buttons[BUTTON_COPY_SW].write((val & 0x04) == 0); + s->buttons[BUTTON_TRANSP_SW].write((val & 0x40) == 0); + s->buttons[BUTTON_SCAN_SW].write((val & 0x08) == 0); + break; case GpioId::CANON_4400F: case GpioId::CANON_8400F: default: diff --git a/backend/genesys/gl843.h b/backend/genesys/gl843.h index fe2814d..ac845bd 100644 --- a/backend/genesys/gl843.h +++ b/backend/genesys/gl843.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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. */ #include "genesys.h" diff --git a/backend/genesys/gl843_registers.h b/backend/genesys/gl843_registers.h index ab1f4c7..a1fe156 100644 --- a/backend/genesys/gl843_registers.h +++ b/backend/genesys/gl843_registers.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_GL843_REGISTERS_H diff --git a/backend/genesys/gl846.cpp b/backend/genesys/gl846.cpp index c8907b2..b427376 100644 --- a/backend/genesys/gl846.cpp +++ b/backend/genesys/gl846.cpp @@ -17,27 +17,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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. */ /** @file @@ -374,25 +353,13 @@ static void gl846_init_motor_regs_scan(Genesys_Device* dev, unsigned step_multiplier = gl846_get_step_multiplier(reg); - bool use_fast_fed = false; - if (dev->settings.yres == 4444 && feed_steps > 100 && !has_flag(flags, ScanFlag::FEEDING)) { - use_fast_fed = true; - } - if (has_flag(dev->model->flags, ModelFlag::DISABLE_FAST_FEEDING)) { - use_fast_fed = false; - } - reg->set24(REG_LINCNT, scan_lines); reg->set8(REG_0x02, 0); sanei_genesys_set_motor_power(*reg, true); std::uint8_t reg02 = reg->get8(REG_0x02); - if (use_fast_fed) { - reg02 |= REG_0x02_FASTFED; - } else { - reg02 &= ~REG_0x02_FASTFED; - } + reg02 &= ~REG_0x02_FASTFED; if (has_flag(flags, ScanFlag::AUTO_GO_HOME)) { reg02 |= REG_0x02_AGOHOME | REG_0x02_NOTHOME; @@ -446,18 +413,11 @@ static void gl846_init_motor_regs_scan(Genesys_Device* dev, unsigned feedl = feed_steps; unsigned dist = 0; - if (use_fast_fed) { - feedl <<= static_cast<unsigned>(fast_profile->step_type); - dist = (scan_table.table.size() + 2 * fast_table.table.size()); - // TODO read and decode REG_0xAB - dist += (reg->get8(0x5e) & 31); - dist += reg->get8(REG_FEDCNT); - } else { - feedl <<= static_cast<unsigned>(motor_profile.step_type); - dist = scan_table.table.size(); - if (has_flag(flags, ScanFlag::FEEDING)) { - dist *= 2; - } + + feedl <<= static_cast<unsigned>(motor_profile.step_type); + dist = scan_table.table.size(); + if (has_flag(flags, ScanFlag::FEEDING)) { + dist *= 2; } // check for overflow @@ -513,7 +473,7 @@ static void gl846_init_motor_regs_scan(Genesys_Device* dev, reg->set8(REG_BWDSTEP, min_restep); std::uint32_t z1, z2; - sanei_genesys_calculate_zmod(use_fast_fed, + sanei_genesys_calculate_zmod(false, scan_exposure_time * ccdlmt * tgtime, scan_table.table, scan_table.table.size(), @@ -759,6 +719,8 @@ ScanSession CommandSetGl846::calculate_scan_session(const Genesys_Device* dev, session.params.scan_method = settings.scan_method; session.params.scan_mode = settings.scan_mode; session.params.color_filter = settings.color_filter; + session.params.contrast_adjustment = settings.contrast; + session.params.brightness_adjustment = settings.brightness; // backtracking isn't handled well, so don't enable it session.params.flags = flags; @@ -882,6 +844,8 @@ void CommandSetGl846::init_regs_for_shading(Genesys_Device* dev, const Genesys_S session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = flags; compute_session(dev, session, calib_sensor); diff --git a/backend/genesys/gl846.h b/backend/genesys/gl846.h index d06b337..f1d396d 100644 --- a/backend/genesys/gl846.h +++ b/backend/genesys/gl846.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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. */ #include "genesys.h" diff --git a/backend/genesys/gl846_registers.h b/backend/genesys/gl846_registers.h index df45e4f..8e3c655 100644 --- a/backend/genesys/gl846_registers.h +++ b/backend/genesys/gl846_registers.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_GL846_REGISTERS_H diff --git a/backend/genesys/gl847.cpp b/backend/genesys/gl847.cpp index 91ac4eb..13f9dd9 100644 --- a/backend/genesys/gl847.cpp +++ b/backend/genesys/gl847.cpp @@ -17,27 +17,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -338,25 +317,13 @@ static void gl847_init_motor_regs_scan(Genesys_Device* dev, unsigned step_multiplier = gl847_get_step_multiplier (reg); - bool use_fast_fed = false; - if (dev->settings.yres == 4444 && feed_steps > 100 && !has_flag(flags, ScanFlag::FEEDING)) { - use_fast_fed = true; - } - if (has_flag(dev->model->flags, ModelFlag::DISABLE_FAST_FEEDING)) { - use_fast_fed = false; - } - reg->set24(REG_LINCNT, scan_lines); reg->set8(REG_0x02, 0); sanei_genesys_set_motor_power(*reg, true); std::uint8_t reg02 = reg->get8(REG_0x02); - if (use_fast_fed) { - reg02 |= REG_0x02_FASTFED; - } else { - reg02 &= ~REG_0x02_FASTFED; - } + reg02 &= ~REG_0x02_FASTFED; if (has_flag(flags, ScanFlag::AUTO_GO_HOME)) { reg02 |= REG_0x02_AGOHOME | REG_0x02_NOTHOME; @@ -402,19 +369,11 @@ static void gl847_init_motor_regs_scan(Genesys_Device* dev, // correct move distance by acceleration and deceleration amounts unsigned feedl = feed_steps; unsigned dist = 0; - if (use_fast_fed) - { - feedl <<= static_cast<unsigned>(fast_step_type); - dist = (scan_table.table.size() + 2 * fast_table.table.size()); - // TODO read and decode REG_0xAB - dist += (reg->get8(0x5e) & 31); - dist += reg->get8(REG_FEDCNT); - } else { - feedl <<= static_cast<unsigned>(motor_profile.step_type); - dist = scan_table.table.size(); - if (has_flag(flags, ScanFlag::FEEDING)) { - dist *= 2; - } + + feedl <<= static_cast<unsigned>(motor_profile.step_type); + dist = scan_table.table.size(); + if (has_flag(flags, ScanFlag::FEEDING)) { + dist *= 2; } // check for overflow @@ -456,7 +415,7 @@ static void gl847_init_motor_regs_scan(Genesys_Device* dev, reg->set8(REG_BWDSTEP, min_restep); std::uint32_t z1, z2; - sanei_genesys_calculate_zmod(use_fast_fed, + sanei_genesys_calculate_zmod(false, scan_exposure_time * ccdlmt * tgtime, scan_table.table, scan_table.table.size(), @@ -735,6 +694,8 @@ ScanSession CommandSetGl847::calculate_scan_session(const Genesys_Device* dev, session.params.scan_method = settings.scan_method; session.params.scan_mode = settings.scan_mode; session.params.color_filter = settings.color_filter; + session.params.contrast_adjustment = settings.contrast; + session.params.brightness_adjustment = settings.brightness; session.params.flags = flags; compute_session(dev, session, sensor); @@ -900,6 +861,8 @@ void CommandSetGl847::init_regs_for_shading(Genesys_Device* dev, const Genesys_S session.params.scan_method = dev->settings.scan_method; session.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; session.params.color_filter = dev->settings.color_filter; + session.params.contrast_adjustment = dev->settings.contrast; + session.params.brightness_adjustment = dev->settings.brightness; session.params.flags = flags; compute_session(dev, session, calib_sensor); diff --git a/backend/genesys/gl847.h b/backend/genesys/gl847.h index 2cb3a9f..4b98b7a 100644 --- a/backend/genesys/gl847.h +++ b/backend/genesys/gl847.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_GL847_H diff --git a/backend/genesys/gl847_registers.h b/backend/genesys/gl847_registers.h index 66fda4b..3497c69 100644 --- a/backend/genesys/gl847_registers.h +++ b/backend/genesys/gl847_registers.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_GL847_REGISTERS_H diff --git a/backend/genesys/image.cpp b/backend/genesys/image.cpp index 3ea6ef6..431f996 100644 --- a/backend/genesys/image.cpp +++ b/backend/genesys/image.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/image.h b/backend/genesys/image.h index 0ad344e..07d3be3 100644 --- a/backend/genesys/image.h +++ b/backend/genesys/image.h @@ -15,28 +15,7 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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. + along with this program. If not, see <https://www.gnu.org/licenses/>.s */ #ifndef BACKEND_GENESYS_IMAGE_H diff --git a/backend/genesys/image_buffer.cpp b/backend/genesys/image_buffer.cpp index 46ca292..ed01252 100644 --- a/backend/genesys/image_buffer.cpp +++ b/backend/genesys/image_buffer.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/image_buffer.h b/backend/genesys/image_buffer.h index 516e828..15af742 100644 --- a/backend/genesys/image_buffer.h +++ b/backend/genesys/image_buffer.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_IMAGE_BUFFER_H diff --git a/backend/genesys/image_pipeline.cpp b/backend/genesys/image_pipeline.cpp index 4161e95..f53680f 100644 --- a/backend/genesys/image_pipeline.cpp +++ b/backend/genesys/image_pipeline.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -304,8 +283,8 @@ bool ImagePipelineNodeInvert::get_next_row_data(std::uint8_t* out_data) return got_data; } -ImagePipelineNodeMergeMonoLines::ImagePipelineNodeMergeMonoLines(ImagePipelineNode& source, - ColorOrder color_order) : +ImagePipelineNodeMergeMonoLinesToColor::ImagePipelineNodeMergeMonoLinesToColor( + ImagePipelineNode& source, ColorOrder color_order) : source_(source), buffer_(source_.get_row_bytes()) { @@ -314,7 +293,7 @@ ImagePipelineNodeMergeMonoLines::ImagePipelineNodeMergeMonoLines(ImagePipelineNo output_format_ = get_output_format(source_.get_format(), color_order); } -bool ImagePipelineNodeMergeMonoLines::get_next_row_data(std::uint8_t* out_data) +bool ImagePipelineNodeMergeMonoLinesToColor::get_next_row_data(std::uint8_t* out_data) { bool got_data = true; @@ -341,8 +320,8 @@ bool ImagePipelineNodeMergeMonoLines::get_next_row_data(std::uint8_t* out_data) return got_data; } -PixelFormat ImagePipelineNodeMergeMonoLines::get_output_format(PixelFormat input_format, - ColorOrder order) +PixelFormat ImagePipelineNodeMergeMonoLinesToColor::get_output_format(PixelFormat input_format, + ColorOrder order) { switch (input_format) { case PixelFormat::I1: { @@ -417,6 +396,75 @@ PixelFormat ImagePipelineNodeSplitMonoLines::get_output_format(PixelFormat input throw SaneException("Unsupported input format %d", static_cast<unsigned>(input_format)); } + +ImagePipelineNodeMergeColorToGray::ImagePipelineNodeMergeColorToGray(ImagePipelineNode& source) : + source_(source) +{ + + output_format_ = get_output_format(source_.get_format()); + float red_mult = 0.2125f; + float green_mult = 0.7154f; + float blue_mult = 0.0721f; + + switch (get_pixel_format_color_order(source_.get_format())) { + case ColorOrder::RGB: { + ch0_mult_ = red_mult; + ch1_mult_ = green_mult; + ch2_mult_ = blue_mult; + break; + } + case ColorOrder::BGR: { + ch0_mult_ = blue_mult; + ch1_mult_ = green_mult; + ch2_mult_ = red_mult; + break; + } + case ColorOrder::GBR: { + ch0_mult_ = green_mult; + ch1_mult_ = blue_mult; + ch2_mult_ = red_mult; + break; + } + default: + throw SaneException("Unknown color order"); + } + temp_buffer_.resize(source_.get_row_bytes()); +} + +bool ImagePipelineNodeMergeColorToGray::get_next_row_data(std::uint8_t* out_data) +{ + auto* src_data = temp_buffer_.data(); + + bool got_data = source_.get_next_row_data(src_data); + + auto src_format = source_.get_format(); + + for (std::size_t x = 0, width = get_width(); x < width; ++x) { + std::uint16_t ch0 = get_raw_channel_from_row(src_data, x, 0, src_format); + std::uint16_t ch1 = get_raw_channel_from_row(src_data, x, 1, src_format); + std::uint16_t ch2 = get_raw_channel_from_row(src_data, x, 2, src_format); + float mono = ch0 * ch0_mult_ + ch1 * ch1_mult_ + ch2 * ch2_mult_; + set_raw_channel_to_row(out_data, x, 0, static_cast<std::uint16_t>(mono), output_format_); + } + return got_data; +} + +PixelFormat ImagePipelineNodeMergeColorToGray::get_output_format(PixelFormat input_format) +{ + switch (input_format) { + case PixelFormat::RGB111: + return PixelFormat::I1; + case PixelFormat::RGB888: + case PixelFormat::BGR888: + return PixelFormat::I8; + case PixelFormat::RGB161616: + case PixelFormat::BGR161616: + return PixelFormat::I16; + default: break; + } + throw SaneException("Unsupported format %d", static_cast<unsigned>(input_format)); +} + ImagePipelineNodeComponentShiftLines::ImagePipelineNodeComponentShiftLines( ImagePipelineNode& source, unsigned shift_r, unsigned shift_g, unsigned shift_b) : source_(source), @@ -712,7 +760,7 @@ ImagePipelineNodeCalibrate::ImagePipelineNodeCalibrate(ImagePipelineNode& source const std::vector<std::uint16_t>& bottom, const std::vector<std::uint16_t>& top, std::size_t x_start) : - source_{source} + source_(source) { std::size_t size = 0; if (bottom.size() >= x_start && top.size() >= x_start) { diff --git a/backend/genesys/image_pipeline.h b/backend/genesys/image_pipeline.h index 3632b36..39aed71 100644 --- a/backend/genesys/image_pipeline.h +++ b/backend/genesys/image_pipeline.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_IMAGE_PIPELINE_H @@ -295,11 +274,11 @@ private: }; // A pipeline node that merges 3 mono lines into a color channel -class ImagePipelineNodeMergeMonoLines : public ImagePipelineNode +class ImagePipelineNodeMergeMonoLinesToColor : public ImagePipelineNode { public: - ImagePipelineNodeMergeMonoLines(ImagePipelineNode& source, - ColorOrder color_order); + ImagePipelineNodeMergeMonoLinesToColor(ImagePipelineNode& source, + ColorOrder color_order); std::size_t get_width() const override { return source_.get_width(); } std::size_t get_height() const override { return source_.get_height() / 3; } @@ -342,6 +321,33 @@ private: unsigned next_channel_ = 0; }; + +// A pipeline node that merges 3 mono lines into a gray channel +class ImagePipelineNodeMergeColorToGray : public ImagePipelineNode +{ +public: + ImagePipelineNodeMergeColorToGray(ImagePipelineNode& source); + + std::size_t get_width() const override { return source_.get_width(); } + std::size_t get_height() const override { return source_.get_height(); } + PixelFormat get_format() const override { return output_format_; } + + bool eof() const override { return source_.eof(); } + + bool get_next_row_data(std::uint8_t* out_data) override; + +private: + static PixelFormat get_output_format(PixelFormat input_format); + + ImagePipelineNode& source_; + PixelFormat output_format_ = PixelFormat::UNKNOWN; + float ch0_mult_ = 0; + float ch1_mult_ = 0; + float ch2_mult_ = 0; + + std::vector<std::uint8_t> temp_buffer_; +}; + // A pipeline node that shifts colors across lines by the given offsets class ImagePipelineNodeComponentShiftLines : public ImagePipelineNode { diff --git a/backend/genesys/image_pixel.cpp b/backend/genesys/image_pixel.cpp index 011a086..02ef782 100644 --- a/backend/genesys/image_pixel.cpp +++ b/backend/genesys/image_pixel.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/image_pixel.h b/backend/genesys/image_pixel.h index 4b16083..e414cfb 100644 --- a/backend/genesys/image_pixel.h +++ b/backend/genesys/image_pixel.h @@ -15,28 +15,7 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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. + along with this program. If not, see <https://www.gnu.org/licenses/>.s */ #ifndef BACKEND_GENESYS_IMAGE_PIXEL_H diff --git a/backend/genesys/low.cpp b/backend/genesys/low.cpp index ddd2c88..a6da2c1 100644 --- a/backend/genesys/low.cpp +++ b/backend/genesys/low.cpp @@ -17,27 +17,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -442,7 +421,11 @@ Image read_unshuffled_image_from_scanner(Genesys_Device* dev, const ScanSession& } if (dev->model->is_cis && session.params.channels == 3) { - pipeline.push_node<ImagePipelineNodeMergeMonoLines>(dev->model->line_mode_color_order); + pipeline.push_node<ImagePipelineNodeMergeMonoLinesToColor>(dev->model->line_mode_color_order); + } + + if (session.use_host_side_gray) { + pipeline.push_node<ImagePipelineNodeMergeColorToGray>(); } if (pipeline.get_output_format() == PixelFormat::BGR888) { @@ -540,7 +523,7 @@ Image read_shuffled_image_from_scanner(Genesys_Device* dev, const ScanSession& s } if (dev->model->is_cis && session.params.channels == 3) { - pipeline.push_node<ImagePipelineNodeMergeMonoLines>(dev->model->line_mode_color_order); + pipeline.push_node<ImagePipelineNodeMergeMonoLinesToColor>(dev->model->line_mode_color_order); } if (pipeline.get_output_format() == PixelFormat::BGR888) { @@ -638,11 +621,16 @@ bool should_enable_gamma(const ScanSession& session, const Genesys_Sensor& senso if ((session.params.flags & ScanFlag::DISABLE_GAMMA) != ScanFlag::NONE) { return false; } - if (sensor.gamma[0] == 1.0f || sensor.gamma[1] == 1.0f || sensor.gamma[2] == 1.0f) { + if (session.params.depth == 16) { return false; } - if (session.params.depth == 16) + if (session.params.brightness_adjustment != 0 || session.params.contrast_adjustment != 0) { + return true; + } + + if (sensor.gamma[0] == 1.0f || sensor.gamma[1] == 1.0f || sensor.gamma[2] == 1.0f) { return false; + } return true; } @@ -949,6 +937,14 @@ void compute_session(const Genesys_Device* dev, ScanSession& s, const Genesys_Se s.output_startx = static_cast<unsigned>( static_cast<int>(s.params.startx) + sensor.output_pixel_offset); + if (has_flag(dev->model->flags, ModelFlag::HOST_SIDE_GRAY) && s.params.channels == 1 && + s.params.color_filter == ColorFilter::NONE) + { + s.use_host_side_gray = true; + s.params.channels = 3; + s.params.scan_mode = ScanColorMode::COLOR_SINGLE_PASS; + } + s.stagger_x = sensor.stagger_x; s.stagger_y = sensor.stagger_y; @@ -1114,7 +1110,8 @@ void compute_session(const Genesys_Device* dev, ScanSession& s, const Genesys_Se dev->model->asic_type == AsicType::GL845 || dev->model->asic_type == AsicType::GL846) { - s.enable_ledadd = (s.params.channels == 1 && dev->model->is_cis && dev->settings.true_gray); + s.enable_ledadd = (s.params.channels == 1 && dev->model->is_cis && + s.params.color_filter == ColorFilter::NONE); } s.use_host_side_calib = sensor.use_host_side_calib; @@ -1212,7 +1209,7 @@ ImagePipelineStack build_image_pipeline(const Genesys_Device& dev, const ScanSes } if (dev.model->is_cis && session.params.channels == 3) { - pipeline.push_node<ImagePipelineNodeMergeMonoLines>(dev.model->line_mode_color_order); + pipeline.push_node<ImagePipelineNodeMergeMonoLinesToColor>(dev.model->line_mode_color_order); if (log_image_data) { pipeline.push_node<ImagePipelineNodeDebug>(debug_prefix + "_4_after_merge_mono.tiff"); @@ -1274,6 +1271,14 @@ ImagePipelineStack build_image_pipeline(const Genesys_Device& dev, const ScanSes } } + if (session.use_host_side_gray) { + pipeline.push_node<ImagePipelineNodeMergeColorToGray>(); + + if (log_image_data) { + pipeline.push_node<ImagePipelineNodeDebug>(debug_prefix + "_10_after_nogray.tiff"); + } + } + if (pipeline.get_output_width() != session.params.get_requested_pixels()) { pipeline.push_node<ImagePipelineNodeScaleRows>(session.params.get_requested_pixels()); } diff --git a/backend/genesys/low.h b/backend/genesys/low.h index ac149b5..b0d23fe 100644 --- a/backend/genesys/low.h +++ b/backend/genesys/low.h @@ -23,27 +23,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 GENESYS_LOW_H @@ -116,6 +95,7 @@ #define GENESYS_HAS_POWER_SW (1 << 6) /**< scanner has power button */ #define GENESYS_HAS_CALIBRATE (1 << 7) /**< scanner has 'calibrate' software button to start calibration */ #define GENESYS_HAS_EXTRA_SW (1 << 8) /**< scanner has extra function button */ +#define GENESYS_HAS_TRANSP_SW (1 << 9) /**< scanner has TRANSPARCY/SCAN_FILM button */ /* USB control message values */ #define REQUEST_TYPE_IN (USB_TYPE_VENDOR | USB_DIR_IN) diff --git a/backend/genesys/motor.cpp b/backend/genesys/motor.cpp index 8450fea..1dfe64f 100644 --- a/backend/genesys/motor.cpp +++ b/backend/genesys/motor.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -136,7 +115,8 @@ MotorSlopeTable create_slope_table_for_speed(const MotorSlope& slope, unsigned t unsigned max_speed_shifted_w = slope.max_speed_w >> step_shift; if (target_speed_shifted_w < max_speed_shifted_w) { - dbg.log(DBG_warn, "failed to reach target speed"); + dbg.vlog(DBG_warn, "failed to reach target speed %d %d", target_speed_w, + slope.max_speed_w); } if (target_speed_shifted_w >= std::numeric_limits<std::uint16_t>::max()) { diff --git a/backend/genesys/motor.h b/backend/genesys/motor.h index e5fd695..1981e80 100644 --- a/backend/genesys/motor.h +++ b/backend/genesys/motor.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_MOTOR_H diff --git a/backend/genesys/register.h b/backend/genesys/register.h index cee9adf..8ac549d 100644 --- a/backend/genesys/register.h +++ b/backend/genesys/register.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_REGISTER_H diff --git a/backend/genesys/register_cache.h b/backend/genesys/register_cache.h index c7e5c41..0538529 100644 --- a/backend/genesys/register_cache.h +++ b/backend/genesys/register_cache.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_REGISTER_CACHE_H diff --git a/backend/genesys/row_buffer.h b/backend/genesys/row_buffer.h index a4b9e42..d7f071c 100644 --- a/backend/genesys/row_buffer.h +++ b/backend/genesys/row_buffer.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_LINE_BUFFER_H diff --git a/backend/genesys/scanner_interface.cpp b/backend/genesys/scanner_interface.cpp index 5363f0e..485270e 100644 --- a/backend/genesys/scanner_interface.cpp +++ b/backend/genesys/scanner_interface.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/scanner_interface.h b/backend/genesys/scanner_interface.h index 8258117..3aa9d6b 100644 --- a/backend/genesys/scanner_interface.h +++ b/backend/genesys/scanner_interface.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_SCANNER_INTERFACE_H diff --git a/backend/genesys/scanner_interface_usb.cpp b/backend/genesys/scanner_interface_usb.cpp index 117297c..da8823b 100644 --- a/backend/genesys/scanner_interface_usb.cpp +++ b/backend/genesys/scanner_interface_usb.cpp @@ -16,34 +16,12 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 "scanner_interface_usb.h" #include "low.h" -#include <thread> namespace genesys { @@ -481,7 +459,7 @@ void ScannerInterfaceUsb::sleep_us(unsigned microseconds) if (sanei_usb_is_replay_mode_enabled()) { return; } - std::this_thread::sleep_for(std::chrono::microseconds{microseconds}); + usleep(microseconds); } void ScannerInterfaceUsb::record_progress_message(const char* msg) diff --git a/backend/genesys/scanner_interface_usb.h b/backend/genesys/scanner_interface_usb.h index 569d634..d6408df 100644 --- a/backend/genesys/scanner_interface_usb.h +++ b/backend/genesys/scanner_interface_usb.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_SCANNER_INTERFACE_USB_H diff --git a/backend/genesys/sensor.cpp b/backend/genesys/sensor.cpp index b09745f..d3cdda1 100644 --- a/backend/genesys/sensor.cpp +++ b/backend/genesys/sensor.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/sensor.h b/backend/genesys/sensor.h index 6f87607..2902b0d 100644 --- a/backend/genesys/sensor.h +++ b/backend/genesys/sensor.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_SENSOR_H diff --git a/backend/genesys/serialize.h b/backend/genesys/serialize.h index 138ff08..ed67ea3 100644 --- a/backend/genesys/serialize.h +++ b/backend/genesys/serialize.h @@ -15,28 +15,7 @@ General Public License for more details. You should have received a copy of the GNU General Public License - along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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. + along with this program. If not, see <https://www.gnu.org/licenses/>.s */ #ifndef BACKEND_GENESYS_SERIALIZE_H diff --git a/backend/genesys/settings.cpp b/backend/genesys/settings.cpp index 7f64798..d409683 100644 --- a/backend/genesys/settings.cpp +++ b/backend/genesys/settings.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -86,6 +65,8 @@ std::ostream& operator<<(std::ostream& out, const SetupParams& params) << " channels: " << params.channels << '\n' << " scan_mode: " << params.scan_mode << '\n' << " color_filter: " << params.color_filter << '\n' + << " contrast_adjustment: " << params.contrast_adjustment << '\n' + << " brightness_adjustment: " << params.brightness_adjustment << '\n' << " flags: " << params.flags << '\n' << "}"; return out; @@ -127,7 +108,8 @@ bool ScanSession::operator==(const ScanSession& other) const shading_pixel_offset == other.shading_pixel_offset && buffer_size_read == other.buffer_size_read && enable_ledadd == other.enable_ledadd && - use_host_side_calib == other.use_host_side_calib; + use_host_side_calib == other.use_host_side_calib && + use_host_side_gray == other.use_host_side_gray; } std::ostream& operator<<(std::ostream& out, const ScanSession& session) @@ -164,6 +146,7 @@ std::ostream& operator<<(std::ostream& out, const ScanSession& session) << " buffer_size_read: " << session.buffer_size_read << '\n' << " enable_ledadd: " << session.enable_ledadd << '\n' << " use_host_side_calib: " << session.use_host_side_calib << '\n' + << " use_host_side_gray: " << session.use_host_side_gray << '\n' << " params: " << format_indent_braced_list(4, session.params) << '\n' << "}"; return out; diff --git a/backend/genesys/settings.h b/backend/genesys/settings.h index 4c834fa..d404941 100644 --- a/backend/genesys/settings.h +++ b/backend/genesys/settings.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_SETTINGS_H @@ -76,9 +55,6 @@ struct Genesys_Settings ColorFilter color_filter = ColorFilter::NONE; - // true if scan is true gray, false if monochrome scan - int true_gray = 0; - // value for contrast enhancement in the [-100..100] range int contrast = 0; @@ -102,6 +78,7 @@ std::ostream& operator<<(std::ostream& out, const Genesys_Settings& settings); struct SetupParams { static constexpr unsigned NOT_SET = std::numeric_limits<unsigned>::max(); + static constexpr unsigned NOT_SET_I = std::numeric_limits<int>::max(); // resolution in x direction unsigned xres = NOT_SET; @@ -136,6 +113,10 @@ struct SetupParams { ColorFilter color_filter = static_cast<ColorFilter>(NOT_SET); + // the values for contrast and brightness adjustment in the range of [-100..100] + int contrast_adjustment = NOT_SET_I; + int brightness_adjustment = NOT_SET_I; + ScanFlag flags = ScanFlag::NONE; unsigned get_requested_pixels() const @@ -152,7 +133,8 @@ struct SetupParams { pixels == NOT_SET || lines == NOT_SET ||depth == NOT_SET || channels == NOT_SET || scan_method == static_cast<ScanMethod>(NOT_SET) || scan_mode == static_cast<ScanColorMode>(NOT_SET) || - color_filter == static_cast<ColorFilter>(NOT_SET)) + color_filter == static_cast<ColorFilter>(NOT_SET) || + contrast_adjustment == NOT_SET_I || brightness_adjustment == NOT_SET_I) { throw std::runtime_error("SetupParams are not valid"); } @@ -172,6 +154,8 @@ struct SetupParams { scan_method == other.scan_method && scan_mode == other.scan_mode && color_filter == other.color_filter && + contrast_adjustment == other.contrast_adjustment && + brightness_adjustment == other.brightness_adjustment && flags == other.flags; } }; @@ -193,6 +177,8 @@ void serialize(Stream& str, SetupParams& x) serialize(str, x.scan_method); serialize(str, x.scan_mode); serialize(str, x.color_filter); + serialize(str, x.contrast_adjustment); + serialize(str, x.brightness_adjustment); serialize(str, x.flags); } @@ -317,6 +303,9 @@ struct ScanSession { // whether calibration should be performed host-side bool use_host_side_calib = false; + // whether gray scanning should be performed host-side (scan as color and merge to gray) + bool use_host_side_gray = false; + void assert_computed() const { if (!computed) { @@ -368,6 +357,7 @@ void serialize(Stream& str, ScanSession& x) serialize(str, x.buffer_size_read); serialize(str, x.enable_ledadd); serialize(str, x.use_host_side_calib); + serialize(str, x.use_host_side_gray); } std::ostream& operator<<(std::ostream& out, const SANE_Parameters& params); diff --git a/backend/genesys/static_init.cpp b/backend/genesys/static_init.cpp index 5ed3b50..2d463ee 100644 --- a/backend/genesys/static_init.cpp +++ b/backend/genesys/static_init.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -57,12 +36,15 @@ void add_function_to_run_at_backend_exit(const std::function<void()>& function) void run_functions_at_backend_exit() { - for (auto it = s_functions_run_at_backend_exit->rbegin(); - it != s_functions_run_at_backend_exit->rend(); ++it) + if (s_functions_run_at_backend_exit) { - (*it)(); + for (auto it = s_functions_run_at_backend_exit->rbegin(); + it != s_functions_run_at_backend_exit->rend(); ++it) + { + (*it)(); + } + s_functions_run_at_backend_exit.reset(); } - s_functions_run_at_backend_exit.reset(); } } // namespace genesys diff --git a/backend/genesys/static_init.h b/backend/genesys/static_init.h index e0b39c8..63c242e 100644 --- a/backend/genesys/static_init.h +++ b/backend/genesys/static_init.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_STATIC_INIT_H diff --git a/backend/genesys/status.cpp b/backend/genesys/status.cpp index 170bcd7..b95bcd6 100644 --- a/backend/genesys/status.cpp +++ b/backend/genesys/status.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/status.h b/backend/genesys/status.h index f1a3695..5983bf2 100644 --- a/backend/genesys/status.h +++ b/backend/genesys/status.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_STATUS_H diff --git a/backend/genesys/tables_frontend.cpp b/backend/genesys/tables_frontend.cpp index 02e9998..65fc7f4 100644 --- a/backend/genesys/tables_frontend.cpp +++ b/backend/genesys/tables_frontend.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/tables_gpo.cpp b/backend/genesys/tables_gpo.cpp index 075cafb..f129262 100644 --- a/backend/genesys/tables_gpo.cpp +++ b/backend/genesys/tables_gpo.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -258,6 +237,21 @@ void genesys_init_gpo_tables() gpo = Genesys_Gpo(); + gpo.id = GpioId::G4010; + gpo.regs = { + { 0x6c, 0x20 }, + { 0x6d, 0x00 }, + { 0x6e, 0xfc }, + { 0x6f, 0x00 }, + { 0xa6, 0x08 }, + { 0xa7, 0x1e }, + { 0xa8, 0x3e }, + { 0xa9, 0x06 }, + }; + s_gpo->push_back(gpo); + + + gpo = Genesys_Gpo(); gpo.id = GpioId::HP_N6310; gpo.regs = { { 0x6c, 0xa3 }, diff --git a/backend/genesys/tables_model.cpp b/backend/genesys/tables_model.cpp index 6998a51..d139334 100644 --- a/backend/genesys/tables_model.cpp +++ b/backend/genesys/tables_model.cpp @@ -27,27 +27,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -191,6 +170,7 @@ void genesys_init_usb_device_tables() model.gpio_id = GpioId::CANON_LIDE_35; model.motor_id = MotorId::CANON_LIDE_35; model.flags = ModelFlag::DARK_WHITE_CALIBRATION | + ModelFlag::HOST_SIDE_GRAY | ModelFlag::CUSTOM_GAMMA; model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | @@ -342,12 +322,12 @@ void genesys_init_usb_device_tables() model.is_sheetfed = false; model.sensor_id = SensorId::CCD_G4050; model.adc_id = AdcId::G4050; - model.gpio_id = GpioId::G4050; + model.gpio_id = GpioId::G4010; model.motor_id = MotorId::G4050; model.flags = ModelFlag::WARMUP | ModelFlag::DARK_CALIBRATION | ModelFlag::CUSTOM_GAMMA; - model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_COPY_SW; + model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | GENESYS_HAS_COPY_SW | GENESYS_HAS_TRANSP_SW; model.search_lines = 100; s_usb_devices->emplace_back(0x03f0, 0x4505, model); @@ -619,8 +599,8 @@ void genesys_init_usb_device_tables() model.resolutions = { { { ScanMethod::FLATBED }, - { 2400, 1200, 600, 300, 200, 150, 100, 75 }, - { 4800, 2400, 1200, 600, 300, 200, 150, 100, 75 }, + { 2400, 1200, 600, 300, 200, 150 }, + { 4800, 2400, 1200, 600, 300, 200, 150 }, } }; @@ -1020,8 +1000,8 @@ void genesys_init_usb_device_tables() model.resolutions = { { { ScanMethod::FLATBED }, - { 4800, 2400, 1200, 600, 300, 200, 150, 100, 75 }, - { 4800, 2400, 1200, 600, 300, 200, 150, 100, 75 }, + { 4800, 2400, 1200, 600, 300, 200, 150 }, + { 4800, 2400, 1200, 600, 300, 200, 150 }, } }; @@ -1110,6 +1090,7 @@ void genesys_init_usb_device_tables() model.gpio_id = GpioId::CANON_LIDE_35; model.motor_id = MotorId::CANON_LIDE_60; model.flags = ModelFlag::DARK_WHITE_CALIBRATION | + ModelFlag::HOST_SIDE_GRAY | ModelFlag::CUSTOM_GAMMA; model.buttons = GENESYS_HAS_COPY_SW | @@ -1165,6 +1146,7 @@ void genesys_init_usb_device_tables() model.gpio_id = GpioId::CANON_LIDE_80; model.motor_id = MotorId::CANON_LIDE_80; model.flags = ModelFlag::DARK_WHITE_CALIBRATION | + ModelFlag::HOST_SIDE_GRAY | ModelFlag::CUSTOM_GAMMA; model.buttons = GENESYS_HAS_SCAN_SW | GENESYS_HAS_FILE_SW | diff --git a/backend/genesys/tables_motor.cpp b/backend/genesys/tables_motor.cpp index e8e89c5..3cc576f 100644 --- a/backend/genesys/tables_motor.cpp +++ b/backend/genesys/tables_motor.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -472,7 +451,7 @@ void genesys_init_motor_tables() motor.base_ydpi = 4800; motor.profiles.push_back({MotorSlope::create_from_steps(62496, 864, 127), StepType::FULL, 4608}); - motor.profiles.push_back({MotorSlope::create_from_steps(62496, 2010, 63), + motor.profiles.push_back({MotorSlope::create_from_steps(62496, 1338, 63), StepType::HALF, 5360}); motor.profiles.push_back({MotorSlope::create_from_steps(62464, 2632, 3), StepType::QUARTER, 10528}); diff --git a/backend/genesys/tables_sensor.cpp b/backend/genesys/tables_sensor.cpp index 8383287..fb18abc 100644 --- a/backend/genesys/tables_sensor.cpp +++ b/backend/genesys/tables_sensor.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 @@ -471,8 +450,8 @@ void genesys_init_sensor_tables() sensor.register_dpihw = 1200; sensor.black_pixels = 87; sensor.dummy_pixel = 87; - sensor.fau_gain_white_ref = 0; - sensor.gain_white_ref = 0; + sensor.fau_gain_white_ref = 100; + sensor.gain_white_ref = 100; sensor.exposure = { 0x0400, 0x0400, 0x0400 }; sensor.custom_regs = { { 0x16, 0x00 }, { 0x17, 0x02 }, { 0x18, 0x00 }, { 0x19, 0x50 }, @@ -519,8 +498,8 @@ void genesys_init_sensor_tables() sensor.register_dpihw = 1200; sensor.black_pixels = 87; sensor.dummy_pixel = 87; - sensor.fau_gain_white_ref = 0; - sensor.gain_white_ref = 0; + sensor.fau_gain_white_ref = 100; + sensor.gain_white_ref = 100; sensor.exposure = { 0x0400, 0x0400, 0x0400 }; sensor.custom_regs = { { 0x16, 0x00 }, { 0x17, 0x01 }, { 0x18, 0x00 }, { 0x19, 0x50 }, @@ -1058,30 +1037,6 @@ void genesys_init_sensor_tables() CustomSensorSettings custom_settings[] = { // Note: Windows driver uses 1424 lperiod and enables dummy line (0x17) - { { 75 }, 600, 2848, { 304, 203, 180 }, Ratio{1, 8}, 8, 40, 5136, - std::vector<unsigned>{}, { - { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff }, - { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 }, - { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 }, - { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 }, - { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c }, - { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f }, - { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, - } - }, - // Note: Windows driver uses 1424 lperiod and enables dummy line (0x17) - { { 100 }, 600, 2848, { 304, 203, 180 }, Ratio{1, 8}, 6, 53, 5136, - std::vector<unsigned>{}, { - { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff }, - { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 }, - { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 }, - { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 }, - { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c }, - { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f }, - { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, - } - }, - // Note: Windows driver uses 1424 lperiod and enables dummy line (0x17) { { 150 }, 600, 2848, { 304, 203, 180 }, Ratio{1, 8}, 4, 80, 5136, std::vector<unsigned>{}, { { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff }, @@ -1361,28 +1316,6 @@ void genesys_init_sensor_tables() }; CustomSensorSettings custom_settings[] = { - { { 75 }, 600, 2304, { 423, 294, 242 }, Ratio{1, 4}, 8, 40, 5136, - std::vector<unsigned>{}, { - { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff }, - { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 }, - { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 }, - { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 }, - { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c }, - { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f }, - { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, - } - }, - { { 100 }, 600, 2304, { 423, 294, 242 }, Ratio{1, 4}, 6, 53, 5136, - std::vector<unsigned>{}, { - { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff }, - { 0x1a, 0x34 }, { 0x1b, 0x00 }, { 0x1c, 0x02 }, { 0x1d, 0x04 }, - { 0x52, 0x03 }, { 0x53, 0x07 }, { 0x54, 0x00 }, { 0x55, 0x00 }, - { 0x56, 0x00 }, { 0x57, 0x00 }, { 0x58, 0x2a }, { 0x59, 0xe1 }, { 0x5a, 0x55 }, - { 0x74, 0x00 }, { 0x75, 0x00 }, { 0x76, 0x3c }, - { 0x77, 0x00 }, { 0x78, 0x00 }, { 0x79, 0x9f }, - { 0x7a, 0x00 }, { 0x7b, 0x00 }, { 0x7c, 0x55 }, - } - }, { { 150 }, 600, 2304, { 423, 294, 242 }, Ratio{1, 4}, 4, 80, 5136, std::vector<unsigned>{}, { { 0x16, 0x10 }, { 0x17, 0x0a }, { 0x18, 0x00 }, { 0x19, 0xff }, @@ -2635,6 +2568,13 @@ void genesys_init_sensor_tables() sensor.shading_factor = setting.shading_factor; sensor.segment_order = setting.segment_order; sensor.custom_regs = setting.custom_regs; + + sensor.channels = { 1 }; + sensor.custom_regs.set_value(0x0c, 0x10); + s_sensors->push_back(sensor); + + sensor.channels = { 3 }; + sensor.custom_regs.set_value(0x0c, 0x12); s_sensors->push_back(sensor); } } @@ -2805,6 +2745,13 @@ void genesys_init_sensor_tables() sensor.shading_factor = setting.shading_factor; sensor.segment_order = setting.segment_order; sensor.custom_regs = setting.custom_regs; + + sensor.channels = { 1 }; + sensor.custom_regs.set_value(0x0c, 0x10); + s_sensors->push_back(sensor); + + sensor.channels = { 3 }; + sensor.custom_regs.set_value(0x0c, 0x12); s_sensors->push_back(sensor); } } @@ -3000,6 +2947,13 @@ void genesys_init_sensor_tables() sensor.shading_factor = setting.shading_factor; sensor.segment_order = setting.segment_order; sensor.custom_regs = setting.custom_regs; + + sensor.channels = { 1 }; + sensor.custom_regs.set_value(0x0c, 0x10); + s_sensors->push_back(sensor); + + sensor.channels = { 3 }; + sensor.custom_regs.set_value(0x0c, 0x12); s_sensors->push_back(sensor); } } @@ -3196,6 +3150,13 @@ void genesys_init_sensor_tables() sensor.shading_factor = setting.shading_factor; sensor.segment_order = setting.segment_order; sensor.custom_regs = setting.custom_regs; + + sensor.channels = { 1 }; + sensor.custom_regs.set_value(0x0c, 0x10); + s_sensors->push_back(sensor); + + sensor.channels = { 3 }; + sensor.custom_regs.set_value(0x0c, 0x12); s_sensors->push_back(sensor); } } diff --git a/backend/genesys/test_scanner_interface.cpp b/backend/genesys/test_scanner_interface.cpp index 5d0dcd3..412176e 100644 --- a/backend/genesys/test_scanner_interface.cpp +++ b/backend/genesys/test_scanner_interface.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/test_scanner_interface.h b/backend/genesys/test_scanner_interface.h index c1a3b76..9a5f412 100644 --- a/backend/genesys/test_scanner_interface.h +++ b/backend/genesys/test_scanner_interface.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_TEST_SCANNER_INTERFACE_H diff --git a/backend/genesys/test_settings.cpp b/backend/genesys/test_settings.cpp index ba50f36..c0aa43f 100644 --- a/backend/genesys/test_settings.cpp +++ b/backend/genesys/test_settings.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/test_settings.h b/backend/genesys/test_settings.h index 90c6e50..64e8f02 100644 --- a/backend/genesys/test_settings.h +++ b/backend/genesys/test_settings.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_TEST_SETTINGS_H diff --git a/backend/genesys/test_usb_device.cpp b/backend/genesys/test_usb_device.cpp index 46cd4e5..a5dbd78 100644 --- a/backend/genesys/test_usb_device.cpp +++ b/backend/genesys/test_usb_device.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/test_usb_device.h b/backend/genesys/test_usb_device.h index 6fd0ff3..ae8d4a2 100644 --- a/backend/genesys/test_usb_device.h +++ b/backend/genesys/test_usb_device.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_TEST_USB_DEVICE_H diff --git a/backend/genesys/usb_device.cpp b/backend/genesys/usb_device.cpp index 63afb09..41b8fbe 100644 --- a/backend/genesys/usb_device.cpp +++ b/backend/genesys/usb_device.cpp @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 diff --git a/backend/genesys/usb_device.h b/backend/genesys/usb_device.h index 72f7017..fa97e5c 100644 --- a/backend/genesys/usb_device.h +++ b/backend/genesys/usb_device.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_USB_DEVICE_H diff --git a/backend/genesys/utilities.h b/backend/genesys/utilities.h index 6e637d0..8c872c9 100644 --- a/backend/genesys/utilities.h +++ b/backend/genesys/utilities.h @@ -16,27 +16,6 @@ You should have received a copy of the GNU General Public License along with this program. If not, see <https://www.gnu.org/licenses/>. - - 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 BACKEND_GENESYS_UTILITIES_H @@ -226,7 +205,7 @@ class BasicStreamStateSaver { public: explicit BasicStreamStateSaver(std::basic_ios<Char, Traits>& stream) : - stream_{stream} + stream_(stream) { flags_ = stream_.flags(); width_ = stream_.width(); diff --git a/backend/gphoto2.c b/backend/gphoto2.c index 0ea5b48..758829a 100644 --- a/backend/gphoto2.c +++ b/backend/gphoto2.c @@ -677,7 +677,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize } if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (GPHOTO2_CONFIG_FILE); diff --git a/backend/gt68xx.c b/backend/gt68xx.c index 6e43765..f46c578 100644 --- a/backend/gt68xx.c +++ b/backend/gt68xx.c @@ -1174,8 +1174,11 @@ static SANE_Status probe_gt68xx_devices(void) new_dev[i]->model->firmware_name); } if (i == 0) - DBG (5, "sane_init: firmware %s can't be loaded, set device " - "first\n", word); + { + DBG (5, "sane_init: firmware %s can't be loaded, set device " + "first\n", word); + free (word); + } } else { @@ -1198,8 +1201,11 @@ static SANE_Status probe_gt68xx_devices(void) new_dev[i]->model->name, new_dev[i]->model->vendor); } if (i == 0) - DBG (5, "sane_init: can't set vendor name %s, set device " - "first\n", word); + { + DBG (5, "sane_init: can't set vendor name %s, set device " + "first\n", word); + free (word); + } } else { @@ -1221,9 +1227,11 @@ static SANE_Status probe_gt68xx_devices(void) new_dev[i]->model->name, new_dev[i]->model->model); } if (i == 0) - DBG (5, "sane_init: can't set model name %s, set device " - "first\n", word); - free (word); + { + DBG (5, "sane_init: can't set model name %s, set device " + "first\n", word); + free (word); + } } else { @@ -1332,10 +1340,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) } #endif DBG (2, "SANE GT68xx backend version %d.%d build %d from %s\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (5, "sane_init: authorize %s null\n", authorize ? "!=" : "=="); diff --git a/backend/hp.c b/backend/hp.c index 2358d1f..558a36d 100644 --- a/backend/hp.c +++ b/backend/hp.c @@ -816,7 +816,7 @@ sane_init (SANE_Int *version_code, SANE_Auth_Callback __sane_unused__ authorize) hp_destroy(); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, VERSIO); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, VERSIO); status = hp_init(); DBG(3, "sane_init will finish with %s\n", sane_strstatus (status)); diff --git a/backend/hp3500.c b/backend/hp3500.c index b7a2d59..bf07b36 100644 --- a/backend/hp3500.c +++ b/backend/hp3500.c @@ -274,7 +274,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) sanei_thread_init (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); sanei_usb_find_devices (0x03f0, 0x2205, attachScanner); sanei_usb_find_devices (0x03f0, 0x2005, attachScanner); diff --git a/backend/hp3900_sane.c b/backend/hp3900_sane.c index c717d4d..eae99e0 100644 --- a/backend/hp3900_sane.c +++ b/backend/hp3900_sane.c @@ -1806,7 +1806,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) /* Return backend version */ if (version_code != NULL) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); return SANE_STATUS_GOOD; } diff --git a/backend/hp4200.c b/backend/hp4200.c index c080fcb..5b21b47 100644 --- a/backend/hp4200.c +++ b/backend/hp4200.c @@ -1497,7 +1497,7 @@ do_fine_calibration (HP4200_Scanner * s, struct coarse_t *coarse) int i; for (i = 0; i < 12; i++) { - memset (registro[i], 0, 5460 * 3 * sizeof(registro[0])); + memset (registro[i], 0, 5460 * 3 * sizeof(int)); } } @@ -2375,12 +2375,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (DBG_proc, "%s\n", me); DBG (DBG_error, "SANE hp4200 backend version %d.%d build %d from %s\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); /* put some version_code checks here */ if (NULL != version_code) { - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); } sanei_usb_init (); diff --git a/backend/hp5400_sane.c b/backend/hp5400_sane.c index 8413568..5043dad 100644 --- a/backend/hp5400_sane.c +++ b/backend/hp5400_sane.c @@ -623,7 +623,7 @@ sane_init (SANE_Int * piVersion, SANE_Auth_Callback pfnAuth) DBG_INIT (); HP5400_DBG (DBG_MSG, "sane_init: SANE hp5400 backend version %d.%d-%d (from %s)\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); sanei_usb_init (); @@ -671,7 +671,7 @@ sane_init (SANE_Int * piVersion, SANE_Auth_Callback pfnAuth) if (piVersion != NULL) { - *piVersion = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *piVersion = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); } return SANE_STATUS_GOOD; diff --git a/backend/hp5590.c b/backend/hp5590.c index 1c164e4..78c9313 100644 --- a/backend/hp5590.c +++ b/backend/hp5590.c @@ -480,11 +480,11 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG_INIT(); DBG (1, "SANE backed for HP ScanJet 4500C/4570C/5500C/5550C/5590/7650 %u.%u.%u\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (1, "(c) Ilia Sotnikov <hostcc@gmail.com>\n"); if (version_code) - *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); sanei_usb_init(); diff --git a/backend/hpljm1005.c b/backend/hpljm1005.c index 95ddd8e..2a7116c 100644 --- a/backend/hpljm1005.c +++ b/backend/hpljm1005.c @@ -392,7 +392,7 @@ sane_init (SANE_Int * version_code, { if (version_code != NULL) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG_INIT(); diff --git a/backend/hpsj5s.c b/backend/hpsj5s.c index ea58433..5ff5064 100644 --- a/backend/hpsj5s.c +++ b/backend/hpsj5s.c @@ -166,11 +166,11 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (2, "sane_init: version_code %s 0, authorize %s 0\n", version_code == 0 ? "=" : "!=", authorize == 0 ? "=" : "!="); DBG (1, "sane_init: SANE hpsj5s backend version %d.%d.%d\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); /*Inform about supported version */ if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); /*Open configuration file for this backend */ config_file = sanei_config_open (HPSJ5S_CONFIG_FILE); diff --git a/backend/hs2p.c b/backend/hs2p.c index ec9eec9..76f4b96 100644 --- a/backend/hs2p.c +++ b/backend/hs2p.c @@ -1565,14 +1565,14 @@ sane_init (SANE_Int * version_code, /*DBG (DBG_sane_init, "> sane_init (authorize = %p)\n", (void *) authorize); */ #if defined PACKAGE && defined VERSION DBG (DBG_sane_init, "> sane_init: hs2p backend version %d.%d-%d (" - PACKAGE " " VERSION ")\n", SANE_CURRENT_MAJOR, V_MINOR, BUILD); + PACKAGE " " VERSION ")\n", SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); #endif /* sanei_thread_init (); */ if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); if ((fp = sanei_config_open (HS2P_CONFIG_FILE)) != NULL) diff --git a/backend/ibm.c b/backend/ibm.c index 91a09ee..688cdfb 100644 --- a/backend/ibm.c +++ b/backend/ibm.c @@ -545,11 +545,11 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) #if defined PACKAGE && defined VERSION DBG (2, "sane_init: ibm backend version %d.%d-%d (" - PACKAGE " " VERSION ")\n", SANE_CURRENT_MAJOR, V_MINOR, BUILD); + PACKAGE " " VERSION ")\n", SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); #endif if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open(IBM_CONFIG_FILE); if (fp) diff --git a/backend/kodak.c b/backend/kodak.c index 39c91e6..c41f088 100644 --- a/backend/kodak.c +++ b/backend/kodak.c @@ -181,10 +181,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (10, "sane_init: start\n"); if (version_code) - *version_code = SANE_VERSION_CODE (V_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (5, "sane_init: kodak backend %d.%d.%d, from %s\n", - V_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); DBG (10, "sane_init: finish\n"); diff --git a/backend/kodakaio.c b/backend/kodakaio.c index 73dd58b..fe83e27 100644 --- a/backend/kodakaio.c +++ b/backend/kodakaio.c @@ -2629,7 +2629,7 @@ sane_init(SANE_Int *version_code, SANE_Auth_Callback __sane_unused__ authorize) KODAKAIO_VERSION, KODAKAIO_REVISION, KODAKAIO_BUILD); DBG(2, "%s: called\n", __func__); if (version_code != NULL) - *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, KODAKAIO_BUILD); sanei_usb_init(); diff --git a/backend/kvs1025.c b/backend/kvs1025.c index fc89d87..9d53690 100644 --- a/backend/kvs1025.c +++ b/backend/kvs1025.c @@ -51,11 +51,11 @@ sane_init (SANE_Int * version_code, DBG (DBG_error, "This is panasonic KV-S1020C / KV-S1025C version %d.%d build %d\n", - V_MAJOR, V_MINOR, V_BUILD); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, V_BUILD); if (version_code) { - *version_code = SANE_VERSION_CODE (V_MAJOR, V_MINOR, V_BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, V_BUILD); } /* Initialize USB */ diff --git a/backend/kvs20xx.c b/backend/kvs20xx.c index 8864d7d..7baebbc 100644 --- a/backend/kvs20xx.c +++ b/backend/kvs20xx.c @@ -64,7 +64,7 @@ sane_init (SANE_Int __sane_unused__ * version_code, DBG_INIT (); DBG (DBG_INFO, "This is panasonic kvs20xx driver\n"); - *version_code = SANE_VERSION_CODE (V_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); /* Initialize USB */ sanei_usb_init (); diff --git a/backend/kvs40xx.c b/backend/kvs40xx.c index 6416d64..230bdc2 100644 --- a/backend/kvs40xx.c +++ b/backend/kvs40xx.c @@ -165,7 +165,7 @@ sane_init (SANE_Int __sane_unused__ * version_code, DBG_INIT (); DBG (DBG_INFO, "This is panasonic kvs40xx driver\n"); - *version_code = SANE_VERSION_CODE (V_MAJOR, V_MINOR, 1); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 1); /* Initialize USB */ sanei_usb_init (); diff --git a/backend/leo.c b/backend/leo.c index 3c97daa..344d2c6 100644 --- a/backend/leo.c +++ b/backend/leo.c @@ -1298,12 +1298,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG (DBG_sane_init, "sane_init\n"); DBG (DBG_error, "This is sane-leo version %d.%d-%d\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD); + SANE_CURRENT_MINOR, BUILD); DBG (DBG_error, "(C) 2002 by Frank Zago\n"); if (version_code) { - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); } fp = sanei_config_open (LEO_CONFIG_FILE); diff --git a/backend/lexmark.c b/backend/lexmark.c index 2c9287a..ba0311d 100644 --- a/backend/lexmark.c +++ b/backend/lexmark.c @@ -526,12 +526,12 @@ sane_init (SANE_Int * version_code, DBG_INIT (); DBG (1, "SANE Lexmark backend version %d.%d.%d-devel\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD); + SANE_CURRENT_MINOR, BUILD); DBG (2, "sane_init: version_code=%p\n", (void *) version_code); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); #ifndef FAKE_USB sanei_usb_init (); diff --git a/backend/ma1509.c b/backend/ma1509.c index 37bbefb..5966a17 100644 --- a/backend/ma1509.c +++ b/backend/ma1509.c @@ -1110,10 +1110,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) #endif DBG (2, "SANE ma1509 backend version %d.%d build %d from %s\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (4, "sane_init: authorize %s null\n", authorize ? "!=" : "=="); diff --git a/backend/magicolor.c b/backend/magicolor.c index 886dbab..8fc6d31 100644 --- a/backend/magicolor.c +++ b/backend/magicolor.c @@ -2266,7 +2266,7 @@ sane_init(SANE_Int *version_code, SANE_Auth_Callback __sane_unused__ authorize) MAGICOLOR_VERSION, MAGICOLOR_REVISION, MAGICOLOR_BUILD); if (version_code != NULL) - *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, MAGICOLOR_BUILD); sanei_usb_init(); diff --git a/backend/matsushita.c b/backend/matsushita.c index d982f50..e3a983f 100644 --- a/backend/matsushita.c +++ b/backend/matsushita.c @@ -1711,12 +1711,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG (DBG_sane_init, "sane_init\n"); DBG (DBG_error, "This is sane-matsushita version %d.%d-%d\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD); + SANE_CURRENT_MINOR, BUILD); DBG (DBG_error, "(C) 2002 by Frank Zago\n"); if (version_code) { - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); } fp = sanei_config_open (MATSUSHITA_CONFIG_FILE); diff --git a/backend/microtek.c b/backend/microtek.c index 200a69c..17f3151 100644 --- a/backend/microtek.c +++ b/backend/microtek.c @@ -57,6 +57,7 @@ #include "../include/sane/config.h" +#include <stdarg.h> #include <stdlib.h> #include <string.h> #include <unistd.h> @@ -3065,7 +3066,7 @@ sane_init(SANE_Int *version_code, SANE_Auth_Callback authorize) MICROTEK_MAJOR, MICROTEK_MINOR, MICROTEK_PATCH); /* return the SANE version we got compiled under */ if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); /* parse config file */ fp = sanei_config_open (MICROTEK_CONFIG_FILE); diff --git a/backend/microtek2.c b/backend/microtek2.c index 72c1b20..505e86b 100644 --- a/backend/microtek2.c +++ b/backend/microtek2.c @@ -456,7 +456,7 @@ sane_init(SANE_Int *version_code, SANE_Auth_Callback __sane_unused__ authorize) MICROTEK2_MAJOR, MICROTEK2_MINOR, MICROTEK2_BUILD); if ( version_code ) - *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); #ifdef HAVE_AUTHORIZATION auth_callback = authorize; diff --git a/backend/mustek.c b/backend/mustek.c index 48bcfd9..4d77fb5 100644 --- a/backend/mustek.c +++ b/backend/mustek.c @@ -5201,10 +5201,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) #endif DBG (2, "SANE mustek backend version %d.%d build %d from %s\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (5, "sane_init: authorize %s null\n", authorize ? "!=" : "=="); diff --git a/backend/mustek_pp.c b/backend/mustek_pp.c index 26dc0e4..2d374ee 100644 --- a/backend/mustek_pp.c +++ b/backend/mustek_pp.c @@ -710,7 +710,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (3, "backend by Jochen Eisinger <jochen.eisinger@gmx.net>\n"); if (version_code != NULL) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, MUSTEK_PP_BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, MUSTEK_PP_BUILD); sane_auth = authorize; diff --git a/backend/mustek_usb.c b/backend/mustek_usb.c index 6bd3390..7417094 100644 --- a/backend/mustek_usb.c +++ b/backend/mustek_usb.c @@ -699,10 +699,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG_INIT (); DBG (2, "SANE Mustek USB backend version %d.%d build %d from %s\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (5, "sane_init: authorize %s null\n", authorize ? "!=" : "=="); diff --git a/backend/mustek_usb2.c b/backend/mustek_usb2.c index aa4d797..9faeff6 100644 --- a/backend/mustek_usb2.c +++ b/backend/mustek_usb2.c @@ -2008,12 +2008,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG_INIT (); DBG (DBG_FUNC, "sane_init: start\n"); DBG (DBG_ERR, "SANE Mustek USB2 backend version %d.%d build %d from %s\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); num_devices = 1; /* HOLD: only one device in this backend */ if (version_code != NULL) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (DBG_INFO, "sane_init: authorize %s null\n", authorize ? "!=" : "=="); diff --git a/backend/nec.c b/backend/nec.c index b61bb37..66bfc9b 100644 --- a/backend/nec.c +++ b/backend/nec.c @@ -1898,7 +1898,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (1, "sane_init: NEC (Ver %d.%d)\n", NEC_MAJOR, NEC_MINOR); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (NEC_CONFIG_FILE); if (!fp) diff --git a/backend/niash.c b/backend/niash.c index 03faa36..bce6c2f 100644 --- a/backend/niash.c +++ b/backend/niash.c @@ -195,7 +195,7 @@ _UnityGammaTable (unsigned char *hwGamma) } static const SANE_Range rangeXmm = { 0, 220, 1 }; -static const SANE_Range rangeYmm = { 0, 296, 1 }; +static const SANE_Range rangeYmm = { 0, 297, 1 }; static const SANE_Int startUpGamma = SANE_FIX (1.6); static const char colorStr[] = { SANE_VALUE_SCAN_MODE_COLOR }; @@ -827,7 +827,7 @@ sane_init (SANE_Int * piVersion, SANE_Auth_Callback __sane_unused__ pfnAuth) if (piVersion != NULL) { - *piVersion = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *piVersion = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); } /* initialise transfer methods */ diff --git a/backend/p5.c b/backend/p5.c index 7e25cc1..558d9d2 100644 --- a/backend/p5.c +++ b/backend/p5.c @@ -164,12 +164,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) /* init backend debug */ DBG_INIT (); DBG (DBG_info, "SANE P5 backend version %d.%d-%d\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (DBG_proc, "sane_init: start\n"); DBG (DBG_trace, "sane_init: init_count=%d\n", init_count); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); /* cold-plugging case : probe for already plugged devices */ status = probe_p5_devices (); diff --git a/backend/pie.c b/backend/pie.c index b5be0a2..2db90dc 100644 --- a/backend/pie.c +++ b/backend/pie.c @@ -2936,7 +2936,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG (DBG_sane_init, "sane_init() build %d\n", BUILD);
if (version_code)
- *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD);
+ *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD);
fp = sanei_config_open (PIE_CONFIG_FILE);
if (!fp)
diff --git a/backend/pieusb.c b/backend/pieusb.c index a070fc0..f8dc073 100644 --- a/backend/pieusb.c +++ b/backend/pieusb.c @@ -110,6 +110,8 @@ extern void write_tiff_rgbi_header (FILE *fptr, int width, int height, int depth /* device flags */ #define FLAG_SLIDE_TRANSPORT 0x01 +/* Some scanners do understand SLIDE_TRANSPORT but not CMD_17 - introducing a new flag */ +#define FLAG_CMD_17_NOSUPPORT 0x02 /* -------------------------------------------------------------------------- * @@ -163,7 +165,6 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize 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); @@ -1004,10 +1005,12 @@ sane_start (SANE_Handle handle) /* ---------------------------------------------------------------------- * * Function 17 + * This function is not supported by all scanners which are capable of + * slide transport, therefore FLAG_CMD_17_NOSUPPORT was introduced. * * ---------------------------------------------------------------------- */ - if (scanner->device->flags & FLAG_SLIDE_TRANSPORT) { + if ( (scanner->device->flags & FLAG_SLIDE_TRANSPORT) & !(scanner->device->flags & FLAG_CMD_17_NOSUPPORT) ) { 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); diff --git a/backend/pieusb.conf.in b/backend/pieusb.conf.in index 8904d3d..df9a194 100644 --- a/backend/pieusb.conf.in +++ b/backend/pieusb.conf.in @@ -16,5 +16,7 @@ usb 0x05e3 0x0145 0x47 0x00 # Reflecta CrystalScan 3600 usb 0x05e3 0x0145 0x2e 0x00 -# Reflecta DigitDia 4000 -usb 0x05e3 0x0142 0x2f 0x00 +# Reflecta DigitDia 4000 - SLIDE_TRANSPORT but no CMD_17 +usb 0x05e3 0x0142 0x2f 0x03 +# Reflecta RPS 10M (aka Pacific Image PrimeFilm XAs) +usb 0x05e3 0x0144 0x0048 0x00 diff --git a/backend/pieusb_specific.c b/backend/pieusb_specific.c index 033ad03..e5471ee 100644 --- a/backend/pieusb_specific.c +++ b/backend/pieusb_specific.c @@ -753,7 +753,7 @@ sanei_pieusb_init_options (Pieusb_Scanner* scanner) 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].name = "advance"; 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; diff --git a/backend/pint.c b/backend/pint.c index 7ab53e5..cc8137b 100644 --- a/backend/pint.c +++ b/backend/pint.c @@ -573,7 +573,7 @@ sane_init (SANE_Int *version_code, SANE_Auth_Callback authorize) DBG_INIT(); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (PINT_CONFIG_FILE); if (!fp) diff --git a/backend/pixma/pixma.c b/backend/pixma/pixma.c index b4e423d..31e71f0 100644 --- a/backend/pixma/pixma.c +++ b/backend/pixma/pixma.c @@ -1661,7 +1661,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) if (!version_code) return SANE_STATUS_INVAL; myversion = 100 * PIXMA_VERSION_MAJOR + PIXMA_VERSION_MINOR; - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, myversion); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, myversion); DBG_INIT (); sanei_thread_init (); pixma_set_debug_level (DBG_LEVEL); diff --git a/backend/pixma/pixma_common.c b/backend/pixma/pixma_common.c index 6bce4bc..24912b8 100644 --- a/backend/pixma/pixma_common.c +++ b/backend/pixma/pixma_common.c @@ -968,16 +968,16 @@ pixma_read_image (pixma_t * s, void *buf, unsigned len) s->last_source = s->param->source; if ((s->cur_image_size != s->param->image_size) && !s->param->mode_jpeg) { - pixma_dbg (1, "WARNING:image size mismatches\n"); - pixma_dbg (1, + PDBG (pixma_dbg (1, "WARNING:image size mismatches\n")); + PDBG (pixma_dbg (1, " %"PRIu64" expected (%d lines) but %"PRIu64" received (%"PRIu64" lines)\n", s->param->image_size, s->param->h, s->cur_image_size, - s->cur_image_size / s->param->line_size); + s->cur_image_size / s->param->line_size)); if ((s->cur_image_size % s->param->line_size) != 0) { - pixma_dbg (1, - "BUG:received data not multiple of line_size\n"); + PDBG (pixma_dbg (1, + "BUG:received data not multiple of line_size\n")); } } if ((s->cur_image_size < s->param->image_size) && !s->param->mode_jpeg) diff --git a/backend/plustek.c b/backend/plustek.c index 10458a0..96fd04f 100644 --- a/backend/plustek.c +++ b/backend/plustek.c @@ -1465,7 +1465,7 @@ sane_init( SANE_Int *version_code, SANE_Auth_Callback authorize ) usbGetList( &usbDevs ); if( version_code != NULL ) - *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open( PLUSTEK_CONFIG_FILE ); diff --git a/backend/plustek_pp.c b/backend/plustek_pp.c index 76a8789..af91c99 100644 --- a/backend/plustek_pp.c +++ b/backend/plustek_pp.c @@ -1166,7 +1166,7 @@ SANE_Status sane_init( SANE_Int *version_code, SANE_Auth_Callback authorize ) #endif if( version_code != NULL ) - *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open( PLUSTEK_CONFIG_FILE ); diff --git a/backend/pnm.c b/backend/pnm.c index ccc6f64..0ace3a5 100644 --- a/backend/pnm.c +++ b/backend/pnm.c @@ -509,10 +509,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (2, "sane_init: version_code %s 0, authorize %s 0\n", version_code == 0 ? "=" : "!=", authorize == 0 ? "=" : "!="); DBG (1, "sane_init: SANE pnm backend version %d.%d.%d from %s\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); return SANE_STATUS_GOOD; } diff --git a/backend/qcam.c b/backend/qcam.c index 9b1d7a3..9d55055 100644 --- a/backend/qcam.c +++ b/backend/qcam.c @@ -1461,7 +1461,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (1, "sane_init: enter\n"); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (QCAM_CONFIG_FILE); if (!fp) diff --git a/backend/ricoh.c b/backend/ricoh.c index eb692c9..d1f20c0 100644 --- a/backend/ricoh.c +++ b/backend/ricoh.c @@ -495,7 +495,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) #endif if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open(RICOH_CONFIG_FILE); if (fp) diff --git a/backend/ricoh2.c b/backend/ricoh2.c index e8f8604..e145b65 100644 --- a/backend/ricoh2.c +++ b/backend/ricoh2.c @@ -293,7 +293,7 @@ sane_init (SANE_Int *vc, SANE_Auth_Callback __sane_unused__ cb) } if (vc) - *vc = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *vc = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); DBG(8, "<sane_init\n"); initialized = SANE_TRUE; diff --git a/backend/rts8891.c b/backend/rts8891.c index e8d57b8..fa5d17a 100644 --- a/backend/rts8891.c +++ b/backend/rts8891.c @@ -315,11 +315,11 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) /* init backend debug */ DBG_INIT (); DBG (DBG_info, "SANE Rts8891 backend version %d.%d-%d\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG (DBG_proc, "sane_init: start\n"); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); /* cold-plugging case : probe for already plugged devices */ status = probe_rts8891_devices (); diff --git a/backend/rts8891_low.c b/backend/rts8891_low.c index 535f6d5..1b95765 100644 --- a/backend/rts8891_low.c +++ b/backend/rts8891_low.c @@ -64,7 +64,7 @@ rts8891_low_init (void) { DBG_INIT (); DBG (DBG_info, "RTS8891 low-level functions, version %d.%d-%d\n", - SANE_CURRENT_MAJOR, V_MINOR, RTS8891_BUILD); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, RTS8891_BUILD); } diff --git a/backend/rts88xx_lib.c b/backend/rts88xx_lib.c index 16727ef..c047b18 100644 --- a/backend/rts88xx_lib.c +++ b/backend/rts88xx_lib.c @@ -63,7 +63,7 @@ void sanei_rts88xx_lib_init (void) { DBG_INIT (); - DBG (DBG_info, "RTS88XX library, version %d.%d-%d\n", SANE_CURRENT_MAJOR, V_MINOR, + DBG (DBG_info, "RTS88XX library, version %d.%d-%d\n", SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, RTS88XX_LIB_BUILD); } diff --git a/backend/s9036.c b/backend/s9036.c index b3734ed..8f84ecf 100644 --- a/backend/s9036.c +++ b/backend/s9036.c @@ -834,7 +834,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG_INIT (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open ("s9036.conf"); if (!fp) diff --git a/backend/sceptre.c b/backend/sceptre.c index 62f28ff..7f5d4e4 100644 --- a/backend/sceptre.c +++ b/backend/sceptre.c @@ -1315,12 +1315,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG (DBG_proc, "sane_init: enter\n"); DBG (DBG_error, "This is sane-sceptre version %d.%d-%d\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD); + SANE_CURRENT_MINOR, BUILD); DBG (DBG_error, "(C) 2002 by Frank Zago\n"); if (version_code) { - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); } fp = sanei_config_open (SCEPTRE_CONFIG_FILE); diff --git a/backend/sharp.c b/backend/sharp.c index d533103..b52e8e2 100644 --- a/backend/sharp.c +++ b/backend/sharp.c @@ -2361,7 +2361,7 @@ sane_init (SANE_Int * version_code, #endif if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (SHARP_CONFIG_FILE); if (!fp) diff --git a/backend/sm3600-scanutil.c b/backend/sm3600-scanutil.c index 6fe67ed..616bf3f 100644 --- a/backend/sm3600-scanutil.c +++ b/backend/sm3600-scanutil.c @@ -43,6 +43,7 @@ Userspace scan tool for the Microtek 3600 scanner ====================================================================== */ +#include <stdarg.h> #include <unistd.h> #include "sm3600-scantool.h" diff --git a/backend/sm3600.c b/backend/sm3600.c index 8542e3e..e1df6b0 100644 --- a/backend/sm3600.c +++ b/backend/sm3600.c @@ -390,9 +390,9 @@ sane_init (SANE_Int *version_code, SANE_Auth_Callback authCB) DBG(DEBUG_VERBOSE,"SM3600 init\n"); if (version_code) { - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); DBG(DEBUG_VERBOSE,"SM3600 version: %x\n", - SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, BUILD)); + SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD)); } pdevFirst=NULL; diff --git a/backend/sm3840.c b/backend/sm3840.c index b728128..159f600 100644 --- a/backend/sm3840.c +++ b/backend/sm3840.c @@ -549,7 +549,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) { DBG_INIT (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); if (authorize) DBG (2, "Unused authorize\n"); diff --git a/backend/sp15c.c b/backend/sp15c.c index 6feada5..a3ad5c2 100644 --- a/backend/sp15c.c +++ b/backend/sp15c.c @@ -281,7 +281,7 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) sanei_thread_init (); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (SP15C_CONFIG_FILE); if (!fp) { diff --git a/backend/st400.c b/backend/st400.c index 487dbd1..a75807f 100644 --- a/backend/st400.c +++ b/backend/st400.c @@ -680,7 +680,7 @@ sane_init( SANE_Int *versionP, SANE_Auth_Callback authorize ) DBG(DCODE, "sane_init: version %s null, authorize %s null\n", (versionP) ? "!=" : "==", (authorize) ? "!=" : "=="); if( versionP != NULL ) - *versionP = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, 0); + *versionP = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); status = SANE_STATUS_GOOD; if( (fp = sanei_config_open(ST400_CONFIG_FILE)) != NULL ) { diff --git a/backend/stv680.c b/backend/stv680.c index cab59b4..eb9add5 100644 --- a/backend/stv680.c +++ b/backend/stv680.c @@ -1523,12 +1523,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) authorize = authorize; /* silence gcc */ DBG (DBG_error, "This is sane-stv680 version %d.%d-%d\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD); + SANE_CURRENT_MINOR, BUILD); DBG (DBG_error, "(C) 2004-2006 by Gerard Klaver\n"); if (version_code) { - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); } DBG (DBG_proc, "sane_init: authorize %s null\n", authorize ? "!=" : "=="); diff --git a/backend/tamarack.c b/backend/tamarack.c index 38e0aad..38cc7ea 100644 --- a/backend/tamarack.c +++ b/backend/tamarack.c @@ -916,7 +916,7 @@ sane_init (SANE_Int *version_code, SANE_Auth_Callback authorize) sanei_thread_init(); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open (TAMARACK_CONFIG_FILE); if (!fp) { diff --git a/backend/teco1.c b/backend/teco1.c index 6462ac2..1ba0dff 100644 --- a/backend/teco1.c +++ b/backend/teco1.c @@ -1476,12 +1476,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG (DBG_sane_init, "sane_init\n"); DBG (DBG_error, "This is sane-teco1 version %d.%d-%d\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD); + SANE_CURRENT_MINOR, BUILD); DBG (DBG_error, "(C) 2002 by Frank Zago\n"); if (version_code) { - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); } fp = sanei_config_open (TECO_CONFIG_FILE); diff --git a/backend/teco2.c b/backend/teco2.c index 01fb667..fd3aa5f 100644 --- a/backend/teco2.c +++ b/backend/teco2.c @@ -2519,12 +2519,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG (DBG_sane_init, "sane_init\n"); DBG (DBG_error, "This is sane-teco2 version %d.%d-%d\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD); + SANE_CURRENT_MINOR, BUILD); DBG (DBG_error, "(C) 2002 - 2003 by Frank Zago, update 2003 - 2008 by Gerard Klaver\n"); if (version_code) { - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); } fp = sanei_config_open (TECO2_CONFIG_FILE); diff --git a/backend/teco3.c b/backend/teco3.c index 6a0c61f..d568a5e 100644 --- a/backend/teco3.c +++ b/backend/teco3.c @@ -1498,12 +1498,12 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback __sane_unused__ authorize DBG (DBG_sane_init, "sane_init\n"); DBG (DBG_error, "This is sane-teco3 version %d.%d-%d\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD); + SANE_CURRENT_MINOR, BUILD); DBG (DBG_error, "(C) 2002 by Frank Zago\n"); if (version_code) { - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); } fp = sanei_config_open (TECO_CONFIG_FILE); diff --git a/backend/test.c b/backend/test.c index 075fdfa..3c7a949 100644 --- a/backend/test.c +++ b/backend/test.c @@ -1637,10 +1637,10 @@ sane_init (SANE_Int * __sane_unused__ version_code, SANE_Auth_Callback __sane_un previous_device = 0; DBG (1, "sane_init: SANE test backend version %d.%d.%d from %s\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); if (inited) DBG (3, "sane_init: warning: already inited\n"); diff --git a/backend/u12.c b/backend/u12.c index 7434552..c7bc51a 100644 --- a/backend/u12.c +++ b/backend/u12.c @@ -941,7 +941,7 @@ SANE_Status sane_init( SANE_Int *version_code, SANE_Auth_Callback authorize ) init_config_struct( &config ); if( version_code != NULL ) - *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, 0); + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, 0); fp = sanei_config_open( U12_CONFIG_FILE ); diff --git a/backend/umax.c b/backend/umax.c index 9cefc08..d6551c5 100644 --- a/backend/umax.c +++ b/backend/umax.c @@ -5987,7 +5987,7 @@ SANE_Status sane_init(SANE_Int *version_code, SANE_Auth_Callback authorize) DBG_INIT(); DBG(DBG_sane_init,"sane_init\n"); - DBG(DBG_error,"This is sane-umax version %d.%d build %d\n", SANE_CURRENT_MAJOR, V_MINOR, BUILD); + DBG(DBG_error,"This is sane-umax version %d.%d build %d\n", SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); #ifdef UMAX_ENABLE_USB DBG(DBG_error,"compiled with USB support for Astra 2200\n"); #else @@ -5998,7 +5998,7 @@ SANE_Status sane_init(SANE_Int *version_code, SANE_Auth_Callback authorize) if (version_code) { - *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); } frontend_authorize_callback = authorize; /* store frontend authorize callback */ diff --git a/backend/umax1220u.c b/backend/umax1220u.c index 6e8d95f..8c6098c 100644 --- a/backend/umax1220u.c +++ b/backend/umax1220u.c @@ -593,10 +593,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG (2, "sane_init: version_code %s 0, authorize %s 0\n", version_code == 0 ? "=" : "!=", authorize == 0 ? "=" : "!="); DBG (1, "sane_init: SANE umax1220u backend version %d.%d.%d from %s\n", - SANE_CURRENT_MAJOR, V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); sanei_usb_init (); sanei_pv8630_init (); diff --git a/backend/umax_pp.c b/backend/umax_pp.c index 4a4ab8a..e705a77 100644 --- a/backend/umax_pp.c +++ b/backend/umax_pp.c @@ -833,9 +833,9 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) } if (version_code != NULL) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, UMAX_PP_BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, UMAX_PP_BUILD); - DBG (3, "init: SANE v%s, backend v%d.%d.%d-%s\n", VERSION, SANE_CURRENT_MAJOR, V_MINOR, + DBG (3, "init: SANE v%s, backend v%d.%d.%d-%s\n", VERSION, SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, UMAX_PP_BUILD, UMAX_PP_STATE); /* set up configuration options to parse */ diff --git a/backend/umax_pp.h b/backend/umax_pp.h index ffff012..c41328b 100644 --- a/backend/umax_pp.h +++ b/backend/umax_pp.h @@ -192,7 +192,7 @@ enum Umax_PP_Configure_Option }; #define DEBUG() DBG(4, "%s(v%d.%d.%d-%s): line %d: debug exception\n", \ - __func__, SANE_CURRENT_MAJOR, V_MINOR, \ + __func__, SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, \ UMAX_PP_BUILD, UMAX_PP_STATE, __LINE__) #endif /* umax_pp_h */ diff --git a/backend/v4l.c b/backend/v4l.c index b15e5d1..bce3c3a 100644 --- a/backend/v4l.c +++ b/backend/v4l.c @@ -438,10 +438,10 @@ sane_init (SANE_Int * version_code, SANE_Auth_Callback authorize) DBG_INIT (); DBG (2, "SANE v4l backend version %d.%d build %d from %s\n", SANE_CURRENT_MAJOR, - V_MINOR, BUILD, PACKAGE_STRING); + SANE_CURRENT_MINOR, BUILD, PACKAGE_STRING); if (version_code) - *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, V_MINOR, BUILD); + *version_code = SANE_VERSION_CODE (SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BUILD); fp = sanei_config_open (V4L_CONFIG_FILE); if (!fp) diff --git a/backend/xerox_mfp.c b/backend/xerox_mfp.c index edd6e64..310dc53 100644 --- a/backend/xerox_mfp.c +++ b/backend/xerox_mfp.c @@ -1042,7 +1042,7 @@ sane_init(SANE_Int *version_code, SANE_Auth_Callback cb) (version_code) ? "!=" : "==", (cb) ? "!=" : "=="); if (version_code) - *version_code = SANE_VERSION_CODE(V_MAJOR, V_MINOR, BACKEND_BUILD); + *version_code = SANE_VERSION_CODE(SANE_CURRENT_MAJOR, SANE_CURRENT_MINOR, BACKEND_BUILD); sanei_usb_init(); return SANE_STATUS_GOOD; |