sane.ds: Add array of resolutions support.

Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55378
This commit is contained in:
Ilia Docin 2023-08-04 12:06:06 +03:00 committed by Alexandre Julliard
parent 26e72a7580
commit b43ba81e17
3 changed files with 46 additions and 27 deletions

View file

@ -143,27 +143,35 @@ static TW_UINT16 msg_get_range(pTW_CAPABILITY pCapability, TW_UINT16 type,
return TWCC_SUCCESS;
}
static TW_UINT16 TWAIN_GetSupportedCaps(pTW_CAPABILITY pCapability)
static TW_UINT16 msg_get_array(pTW_CAPABILITY pCapability, TW_UINT16 type, const int *values, int value_count)
{
TW_ARRAY *a;
static const UINT16 supported_caps[] = { CAP_SUPPORTEDCAPS, CAP_XFERCOUNT, CAP_UICONTROLLABLE,
CAP_AUTOFEED, CAP_FEEDERENABLED,
ICAP_XFERMECH, ICAP_PIXELTYPE, ICAP_UNITS, ICAP_BITDEPTH, ICAP_COMPRESSION, ICAP_PIXELFLAVOR,
ICAP_XRESOLUTION, ICAP_YRESOLUTION, ICAP_PHYSICALHEIGHT, ICAP_PHYSICALWIDTH, ICAP_SUPPORTEDSIZES };
TW_UINT32 *p32;
TW_UINT16 *p16;
pCapability->hContainer = GlobalAlloc (0, FIELD_OFFSET( TW_ARRAY, ItemList[sizeof(supported_caps)] ));
pCapability->hContainer = 0;
pCapability->ConType = TWON_ARRAY;
if (type == TWTY_INT16 || type == TWTY_UINT16)
pCapability->hContainer = GlobalAlloc (0, FIELD_OFFSET( TW_ARRAY, ItemList[value_count * sizeof(TW_UINT16)]));
else if (type == TWTY_INT32 || type == TWTY_UINT32)
pCapability->hContainer = GlobalAlloc (0, FIELD_OFFSET( TW_ARRAY, ItemList[value_count * sizeof(TW_UINT32)]));
if (pCapability->hContainer)
{
UINT16 *u;
TW_UINT32 i;
a = GlobalLock (pCapability->hContainer);
a->ItemType = TWTY_UINT16;
a->NumItems = ARRAY_SIZE(supported_caps);
u = (UINT16 *) a->ItemList;
a->ItemType = type;
a->NumItems = value_count;
p16 = (TW_UINT16 *) a->ItemList;
p32 = (TW_UINT32 *) a->ItemList;
for (i = 0; i < a->NumItems; i++)
u[i] = supported_caps[i];
{
if (type == TWTY_INT16 || type == TWTY_UINT16)
p16[i] = values[i];
else if (type == TWTY_INT32 || type == TWTY_UINT32)
p32[i] = values[i];
}
GlobalUnlock (pCapability->hContainer);
return TWCC_SUCCESS;
}
@ -171,6 +179,16 @@ static TW_UINT16 TWAIN_GetSupportedCaps(pTW_CAPABILITY pCapability)
return TWCC_LOWMEMORY;
}
static TW_UINT16 TWAIN_GetSupportedCaps(pTW_CAPABILITY pCapability)
{
static const int supported_caps[] = { CAP_SUPPORTEDCAPS, CAP_XFERCOUNT, CAP_UICONTROLLABLE,
CAP_AUTOFEED, CAP_FEEDERENABLED,
ICAP_XFERMECH, ICAP_PIXELTYPE, ICAP_UNITS, ICAP_BITDEPTH, ICAP_COMPRESSION, ICAP_PIXELFLAVOR,
ICAP_XRESOLUTION, ICAP_YRESOLUTION, ICAP_PHYSICALHEIGHT, ICAP_PHYSICALWIDTH, ICAP_SUPPORTEDSIZES };
return msg_get_array(pCapability, TWTY_UINT16, supported_caps, sizeof(supported_caps) / sizeof(supported_caps[0]));
}
/* ICAP_XFERMECH */
static TW_UINT16 SANE_ICAPXferMech (pTW_CAPABILITY pCapability, TW_UINT16 action)
@ -518,7 +536,7 @@ static TW_UINT16 SANE_ICAPResolution (pTW_CAPABILITY pCapability, TW_UINT16 acti
int current_resolution;
TW_FIX32 *default_res;
const char *best_option_name;
int minval, maxval, quantval;
struct option_descriptor opt;
TRACE("ICAP_%cRESOLUTION\n", cap == ICAP_XRESOLUTION ? 'X' : 'Y');
@ -565,10 +583,20 @@ static TW_UINT16 SANE_ICAPResolution (pTW_CAPABILITY pCapability, TW_UINT16 acti
break;
case MSG_GET:
twCC = sane_option_probe_resolution(best_option_name, &minval, &maxval, &quantval);
twCC = sane_option_probe_resolution(best_option_name, &opt);
if (twCC == TWCC_SUCCESS)
twCC = msg_get_range(pCapability, TWTY_FIX32,
minval, maxval, quantval == 0 ? 1 : quantval, default_res->Whole, current_resolution);
{
if (opt.constraint_type == CONSTRAINT_RANGE)
twCC = msg_get_range(pCapability, TWTY_FIX32,
opt.constraint.range.min, opt.constraint.range.max,
opt.constraint.range.quant == 0 ? 1 : opt.constraint.range.quant,
default_res->Whole, current_resolution);
else if (opt.constraint_type == CONSTRAINT_WORD_LIST)
twCC = msg_get_array(pCapability, TWTY_UINT32, &(opt.constraint.word_list[1]),
opt.constraint.word_list[0]);
else
twCC = TWCC_CAPUNSUPPORTED;
}
break;
case MSG_SET:

View file

@ -107,18 +107,9 @@ TW_UINT16 sane_option_set_str(const char *option_name, char *val, BOOL *needs_re
return rc;
}
TW_UINT16 sane_option_probe_resolution(const char *option_name, int *minval, int *maxval, int *quant)
TW_UINT16 sane_option_probe_resolution(const char *option_name, struct option_descriptor *opt)
{
struct option_descriptor opt;
TW_UINT16 rc = sane_find_option(option_name, TYPE_INT, &opt);
if (rc != TWCC_SUCCESS) return rc;
if (opt.constraint_type != CONSTRAINT_RANGE) return TWCC_CAPUNSUPPORTED;
*minval = opt.constraint.range.min;
*maxval = opt.constraint.range.max;
*quant = opt.constraint.range.quant;
return rc;
return sane_find_option(option_name, TYPE_INT, opt);
}
TW_UINT16 sane_option_probe_mode(TW_UINT16 *current, TW_UINT32 *choices, int *count)

View file

@ -200,7 +200,7 @@ TW_UINT16 sane_option_get_int( const char *option_name, int *val ) DECLSPEC_HIDD
TW_UINT16 sane_option_set_int( const char *option_name, int val, BOOL *reload ) DECLSPEC_HIDDEN;
TW_UINT16 sane_option_get_str( const char *option_name, char *val, int len ) DECLSPEC_HIDDEN;
TW_UINT16 sane_option_set_str( const char *option_name, char *val, BOOL *reload ) DECLSPEC_HIDDEN;
TW_UINT16 sane_option_probe_resolution( const char *option_name, int *minval, int *maxval, int *quant) DECLSPEC_HIDDEN;
TW_UINT16 sane_option_probe_resolution( const char *option_name, struct option_descriptor *opt ) DECLSPEC_HIDDEN;
TW_UINT16 sane_option_probe_mode(TW_UINT16 *current, TW_UINT32 *choices, int *count) DECLSPEC_HIDDEN;
TW_UINT16 sane_option_get_bool( const char *option_name, BOOL *val ) DECLSPEC_HIDDEN;
TW_UINT16 sane_option_set_bool( const char *option_name, BOOL val ) DECLSPEC_HIDDEN;