sane-project-website/html/doc011.html

877 wiersze
32 KiB
HTML

<html><body>
<a href="doc012.html"><img src=../icons/next.gif alt="Next"></a>
<a href="doc000.html"><img src=../icons/up.gif alt="Up"></a>
<a href="doc010.html"><img src=../icons/previous.gif alt="Previous"></a>
<a href="doc000.html"><img src=../icons/contents.gif alt="Contents"></a>
<a href="doc019.html"><img src=../icons/index.gif alt="Index"></a>
<hr>
<title>Data Types</title>
<h2><a name="s4.2">4.2 Data Types</a></h2>
<p><h3><a name="s4.2.1">4.2.1 Base Types</a></h3>
<p>The SANE standard is based on just two SANE-specific base types: the
SANE byte and word.
<blockquote>
<tt>typedef <i>some-scalar-type</i> SANE_Byte<a name="i9">;</tt> <br>
<tt>typedef <i>some-scalar-type</i> SANE_Word<a name="i10">;</tt>
</blockquote>
<tt>SANE_Byte</tt> must correspond to some scalar C type that is capable
of holding values in the range 0 to 255. <tt>SANE_Word</tt> must be
capable of holding any of the following:
<ul>
<li>the truth values <tt>SANE_FALSE</tt> and <tt>SANE_TRUE</tt>
<li>signed integers in the range -2<sup>31</sup>...2<sup>31</sup>-1
<li>fixed point values in the range -32768...32767.9999 with
a resolution of 1/65536
<li>32 bits (for bit sets)
</ul>
Note that the SANE standard does not define what C type
<tt>SANE_Byte</tt> and <tt>SANE_Word</tt> map to. For example, on some
platforms, the latter may map to <tt>long int</tt> whereas on others it
may map to <tt>int</tt>. A portable SANE frontend or backend must
therefore not depend on a particular mapping.
<p><h3><a name="s4.2.2">4.2.2 Boolean Type</a></h3>
<p><tt>SANE_Bool<a name="i11"></tt> is used for variables that can take one of
the two truth values <tt>SANE_FALSE<a name="i12"></tt> and
<tt>SANE_TRUE<a name="i13"></tt>. The former value is defined to be 0,
whereas the latter is 1.<a name="F1"><a href="footnotes.html#000001"><sup><fontsize=-2>1</font></sup></a></a> The C
declarations for this type are given below.
<blockquote>
<pre>
#define SANE_FALSE 0
#define SANE_TRUE 1
typedef SANE_Word SANE_Bool;
</pre>
</blockquote>
Note that <tt>SANE_Bool</tt> is simply an alias of <tt>SANE_Word</tt>. It
is therefore always legal to use the latter type in place of the
former. However, for clarity, it is recommended to use
<tt>SANE_Bool</tt> whenever a given variable or formal argument has a
fixed interpretation as a boolean object.
<p><h3><a name="s4.2.3">4.2.3 Integer Type</a></h3>
<p><tt>SANE_Int<a name="i14"></tt> is used for variables that can take integer
values in the range -2<sup>32</sup> to 2<sup>31</sup>-1. Its C declaration is
given below.
<blockquote>
<pre>
typedef SANE_Word SANE_Int;
</pre>
</blockquote>
Note that <tt>SANE_Int</tt> is simply an alias of <tt>SANE_Word</tt>. It
is therefore always legal to use the latter type in place of the
former. However, for clarity, it is recommended to use
<tt>SANE_Int</tt> whenever a given variable or formal argument has a
fixed interpretation as an integer object.
<p><h3><a name="s4.2.4">4.2.4 Fixed-point Type</a></h3>
<p><tt>SANE_Fixed<a name="i15"></tt> is used for variables that can take fixed
point values in the range -32768 to 32767.9999 with a resolution
of 1/65535. The C declarations relating to this type are given
below.
<blockquote>
<pre>
#define SANE_FIXED_SCALE_SHIFT 16
typedef SANE_Word SANE_Fixed;
</pre>
</blockquote>
The macro <tt>SANE_FIXED_SCALE_SHIFT<a name="i16"></tt> gives the location
of the fixed binary point. This standard defines that value to be 16,
which yields a resolution of 1/65536.
<p>Note that <tt>SANE_Fixed</tt> is simply an alias of <tt>SANE_Word</tt>.
It is therefore always legal to use the latter type in place of the
former. However, for clarity, it is recommended to use
<tt>SANE_Fixed</tt> whenever a given variable or formal argument has a
fixed interpretation as a fixed-point object.
<p>For convenience, SANE also defines two macros that convert fixed-point
values to and from C double floating point values.
<blockquote>
<dl>
<p> <dt><tt>SANE_FIX<a name="i17">(<i>d</i>)</tt>:<dd> Returns the largest SANE
fixed-point value that is smaller than the double value <i>d</i>.
No range checking is performed. If the value of <i>d</i> is out of
range, the result is undefined.
<p> <dt><tt>SANE_UNFIX<a name="i18">(<i>w</i>)</tt>:<dd> Returns the nearest
double machine number that corresponds to fixed-point value
<i>w</i>.
<p> </dl>
</blockquote>
SANE does <em>not</em> require that the following two expressions hold
true (even if the values of <i>w</i> and <i>d</i> are in range):
<blockquote>
<pre>
SANE_UNFIX(SANE_FIX(d)) == d
SANE_FIX(SANE_UNFIX(w)) == w
</pre>
</blockquote>
In other words, conversion between fixed and double values may be
lossy. It is therefore recommended to avoid repeated conversions
between the two representations.
<p><h3><a name="s4.2.5">4.2.5 Text</a></h3>
<p><h4><a name="s4.2.5.1">4.2.5.1 Character Type</a></h4>
<p>Type <tt>SANE_Char<a name="i19"></tt> represents a single text character or
symbol. At present, this type maps directly to the underlying C
<tt>char</tt> type (typically one byte). The encoding for such
characters is currently fixed as ISO LATIN-1. Future versions of this
standard may map this type to a wider type and allow multi-byte
encodings to support internationalization. As a result of this, care
should be taken to avoid the assumption that
<tt>sizeof(SANE_Char)==sizeof(char)</tt>.
<blockquote>
<pre>
typedef char SANE_Char;
</pre>
</blockquote>
<p><h4><a name="s4.2.5.2">4.2.5.2 String Type</a></h4>
<p>Type <tt>SANE_String<a name="i20"></tt> represents a text string as a sequence
of C <tt>char</tt> values. The end of the sequence is indicated by a
<tt>'\0'</tt> (NUL<a name="i21">) character.
<blockquote>
<pre>
typedef SANE_Char *SANE_String;
typedef const SANE_Char *SANE_String_Const;
</pre>
</blockquote>
The type <tt>SANE_String_Const<a name="i22"></tt> is provided by SANE to
enable declaring strings whose contents is unchangable. Note that in
ANSI C, the declaration
<blockquote>
<pre>
const SANE_String str;
</pre>
</blockquote>
declares a string pointer that is constant (not a string pointer that
points to a constant value).
<p><h3><a name="s4.2.6">4.2.6 Scanner Handle Type</a></h3>
<p>Access to a scanner is provided through an opaque type called
<tt>SANE_Handle<a name="i23"></tt>. The C declaration of this type is given
below.
<blockquote>
<pre>
typedef void *SANE_Handle;
</pre>
</blockquote>
While this type is declared to be a void pointer, an application must
not attempt to interpret the value of a <tt>SANE_Handle</tt>. In
particular, SANE does not require that a value of this type is a legal
pointer value.
<p><h3><a name="s4.2.7">4.2.7 Status Type</a></h3>
<p>Most SANE operations return a value of type <tt>SANE_Status<a name="i24"></tt>
to indicate whether the completion status of the operation. If an
operation completes successfully, <tt>SANE_STATUS_GOOD</tt> is returned.
In case of an error, a value is returned that indicates the nature of
the problem. The complete list of available status codes is listed in
Table <a href="doc011.html#t1">1</a>. It is recommended to use function
<tt>sane_strstatus()</tt> to convert status codes into a legible
string.
<p><p><a name="t1"></a>
<center>
<table cellpadding=0 cellspacing=0 border=1>
<tr valign=top>
<td colspan=1 align=center nowrap><b>Symbol</b></td>
<td colspan=1 align=center nowrap><b>Code</b></td>
<td colspan=1 align=center nowrap><b>Description</b></td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_GOOD<a name="i25"></tt>
</td>
<td colspan=1 align=right nowrap> 0 </td>
<td colspan=1 align=left nowrap> Operation completed succesfully. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_UNSUPPORTED<a name="i26"></tt>
</td>
<td colspan=1 align=right nowrap> 1 </td>
<td colspan=1 align=left nowrap> Operation is not supported. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_CANCELLED<a name="i27"></tt>
</td>
<td colspan=1 align=right nowrap> 2 </td>
<td colspan=1 align=left nowrap> Operation was cancelled. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_DEVICE_BUSY<a name="i28"></tt>
</td>
<td colspan=1 align=right nowrap> 3 </td>
<td colspan=1 align=left nowrap> Device is busy---retry later. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_INVAL<a name="i29"></tt>
</td>
<td colspan=1 align=right nowrap> 4 </td>
<td colspan=1 align=left nowrap> Data or argument is invalid. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_EOF<a name="i30"></tt>
</td>
<td colspan=1 align=right nowrap> 5 </td>
<td colspan=1 align=left nowrap> No more data available (end-of-file). </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_JAMMED<a name="i31"></tt>
</td>
<td colspan=1 align=right nowrap> 6 </td>
<td colspan=1 align=left nowrap> Document feeder jammed. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_NO_DOCS<a name="i32"></tt>
</td>
<td colspan=1 align=right nowrap> 7 </td>
<td colspan=1 align=left nowrap> Document feeder out of documents. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_COVER_OPEN<a name="i33"></tt>
</td>
<td colspan=1 align=right nowrap> 8 </td>
<td colspan=1 align=left nowrap> Scanner cover is open. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_IO_ERROR<a name="i34"></tt>
</td>
<td colspan=1 align=right nowrap> 9 </td>
<td colspan=1 align=left nowrap> Error during device I/O. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_NO_MEM<a name="i35"></tt>
</td>
<td colspan=1 align=right nowrap> 10 </td>
<td colspan=1 align=left nowrap> Out of memory. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_STATUS_ACCESS_DENIED<a name="i36"></tt>
</td>
<td colspan=1 align=right nowrap> 11 </td>
<td colspan=1 align=left nowrap> Access to resource has been denied. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
</td></tr>
</table>
<p><center>Table 1: Status Codes</center>
</center>
<p>
<p><h3><a name="s4.2.8">4.2.8 Device Descriptor Type</a></h3>
<p>Each SANE device is represented by a structure of type
<tt>SANE_Device<a name="i37"></tt>. The C declaration of this type is given
below.
<blockquote>
<pre>
typedef struct
{
SANE_String_Const name;
SANE_String_Const vendor;
SANE_String_Const model;
SANE_String_Const type;
}
SANE_Device;
</pre>
</blockquote>
<a name="i38">
The structure provides the unique name of the scanner in member
<tt>name</tt>. It is this unique name that should be passed in a call
to <tt>sane_open()</tt>. The format of this name is completely up to
the backend. The only constraints are that the name is unique among
all devices supported by the backend and that the name is a legal SANE
text string. To simplify presentation of unique names, their length
should not be excessive. It is <em>recommended</em> that backends keep
unique names below 32 characters in length. However, applications
<em>must</em> be able to cope with arbitrary length unique names.
<p>The remaining members in the device structure provide additional
information on the device corresponding to the unique name.
Specifically, members <tt>vendor</tt>, <tt>model</tt>, and <tt>type</tt> are
single-line strings that give information on the vendor
(manufacturer), model, and the type of the device. For consistency's
sake, the following strings should be used when appropriate (the lists
will be expanded as need arises):
<p><p><a name="t2"></a>
<center>
<spacer type=horizontal size=72>
<table cellpadding=0 cellspacing=0 border=1>
<tr valign=top>
<td colspan=2 align=center nowrap><b>Vendor Strings<a name="i39"></b></td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>AGFA</tt> </td>
<td colspan=1 align=left nowrap> <tt>Microtek</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Abaton</tt> </td>
<td colspan=1 align=left nowrap> <tt>Minolta</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Acer</tt> </td>
<td colspan=1 align=left nowrap> <tt>Mitsubishi</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Apple</tt> </td>
<td colspan=1 align=left nowrap> <tt>Mustek</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Artec</tt> </td>
<td colspan=1 align=left nowrap> <tt>NEC</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Avision</tt> </td>
<td colspan=1 align=left nowrap> <tt>Nikon</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>CANON</tt> </td>
<td colspan=1 align=left nowrap> <tt>Plustek</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Connectix</tt> </td>
<td colspan=1 align=left nowrap> <tt>Polaroid</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Epson</tt> </td>
<td colspan=1 align=left nowrap> <tt>Relisys</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Fujitsu</tt> </td>
<td colspan=1 align=left nowrap> <tt>Ricoh</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Hewlett-Packard</tt> </td>
<td colspan=1 align=left nowrap> <tt>Sharp</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>IBM</tt> </td>
<td colspan=1 align=left nowrap> <tt>Siemens</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Kodak</tt> </td>
<td colspan=1 align=left nowrap> <tt>Tamarack</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Lexmark</tt> </td>
<td colspan=1 align=left nowrap> <tt>UMAX</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>Logitech</tt> </td>
<td colspan=1 align=left nowrap> <tt>Noname</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
</td></tr>
</table>
<spacer type=horizontal size=72>
<table cellpadding=0 cellspacing=0 border=1>
<tr valign=top>
<td colspan=1 align=center nowrap><b>Type Strings<a name="i40"></b></td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>film scanner</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>flatbed scanner</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>frame grabber</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>handheld scanner</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>multi-function peripheral</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>sheetfed scanner</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>still camera</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>video camera</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>virtual device</tt> </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
</td></tr>
</table>
<spacer type=horizontal size=72>
<p><center>Table 2: Predefined Device Information Strings</center>
</center>
<p>
Note that vendor string <tt>Noname</tt> can be used for virtual devices
that have no physical vendor associated. Also, there are no
predefined model name strings since those are vendor specific and
therefore completely under control of the respective backends.
<p><h3><a name="s4.2.9">4.2.9 Option Descriptor Type</a></h3>
<p>Option descriptors are at the same time the most intricate and
powerful type in the SANE standard. Options are used to control
virtually all aspects of device operation. Much of the power of the
SANE API stems from the fact that most device controls are completely
described by their respective option descriptor. Thus, a frontend can
control a scanner abstractly, without requiring knowledge as to what
the purpose of any given option is. Conversely, a scanner can
describe its controls without requiring knowledge of how the frontend
operates. The C declaration of the
<tt>SANE_Option_Descriptor<a name="i41"></tt> type is given below.
<blockquote>
<pre>
typedef struct
{
SANE_String_Const name;
SANE_String_Const title;
SANE_String_Const desc;
SANE_Value_Type type;
SANE_Unit unit;
SANE_Int size;
SANE_Int cap;
SANE_Constraint_Type constraint_type;
union
{
const SANE_String_Const *string_list;
const SANE_Word *word_list;
const SANE_Range *range;
}
constraint;
}
SANE_Option_Descriptor;
</pre>
</blockquote>
<p><h4><a name="s4.2.9.1">4.2.9.1 Option Name</a></h4>
<p>Member <tt>name</tt> is a string that uniquely identifies the option.
The name must be unique for a given device (i.e., the option names
across different backends or devices need not be unique). The option
name must consist of lower-case ASCII letters (<tt>a</tt>--<tt>z</tt>),
digits (<tt>0</tt>--<tt>9</tt>), or the dash character (<tt>-</tt>) only.
The first character must be a lower-case ASCII character (i.e., not a
digit or a dash).
<p><h4><a name="s4.2.9.2">4.2.9.2 Option Title</a></h4>
<p>Member <tt>title</tt> is a single-line string that can be used by the
frontend as a title string. This should typically be a short (one or
two-word) string that is chosen based on the function of the option.
<p><h4><a name="s4.2.9.3">4.2.9.3 Option Description</a></h4>
<p>Member <tt>desc</tt> is a (potentially very) long string that can be
used as a help text to describe the option. It is the responsibility
of the frontend to break the string into managable-length lines.
Newline characters in this string should be interpreted as paragraph
breaks.
<p><h4><a name="s4.2.9.4">4.2.9.4 Option Value Type</a></h4>
<p>Member <tt>type</tt> specifies the type of the option value. The
possible values for type <tt>SANE_Value_Type<a name="i42"></tt> are described
in Table <a href="doc011.html#t3">3</a>.
<p><p><a name="t3"></a>
<center>
<table cellpadding=0 cellspacing=0 border=1>
<tr valign=top>
<td colspan=1 align=center nowrap><b>Symbol</b></td>
<td colspan=1 align=center nowrap><b>Code</b></td>
<td colspan=1 align=center nowrap><b>Description</b></td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_TYPE_BOOL<a name="i43"></tt> </td>
<td colspan=1 align=left nowrap> 0 </td>
<td colspan=1 align=left> Option value is of type
<tt>SANE_Bool</tt>. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_TYPE_INT<a name="i44"></tt> </td>
<td colspan=1 align=left nowrap> 1 </td>
<td colspan=1 align=left> Option value is of type
<tt>SANE_Int</tt>. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_TYPE_FIXED<a name="i45"></tt></td>
<td colspan=1 align=left nowrap>2 </td>
<td colspan=1 align=left> Option value is of type
<tt>SANE_Fixed</tt>. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_TYPE_STRING<a name="i46"></tt></td>
<td colspan=1 align=left nowrap>3 </td>
<td colspan=1 align=left> Option value is of type
<tt>SANE_String</tt>. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_TYPE_BUTTON<a name="i47"></tt> </td>
<td colspan=1 align=left nowrap> 4 </td>
<td colspan=1 align=left> An option of this type has no value.
Instead, setting an option of this type has an option-specific
side-effect. For example, a button-typed option could be used by a
backend to provide a means to select default values or to the tell an
automatic document feeder to advance to the next sheet of paper. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_TYPE_GROUP<a name="i48"></tt> </td>
<td colspan=1 align=left nowrap> 5 </td>
<td colspan=1 align=left> An option of this type has no value.
This type is used to group logically related options. A group option
is in effect up to the point where another group option is encountered
(or up to the end of the option list, if there are no other group
options). For group options, only members <tt>title</tt> and
<tt>type</tt> are valid in the option descriptor. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p>
</td></tr>
</table>
<p><center>Table 3: Option Value Types (<tt>SANE_Value_Type</tt>)</center>
</center>
<p>
<p><h4><a name="s4.2.9.5">4.2.9.5 Option Value Unit</a></h4>
<p>Member <tt>unit</tt> specifies what the physical unit of the option
value is. The possible values for type <tt>SANE_Unit<a name="i49"></tt> are
described in Table <a href="doc011.html#t4">4</a>. Note that the specified unit is
what the SANE backend expects. It is entirely up to a frontend as to
how these units a presented to the user. For example, SANE expresses
all lengths in millimeters. A frontend is generally expected to
provide appropriate conversion routines so that a user can express
quantities in a customary unit (e.g., inches or centimeters).
<p><p><a name="t4"></a>
<center>
<table cellpadding=0 cellspacing=0 border=1>
<tr valign=top>
<td colspan=1 align=center nowrap><b>Symbol</b></td>
<td colspan=1 align=center nowrap><b>Code</b></td>
<td colspan=1 align=center nowrap><b>Description</b></td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p>
<p><tt>SANE_UNIT_NONE<a name="i50"></tt> </td>
<td colspan=1 align=left nowrap> 0 </td>
<td colspan=1 align=left nowrap> Value is unit-less (e.g., page count).</td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_UNIT_PIXEL<a name="i51"></tt> </td>
<td colspan=1 align=left nowrap> 1 </td>
<td colspan=1 align=left nowrap> Value is in number of pixels. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_UNIT_BIT<a name="i52"></tt> </td>
<td colspan=1 align=left nowrap> 2 </td>
<td colspan=1 align=left nowrap> Value is in number of bits. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_UNIT_MM<a name="i53"></tt> </td>
<td colspan=1 align=left nowrap> 3 </td>
<td colspan=1 align=left nowrap> Value is in millimeters. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_UNIT_DPI<a name="i54"></tt> </td>
<td colspan=1 align=left nowrap> 4 </td>
<td colspan=1 align=left nowrap> Value is a resolution in dots/inch. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_UNIT_PERCENT<a name="i55"></tt></td>
<td colspan=1 align=left nowrap> 5 </td>
<td colspan=1 align=left nowrap> Value is a percentage. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<tt>SANE_UNIT_MICROSECOND<a name="i56"></tt></td>
<td colspan=1 align=left nowrap> 6 </td>
<td colspan=1 align=left nowrap> Value is time in &micro;-seconds. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p>
</td></tr>
</table>
<p><center>Table 4: Physical Units (<tt>SANE_Unit</tt>)</center>
</center>
<p>
<p><h4><a name="s4.2.9.6">4.2.9.6 Option Value Size</a></h4>
<p>Member <tt>size</tt> specifies the size of the option value (in bytes).
This member has a slightly different interpretation depending on the
type of the option value:
<blockquote>
<dl>
<dt><tt>SANE_TYPE_STRING</tt>:<dd> The size is the maximum size of
the string. For the purpose of string size calcuations, the
terminating <tt>NUL</tt> character is considered to be part of the
string. Note that the terminating <tt>NUL</tt> character must
always be present in string option values.
<dt><tt>SANE_TYPE_INT</tt>, <tt>SANE_TYPE_FIXED</tt>:<dd> The size
must be a positive integer multiple of the size of a
<tt>SANE_Word</tt>. The option value is a vector of length
<p>
<center>
<tt>size</tt>/<tt>sizeof(SANE_Word)</tt>. </center>
<p>
<dt><tt>SANE_TYPE_BOOL</tt>:<dd> The size must be set to
<tt>sizeof(SANE_Word)</tt>.
<dt><tt>SANE_TYPE_BUTTON</tt>, <tt>SANE_TYPE_GROUP</tt>:<dd> The
option size is ignored.
</dl>
</blockquote>
<p><h4><a name="s4.2.9.7">4.2.9.7 Option Capabilities</a></h4>
<p>Member <tt>cap</tt> describes what capabilities the option posseses.
This is a bitset that is formed as the inclusive logical OR of the
capabilities described in Table <a href="doc011.html#t5">5</a>. The SANE API
provides the following to macros to test certain features of a given
capability bitset:
<blockquote>
<dl>
<p> <dt><tt>SANE_OPTION_IS_ACTIVE<a name="i57">(<i>cap</i>)</tt>:<dd> This macro
returns <tt>SANE_TRUE</tt> if and only if the option with the
capability set <i>cap</i> is currently active.
<p> <dt><tt>SANE_OPTION_IS_SETTABLE<a name="i58">(<i>cap</i>)</tt>:<dd> This
macro returns <tt>SANE_TRUE</tt> if and only if the option with the
capability set <i>cap</i> is software settable.
</dl>
</blockquote>
<p><p><a name="t5"></a>
<center>
<table cellpadding=0 cellspacing=0 border=1>
<tr valign=top>
<td colspan=1 align=center nowrap><b>Symbol</b></td>
<td colspan=1 align=center nowrap><b>Code</b></td>
<td colspan=1 align=center nowrap><b>Description</b></td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_CAP_SOFT_SELECT<a name="i59"></tt> </td>
<td colspan=1 align=right nowrap> 1 </td>
<td colspan=1 align=left> The option
value can be set by a call to <tt>sane_control_option()</tt>.</td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_CAP_HARD_SELECT<a name="i60"></tt> </td>
<td colspan=1 align=right nowrap> 2 </td>
<td colspan=1 align=left> The option value can be set by
user-intervention (e.g., by flipping a switch). The user-interface
should prompt the user to execute the appropriate action to set such
an option. This capability is mutually exclusive with
SANE_CAP_SOFT_SELECT (either one of them can be set, but not both
simultaneously). </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_CAP_SOFT_DETECT<a name="i61"></tt> </td>
<td colspan=1 align=right nowrap> 4 </td>
<td colspan=1 align=left> The option
value can be detected by software. If
<tt>SANE_CAP_SOFT_SELECT</tt> is set, this capability <em>must</em>
be set. If <tt>SANE_CAP_HARD_SELECT</tt> is set, this capability
may or may not be set. If this capability is set but neither
<tt>SANE_CAP_SOFT_SELECT</tt> nor <tt>SANE_CAP_HARD_SELECT</tt>
are, then there is no way to control the option. That is, the
option provides read-out of the current value only. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_CAP_EMULATED<a name="i62"></tt> </td>
<td colspan=1 align=right nowrap> 8 </td>
<td colspan=1 align=left> If set, this capability indicates
that an option is not directly supported by the device and is
instead emulated in the backend. A sophisticated frontend may
elect to use its own (presumably better) emulation in lieu of an emulated
option. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_CAP_AUTOMATIC<a name="i63"></tt> </td>
<td colspan=1 align=right nowrap> 16 </td>
<td colspan=1 align=left> If set, this capability indicates
that the backend (or the device) is capable to picking a reasonable
option value automatically. For such options, it is possible to
select automatic operation by calling <tt>sane_control_option()</tt>
with an action value of <tt>SANE_ACTION_SET_AUTO</tt>. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_CAP_INACTIVE<a name="i64"></tt> </td>
<td colspan=1 align=right nowrap> 32 </td>
<td colspan=1 align=left> If set, this capability indicates
that the option is not currently active (e.g., because it's
meaningful only if another option is set to some other value). </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_CAP_ADVANCED<a name="i65"></tt> </td>
<td colspan=1 align=right nowrap> 64 </td>
<td colspan=1 align=left>
If set, this capability indicates that the option should be
considered an ``advanced user option.'' A frontend typically
displays such options in a less conspicuous way than regular options
(e.g., a command line interface may list such options last or a
graphical interface may make them available in a seperate ``advanced
settings'' dialog).
</td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p>
</td></tr>
</table>
<p><center>Table 5: Option Capabilities</center>
</center>
<p>
<p><h4><a name="s4.2.9.8">4.2.9.8 Option Value Constraints</a></h4>
<p>It is often useful to constrain the values that an option can take.
For example, constraints can be used by a frontend to determine how to
represent a given option. Member <tt>constraint_type</tt> indicates
what constraint is in effect for the option. The constrained values
that are allowed for the option are described by one of the union
members of member <tt>constraint</tt>. The possible values of type
<tt>SANE_Constraint_Type<a name="i66"></tt> and the interpretation of the
<tt>constraint</tt> union is described in Table <a href="doc011.html#t6">6</a>.
<p><p><a name="t6"></a>
<center>
<table cellpadding=0 cellspacing=0 border=1>
<tr valign=top>
<td colspan=1 align=center nowrap><b>Symbol</b></td>
<td colspan=1 align=center nowrap><b>Code</b></td>
<td colspan=1 align=center nowrap><b>Description</b></td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p>
<p><tt>SANE_CONSTRAINT_NONE<a name="i67"></tt> </td>
<td colspan=1 align=right nowrap> 0 </td>
<td colspan=1 align=left> The value is unconstrained.
The option can take any of the values possible for the option's
type. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p> <tt>SANE_CONSTRAINT_RANGE<a name="i68"></tt> </td>
<td colspan=1 align=right nowrap> 1 </td>
<td colspan=1 align=left> This constraint is
applicable to integer and fixed-point valued options only. It
constrains the option value to a possibly quantized range of
numbers. Option descriptor member <tt>constraint.range</tt> points to
a range of the type <tt>SANE_Range<a name="i69"></tt>. This type is illustrated
below:
<blockquote>
<pre>
typedef struct
{
SANE_Word min;
SANE_Word max;
SANE_Word quant;
}
SANE_Range;
</pre>
</blockquote>
All three members in this structure are interpreted according to the
option value type (<tt>SANE_TYPE_INT</tt> or <tt>SANE_TYPE_FIXED</tt>).
Members <tt>min</tt> and <tt>max</tt> specify the minimum and maximum
values, respectively. If member <tt>quant</tt> is non-zero, it
specifies the quantization value. If l is the minimum value, u
the maximum value and q the (non-zero) quantization of a range,
then the legal values are v=k*q+l for all non-negative
integer values of k such that v&lt;=u. </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_CONSTRAINT_WORD_LIST<a name="i70"></tt> </td>
<td colspan=1 align=right nowrap> 2 </td>
<td colspan=1 align=left> This constraint is applicable
to integer and fixed-point valued options only. It constrains the
option value to a list of numeric values. Option descriptor member
<tt>constraint.word_list</tt> points to a list of words that
enumerates the legal values. The first element in that list is an
integer (<tt>SANE_Int</tt>) that specifies the length of the list (not
counting the length itself). The remaining elements in the list are
interpreted according to the type of the option value
(<tt>SANE_TYPE_INT</tt> or <tt>SANE_TYPE_FIXED</tt>). </td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
<p><tt>SANE_CONSTRAINT_STRING_LIST<a name="i71"></tt> </td>
<td colspan=1 align=right nowrap> 3 </td>
<td colspan=1 align=left> This constraint is
applicable to string-valued options only. It constrains the option
value to a list of strings. The option descriptor member
<tt>constraint.string_list</tt> points to a <tt>NULL</tt> terminated
list of strings that enumerate the legal values for the option
value.
</td></tr>
<tr valign=top>
<td colspan=1 align=left nowrap>
</td></tr>
</table>
<p><center>Table 6: Option Value Constraints</center>
</center>
<p>
<p><p><hr>
<a href="doc012.html"><img src=../icons/next.gif alt="Next"></a>
<a href="doc000.html"><img src=../icons/up.gif alt="Up"></a>
<a href="doc010.html"><img src=../icons/previous.gif alt="Previous"></a>
<a href="doc000.html"><img src=../icons/contents.gif alt="Contents"></a>
<a href="doc019.html"><img src=../icons/index.gif alt="Index"></a>
<hr>
</body></html>