kopia lustrzana https://gitlab.com/sane-project/backends
fujitsu backend v132
- remove ipc_mode option and variables - set ipc mode based on other options - cleanup inverted logic DTC options - fixes threshold option reported in #315069merge-requests/1/head
rodzic
cfa98fd0d1
commit
e4aed53a1e
|
@ -1059,12 +1059,12 @@ putnbyte (unsigned char *pnt, unsigned int value, unsigned int nbytes)
|
|||
|
||||
/* DTC also called Auto-I mode?*/
|
||||
/*warning: filtering uses inverse logic*/
|
||||
#define set_WD_filtering(sb, val) setbitfield(sb + 0x2f, 1, 7, val)
|
||||
#define get_WD_filtering(sb) getbitfield(sb + 0x2f, 1, 7)
|
||||
#define set_WD_filtering(sb, val) setbitfield(sb + 0x2f, 1, 7, !val)
|
||||
#define get_WD_filtering(sb) !getbitfield(sb + 0x2f, 1, 7)
|
||||
|
||||
/*warning: smoothing uses inverse logic*/
|
||||
#define set_WD_smoothing(sb, val) setbitfield(sb + 0x2f, 3, 5, val)
|
||||
#define get_WD_smoothing(sb) getbitfield(sb + 0x2f, 3, 5)
|
||||
#define set_WD_smoothing(sb, val) setbitfield(sb + 0x2f, 3, 5, !val)
|
||||
#define get_WD_smoothing(sb) !getbitfield(sb + 0x2f, 3, 5)
|
||||
|
||||
#define set_WD_gamma_curve(sb, val) setbitfield(sb + 0x2f, 3, 3, val)
|
||||
#define get_WD_gamma_curve(sb) getbitfield(sb + 0x2f, 3, 3)
|
||||
|
|
|
@ -591,6 +591,11 @@
|
|||
- add initial support for fi-7030
|
||||
- set has_MS_lamp=0 for fi-71x0
|
||||
- add I18N macros to all option titles and descriptions
|
||||
v132 2016-10-07, MAN
|
||||
- remove ipc_mode option and variables
|
||||
- set ipc mode based on other options
|
||||
- cleanup inverted logic DTC options
|
||||
- fixes threshold option reported in #315069
|
||||
|
||||
SANE FLOW DIAGRAM
|
||||
|
||||
|
@ -640,7 +645,7 @@
|
|||
#include "fujitsu.h"
|
||||
|
||||
#define DEBUG 1
|
||||
#define BUILD 131
|
||||
#define BUILD 132
|
||||
|
||||
/* values for SANE_DEBUG_FUJITSU env var:
|
||||
- errors 5
|
||||
|
@ -2033,14 +2038,6 @@ init_model (struct fujitsu *s)
|
|||
s->window_gamma = 0x80;
|
||||
}
|
||||
|
||||
/* older scanners would enable their highest */
|
||||
/* IPC mode by default. Newer scanners don't, */
|
||||
/* so we go ahead and turn it on. */
|
||||
if (s->has_sdtc)
|
||||
s->ipc_mode = WD_ipc_SDTC;
|
||||
else if (s->has_dtc)
|
||||
s->ipc_mode = WD_ipc_DTC;
|
||||
|
||||
/* endorser type tells string length (among other things) */
|
||||
if(s->has_endorser_b){
|
||||
/*old-style is 40 bytes*/
|
||||
|
@ -2489,11 +2486,6 @@ init_user (struct fujitsu *s)
|
|||
s->u_endorser_dir=DIR_TTB;
|
||||
strcpy((char *)s->u_endorser_string,"%05ud");
|
||||
|
||||
/* inverted logic ipc settings */
|
||||
s->noise_removal = 1;
|
||||
s->bp_filter = 1;
|
||||
s->smoothing = 1;
|
||||
|
||||
/* more recent machines default to this being 'on', *
|
||||
* which causes the scanner to ingest multiple pages *
|
||||
* even when the user only wants one */
|
||||
|
@ -3277,37 +3269,6 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
opt->cap = SANE_CAP_INACTIVE;
|
||||
}
|
||||
|
||||
if(option==OPT_IPC_MODE){
|
||||
i=0;
|
||||
s->ipc_mode_list[i++]=STRING_DEFAULT;
|
||||
if(s->has_dtc){
|
||||
s->ipc_mode_list[i++]=STRING_DTC;
|
||||
}
|
||||
if(s->has_sdtc){
|
||||
s->ipc_mode_list[i++]=STRING_SDTC;
|
||||
}
|
||||
s->ipc_mode_list[i]=NULL;
|
||||
|
||||
opt->name = "ipc-mode";
|
||||
opt->title = SANE_I18N ("IPC mode");
|
||||
opt->desc = SANE_I18N ("Image processing mode, enables additional options");
|
||||
opt->type = SANE_TYPE_STRING;
|
||||
opt->unit = SANE_UNIT_NONE;
|
||||
|
||||
opt->constraint_type = SANE_CONSTRAINT_STRING_LIST;
|
||||
opt->constraint.string_list = s->ipc_mode_list;
|
||||
opt->size = maxStringSize (opt->constraint.string_list);
|
||||
|
||||
if ( i > 2 ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if(s->s_mode != MODE_HALFTONE && s->s_mode != MODE_LINEART){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
else
|
||||
opt->cap = SANE_CAP_INACTIVE;
|
||||
}
|
||||
|
||||
/* =============== DTC params ================================ */
|
||||
/* enabled when in dtc mode (manually or by default) */
|
||||
if(option==OPT_BP_FILTER){
|
||||
|
@ -3319,8 +3280,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_dtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if(s->ipc_mode == WD_ipc_SDTC
|
||||
|| (s->has_sdtc && s->ipc_mode == WD_ipc_DEFAULT)){
|
||||
if(get_ipc_mode(s) == WD_ipc_SDTC){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -3337,8 +3297,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_dtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if(s->ipc_mode == WD_ipc_SDTC
|
||||
|| (s->has_sdtc && s->ipc_mode == WD_ipc_DEFAULT)){
|
||||
if(get_ipc_mode(s) == WD_ipc_SDTC){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -3361,8 +3320,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_dtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if(s->ipc_mode == WD_ipc_SDTC
|
||||
|| (s->has_sdtc && s->ipc_mode == WD_ipc_DEFAULT)){
|
||||
if(get_ipc_mode(s) == WD_ipc_SDTC){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -3385,8 +3343,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_dtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if(s->ipc_mode == WD_ipc_SDTC
|
||||
|| (s->has_sdtc && s->ipc_mode == WD_ipc_DEFAULT)){
|
||||
if(get_ipc_mode(s) == WD_ipc_SDTC){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -3403,8 +3360,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_dtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if(s->ipc_mode == WD_ipc_SDTC
|
||||
|| (s->has_sdtc && s->ipc_mode == WD_ipc_DEFAULT)){
|
||||
if(get_ipc_mode(s) == WD_ipc_SDTC){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -3421,8 +3377,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_dtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if(s->ipc_mode == WD_ipc_SDTC
|
||||
|| (s->has_sdtc && s->ipc_mode == WD_ipc_DEFAULT)){
|
||||
if(get_ipc_mode(s) == WD_ipc_SDTC){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -3439,9 +3394,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_dtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if( !s->noise_removal
|
||||
|| s->ipc_mode == WD_ipc_SDTC
|
||||
|| (s->has_sdtc && s->ipc_mode == WD_ipc_DEFAULT)){
|
||||
if(!s->noise_removal){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -3458,9 +3411,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_dtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if( !s->noise_removal
|
||||
|| s->ipc_mode == WD_ipc_SDTC
|
||||
|| (s->has_sdtc && s->ipc_mode == WD_ipc_DEFAULT)){
|
||||
if(!s->noise_removal){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -3477,9 +3428,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_dtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if( !s->noise_removal
|
||||
|| s->ipc_mode == WD_ipc_SDTC
|
||||
|| (s->has_sdtc && s->ipc_mode == WD_ipc_DEFAULT)){
|
||||
if(!s->noise_removal){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -3496,9 +3445,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_dtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if( !s->noise_removal
|
||||
|| s->ipc_mode == WD_ipc_SDTC
|
||||
|| (s->has_sdtc && s->ipc_mode == WD_ipc_DEFAULT)){
|
||||
if(!s->noise_removal){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -3524,7 +3471,7 @@ sane_get_option_descriptor (SANE_Handle handle, SANE_Int option)
|
|||
|
||||
if ( s->has_sdtc ){
|
||||
opt->cap = SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
|
||||
if (s->ipc_mode == WD_ipc_DTC){
|
||||
if(get_ipc_mode(s) == WD_ipc_DTC){
|
||||
opt->cap |= SANE_CAP_INACTIVE;
|
||||
}
|
||||
}
|
||||
|
@ -4800,18 +4747,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
|||
}
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
case OPT_IPC_MODE:
|
||||
if(s->ipc_mode == WD_ipc_DEFAULT){
|
||||
strcpy (val, STRING_DEFAULT);
|
||||
}
|
||||
else if(s->ipc_mode == WD_ipc_DTC){
|
||||
strcpy (val, STRING_DTC);
|
||||
}
|
||||
else if(s->ipc_mode == WD_ipc_SDTC){
|
||||
strcpy (val, STRING_SDTC);
|
||||
}
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
/* DTC params*/
|
||||
case OPT_BP_FILTER:
|
||||
*val_p = s->bp_filter;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
@ -4852,6 +4788,7 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
|||
*val_p = s->matrix_2;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
/* SDTC params*/
|
||||
case OPT_VARIANCE:
|
||||
*val_p = s->variance;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
@ -5496,48 +5433,35 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
|||
s->wl_follow = WD_wl_follow_OFF;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
case OPT_IPC_MODE:
|
||||
if (!strcmp (val, STRING_DEFAULT)) {
|
||||
tmp = WD_ipc_DEFAULT;
|
||||
}
|
||||
else if (!strcmp (val, STRING_DTC)) {
|
||||
tmp = WD_ipc_DTC;
|
||||
}
|
||||
else {
|
||||
tmp = WD_ipc_SDTC;
|
||||
}
|
||||
|
||||
if (tmp != s->ipc_mode)
|
||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||
|
||||
s->ipc_mode = tmp;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
/* DTC params*/
|
||||
case OPT_BP_FILTER:
|
||||
s->bp_filter = val_c;
|
||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
case OPT_SMOOTHING:
|
||||
s->smoothing = val_c;
|
||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
case OPT_GAMMA_CURVE:
|
||||
s->gamma_curve = val_c;
|
||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
case OPT_THRESHOLD_CURVE:
|
||||
s->threshold_curve = val_c;
|
||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
case OPT_THRESHOLD_WHITE:
|
||||
s->threshold_white = val_c;
|
||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
case OPT_NOISE_REMOVAL:
|
||||
if (val_c != s->noise_removal)
|
||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||
|
||||
s->noise_removal = val_c;
|
||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
case OPT_MATRIX_5:
|
||||
|
@ -5556,8 +5480,10 @@ sane_control_option (SANE_Handle handle, SANE_Int option,
|
|||
s->matrix_2 = val_c;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
/* SDTC params*/
|
||||
case OPT_VARIANCE:
|
||||
s->variance = val_c;
|
||||
*info |= SANE_INFO_RELOAD_OPTIONS;
|
||||
return SANE_STATUS_GOOD;
|
||||
|
||||
/* Advanced Group */
|
||||
|
@ -7640,15 +7566,15 @@ set_window (struct fujitsu *s)
|
|||
set_WD_separation(desc1,s->separation);
|
||||
set_WD_mirroring(desc1,s->mirroring);
|
||||
|
||||
if (s->has_sdtc && s->ipc_mode != WD_ipc_DTC)
|
||||
if (get_ipc_mode(s) == WD_ipc_SDTC)
|
||||
set_WD_variance(desc1,s->variance);
|
||||
|
||||
if ((s->has_dtc && !s->has_sdtc) || s->ipc_mode == WD_ipc_DTC){
|
||||
set_WD_filtering(desc1,!s->bp_filter);
|
||||
set_WD_smoothing(desc1,!s->smoothing);
|
||||
else if (get_ipc_mode(s) == WD_ipc_DTC){
|
||||
set_WD_filtering(desc1,s->bp_filter);
|
||||
set_WD_smoothing(desc1,s->smoothing);
|
||||
set_WD_gamma_curve(desc1,s->gamma_curve);
|
||||
set_WD_threshold_curve(desc1,s->threshold_curve);
|
||||
set_WD_noise_removal(desc1,!s->noise_removal);
|
||||
set_WD_noise_removal(desc1,s->noise_removal);
|
||||
if(s->noise_removal){
|
||||
set_WD_matrix5x5(desc1,s->matrix_5);
|
||||
set_WD_matrix4x4(desc1,s->matrix_4);
|
||||
|
@ -7660,7 +7586,7 @@ set_window (struct fujitsu *s)
|
|||
|
||||
set_WD_wl_follow(desc1,s->wl_follow);
|
||||
set_WD_subwindow_list(desc1,0);
|
||||
set_WD_ipc_mode(desc1,s->ipc_mode);
|
||||
set_WD_ipc_mode(desc1,get_ipc_mode(s));
|
||||
}
|
||||
|
||||
else{
|
||||
|
@ -9934,6 +9860,43 @@ get_page_height(struct fujitsu *s)
|
|||
return height;
|
||||
}
|
||||
|
||||
/* scanners have two different possible IPC
|
||||
* modes, which enable a different series of
|
||||
* subordinate options. Rather than provide
|
||||
* the user with an option to pick the IPC
|
||||
* mode, we show them the subordinate ones,
|
||||
* and pick the right mode to match.
|
||||
*/
|
||||
static int
|
||||
get_ipc_mode(struct fujitsu *s)
|
||||
{
|
||||
if ( s->bp_filter
|
||||
|| s->smoothing
|
||||
|| s->gamma_curve
|
||||
|| s->threshold_curve
|
||||
|| s->threshold_white
|
||||
|| s->noise_removal
|
||||
|| s->matrix_5
|
||||
|| s->matrix_4
|
||||
|| s->matrix_3
|
||||
|| s->matrix_2
|
||||
)
|
||||
return WD_ipc_DTC;
|
||||
|
||||
if(s->variance)
|
||||
return WD_ipc_SDTC;
|
||||
|
||||
/* special case: 0 threshold should activate IPC */
|
||||
if(!s->threshold){
|
||||
if(s->has_sdtc)
|
||||
return WD_ipc_SDTC;
|
||||
if(s->has_dtc)
|
||||
return WD_ipc_DTC;
|
||||
}
|
||||
|
||||
return WD_ipc_DEFAULT;
|
||||
}
|
||||
|
||||
/* s->max_y gives the maximum height of paper which can be scanned
|
||||
* this actually varies by resolution, so a helper to change it */
|
||||
static int
|
||||
|
|
|
@ -43,7 +43,6 @@ enum fujitsu_Option
|
|||
OPT_SEPARATION,
|
||||
OPT_MIRRORING,
|
||||
OPT_WL_FOLLOW,
|
||||
OPT_IPC_MODE,
|
||||
|
||||
/*IPC/DTC*/
|
||||
OPT_BP_FILTER,
|
||||
|
@ -386,7 +385,6 @@ struct fujitsu
|
|||
SANE_Range ht_pattern_range;
|
||||
SANE_Range emphasis_range;
|
||||
SANE_String_Const wl_follow_list[4];
|
||||
SANE_String_Const ipc_mode_list[4];
|
||||
SANE_Range gamma_curve_range;
|
||||
SANE_Range threshold_curve_range;
|
||||
SANE_Range variance_range;
|
||||
|
@ -456,7 +454,6 @@ struct fujitsu
|
|||
int separation;
|
||||
int mirroring;
|
||||
int wl_follow;
|
||||
int ipc_mode;
|
||||
|
||||
/* ipc_mode=DTC */
|
||||
int bp_filter;
|
||||
|
@ -534,12 +531,6 @@ struct fujitsu
|
|||
SANE_Parameters u_params;
|
||||
SANE_Parameters s_params;
|
||||
|
||||
/* also keep a backup copy, in case the software enhancement code overwrites*/
|
||||
/*
|
||||
SANE_Parameters u_params_bk;
|
||||
SANE_Parameters s_params_bk;
|
||||
*/
|
||||
|
||||
/* --------------------------------------------------------------------- */
|
||||
/* values which are set by scanning functions to keep track of pages, etc */
|
||||
int started;
|
||||
|
@ -821,6 +812,7 @@ static int must_downsample (struct fujitsu *s);
|
|||
static int must_fully_buffer (struct fujitsu *s);
|
||||
static int get_page_width (struct fujitsu *s);
|
||||
static int get_page_height (struct fujitsu *s);
|
||||
static int get_ipc_mode (struct fujitsu *s);
|
||||
static int set_max_y (struct fujitsu *s);
|
||||
|
||||
static SANE_Status send_lut (struct fujitsu *s);
|
||||
|
|
Ładowanie…
Reference in New Issue