Module: wine Branch: master Commit: b43ba81e17ef7b191af30948842596fca54559a3 URL: https://gitlab.winehq.org/wine/wine/-/commit/b43ba81e17ef7b191af30948842596f...
Author: Ilia Docin ilya.docin@contentai.ru Date: Fri Aug 4 12:06:06 2023 +0300
sane.ds: Add array of resolutions support.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=55378
---
dlls/sane.ds/capability.c | 58 +++++++++++++++++++++++++++++++++++------------ dlls/sane.ds/options.c | 13 ++--------- dlls/sane.ds/sane_i.h | 2 +- 3 files changed, 46 insertions(+), 27 deletions(-)
diff --git a/dlls/sane.ds/capability.c b/dlls/sane.ds/capability.c index 15ca4ea740a..312876cd8e6 100644 --- a/dlls/sane.ds/capability.c +++ b/dlls/sane.ds/capability.c @@ -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: diff --git a/dlls/sane.ds/options.c b/dlls/sane.ds/options.c index 52e73a99925..30ca441fd28 100644 --- a/dlls/sane.ds/options.c +++ b/dlls/sane.ds/options.c @@ -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) diff --git a/dlls/sane.ds/sane_i.h b/dlls/sane.ds/sane_i.h index db71b87995e..571917944e1 100644 --- a/dlls/sane.ds/sane_i.h +++ b/dlls/sane.ds/sane_i.h @@ -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;