Bug #300241: fix invers image on 3c/4c/6100C at 10 bit depth

merge-requests/1/head
Peter Kirchgessner 2003-10-09 19:32:50 +00:00
rodzic 512dcd9fd0
commit 3e5bec5925
1 zmienionych plików z 50 dodań i 1 usunięć

Wyświetl plik

@ -42,6 +42,14 @@
HP Scanner Control Language (SCL).
*/
/*
$Log$
Revision 1.12 2003/10/09 19:32:50 kig-guest
Bug #300241: fix invers image on 3c/4c/6100C at 10 bit depth
*/
/* pwd.h not available ? */
#if (defined(__IBMC__) || defined(__IBMCPP__))
#ifndef _AIX
@ -2567,10 +2575,48 @@ _program_scanmode (HpOption this, HpScsi scsi, HpOptSet optset, HpData data)
{
enum hp_scanmode_e new_mode = hp_option_getint(this, data);
int invert = 0;
int fw_invert = 0; /* Flag: does firmware do inversion ? */
int is_model_4c = 0;
enum hp_device_compat_e compat;
hp_bool_t disable_xpa = ( sanei_hp_optset_scan_type (optset, data)
!= SCL_XPA_SCAN );
/* Disbaling XPA resets some settings in the scanner. */
/* Seems that models 3c/4c/6100C invert image data at 10 bit by themself. */
/* So we must not invert it by the invert command. */
if ( (sanei_hp_device_probe (&compat,scsi) == SANE_STATUS_GOOD)
&& (compat & HP_COMPAT_4C) )
{
is_model_4c = 1;
DBG(3, "program_scanmode: model 3c/4c/6100C recognized\n");
}
if (is_model_4c)
{
const HpDeviceInfo *info;
int data_width;
HpOption option;
int is_preview = 0;
/* Preview uses maximum 8 bit. So we don't need to check data width */
option = hp_optset_getByName (optset, SANE_NAME_PREVIEW);
if ( option )
is_preview = hp_option_getint (option, data);
info = sanei_hp_device_info_get ( sanei_hp_scsi_devicename (scsi) );
if ( (!is_preview)
&& hp_optset_isEnabled (optset, data, SANE_NAME_BIT_DEPTH, info))
{
data_width = sanei_hp_optset_data_width (optset, data);
if ((data_width == 10) || (data_width == 30))
{
fw_invert = 1;
DBG(3, "program_scanmode: firmware is doing inversion\n");
}
}
}
/* Disabling XPA resets some settings in the scanner. */
/* Scanmode is the first we program. So set XPA prior to scanmode */
DBG(3, "program_scanmode: disable XPA = %d\n", (int)disable_xpa);
sanei_hp_scl_set(scsi, SCL_XPA_DISABLE, disable_xpa);
@ -2579,13 +2625,16 @@ _program_scanmode (HpOption this, HpScsi scsi, HpOptSet optset, HpData data)
switch (new_mode) {
case HP_SCANMODE_GRAYSCALE:
/* Make sure that it is not b/w. Correct data width will be set later */
RETURN_IF_FAIL( sanei_hp_scl_set(scsi, SCL_DATA_WIDTH, 8) );
invert = 1;
if (fw_invert) invert = 0;
/* For active XPA we use a tone map. Dont invert */
if ( (!disable_xpa) && sanei_hp_is_active_xpa (scsi) ) invert = 0;
break;
case HP_SCANMODE_COLOR:
invert = 1;
if (fw_invert) invert = 0;
/* For active XPA we use a tone map. Dont invert */
if ( (!disable_xpa) && sanei_hp_is_active_xpa (scsi) ) invert = 0;
break;