TWAIN规范的第四章

发布时间 : 星期五 文章TWAIN规范的第四章更新完毕开始阅读

TWAIN Specification Chapter 4 “Advanced Application Implementation”译——应用程序端的高级实现

本文是对TWAIN规范的第四章《应用程序端的高级实现》的翻译。因工作需要了解TWAIN,所以顺便译了一下。这是私人工作,您可以参考,但本人不保证不存在翻译的差错或不合宜。如果您发现有不妥的地方,敬请告之我(yedaoq@126.com)。

4.1 性能

应用程序与源进行性能协商的能力使人们能够控制TWAIN兼容的程序。在第四章“应用程序端的高级实现”中,你将看到对CAP_XFERCOUNT性能的协商。性能在并且总是在状态4期间进行协商,除非应用程序和源双方同意延迟协商。事实上,关于性能还有更多需要我们去了解。

4.1.1 性能值

TWAIN为每种性能定义了一个默认值和一组允许使用的值(见第10章)。应用程序不允许修改默认值,但允许将向用户提供的值限定为一个允许使用值的子集,以及选择性能的当前值。 4.1.1.1 默认值

一个源被打开时,每种性能的当前值都被设置为TWAIN定义的默认值。若TWAIN未定义,则源将选择一个值作为默认值。程序可以使用DG_CONTROL/ DAT_CAPABILITY / MSG_RESET操作将某性能重置为TWAIN定义的默认值。

虽然TWAIN为许多种性能定义了默认值,源也可能因为能够获得更高的效率而首选一个不同的值。例如,源通常在黑白图像中用位值0来代表白色,但是ICAP_FIXELFLAVOR的默认值为TWPF_CHOCOLATE,此值表示0代表黑色。即使TAWIN默认值为TWPF_CHOCOLATE,源也可能将TWPF_VANILLA作为首选值。当应用程序发出一个

DG_CONTROL/DAT_CAPABILITY/MSG_GETDEFAULT操作时,源将返回它的首选值的信息。基于此信息源和应用程序将能够协商出一个更有效的传送方式。

注意这并不是在暗示TWAIN定义的默认值应被完全忽略。在处理特殊数据源性能的首选值和TWAIN默认值之间的冲突时,应考虑到此问题与在会话间保存和恢复图像属性类似。假定一个数据源想保存某些性能的当前值以在将来的某个会话中恢复是合理的,期望恢复值能够反映性能

的当前设置也是合理的。若保存设置对图像属性确实有用,那么应声明数据源的首选值也采用同样方式进行处理。

加载数据源时,相关性能的当前值应被设置为从上一个会话恢复的值或数据源首选的值。此值将保持直至被应用程序显式更改或应用程序发出MSG_RESET操作。

并非所有性能都适用首选值,另外许多性能不适合在多个会话间保存和恢复。 以下是最好的例子:

例1:扫描参数在一个会话中保存并在另一个会话中恢复

1. 用户使用以下参数配置数据源用户接口:24位4*6英寸图像,水平竖直方向的DPI均为200。

2. 用户选择“扫描”然后数据源通知程序进行传送。 3. 应用程序成功获得图像。 4. 应用程序禁用数据源。

5. 应用程序状态4下询问帧,像素类型,位深度和分辨率的当前值。

6. 数据源报告用户设置的当前值:24位4*6英寸图像,水平竖直方向的DPI均为200。 7. 应用程序关闭数据源。

8. 在关闭期间,数据源保存当前帧,像素类型,位深度和分辨率。 9. 应用程序打开数据源。

10. 在打开期间,数据源恢复帧,像素类型,位深度和分辨率。

11. 应用程序在状态4下询问帧,像素类型,位深度和分辨率和当前值。

12. 数据源报告从上一个会话中恢复的数据:24位4*6英寸图像,水平竖直方向的DPI均为200。

例2:数据源使用首选Pixel Flavor代替TWAIN定义的默认值 1. 应用程序首次打开数据源。

2. 应用程序在状态4下询问默认Pixel Flavor。

3. 数据源报告Pixel Flavor默认为TWPF_CHOCOLATE。 4. 应用程序在状态4下询问当前Pixel Flavor。

