Merge branch 'remotes/origin/escl-fix-adv-options' into 'master'

refactoring options code

See merge request sane-project/backends!559
escl-fix-sleep-mode
Ordissimo 2020-12-21 19:42:45 +00:00
commit ae06e017f4
2 zmienionych plików z 93 dodań i 81 usunięć

Wyświetl plik

@ -56,6 +56,7 @@
#define min(A,B) (((A)<(B)) ? (A) : (B))
#define max(A,B) (((A)>(B)) ? (A) : (B))
#define IS_ACTIVE(OPTION) (((handler->opt[OPTION].cap) & SANE_CAP_INACTIVE) == 0)
#define INPUT_BUFFER_SIZE 4096
static const SANE_Device **devlist = NULL;
@ -550,6 +551,30 @@ _source_size_max (SANE_String_Const * sources)
return size;
}
static int
_get_resolution(escl_sane_t *handler, int resol)
{
int x = 1;
int n = handler->scanner->caps[handler->scanner->source].SupportedResolutions[0] + 1;
int old = -1;
for (; x < n; x++) {
DBG(10, "SEARCH RESOLUTION [ %d | %d]\n", resol, (int)handler->scanner->caps[handler->scanner->source].SupportedResolutions[x]);
if (resol == handler->scanner->caps[handler->scanner->source].SupportedResolutions[x])
return resol;
else if (resol < handler->scanner->caps[handler->scanner->source].SupportedResolutions[x])
{
if (old == -1)
return handler->scanner->caps[handler->scanner->source].SupportedResolutions[1];
else
return old;
}
else
old = handler->scanner->caps[handler->scanner->source].SupportedResolutions[x];
}
return old;
}
/**
* \fn static SANE_Status init_options(SANE_String_Const name, escl_sane_t *s)
* \brief Function thzt initializes all the needed options of the received scanner
@ -759,19 +784,8 @@ init_options(SANE_String_Const name_source, escl_sane_t *s)
s->opt[OPT_BRIGHTNESS].constraint.range = &s->brightness_range;
s->val[OPT_BRIGHTNESS].w = s->scanner->brightness->normal;
s->brightness_range.quant=1;
if (s->scanner->brightness->step){
s->brightness_range.min=s->scanner->brightness->min;
s->brightness_range.max=s->scanner->brightness->max;
s->opt[OPT_BRIGHTNESS].cap &= ~SANE_CAP_INACTIVE;
s->opt[OPT_BRIGHTNESS].cap |= SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
}
else{
SANE_Range range = { 0, 255, 0 };
s->opt[OPT_BRIGHTNESS].constraint.range = &range;
s->val[OPT_BRIGHTNESS].w = 0;
s->opt[OPT_BRIGHTNESS].cap |= SANE_CAP_INACTIVE;
}
s->brightness_range.min=s->scanner->brightness->min;
s->brightness_range.max=s->scanner->brightness->max;
}
else{
SANE_Range range = { 0, 255, 0 };
@ -789,19 +803,8 @@ init_options(SANE_String_Const name_source, escl_sane_t *s)
s->opt[OPT_CONTRAST].constraint.range = &s->contrast_range;
s->val[OPT_CONTRAST].w = s->scanner->contrast->normal;
s->contrast_range.quant=1;
if (s->scanner->contrast->step){
s->contrast_range.min=s->scanner->contrast->min;
s->contrast_range.max=s->scanner->contrast->max;
s->opt[OPT_CONTRAST].cap &= ~SANE_CAP_INACTIVE;
s->opt[OPT_CONTRAST].cap |= SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
}
else{
SANE_Range range = { 0, 255, 0 };
s->opt[OPT_CONTRAST].constraint.range = &range;
s->val[OPT_CONTRAST].w = 0;
s->opt[OPT_CONTRAST].cap |= SANE_CAP_INACTIVE;
}
s->contrast_range.min=s->scanner->contrast->min;
s->contrast_range.max=s->scanner->contrast->max;
}
else{
SANE_Range range = { 0, 255, 0 };
@ -819,19 +822,8 @@ init_options(SANE_String_Const name_source, escl_sane_t *s)
s->opt[OPT_SHARPEN].constraint.range = &s->sharpen_range;
s->val[OPT_SHARPEN].w = s->scanner->sharpen->normal;
s->sharpen_range.quant=1;
if (s->scanner->sharpen->step){
s->sharpen_range.min=s->scanner->sharpen->min;
s->sharpen_range.max=s->scanner->sharpen->max;
s->opt[OPT_SHARPEN].cap &= ~SANE_CAP_INACTIVE;
s->opt[OPT_SHARPEN].cap |= SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
}
else{
SANE_Range range = { 0, 255, 0 };
s->opt[OPT_SHARPEN].constraint.range = &range;
s->val[OPT_SHARPEN].w = 0;
s->opt[OPT_SHARPEN].cap |= SANE_CAP_INACTIVE;
}
s->sharpen_range.min=s->scanner->sharpen->min;
s->sharpen_range.max=s->scanner->sharpen->max;
}
else{
SANE_Range range = { 0, 255, 0 };
@ -850,19 +842,8 @@ init_options(SANE_String_Const name_source, escl_sane_t *s)
s->opt[OPT_THRESHOLD].constraint.range = &s->thresold_range;
s->val[OPT_THRESHOLD].w = s->scanner->threshold->normal;
s->thresold_range.quant=1;
if (s->scanner->threshold->step) {
s->thresold_range.min= s->scanner->threshold->min;
s->thresold_range.max=s->scanner->threshold->max;
s->opt[OPT_THRESHOLD].cap &= ~SANE_CAP_INACTIVE;
s->opt[OPT_THRESHOLD].cap |= SANE_CAP_SOFT_SELECT | SANE_CAP_SOFT_DETECT;
}
else{
SANE_Range range = { 0, 255, 0 };
s->opt[OPT_THRESHOLD].constraint.range = &range;
s->val[OPT_THRESHOLD].w = 0;
s->opt[OPT_THRESHOLD].cap |= SANE_CAP_INACTIVE;
}
s->thresold_range.min= s->scanner->threshold->min;
s->thresold_range.max=s->scanner->threshold->max;
}
else{
SANE_Range range = { 0, 255, 0 };
@ -1091,9 +1072,9 @@ sane_control_option(SANE_Handle h, SANE_Int n, SANE_Action a, void *v, SANE_Int
case OPT_BR_X:
case OPT_BR_Y:
case OPT_NUM_OPTS:
case OPT_RESOLUTION:
case OPT_PREVIEW:
case OPT_GRAY_PREVIEW:
case OPT_RESOLUTION:
case OPT_BRIGHTNESS:
case OPT_CONTRAST:
case OPT_SHARPEN:
@ -1116,7 +1097,6 @@ sane_control_option(SANE_Handle h, SANE_Int n, SANE_Action a, void *v, SANE_Int
case OPT_BR_X:
case OPT_BR_Y:
case OPT_NUM_OPTS:
case OPT_RESOLUTION:
case OPT_PREVIEW:
case OPT_GRAY_PREVIEW:
case OPT_BRIGHTNESS:
@ -1163,6 +1143,11 @@ sane_control_option(SANE_Handle h, SANE_Int n, SANE_Action a, void *v, SANE_Int
handler->opt[OPT_SHARPEN].cap &= ~SANE_CAP_INACTIVE;
}
break;
case OPT_RESOLUTION:
handler->val[n].w = _get_resolution(handler, (int)(*(SANE_Word *) v));
if (i)
*i |= SANE_INFO_RELOAD_PARAMS | SANE_INFO_RELOAD_OPTIONS | SANE_INFO_INEXACT;
break;
default:
break;
}
@ -1286,53 +1271,66 @@ sane_start(SANE_Handle h)
DBG (10, "Default Color allocation failure.\n");
return (SANE_STATUS_NO_MEM);
}
if (handler->scanner->threshold) {
if (handler->opt[OPT_THRESHOLD].cap & SANE_CAP_INACTIVE) {
DBG(10, "Not use Thresold\n");
handler->scanner->use_threshold = 0;
}
else {
DBG(10, "Use Thresold [%d|]\n", handler->val[OPT_THRESHOLD].w);
DBG(10, "Have Thresold\n");
if (IS_ACTIVE(OPT_THRESHOLD)) {
DBG(10, "Use Thresold [%d]\n", handler->val[OPT_THRESHOLD].w);
handler->scanner->val_threshold = handler->val[OPT_THRESHOLD].w;
handler->scanner->use_threshold = 1;
}
else {
DBG(10, "Not use Thresold\n");
handler->scanner->use_threshold = 0;
}
}
else
DBG(10, "Don't have Thresold\n");
if (handler->scanner->sharpen) {
if (handler->opt[OPT_SHARPEN].cap & SANE_CAP_INACTIVE) {
DBG(10, "Not use Sharpen\n");
handler->scanner->use_sharpen = 0;
}
else {
DBG(10, "Use Sharpen [%d|]\n", handler->val[OPT_SHARPEN].w);
DBG(10, "Have Sharpen\n");
if (IS_ACTIVE(OPT_SHARPEN)) {
DBG(10, "Use Sharpen [%d]\n", handler->val[OPT_SHARPEN].w);
handler->scanner->val_sharpen = handler->val[OPT_SHARPEN].w;
handler->scanner->use_sharpen = 1;
}
else {
DBG(10, "Not use Thresold\n");
handler->scanner->use_threshold = 0;
}
}
else
DBG(10, "Don't have Thresold\n");
if (handler->scanner->contrast) {
if (handler->opt[OPT_CONTRAST].cap & SANE_CAP_INACTIVE) {
DBG(10, "Not use Contrast\n");
handler->scanner->use_contrast = 0;
}
else {
DBG(10, "Use Contrast [%d|]\n", handler->val[OPT_CONTRAST].w);
DBG(10, "Have Contrast\n");
if (IS_ACTIVE(OPT_CONTRAST)) {
DBG(10, "Use Contrast [%d]\n", handler->val[OPT_CONTRAST].w);
handler->scanner->val_contrast = handler->val[OPT_CONTRAST].w;
handler->scanner->use_contrast = 1;
}
else {
DBG(10, "Not use Contrast\n");
handler->scanner->use_contrast = 0;
}
}
else
DBG(10, "Don't have Contrast\n");
if (handler->scanner->brightness) {
if (handler->opt[OPT_BRIGHTNESS].cap & SANE_CAP_INACTIVE) {
DBG(10, "Not use Brightness\n");
handler->scanner->use_brightness = 0;
}
else {
DBG(10, "Use Brightness [%d|]\n", handler->val[OPT_BRIGHTNESS].w);
DBG(10, "Have Brightness\n");
if (IS_ACTIVE(OPT_BRIGHTNESS)) {
DBG(10, "Use Brightness [%d]\n", handler->val[OPT_BRIGHTNESS].w);
handler->scanner->val_brightness = handler->val[OPT_BRIGHTNESS].w;
handler->scanner->use_brightness = 1;
}
else {
DBG(10, "Not use Brightness\n");
handler->scanner->use_brightness = 0;
}
}
else
DBG(10, "Don't have Brightness\n");
handler->result = escl_newjob(handler->scanner, handler->device, &status);
if (status != SANE_STATUS_GOOD)

Wyświetl plik

@ -194,32 +194,40 @@ find_valor_of_array_variables(xmlNode *node, capabilities_t *scanner, int type)
int i = 0;
SANE_Bool have_jpeg = SANE_FALSE, have_png = SANE_FALSE, have_tiff = SANE_FALSE, have_pdf = SANE_FALSE;
scanner->caps[type].DocumentFormats = char_to_array(scanner->caps[type].DocumentFormats, &scanner->caps[type].DocumentFormatsSize, (SANE_String_Const)xmlNodeGetContent(node), 0);
scanner->caps[type].have_jpeg = -1;
scanner->caps[type].have_png = -1;
scanner->caps[type].have_tiff = -1;
scanner->caps[type].have_pdf = -1;
for(; i < scanner->caps[type].DocumentFormatsSize; i++)
{
if (!strcmp(scanner->caps[type].DocumentFormats[i], "image/jpeg"))
{
have_jpeg = SANE_TRUE;
scanner->caps[type].have_jpeg = i;
}
#if(defined HAVE_LIBPNG)
else if(!strcmp(scanner->caps[type].DocumentFormats[i], "image/png"))
{
have_png = SANE_TRUE;
scanner->caps[type].have_png = i;
}
#endif
#if(defined HAVE_TIFFIO_H)
else if(type == PLATEN && !strcmp(scanner->caps[type].DocumentFormats[i], "image/tiff"))
{
have_tiff = SANE_TRUE;
scanner->caps[type].have_tiff = i;
}
#endif
#if(defined HAVE_POPPLER_GLIB)
else if(type == PLATEN && !strcmp(scanner->caps[type].DocumentFormats[i], "application/pdf"))
{
have_pdf = SANE_TRUE;
scanner->caps[type].have_pdf = i;
}
#endif
}
if (have_pdf)
if (have_pdf)
scanner->caps[type].default_format = strdup("application/pdf");
else if (have_tiff)
scanner->caps[type].default_format = strdup("image/tiff");
@ -288,18 +296,20 @@ print_support(xmlNode *node)
{
support_t *sup = (support_t*)calloc(1, sizeof(support_t));
int cpt = 0;
int have_norm = 0;
while (node) {
if (!strcmp((const char *)node->name, "Min")){
sup->min = atoi((const char *)xmlNodeGetContent(node));
cpt++;
}
else if (!strcmp((const char *)node->name, "Max")) {
sup->step = atoi((const char *)xmlNodeGetContent(node));
sup->max = atoi((const char *)xmlNodeGetContent(node));
cpt++;
}
else if (!strcmp((const char *)node->name, "Normal")) {
sup->step = atoi((const char *)xmlNodeGetContent(node));
sup->normal = atoi((const char *)xmlNodeGetContent(node));
cpt++;
have_norm = 1;
}
else if (!strcmp((const char *)node->name, "Step")) {
sup->step = atoi((const char *)xmlNodeGetContent(node));
@ -309,6 +319,10 @@ print_support(xmlNode *node)
}
if (cpt == 4)
return sup;
if (cpt == 3 && have_norm == 0) {
sup->normal = (sup->max / 2 );
return sup;
}
free(sup);
return NULL;
}