5. 数据源报告Pixel Flavor当前为TWPF_VANILLA(因为设备本身采用这种方式返回数据)。 6. 应用程序要求重置Pixel Flavor。

7. 在重置期间,数据源将当前值变更为TWPF_CHOCOLATE并准备在传输过程中转换数据以适应应用程序要求。

此逻辑在一种情况下会失效。如果数据要对一个受限制的性能的MSG_GET返回

TW_ENUMERATION, TAWIN定义的默认值有可能不在值的约束集合内。在这种情况下,应用程序将认为默认值未定义。一个常识是,出于安全性的考虑,数据源应在当前可用值集合中提供一些合理的默认值(TW_ENUMERATION中存储一个坏索引是灾难性的)。当默认值事实上正被使用时(通过MSG_RESET),此限制将无效并且当前默认值可再次存在并被定义。这是一个仅限于TW_ENUMERATION容器的问题,因为它包含默认值的索引。 4.1.1.2 当前值

应用程序可能要求设置性能的当前值。如果源的用户界面正在显示,当前值也许能从中看出(例如高亮)。如果应用程序设置了当前值,它用于采集和传输直至被用户或一个自动源进程更改。应用程序可在状态6下通过检查当前值判断是否有更改发生。

若仅需要确定性能的当前值,请使用MSG_CONTROL / DAT_CAPABILITY / MSG_GETCURRENT;若要确定当前值以及可用值,请用DG_CONTROL /

DAT_CAPABILITY / MSG_GET。例如您可以对ICAP_PIXELTYPE使用MSG_GET,源将返回一个包含可用值TWPT_BW、TWPT_GRAY和TWPT_RGB的TW_ENUMERATION容器。 若要设置当前值,请使用DG_CONTROL / DAT_CAPABILITY / MSG_SET以及下列容器之一:

? TWON_ONEVALUE:将TW_ONEVALUE.Item置为要求的值。 ? TWON_ARRAY:将TW_ARRAY.ItemList置为要求的值。 其中值必须为MSG_GET操作返回值的一个子集。

同样还可以通过TW_ENUMERATION和TW_RANGE容器来设置当前值。 4.1.1.3 可用值

为了限制在获取和传送过程中限制源可用的设置,应用程序可限定可用值,源不会使用这些值以外的值。这些限制将体现在源的用户界面上,因此不可用的值将不会提供给用户。

例如,如果ICAP_PIXELTYPE上的操作MSG_GET表明源支持TWPT_BW,TWPT_GRAY和TWPT_RGB图像,但应用程序只想要黑白图像,那么它可以要求限制可用值为TWPT_BW。

若要设置可用值,请使用DG_CONTROL / DAT_CAPABILITY / MSG_SET以及下列容器之一:

? TWON_ENUMERATION:将TW_ENUMERATION.ItemList域置为要求的值。通过将CurrentIndex指定为ItemList中某个值的索引,也可在此时设置当前值。 ? TWON_RANGE:将TW_RANGE域设置为要求的值。此时同样可设置当前值。 注:TW_ONEVALUE和TW_ARRAY容器不可用于限制可用值。

4.1.2 性能协商

协商过程包括以下几个基本的部分: ? 应用程序确定源支持哪些性能。 ? 应用程序按要求设置支持的性能。 ? 应用程序校验设置是否已被源接受。 4.1.2.1 确定源支持哪些性能

步骤一

应用程序分配一个TW_CAPABILITY结构并如下填充:

Cap = 感兴趣的性能的名称,一般为CAP_name或ICAP_name ConType = TWON_DONTCARE16 hContainer = 设置为NULL 步骤二

执行DG_CONTROL / DAT_CAPABILITY / MSG_GET并传递TW_CAPABILITY。 步骤三

源检查Cap域并判断是否支持此性能。若支持,则为应用程序生成信息,否则设置一个合适的返回值。 步骤四

应用程序检查操作的返回值(也许是状态码): 若为TWRC_SUCCESS,则源支持该性能并且:

联系合同范文客服:xxxxx#qq.com(#替换为@)