summaryrefslogtreecommitdiff
path: root/doc/sane.tex
diff options
context:
space:
mode:
Diffstat (limited to 'doc/sane.tex')
-rw-r--r--doc/sane.tex1894
1 files changed, 1894 insertions, 0 deletions
diff --git a/doc/sane.tex b/doc/sane.tex
new file mode 100644
index 0000000..1132576
--- /dev/null
+++ b/doc/sane.tex
@@ -0,0 +1,1894 @@
+\documentclass[11pt,DVIps]{report}
+
+\usepackage{times,epsfig,html}
+% Not Currently using changebar package so comment out to reduce
+% external dependencies.
+%\usepackage{changebar}
+
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{1.5ex plus 0.5ex minus 0.5ex}
+\setlength{\textwidth}{6.5in}
+\setlength{\textheight}{8.5in}
+\setlength{\marginparwidth}{0pt}
+\setlength{\oddsidemargin}{0pt}
+\setlength{\evensidemargin}{0pt}
+\setlength{\marginparsep}{0pt}
+\addtolength{\topmargin}{-0.75in}
+
+\title{\huge SANE Standard Version 1.05}
+\author{}
+\date{2006-04-02}
+
+\makeindex
+
+\begin{document}
+
+\newcommand{\filename}[1]{{\tt #1}}
+\newcommand{\code}[1]{{\tt #1}}
+\newcommand{\var}[1]{{\it #1}}
+\newcommand{\defn}[1]{#1\index{#1}}
+
+% Uncomment if adding changebars to text
+%\begin{latexonly}
+% \setcounter{changebargrey}{0} % black change bars
+%\end{latexonly}
+
+\maketitle
+\tableofcontents
+\listoffigures
+\listoftables
+
+
+\chapter{Preface}
+
+The SANE standard is being developed by a group of free-software
+developers. The process is open to the public and comments as well as
+suggestions for improvements are welcome. Information on how to join
+the SANE development process can be found in Chapter
+\ref{chap:contact}.
+
+The SANE standard is intended to streamline software development by
+providing a standard application programming interface to access
+raster scanner hardware. This should reduce the number of different
+driver implementations, thereby reducing the need for reimplementing
+similar code.
+
+
+\section{About This Document}
+
+This document is intended for developers who are creating either an
+application that requires access to raster scanner hardware and for
+developers who are implementing a SANE driver. It does not cover
+specific implementations of SANE components. Its sole purpose is to
+describe and define the SANE application interface that will enable
+any application on any platform to interoperate with any SANE backend
+for that platform.
+
+The remainder of this document is organized as follows.
+Chapter~\ref{chap:intro} provides introductional material.
+Chapter~\ref{chap:environ} presents the environment SANE is designed
+for. Chapter~\ref{chap:api} details the SANE Application Programmer
+Interface. Chapter~\ref{chap:net} specifies the network protocol that
+can be used to implement the SANE API in a network transparent
+fashion. Finally, Chapter~\ref{chap:contact} gives information on how
+to join the SANE development process.
+
+\subsection{Typographic Conventions}
+
+Changes since the last revision of this document are highlighted
+like this:
+
+% \begin{changebar}
+% Paragraphs that changed since the last revision of the documention
+% are marked like this paragraph.
+% \end{changebar}
+
+\chapter{Introduction}\label{chap:intro}
+
+SANE is an application programming interface (API) that provides
+standardized access to any raster image scanner hardware. The
+standardized interface allows to write just one driver for each
+scanner device instead of one driver for each scanner and application.
+The reduction in the number of required drivers provides significant
+savings in development time. More importantly, SANE raises the level
+at which applications can work. As such, it will enable applications
+that were previously unheard of in the UNIX world. While SANE is
+primarily targeted at a UNIX environment, the standard has been
+carefully designed to make it possible to implement the API on
+virtually any hardware or operating system.
+
+SANE is an acronym for ``Scanner Access Now Easy.'' Also, the hope is
+that SANE is sane in the sense that it will allow easy implementation
+of the API while accommodating all features required by today's
+scanner hardware and applications. Specifically, SANE should be broad
+enough to accommodate devices such as scanners, digital still and
+video cameras, as well as virtual devices like image file filters.
+
+\section{Terminology}
+
+An application that uses the SANE interface is called a SANE {\em
+ frontend}. A driver that implements the SANE interface is called a
+SANE {\em backend}. A {\em meta backend\/} provides some means to
+manage one or more other backends.
+
+
+\chapter{The SANE Environment}\label{chap:environ}
+
+SANE is defined as a C-callable library interface. Accessing a raster
+scanner device typically consists of two phases: first, various
+controls of the scanner need to be setup or queried. In the second
+phase, one or more images are acquired.
+
+Since the device controls are widely different from device to device,
+SANE provides a generic interface that makes it easy for a frontend to
+give a user access to all controls without having to understand each
+and every device control. The design principle used here is to
+abstract each device control into a SANE {\em option\/}. An option is
+a self-describing name/value pair. For example, the brightness
+control of a camera might be represented by an option called
+\code{brightness} whose value is an integer in the range from 0 to
+255.
+
+With self-describing options, a backend need not be concerned with
+{\em presentation\/} issues: the backend simply provides a list of
+options that describe all the controls available in the device.
+Similarly, there are benefits to the frontend: it need not be
+concerned with the {\em meaning\/} of each option. It simply provides
+means to present and alter the options defined by the backend.
+
+
+\section{Attaching to a SANE backend}
+
+The process through which a SANE frontend connects to a backend is
+platform dependent. Several possibilities exist:
+\begin{itemize}
+
+\item {\bf Static linking:} A SANE backend may be linked directly into
+ a frontend. While the simplest method of attaching to a backend, it
+ is somewhat limited in functionality since the available devices is
+ limited to the ones for which support has been linked in when the
+ frontend was built. But even so static linking can be quite useful,
+ particularly when combined with a backend that can access scanners
+ via a network. Also, it is possible to support multiple backends
+ simultaneously by implementing a meta backend that manages several
+ backends that have been compiled in such a manner that they export
+ unique function names. For example, a backend called \code{be}
+ would normally export a function called \code{sane\_read()}. If
+ each backend would provide such a function, static linking would
+ fail due to multiple conflicting definitions of the same symbol.
+ This can be resolved by having backend \code{be} include a
+ header file that has lines of the form:
+ \begin{quote}
+\begin{verbatim}
+#define sane_read be_sane_read
+\end{verbatim}
+ \end{quote}
+ With definitions of this kind, backend \code{be} will export
+ function name \code{be\_sane\_read()}. Thus, all backends will
+ export unique names. As long as a meta backend knows about these
+ names, it is possible to combine several backends at link time and
+ select and use them dynamically at runtime.
+
+\item {\bf Dynamic linking:} A simpler yet more powerful way to
+ support multiple backends is to exploit dynamic linking on platforms
+ that support it. In this case, a frontend is linked against a
+ shared library that implements any SANE backend. Since each
+ dynamically linked backend exports the same set of global symbols
+ (all starting with the prefix \code{sane\_}), the dynamic library
+ that gets loaded at runtime does not necessarily have to be the same
+ one as one the frontend got linked against. In other words, it is
+ possible to switch the backend by installing the appropriate backend
+ dynamic library.
+
+ More importantly, dynamic linking makes it easy to implement a meta
+ backend that loads other backends {\em on demand}. This is a
+ powerful mechanism since it allows adding new backends merely by
+ installing a shared library and updating a configuration file.
+
+\item {\bf Network connection:} Arguably the ultimate way to attach to
+ a scanner is by using the network to connect to a backend on a
+ remote machine. This makes it possible to scan images from any host
+ in the universe, as long as there is a network connection to that
+ host and provided the user is permitted to access that scanner.
+
+\end{itemize}
+
+\begin{figure}[htbp]
+ \begin{center}
+ \leavevmode
+ \psfig{file=figs/hierarchy.eps,angle=270,width=\textwidth}
+ \caption{Example SANE Hiearchy}
+ \label{fig:hierarchy}
+ \end{center}
+\end{figure}
+
+The above discussion lists just a few ways for frontends to attach to
+a backend. It is of course possible to combine these solutions to
+provide an entire hierarchy of SANE backends. Such a hierarchy is
+depicted in Figure~\ref{fig:hierarchy}. The figure shows that machine
+A uses a dynamic-linking based meta backend called \code{dll} to
+access the backends called \code{pnm}, \code{mustek}, and \code{net}.
+The first two are real backends, whereas the last one is a meta
+backend that provides network transparent access to remote scanners.
+In the figure, machine B provides non-local access to its scanners
+through the SANE frontend called \code{saned}. The \code{saned} in
+turn has access to the \code{hp} and \code{autolum} backends through
+another instance of the \code{dll} backend. The \code{autolum} meta
+backend is used to automatically adjust the luminance (brightness) of
+the image data acquired by the camera backend called \code{qcam}.
+
+Note that a meta backend really is both a frontend and a backend at
+the same time. It is a frontend from the viewpoint of the backends
+that it manages and a backend from the viewpoint of the frontends that
+access it. The name ``meta backend'' was chosen primarily because the
+SANE standard describes the interface from the viewpoint of a (real)
+frontend.
+
+
+\section{Image Data Format}\label{sec:imageformat}\index{image data format}
+
+Arguably the most important aspect of an image acquisition system is
+how images are represented. The SANE approach is to define a simple
+yet powerful representation that is sufficient for vast majority of
+applications and devices. While the representation is simple, the
+interface has been defined carefully to allow extending it in the
+future without breaking backwards compatibility. Thus, it will be
+possible to accommodate future applications or devices that were not
+anticipated at the time this standard was created.
+
+A SANE image is a rectangular area. The rectangular area is
+subdivided into a number of rows and columns. At the intersection of
+each row and column is a quadratic pixel. A pixel consists of one or
+more sample values. Each sample value represents one channel (e.g.,
+the red channel). Each sample value has a certain bit depth. The bit
+depth is fixed for the entire image and can be as small as one bit.
+Valid bit depths are 1, 8, or 16 bits per sample. If a device's
+natural bit depth is something else, it is up to the driver to scale
+the sample values appropriately (e.g., a 4 bit sample could be scaled
+by a factor of four to represent a sample value of depth 8).
+
+\subsection{Image Transmission}
+
+The SANE API transmits an image as a sequence of frames. Each frame
+covers the same rectangular area as the entire image, but may contain
+only a subset of the channels in the final image. For example, a
+red/green/blue image could either be transmitted as a single frame
+that contains the sample values for all three channels or it could be
+transmitted as a sequence of three frames: the first frame containing
+the red channel, the second the green channel, and the third the blue
+channel.
+
+Conceptually, each frame is transmitted a byte at a time. Each byte
+may contain 8 sample values (for an image bit depth of 1), one full
+sample value (for an image bit depth of 8), or a partial sample value
+(for an image bit depth of 16 or bigger). In the latter case, the
+bytes of each sample value are transmitted in the machine's native
+byte order. For depth 1, the leftmost pixel is stored in the most
+significant bit, and the rightmost pixel in the least significant bit.
+\begin{quote}
+ \begin{center}
+ {\bf Backend Implementation Note}
+ \end{center}
+ A network-based meta backend will have to ensure that the byte order
+ in image data is adjusted appropriately if necessary. For example,
+ when the meta backend attaches to the server proxy, the proxy may
+ inform the backend of the server's byte order. The backend can then
+ apply the adjustment if necessary. In essence, this implements a
+ ``receiver-makes-right'' approach.
+\end{quote}
+
+\begin{figure}[htbp]
+ \begin{center}
+ \leavevmode
+ \psfig{file=figs/xfer.eps,width=0.5\textwidth}
+ \caption{Transfer order of image data bytes}
+ \label{fig:xfer}
+ \end{center}
+\end{figure}
+
+The order in which the sample values in a frame are transmitted is
+illustrated in Figure~\ref{fig:xfer}. As can be seen, the values are
+transmitted row by row and each row is transmitted from left-most to
+right-most column. The left-to-right, top-to-bottom transmission
+order applies when the image is viewed in its normal orientation (as
+it would be displayed on a screen, for example).
+
+If a frame contains multiple channels, then the channels are
+transmitted in an interleaved fashion. Figure~\ref{fig:pixels}
+illustrates this for the case where a frame contains a complete
+red/green/blue image with a bit-depth of 8. For a bit depth of 1,
+each byte contains 8 sample values of a {\em single\/} channel. In
+other words, a bit depth 1 frame is transmitted in a byte interleaved
+fashion.
+
+\begin{figure}[htbp]
+ \begin{center}
+ \leavevmode
+ \psfig{file=figs/image-data.eps,width=0.8\textwidth}
+ \caption{Bit and byte order or image data}
+ \label{fig:pixels}
+ \end{center}
+\end{figure}
+
+When transmitting an image frame by frame, the frontend needs to know
+what part of the image a frame represents (and how many frames it
+should expect). For that purpose, the SANE API tags every frame with
+a type. This version of the SANE standard supports the following
+frame types:
+\begin{quote}
+\begin{description}
+
+\item[\code{\defn{SANE\_FRAME\_GRAY}}:] The frame contains a single
+ channel of data that represents sample values from a spectral band
+ that covers the human visual range. The image consists of this
+ frame only.
+
+\item[\code{\defn{SANE\_FRAME\_RGB}}:] The frame contains three
+ channels of data that represent sample values from the red, green,
+ and blue spectral bands. The sample values are interleaved in the
+ order red, green, and blue. The image consists of this frame only.
+
+\item[\code{\defn{SANE\_FRAME\_RED}}:] The frame contains one channel
+ of data that represents sample values from the red spectral band.
+ The complete image consists of three frames:
+ \code{SANE\_\-FRA\-ME\_RED}, \code{SANE\_FRAME\_GREEN}, and
+ \code{SANE\_FRAME\_BLUE}. The order in which the frames are
+ transmitted chosen by the backend.
+
+\item[\code{\defn{SANE\_FRAME\_GREEN}}:] The frame contains one
+ channel of data that represents sample values from the green
+ spectral band. The complete image consists of three frames:
+ \code{SANE\_\-FRA\-ME\_RED}, \code{SANE\_FRAME\_GREEN}, and
+ \code{SANE\_FRAME\_BLUE}. The order in which the frames are
+ transmitted chosen by the backend.
+
+\item[\code{\defn{SANE\_FRAME\_BLUE}}:] The frame contains one channel
+ of data that represents sample values from the blue spectral band.
+ The complete image consists of three frames:
+ \code{SANE\_\-FRA\-ME\_RED}, \code{SANE\_FRAME\_GREEN}, and
+ \code{SANE\_FRAME\_BLUE}. The order in which the frames are
+ transmitted chosen by the backend.
+
+\end{description}
+\end{quote}
+
+In frames of type \code{SANE\_FRAME\_GRAY}, when the bit depth is 1 there are
+only two sample values possible, 1 represents minimum intensity
+(black) and 0 represents maximum intensity (white). For all other bit
+depth and frame type combinations, a sample value of 0 represents
+minimum intensity and larger values represent increasing intensity.
+
+The combination of bit depth 1 and \code{SANE\_FRAME\_RGB} (or
+\code{SANE\_FRAME\_RED}, \code{SANE\_FRAME\_GREEN}, \code{SANE\_FRAME\_BLUE})
+is rarely used and may not be supported by every frontend.
+
+\chapter{The SANE Application Programmer Interface (API)}\label{chap:api}
+
+This Section defines version 1 of the SANE application
+programmer interface (API). Any SANE frontend must depend on the
+interface defined in this section only. Converseley, any SANE backend
+must implement its functionality in accordance with this
+specification. The interface as documented here is declared as a C
+callable interface in a file called \filename{sane/sane.h}. This file should
+normally be included via a C pre-processor directive of the form:
+\begin{verbatim}
+ #include <sane/sane.h>
+\end{verbatim}
+
+
+\section{Version Control}
+
+The SANE standard is expected to evolve over time. Whenever a change
+to the SANE standard is made that may render an existing frontend or
+backend incompatible with the new standard, the major version number
+must be increased. Thus, any frontend/backend pair is compatible
+provided the major version number of the SANE standard they implement
+is the same. A frontend may implement backwards compatiblity by
+allowing major numbers that are smaller than the expected major number
+(provided the frontend really can cope with the older version). In
+contrast, a backend always provides support for one and only one
+version of the standard. If a specific application does require that
+two different versions of the same backend are accessible at the same
+time, it is possible to do so by installing the two versions under
+different names.
+
+SANE version control also includes a minor version number and a build
+revision. While control of these numbers remains with the implementor
+of a backend, the recommended use is as follows. The minor version is
+incremented with each official release of a backend. The build
+revision is increased with each build of a backend.
+
+The SANE API provides the following five macros to manage version
+numbers.
+\begin{quote}
+ \begin{description}
+ \item[\code{\defn{SANE\_CURRENT\_MAJOR}}:] The value of this macro is the
+ number of the SANE standard that the interface implements.
+
+ \item[\code{\defn{SANE\_VERSION\_CODE}(\var{maj},\var{min},\var{bld})}:]
+ \label{sec:saneversioncode}
+ This macro can be used to build a monotonically increasing version
+ code. A SANE version code consists of the SANE standard major
+ version number (\var{maj}), the minor version number \var{min},
+ and the build revision of a backend (\var{bld}). The major and
+ minor version numbers must be in the range 0\ldots255 and the
+ build revision must be in the range 0\ldots65535.
+
+ Version codes are monotonic in the sense that it is possible to
+ apply relational operators (e.g., equality or less-than test)
+ directly on the version code rather than individually on the three
+ components of the version code.
+
+ Note that the major version number alone determines whether a
+ frontend/backend pair is compatible. The minor version and the
+ build revision are used for informational and bug-fixing purposes
+ only.
+
+ \item[\code{\defn{SANE\_VERSION\_MAJOR}(\var{vc})}:] This macro returns the
+ major version number component of the version code passed in
+ argument \var{vc}.
+ \item[\code{SANE\_VERSION\_MINOR(\var{vc})}:] This macro returns the
+ minor version number component of the version code passed in
+ argument \var{vc}.
+ \item[\code{SANE\_VERSION\_BUILD(\var{vc})}:] This macro returns the
+ build revision component of the version code passed in argument
+ \var{vc}.
+ \end{description}
+\end{quote}
+
+
+\section{Data Types}
+
+\subsection{Base Types}
+
+The SANE standard is based on just two SANE-specific base types: the
+SANE byte and word.
+\begin{quote}
+ \code{typedef \var{some-scalar-type\/} \defn{SANE\_Byte};} \\
+ \code{typedef \var{some-scalar-type\/} \defn{SANE\_Word};}
+\end{quote}
+\verb|SANE_Byte| must correspond to some scalar C type that is capable
+of holding values in the range 0 to 255. \verb|SANE_Word| must be
+capable of holding any of the following:
+\begin{itemize}
+ \item the truth values \verb|SANE_FALSE| and \verb|SANE_TRUE|
+ \item signed integers in the range $-2^{31}\ldots2^{31}-1$
+ \item fixed point values in the range $-32768\ldots32767.9999$ with
+ a resolution of $1/65536$
+ \item 32 bits (for bit sets)
+\end{itemize}
+Note that the SANE standard does not define what C type
+\verb|SANE_Byte| and \verb|SANE_Word| map to. For example, on some
+platforms, the latter may map to \verb|long int| whereas on others it
+may map to \verb|int|. A portable SANE frontend or backend must
+therefore not depend on a particular mapping.
+
+\subsection{Boolean Type}
+
+\code{\defn{SANE\_Bool}} is used for variables that can take one of
+the two truth values \code{\defn{SANE\_FALSE}} and
+\code{\defn{SANE\_TRUE}}. The former value is defined to be 0,
+whereas the latter is 1.\footnote{This is different from ANSI C where
+ any non-zero integer value represents logical TRUE.} The C
+declarations for this type are given below.
+\begin{quote}
+\begin{verbatim}
+#define SANE_FALSE 0
+#define SANE_TRUE 1
+typedef SANE_Word SANE_Bool;
+\end{verbatim}
+\end{quote}
+Note that \verb|SANE_Bool| is simply an alias of \verb|SANE_Word|. It
+is therefore always legal to use the latter type in place of the
+former. However, for clarity, it is recommended to use
+\verb|SANE_Bool| whenever a given variable or formal argument has a
+fixed interpretation as a boolean object.
+
+\subsection{Integer Type}
+
+\code{\defn{SANE\_Int}} is used for variables that can take integer
+values in the range $-2^{32}$ to $2^{31}-1$. Its C declaration is
+given below.
+\begin{quote}
+\begin{verbatim}
+typedef SANE_Word SANE_Int;
+\end{verbatim}
+\end{quote}
+Note that \verb|SANE_Int| is simply an alias of \verb|SANE_Word|. It
+is therefore always legal to use the latter type in place of the
+former. However, for clarity, it is recommended to use
+\verb|SANE_Int| whenever a given variable or formal argument has a
+fixed interpretation as an integer object.
+
+
+\subsection{Fixed-point Type}
+
+\code{\defn{SANE\_Fixed}} 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.
+\begin{quote}
+\begin{verbatim}
+#define SANE_FIXED_SCALE_SHIFT 16
+typedef SANE_Word SANE_Fixed;
+\end{verbatim}
+\end{quote}
+The macro \code{\defn{SANE\_FIXED\_SCALE\_SHIFT}} gives the location
+of the fixed binary point. This standard defines that value to be 16,
+which yields a resolution of $1/65536$.
+
+Note that \verb|SANE_Fixed| is simply an alias of \verb|SANE_Word|.
+It is therefore always legal to use the latter type in place of the
+former. However, for clarity, it is recommended to use
+\verb|SANE_Fixed| whenever a given variable or formal argument has a
+fixed interpretation as a fixed-point object.
+
+For convenience, SANE also defines two macros that convert fixed-point
+values to and from C double floating point values.
+\begin{quote}
+ \begin{description}
+
+ \item[\code{\defn{SANE\_FIX}(\var{d})}:] Returns the largest SANE
+ fixed-point value that is smaller than the double value \var{d}.
+ No range checking is performed. If the value of \var{d} is out of
+ range, the result is undefined.
+
+ \item[\code{\defn{SANE\_UNFIX}(\var{w})}:] Returns the nearest
+ double machine number that corresponds to fixed-point value
+ \var{w}.
+
+ \end{description}
+\end{quote}
+SANE does {\em not\/} require that the following two expressions hold
+true (even if the values of \var{w} and \var{d} are in range):
+\begin{quote}
+\begin{verbatim}
+SANE_UNFIX(SANE_FIX(d)) == d
+SANE_FIX(SANE_UNFIX(w)) == w
+\end{verbatim}
+\end{quote}
+In other words, conversion between fixed and double values may be
+lossy. It is therefore recommended to avoid repeated conversions
+between the two representations.
+
+
+\subsection{Text}
+
+\subsubsection{Character Type}
+
+Type \code{\defn{SANE\_Char}} represents a single text character or
+symbol. At present, this type maps directly to the underlying C
+\verb|char| 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
+\verb|sizeof(SANE_Char)==sizeof(char)|.
+\begin{quote}
+\begin{verbatim}
+typedef char SANE_Char;
+\end{verbatim}
+\end{quote}
+
+\subsubsection{String Type}
+
+Type \code{\defn{SANE\_String}} represents a text string as a sequence
+of C \verb|char| values. The end of the sequence is indicated by a
+\verb|'\0'| (\defn{NUL}) character.
+\begin{quote}
+\begin{verbatim}
+typedef SANE_Char *SANE_String;
+typedef const SANE_Char *SANE_String_Const;
+\end{verbatim}
+\end{quote}
+The type \code{\defn{SANE\_String\_Const}} is provided by SANE to
+enable declaring strings whose contents is unchangable. Note that in
+ANSI C, the declaration
+\begin{quote}
+\begin{verbatim}
+const SANE_String str;
+\end{verbatim}
+\end{quote}
+declares a string pointer that is constant (not a string pointer that
+points to a constant value).
+
+
+\subsection{Scanner Handle Type}
+
+Access to a scanner is provided through an opaque type called
+\code{\defn{SANE\_Handle}}. The C declaration of this type is given
+below.
+\begin{quote}
+\begin{verbatim}
+typedef void *SANE_Handle;
+\end{verbatim}
+\end{quote}
+While this type is declared to be a void pointer, an application must
+not attempt to interpret the value of a \verb|SANE_Handle|. In
+particular, SANE does not require that a value of this type is a legal
+pointer value.
+
+
+\subsection{Status Type}
+
+Most SANE operations return a value of type \code{\defn{SANE\_Status}}
+to indicate whether the completion status of the operation. If an
+operation completes successfully, \verb|SANE_STATUS_GOOD| 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 \ref{tab:status}. It is recommended to use function
+\code{sane\_strstatus()} to convert status codes into a legible
+string.
+
+\begin{table}[htbp]
+ \begin{center}
+ \begin{tabular}{|l|r|l|}
+ \hline
+ \multicolumn{1}{|c|}{\bf Symbol} & \multicolumn{1}{c|}{\bf Code} &
+ \multicolumn{1}{c|}{\bf Description} \\
+ \hline\hline
+\code{\defn{SANE\_STATUS\_GOOD}}
+ & 0 & Operation completed succesfully. \\
+\code{\defn{SANE\_STATUS\_UNSUPPORTED}}
+ & 1 & Operation is not supported. \\
+\code{\defn{SANE\_STATUS\_CANCELLED}}
+ & 2 & Operation was cancelled. \\
+\code{\defn{SANE\_STATUS\_DEVICE\_BUSY}}
+ & 3 & Device is busy---retry later. \\
+\code{\defn{SANE\_STATUS\_INVAL}}
+ & 4 & Data or argument is invalid. \\
+\code{\defn{SANE\_STATUS\_EOF}}
+ & 5 & No more data available (end-of-file). \\
+\code{\defn{SANE\_STATUS\_JAMMED}}
+ & 6 & Document feeder jammed. \\
+\code{\defn{SANE\_STATUS\_NO\_DOCS}}
+ & 7 & Document feeder out of documents. \\
+\code{\defn{SANE\_STATUS\_COVER\_OPEN}}
+ & 8 & Scanner cover is open. \\
+\code{\defn{SANE\_STATUS\_IO\_ERROR}}
+ & 9 & Error during device I/O. \\
+\code{\defn{SANE\_STATUS\_NO\_MEM}}
+ & 10 & Out of memory. \\
+\code{\defn{SANE\_STATUS\_ACCESS\_DENIED}}
+ & 11 & Access to resource has been denied. \\
+ \hline
+ \end{tabular}
+ \caption{Status Codes}\label{tab:status}
+ \end{center}
+\end{table}
+
+
+\subsection{Device Descriptor Type}
+
+Each SANE device is represented by a structure of type
+\code{\defn{SANE\_Device}}. The C declaration of this type is given
+below.
+\begin{quote}
+\begin{verbatim}
+typedef struct
+ {
+ SANE_String_Const name;
+ SANE_String_Const vendor;
+ SANE_String_Const model;
+ SANE_String_Const type;
+ }
+SANE_Device;
+\end{verbatim}
+\end{quote}
+\index{device-name}
+The structure provides the unique name of the scanner in member
+\code{name}. It is this unique name that should be passed in a call
+to \code{sane\_open()}. 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\/} that backends keep
+unique names below 32 characters in length. However, applications
+{\em must\/} be able to cope with arbitrary length unique names.
+
+The remaining members in the device structure provide additional
+information on the device corresponding to the unique name.
+Specifically, members \code{vendor}, \code{model}, and \code{type} 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):
+
+\begin{table}[htbp]
+ \begin{center}
+ \leavevmode
+ \hspace{\fill}
+ \begin{tabular}[t]{|ll|}
+ \hline
+ \multicolumn{2}{|c|}{\bf \defn{Vendor Strings}} \\
+ \hline\hline
+ \code{AGFA} & \code{Microtek} \\
+ \code{Abaton} & \code{Minolta} \\
+ \code{Acer} & \code{Mitsubishi} \\
+ \code{Apple} & \code{Mustek} \\
+ \code{Artec} & \code{NEC} \\
+ \code{Avision} & \code{Nikon} \\
+ \code{CANON} & \code{Plustek} \\
+ \code{Connectix} & \code{Polaroid} \\
+ \code{Epson} & \code{Relisys} \\
+ \code{Fujitsu} & \code{Ricoh} \\
+ \code{Hewlett-Packard} & \code{Sharp} \\
+ \code{IBM} & \code{Siemens} \\
+ \code{Kodak} & \code{Tamarack} \\
+ \code{Lexmark} & \code{UMAX} \\
+ \code{Logitech} & \code{Noname} \\
+ \hline
+ \end{tabular}
+ \hspace{\fill}
+ \begin{tabular}[t]{|l|}
+ \hline
+ \multicolumn{1}{|c|}{\bf \defn{Type Strings}} \\
+ \hline\hline
+ \code{film scanner} \\
+ \code{flatbed scanner} \\
+ \code{frame grabber} \\
+ \code{handheld scanner} \\
+ \code{multi-function peripheral} \\
+ \code{sheetfed scanner} \\
+ \code{still camera} \\
+ \code{video camera} \\
+ \code{virtual device} \\
+ \hline
+ \end{tabular}
+ \hspace{\fill}
+ \caption{Predefined Device Information Strings}
+ \label{tab:devinfo}
+ \end{center}
+\end{table}
+Note that vendor string \code{Noname} 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.
+
+
+\subsection{Option Descriptor Type}\label{sec:odesc}
+
+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
+\code{\defn{SANE\_Option\_Descriptor}} type is given below.
+\begin{quote}
+\begin{verbatim}
+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;
+\end{verbatim}
+\end{quote}
+
+\subsubsection{Option Name}
+
+Member \code{name} 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 (\code{a}--\code{z}),
+digits (\code{0}--\code{9}), or the dash character (\code{-}) only.
+The first character must be a lower-case ASCII character (i.e., not a
+digit or a dash).
+
+\subsubsection{Option Title}
+
+Member \code{title} 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.
+
+\subsubsection{Option Description}
+
+Member \code{desc} 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.
+
+\subsubsection{Option Value Type}
+
+Member \code{type} specifies the type of the option value. The
+possible values for type \code{\defn{SANE\_Value\_Type}} are described
+in Table \ref{tab:valuetype}.
+
+\begin{table}[htbp]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{|l|l|p{0.6\textwidth}|}
+\hline
+\multicolumn{1}{|c|}{\bf Symbol} &
+\multicolumn{1}{c|}{\bf Code} &
+\multicolumn{1}{c|}{\bf Description} \\
+\hline\hline
+
+\code{\defn{SANE\_TYPE\_BOOL}} & 0 & Option value is of type
+ \verb|SANE_Bool|. \\
+
+\code{\defn{SANE\_TYPE\_INT}} & 1 & Option value is of type
+ \verb|SANE_Int|. \\
+
+\code{\defn{SANE\_TYPE\_FIXED}}&2 & Option value is of type
+ \verb|SANE_Fixed|. \\
+
+\code{\defn{SANE\_TYPE\_STRING}}&3 & Option value is of type
+ \verb|SANE_String|. \\
+
+\code{\defn{SANE\_TYPE\_BUTTON}} & 4 & 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. \\
+
+\code{\defn{SANE\_TYPE\_GROUP}} & 5 & 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 \code{title} and
+\code{type} are valid in the option descriptor. \\
+
+ \hline
+ \end{tabular}
+ \caption{Option Value Types (\code{SANE\_Value\_Type})}
+ \label{tab:valuetype}
+ \end{center}
+\end{table}
+
+\subsubsection{Option Value Unit}
+
+Member \code{unit} specifies what the physical unit of the option
+value is. The possible values for type \code{\defn{SANE\_U\-nit}} are
+described in Table \ref{tab:units}. 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).
+
+\begin{table}[htbp]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{|l|l|l|}
+\hline
+\multicolumn{1}{|c|}{\bf Symbol} &
+\multicolumn{1}{|c|}{\bf Code} &
+\multicolumn{1}{|c|}{\bf Description} \\
+
+\hline\hline
+
+\code{\defn{SANE\_UNIT\_NONE}} & 0 & Value is unit-less (e.g., page count).\\
+\code{\defn{SANE\_UNIT\_PIXEL}} & 1 & Value is in number of pixels. \\
+\code{\defn{SANE\_UNIT\_BIT}} & 2 & Value is in number of bits. \\
+\code{\defn{SANE\_UNIT\_MM}} & 3 & Value is in millimeters. \\
+\code{\defn{SANE\_UNIT\_DPI}} & 4 & Value is a resolution in dots/inch. \\
+\code{\defn{SANE\_UNIT\_PERCENT}}& 5 & Value is a percentage. \\
+\code{\defn{SANE\_UNIT\_MICROSECOND}}& 6 & Value is time in $\mu$-seconds. \\
+
+\hline
+ \end{tabular}
+ \caption{Physical Units (\code{SANE\_Unit})}
+ \label{tab:units}
+ \end{center}
+\end{table}
+
+\subsubsection{Option Value Size}\label{sec:valuesize}
+
+Member \code{size} specifies the size of the option value (in bytes).
+This member has a slightly different interpretation depending on the
+type of the option value:
+\begin{quote}
+ \begin{description}
+ \item[\code{SANE\_TYPE\_STRING}:] The size is the maximum size of
+ the string. For the purpose of string size calcuations, the
+ terminating \code{NUL} character is considered to be part of the
+ string. Note that the terminating \code{NUL} character must
+ always be present in string option values.
+ \item[\code{SANE\_TYPE\_INT}, \code{SANE\_TYPE\_FIXED}:] The size
+ must be a positive integer multiple of the size of a
+ \verb|SANE_Word|. The option value is a vector of length
+ \[ \code{size}/\code{sizeof(SANE\_Word)}. \]
+ \item[\code{SANE\_TYPE\_BOOL}:] The size must be set to
+ \code{sizeof(SANE\_Word)}.
+ \item[\code{SANE\_TYPE\_BUTTON}, \code{SANE\_TYPE\_GROUP}:] The
+ option size is ignored.
+ \end{description}
+\end{quote}
+
+\subsubsection{Option Capabilities}
+
+Member \code{cap} describes what capabilities the option posseses.
+This is a bitset that is formed as the inclusive logical OR of the
+capabilities described in Table \ref{tab:capabilities}. The SANE API
+provides the following to macros to test certain features of a given
+capability bitset:
+\begin{quote}
+ \begin{description}
+
+ \item[\code{\defn{SANE\_OPTION\_IS\_ACTIVE}(\var{cap})}:] This macro
+ returns \code{SANE\_TRUE} if and only if the option with the
+ capability set \var{cap} is currently active.
+
+ \item[\code{\defn{SANE\_OPTION\_IS\_SETTABLE}(\var{cap})}:] This
+ macro returns \code{SANE\_TRUE} if and only if the option with the
+ capability set \var{cap} is software settable.
+ \end{description}
+\end{quote}
+
+\begin{table}[htbp]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{|l|r|p{0.59\textwidth}|}
+\hline
+\multicolumn{1}{|c|}{\bf Symbol} &
+\multicolumn{1}{c|}{\bf Code} &
+\multicolumn{1}{c|}{\bf Description} \\
+\hline\hline
+
+\code{\defn{SANE\_CAP\_SOFT\_SELECT}} & 1 & The option
+ value can be set by a call to \code{sane\_con\-trol\_opt\-ion()}.\\
+
+\code{\defn{SANE\_CAP\_HARD\_SELECT}} & 2 & 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). \\
+
+\code{\defn{SANE\_CAP\_SOFT\_DETECT}} & 4 & The option
+ value can be detected by software. If
+ \code{SANE\_\-CAP\_\-SO\-FT\_SEL\-ECT} is set, this capability {\em must\/}
+ be set. If \code{SANE\_CAP\_HARD\_SELECT} is set, this capability
+ may or may not be set. If this capability is set but neither
+ \code{SANE\_CAP\_SO\-FT\_SEL\-ECT} nor \code{SANE\_CAP\_HA\-RD\_SEL\-ECT}
+ are, then there is no way to control the option. That is, the
+ option provides read-out of the current value only. \\
+
+\code{\defn{SANE\_CAP\_EMULATED}} & 8 & 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. \\
+
+\code{\defn{SANE\_CAP\_AUTOMATIC}} & 16 & 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 \code{sane\_control\_option()}
+ with an action value of \code{SANE\_ACTION\_SET\_AUTO}. \\
+
+\code{\defn{SANE\_CAP\_INACTIVE}} & 32 & 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). \\
+
+\code{\defn{SANE\_CAP\_ADVANCED}} & 64 &
+ 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).
+ \\
+
+\hline
+ \end{tabular}
+ \caption{Option Capabilities}
+ \label{tab:capabilities}
+ \end{center}
+\end{table}
+
+\subsubsection{Option Value Constraints}
+
+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 \code{constraint\_type} 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 \code{constraint}. The possible values of type
+\code{\defn{SANE\_Constraint\_Type}} and the interpretation of the
+\code{constraint} union is described in Table~\ref{tab:constraints}.
+
+\begin{table}[htbp]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{|l|r|p{0.5\textwidth}|}
+\hline
+\multicolumn{1}{|c|}{\bf Symbol} &
+\multicolumn{1}{|c|}{\bf Code} &
+\multicolumn{1}{|c|}{\bf Description} \\
+
+\hline\hline
+
+\code{\defn{SANE\_CONSTRAINT\_NONE}} & 0 & The value is unconstrained.
+ The option can take any of the values possible for the option's
+ type. \\
+
+ \code{\defn{SANE\_CONSTRAINT\_RANGE}} & 1 & 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 \code{constraint.range} points to
+ a range of the type \code{\defn{SANE\_Range}}. This type is illustrated
+ below:
+ \begin{quote}
+\begin{verbatim}
+typedef struct
+ {
+ SANE_Word min;
+ SANE_Word max;
+ SANE_Word quant;
+ }
+SANE_Range;
+\end{verbatim}
+ \end{quote}
+ All three members in this structure are interpreted according to the
+ option value type (\verb|SANE_TYPE_INT| or \verb|SANE_TYPE_FIXED|).
+ Members \code{min} and \code{max} specify the minimum and maximum
+ values, respectively. If member \code{quant} 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\cdot q+l$ for all non-negative
+ integer values of $k$ such that $v<=u$. \\
+
+\code{\defn{SANE\_CONSTRAINT\_WORD\_LIST}} & 2 & 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
+ \code{constraint.word\_list} points to a list of words that
+ enumerates the legal values. The first element in that list is an
+ integer (\verb|SANE_Int|) 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
+ (\verb|SANE_TYPE_INT| or \verb|SANE_TYPE_FIXED|). \\
+
+\code{\defn{SANE\_CONSTRAINT\_STRING\_LIST}} & 3 & This constraint is
+ applicable to string-valued options only. It constrains the option
+ value to a list of strings. The option descriptor member
+ \code{con\-strai\-nt.str\-ing\_list} points to a \code{NULL} terminated
+ list of strings that enumerate the legal values for the option
+ value.
+\\\hline
+ \end{tabular}
+ \caption{Option Value Constraints}
+ \label{tab:constraints}
+ \end{center}
+\end{table}
+
+
+\section{Operations}
+
+\subsection{\code{sane\_init}}
+
+This function must be called before any other SANE function can be called.
+The behavior of a SANE backend is undefined if this function is not called
+first or if the status code returned by \code{sane\_init} is different from
+\code{\defn{SANE\_STATUS\_GOOD}}. The version code of the backend is returned
+in the value pointed to by \code{version\_code}. If that pointer is
+\code{NULL}, no version code is returned. Argument \code{authorize} is either
+a pointer to a function that is invoked when the backend requires
+authentication for a specific resource or \code{NULL} if the frontend does not
+support authentication.
+\begin{quote}\index{sane\_init}
+\begin{verbatim}
+SANE_Status sane_init (SANE_Int * version_code,
+ SANE_Authorization_Callback authorize);
+\end{verbatim}
+\end{quote}
+
+The authorization function may be called by a backend in response to
+any of the following calls:
+\begin{quote}
+ \code{sane\_open}, \code{sane\_control\_option}, \code{sane\_start}
+\end{quote}
+If a backend was initialized without authorization function, then
+authorization requests that cannot be handled by the backend itself
+will fail automatically and the user may be prevented from accessing
+protected resources. Backends are encouraged to implement means of
+authentication that do not require user assistance. E.g., on a
+multi-user system that authenticates users through a login process a
+backend could automatically lookup the apporpriate password based on
+resource- and user-name.
+
+The authentication function type has the following declaration:
+\begin{quote}\index{SANE\_Authorization\_Callback}
+ \index{domain}\index{username}\index{password}
+\begin{verbatim}
+#define SANE_MAX_USERNAME_LEN 128
+#define SANE_MAX_PASSWORD_LEN 128
+
+typedef void (*SANE_Authorization_Callback)
+ (SANE_String_Const resource,
+ SANE_Char username[SANE_MAX_USERNAME_LEN],
+ SANE_Char password[SANE_MAX_PASSWORD_LEN]);
+\end{verbatim}
+\end{quote}
+Three arguments are passed to the authorization function:
+\code{resource} is a string specifying the name of the resource that
+requires authorization. A frontend should use this string to build a
+user-prompt requesting a username and a password. The \code{username}
+and \code{password} arguments are (pointers to) an array of
+\code{SANE\_MAX\_USERNAME\_LEN} and \code{SANE\_MAX\_PASSWORD\_LEN}
+characters, respectively. The authorization call should place the
+entered username and password in these arrays. The returned strings
+{\em must\/} be ASCII-NUL terminated.
+
+\subsection{\code{sane\_exit}}
+
+This function must be called to terminate use of a backend. The
+function will first close all device handles that still might be open
+(it is recommended to close device handles explicitly through a call
+to \code{sane\_clo\-se()}, but backends are required to release all
+resources upon a call to this function). After this function returns,
+no function other than \code{sane\_init()} may be called (regardless
+of the status value returned by \code{sane\_exit()}. Neglecting to
+call this function may result in some resources not being released
+properly.
+\begin{quote}\index{sane\_exit}
+\begin{verbatim}
+void sane_exit (void);
+\end{verbatim}
+\end{quote}
+
+
+\subsection{\code{sane\_get\_devices}}
+
+This function can be used to query the list of devices that are
+available. If the function executes successfully, it stores a pointer
+to a \code{NULL} terminated array of pointers to \verb|SANE_Device|
+structures in \code{*device\_list}. The returned list is guaranteed
+to remain unchanged and valid until (a) another call to this function
+is performed or (b) a call to \code{sane\_exit()} is performed. This
+function can be called repeatedly to detect when new devices become
+available. If argument \code{local\_only} is true, only local devices
+are returned (devices directly attached to the machine that SANE is
+running on). If it is false, the device list includes all remote
+devices that are accessible to the SANE library.
+\begin{quote}\index{sane\_get\_devices}
+\begin{verbatim}
+SANE_Status sane_get_devices (const SANE_Device *** device_list,
+ SANE_Bool local_only);
+\end{verbatim}
+\end{quote}
+
+This function may fail with \code{SANE\_STATUS\_NO\_MEM} if an
+insufficient amount of memory is available.
+
+\begin{quote}
+ \begin{center}
+ {\bf Backend Implementation Note}
+ \end{center}
+ SANE does not require that this function is called before a
+ \code{sane\_open()} call is performed. A device name may be
+ specified explicitly by a user which would make it unnecessary and
+ undesirable to call this function first.
+\end{quote}
+
+
+\subsection{\code{sane\_open}}
+
+This function is used to establish a connection to a particular
+device. The name of the device to be opened is passed in argument
+\code{name}. If the call completes successfully, a handle for the
+device is returned in \code{*h}. As a special case, specifying a
+zero-length string as the device requests opening the first available
+device (if there is such a device).
+\begin{quote}\index{sane\_open}
+\begin{verbatim}
+SANE_Status sane_open (SANE_String_Const name, SANE_Handle * h);
+\end{verbatim}
+\end{quote}
+
+This function may fail with one of the following status codes.
+\begin{quote}
+\begin{description}
+\item[\code{SANE\_STATUS\_DEVICE\_BUSY}:] The device is currently
+ busy (in use by somebody else).
+\item[\code{SANE\_STATUS\_INVAL}:] The device name is not valid.
+\item[\code{SANE\_STATUS\_IO\_ERROR}:] An error occured while
+ communicating with the device.
+\item[\code{SANE\_STATUS\_NO\_MEM}:] An insufficent amount of memory
+ is available.
+\item[\code{SANE\_STATUS\_ACCESS\_DENIED}:] Access to the device has
+ been denied due to insufficient or invalid authentication.
+\end{description}
+\end{quote}
+
+
+\subsection{\code{sane\_close}}
+
+This function terminates the association between the device handle
+passed in argument \code{h} and the device it represents. If the
+device is presently active, a call to \code{sane\_cancel()} is
+performed first. After this function returns, handle \code{h} must
+not be used anymore.
+
+\begin{quote}\index{sane\_close}
+\begin{verbatim}
+void sane_close (SANE_Handle h);
+\end{verbatim}
+\end{quote}
+
+\subsection{\code{sane\_get\_option\_descriptor}}
+
+This function is used to access option descriptors. The function
+returns the option descriptor for option number \code{n} of the device
+represented by handle \code{h}. Option number 0 is guaranteed to be a
+valid option. Its value is an integer that specifies the number of
+options that are available for device handle \code{h} (the count
+includes option 0). If $n$ is not a valid option index, the function
+returns \code{NULL}. The returned option descriptor is guaranteed to
+remain valid (and at the returned address) until the device is closed.
+
+\begin{quote}\index{sane\_get\_option\_descriptor}
+\begin{verbatim}
+const SANE_Option_Descriptor *
+ sane_get_option_descriptor (SANE_Handle h, SANE_Int n);
+\end{verbatim}
+\end{quote}
+
+\subsection{\code{sane\_control\_option}}\label{sec:control}
+
+This function is used to set or inquire the current value of option
+number \code{n} of the device represented by handle \code{h}. The
+manner in which the option is controlled is specified by parameter
+\code{a}. The possible values of this parameter are described in more
+detail below. The value of the option is passed through argument
+\code{v}. It is a pointer to the memory that holds the option value.
+The memory area pointed to by \code{v} must be big enough to hold the
+entire option value (determined by member \code{size} in the
+corresponding option descriptor). The only exception to this rule is
+that when setting the value of a string option, the string pointed to
+by argument \code{v} may be shorter since the backend will stop
+reading the option value upon encountering the first \code{NUL}
+terminator in the string. If argument \code{i} is not \code{NULL},
+the value of \code{*i} will be set to provide details on how well the
+request has been met. The meaning of this argument is described in
+more detail below.
+\begin{quote}\index{sane\_control\_option}
+\begin{verbatim}
+SANE_Status sane_control_option (SANE_Handle h, SANE_Int n,
+ SANE_Action a, void *v,
+ SANE_Int * i);
+\end{verbatim}
+\end{quote}
+
+The way the option is affected by a call to this function is
+controlled by parameter \code{a} which is a value of type
+\code{\defn{SANE\_Action}}. The possible values and their meaning is
+described in Table~\ref{tab:actions}.
+
+\begin{table}[h]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{|l|r|p{0.5\textwidth}|}
+\hline
+\multicolumn{1}{|c|}{\bf Symbol} &
+\multicolumn{1}{|c|}{\bf Code} &
+\multicolumn{1}{|c|}{\bf Description} \\
+
+\hline\hline
+
+\code{\defn{SANE\_ACTION\_GET\_VALUE}} & 0 & Get current option value. \\
+
+\code{\defn{SANE\_ACTION\_SET\_VALUE}} & 1 & Set option value. The
+ option value passed through argument \code{v} may be modified by the
+ backend if the value cannot be set exactly. \\
+
+\code{\defn{SANE\_ACTION\_SET\_AUTO}} & 2 & Turn on automatic mode. Backend
+ or device will automatically select an appropriate value. This mode
+ remains effective until overridden by an explicit set value request.
+ The value of parameter \code{v} is completely ignored in this case and
+ may be \code{NULL}. \\
+
+\hline
+ \end{tabular}
+ \caption{Action Values (\code{SANE\_Action})}
+ \label{tab:actions}
+ \end{center}
+\end{table}
+
+After setting a value via an action value of
+\verb|SANE_ACTION_SET_VALUE|, additional information on how well the
+request has been met is returned in \code{*i} (if \code{i} is
+non-\code{NULL}). The returned value is a bitset that may contain any
+combination of the values described in Table~\ref{tab:info}.
+\begin{table}[htbp]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{|l|r|p{0.5\textwidth}|}
+\hline
+\multicolumn{1}{|c|}{\bf Symbol} &
+\multicolumn{1}{|c|}{\bf Code} &
+\multicolumn{1}{|c|}{\bf Description} \\
+
+\hline\hline
+
+\code{\defn{SANE\_INFO\_INEXACT}} & 1 & This value is returned when
+ setting an option value resulted in a value being selected that does
+ not exactly match the requested value. For example, if a scanner
+ can adjust the resolution in increments of 30dpi only, setting the
+ resolution to 307dpi may result in an actual setting of 300dpi.
+ When this happens, the bitset returned in \code{*i} has this member
+ set. In addition, the option value is modified to reflect the
+ actual (rounded) value that was used by the backend. Note that
+ inexact values are admissible for strings as well. A backend may
+ choose to ``round'' a string to the closest matching legal string
+ for a constrained string value. \\
+
+ \code{\defn{SANE\_INFO\_RELOAD\_OPTIONS}} & 2 & The setting of an
+ option may affect the value or availability of one or more {\em
+ other\/} options. When this happens, the SANE backend sets this
+ member in \code{*i} to indicate that the application should reload
+ all options. This member may be set if and only if at least one
+ option changed. \\
+
+\code{\defn{SANE\_INFO\_RELOAD\_PARAMS}} & 4 & The setting of an option may
+ affect the parameter values (see \code{sane\_get\_parameters()}).
+ If setting an option affects the parameter values, this member will
+ be set in \code{*i}. Note that this member may be set even if the
+ parameters did not actually change. However, it is guaranteed that
+ the parameters never change without this member being set. \\
+
+\hline
+ \end{tabular}
+ \caption{Additional Information Returned When Setting an Option}
+ \label{tab:info}
+ \end{center}
+\end{table}
+
+This function may fail with one of the following status codes.
+\begin{quote}
+\begin{description}
+\item[\code{SANE\_STATUS\_UNSUPPORTED}:] The operation is not
+ supported for the specified handle and option number.
+\item[\code{SANE\_STATUS\_INVAL}:] The option value is not valid.
+\item[\code{SANE\_STATUS\_IO\_ERROR}:] An error occured while
+ communicating with the device.
+\item[\code{SANE\_STATUS\_NO\_MEM}:] An insufficent amount of memory
+ is available.
+\item[\code{SANE\_STATUS\_ACCESS\_DENIED}:] Access to the option has
+ been denied due to insufficient or invalid authentication.
+\end{description}
+\end{quote}
+
+
+
+\subsection{\code{sane\_get\_parameters}}
+
+This function is used to obtain the current scan parameters. The
+returned parameters are guaranteed to be accurate between the time a
+scan has been started (\code{sane\_start()} has been called) and the
+completion of that request. Outside of that window, the returned
+values are best-effort estimates of what the parameters will be when
+\code{sane\_start()} gets invoked. Calling this function before a
+scan has actually started allows, for example, to get an estimate of
+how big the scanned image will be. The parameters passed to this
+function are the handle \code{h} of the device for which the
+parameters should be obtained and a pointer \code{p} to a parameter
+structure. The parameter structure is described in more detail below.
+
+\begin{quote}\index{sane\_get\_parameters}
+\begin{verbatim}
+SANE_Status sane_get_parameters (SANE_Handle h,
+ SANE_Parameters * p);
+\end{verbatim}
+\end{quote}
+
+The scan parameters are returned in a structure of type
+\code{\defn{SANE\_Parameters}}. The C declaration of this structure
+is given below.
+\begin{quote}
+\begin{verbatim}
+typedef struct
+ {
+ SANE_Frame format;
+ SANE_Bool last_frame;
+ SANE_Int bytes_per_line;
+ SANE_Int pixels_per_line;
+ SANE_Int lines;
+ SANE_Int depth;
+ }
+SANE_Parameters;
+\end{verbatim}
+\end{quote}
+
+Member \code{format} specifies the format of the next frame to be
+returned. The possible values for type \code{\defn{SANE\_Frame}} are
+described in Table~\ref{tab:frameformat}. The meaning of these
+values is described in more detail in Section~\ref{sec:imageformat}.
+\begin{table}[htbp]
+ \begin{center}
+ \leavevmode
+ \begin{tabular}{|l|r|l|}
+\hline
+\multicolumn{1}{|c|}{\bf Symbol} &
+\multicolumn{1}{|c|}{\bf Code} &
+\multicolumn{1}{|c|}{\bf Description} \\
+
+\hline\hline
+
+\code{\defn{SANE\_FRAME\_GRAY}} & 0 & Band covering human visual range. \\
+\code{\defn{SANE\_FRAME\_RGB}} & 1 & Pixel-interleaved red/green/blue bands. \\
+\code{\defn{SANE\_FRAME\_RED}} & 2 & Red band of a red/green/blue image. \\
+\code{\defn{SANE\_FRAME\_GREEN}} & 3 & Green band of a red/green/blue image. \\
+\code{\defn{SANE\_FRAME\_BLUE}} & 4 & Blue band of a red/green/blue image. \\
+
+\hline
+ \end{tabular}
+ \caption{Frame Format (\code{SANE\_Frame})}
+ \label{tab:frameformat}
+ \end{center}
+\end{table}
+
+Member \code{last\_frame} is set to \code{SANE\_TRUE} if and only if
+the frame that is currently being acquired (or the frame that will be
+acquired next if there is no current frame) is the last frame of a
+multi frame image (e.g., the current frame is the blue component of a
+red, green, blue image).
+
+Member \code{lines} specifies how many scan lines the frame is
+comprised of. If this value is -1, the number of lines is not known a
+priori and the frontend should call \code{sane\_read()} until it
+returns a status of \code{SANE\_STATUS\_EOF}.
+
+Member \code{bytes\_per\_line} specifies the number of bytes that
+comprise one scan line.
+
+Member \code{depth} specifies the number of bits per sample.
+
+Member \code{pixels\_per\_line} specifies the number of pixels that
+comprise one scan line.
+
+Assume $B$ is the number of channels in the frame, then the bit depth
+$d$ (as given by member \code{depth}) and the number of pixels per
+line $n$ (as given by this member \code{pixels\_per\_line}) are
+related to $c$, the number of bytes per line (as given by member
+\code{bytes\_per\_line}) as follows:
+\[
+ c >= \left\{
+ \begin{array}{ll}
+ B\cdot \lfloor (n + 7) / 8\rfloor & \mbox{if $d=1$}\\
+ B\cdot n \cdot d / 8 & \mbox{if $d>1$}
+ \end{array}
+ \right.
+\]
+Note that the number of bytes per line can be larger than the minimum
+value imposed by the right side of this equation. A frontend must be
+able to properly cope with such ``padded'' image formats.
+
+
+\subsection{\code{sane\_start}}
+
+This function initiates aquisition of an image from the device
+represented by handle \code{h}.
+\begin{quote}\index{sane\_start}
+\begin{verbatim}
+SANE_Status sane_start (SANE_Handle h);
+\end{verbatim}
+\end{quote}
+This function may fail with one of the following status codes.
+\begin{quote}
+\begin{description}
+\item[\code{SANE\_STATUS\_CANCELLED}:] The operation was cancelled through
+ a call to \code{sane\_cancel}.
+\item[\code{SANE\_STATUS\_DEVICE\_BUSY}:] The device is busy. The
+ operation should be retried later.
+\item[\code{SANE\_STATUS\_JAMMED}:] The document feeder is jammed.
+\item[\code{SANE\_STATUS\_NO\_DOCS}:] The document feeder is out of
+ documents.
+\item[\code{SANE\_STATUS\_COVER\_OPEN}:] The scanner cover is open.
+\item[\code{SANE\_STATUS\_IO\_ERROR}:] An error occurred while communicating
+ with the device.
+\item[\code{SANE\_STATUS\_NO\_MEM}:] An insufficent amount of memory
+ is available.
+\item[\code{SANE\_STATUS\_INVAL}:] The scan cannot be started with the current
+ set of options. The frontend should reload the option descriptors, as if
+ \code{\defn{SANE\_INFO\_RELOAD\_OPTIONS}} had been returned from a call to
+ \code{sane\_control\_option()}, since the device's capabilities may have
+ changed.
+\end{description}
+\end{quote}
+
+
+\subsection{\code{sane\_read}}
+
+This function is used to read image data from the device represented
+by handle \code{h}. Argument \code{buf} is a pointer to a memory area
+that is at least \code{maxlen} bytes long. The number of bytes
+returned is stored in \code{*len}. A backend must set this to zero
+when a status other than \code{SANE\_STA\-TUS\_GOOD} is returned.
+When the call succeeds, the number of bytes returned can be anywhere in
+the range from 0 to \code{maxlen} bytes.
+\begin{quote}\index{sane\_read}
+\begin{verbatim}
+SANE_Status sane_read (SANE_Handle h, SANE_Byte * buf,
+ SANE_Int maxlen, SANE_Int * len);
+\end{verbatim}
+\end{quote}
+If this function is called when no data is available, one of two
+things may happen, depending on the I/O mode that is in effect for
+handle \code{h}.
+\begin{enumerate}
+\item If the device is in blocking I/O mode (the default mode), the
+ call blocks until at least one data byte is available (or until some
+ error occurs).
+
+\item If the device is in non-blocking I/O mode, the call returns
+ immediately with status \code{SANE\_STA\-TUS\_GOOD} and with
+ \code{*len} set to zero.
+\end{enumerate}
+The I/O mode of handle \code{h} can be set via a call to
+\code{sane\_set\_io\_mode()}.
+
+This function may fail with one of the following status codes.
+\begin{quote}
+\begin{description}
+\item[\code{SANE\_STATUS\_CANCELLED}:] The operation was cancelled through
+ a call to \code{sane\_cancel}.
+\item[\code{SANE\_STATUS\_EOF}:] No more data is available for the
+ current frame.
+\item[\code{SANE\_STATUS\_JAMMED}:] The document feeder is jammed.
+\item[\code{SANE\_STATUS\_NO\_DOCS}:] The document feeder is out of
+ documents.
+\item[\code{SANE\_STATUS\_COVER\_OPEN}:] The scanner cover is open.
+\item[\code{SANE\_STATUS\_IO\_ERROR}:] An error occurred while communicating
+ with the device.
+\item[\code{SANE\_STATUS\_NO\_MEM}:] An insufficent amount of memory
+ is available.
+\item[\code{SANE\_STATUS\_ACCESS\_DENIED}:] Access to the device has
+ been denied due to insufficient or invalid authentication.
+\end{description}
+\end{quote}
+
+
+\subsection{\code{sane\_cancel}}
+
+This function is used to immediately or as quickly as possible cancel
+the currently pending operation of the device represented by handle
+\code{h}.
+\begin{quote}\index{sane\_cancel}
+\begin{verbatim}
+void sane_cancel (SANE_Handle h);
+\end{verbatim}
+\end{quote}
+This function can be called at any time (as long as handle \code{h} is
+a valid handle) but usually affects long-running operations only (such
+as image is acquisition). It is safe to call this function
+asynchronously (e.g., from within a signal handler). It is important
+to note that completion of this operaton does {\em not\/} imply that
+the currently pending operation has been cancelled. It only
+guarantees that cancellation has been {\em initiated}. Cancellation
+completes only when the cancelled call returns (typically with a
+status value of \code{SANE\_STATUS\_CANCELLED}). Since the SANE API
+does not require any other operations to be re-entrant, this implies
+that a frontend must {\em not\/} call any other operation until the
+cancelled operation has returned.
+
+
+\subsection{\code{sane\_set\_io\_mode}}
+
+This function is used to set the I/O mode of handle \code{h}. The I/O mode
+can be either blocking or non-blocking. If argument \code{m} is
+\code{SANE\_TRUE}, the mode is set to non-blocking mode, otherwise it's set to
+blocking mode. This function can be called only after a call to
+\code{sane\_start()} has been performed.
+\begin{quote}\index{sane\_set\_io\_mode}
+\begin{verbatim}
+SANE_Status sane_set_io_mode (SANE_Handle h, SANE_Bool m);
+\end{verbatim}
+\end{quote}
+By default, newly opened handles operate in blocking mode. A backend
+may elect not to support non-blocking I/O mode. In such a case the
+status value \code{SANE\_STATUS\_UNSUPPORTED} is returned. Blocking
+I/O must be supported by all backends, so calling this function with
+argument \code{m} set to \code{SANE\_FALSE} is guaranteed to complete
+successfully.
+
+This function may fail with one of the following status codes:
+\begin{quote}
+\begin{description}
+\item[\code{SANE\_STATUS\_INVAL}:] No image acquisition is pending.
+\item[\code{SANE\_STATUS\_UNSUPPORTED}:] The backend does not support
+ the requested I/O mode.
+\end{description}
+\end{quote}
+
+
+\subsection{\code{sane\_get\_select\_fd}}
+
+This function is used to obtain a (platform-specific) file-descriptor
+for handle \code{h} that is readable if and only if image data is
+available (i.e., when a call to \code{sane\_read()} will return at
+least one byte of data). If the call completes successfully, the
+select file-descriptor is returned in \code{*fd}.
+\begin{quote}\index{sane\_get\_select\_fd}
+\begin{verbatim}
+SANE_Status sane_get_select_fd (SANE_Handle h, SANE_Int *fd);
+\end{verbatim}
+\end{quote}
+This function can be called only after a call to \code{sane\_start()}
+has been performed and the returned file-descriptor is guaranteed to
+remain valid for the duration of the current image acquisition (i.e.,
+until \code{sane\_cancel()} or \code{sane\_start()} get called again
+or until \code{sane\_read()} returns with status
+\code{SANE\_STA\-TUS\_EOF}). Indeed, a backend must guarantee to
+close the returned select file descriptor at the point when the next
+\code{sane\_read()} call would return \code{SANE\_STA\-TUS\_EOF}.
+This is necessary to ensure the application can detect when this
+condition occurs without actually having to call \code{sane\_read()}.
+
+A backend may elect not to support this operation. In such a case,
+the function returns with status code
+\code{SANE\_STATUS\_UNSUPPORTED}.
+
+Note that the only operation supported by the returned file-descriptor
+is a host operating-system dependent test whether the file-descriptor
+is readable (e.g., this test can be implemented using \code{select()}
+or \code{poll()} under UNIX). If any other operation is performed on
+the file descriptor, the behavior of the backend becomes
+unpredictable. Once the file-descriptor signals ``readable'' status,
+it will remain in that state until a call to \code{sane\_read()} is
+performed. Since many input devices are very slow, support for this
+operation is strongly encouraged as it permits an application to do
+other work while image acquisition is in progress.
+
+This function may fail with one of the following status codes:
+\begin{quote}
+\begin{description}
+\item[\code{SANE\_STATUS\_INVAL}:] No image acquisition is pending.
+\item[\code{SANE\_STATUS\_UNSUPPORTED}:] The backend does not support
+ this operation.
+\end{description}
+\end{quote}
+
+
+\subsection{\code{sane\_strstatus}}
+
+This function can be used to translate a SANE status code into a
+printable string. The returned string is a single line of text that
+forms a complete sentence, but without the trailing period
+(full-stop). The function is guaranteed to never return \code{NULL}.
+The returned pointer is valid at least until the next call to this
+function is performed.
+\begin{quote}\index{sane\_strstatus}
+\begin{verbatim}
+const SANE_String_Const sane_strstatus (SANE_Status status);
+\end{verbatim}
+\end{quote}
+
+\section{Code Flow}\index{code flow}
+
+The code flow for the SANE API is illustrated in
+Figure~\ref{fig:flow}. Functions \code{sane\_init()} and
+\code{sane\_exit()} initialize and exit the backend, respectively.
+All other calls must be performed after initialization and before
+exiting the backend.
+
+\begin{figure}[htb]
+ \begin{center}
+ \leavevmode
+ \psfig{file=figs/flow.eps,height=0.5\textheight}
+ \caption{Code flow}
+ \label{fig:flow}
+ \end{center}
+\end{figure}
+
+Function \code{sane\_get\_devices()} can be called any time after
+\code{sane\_init()} has been called. It returns the list of the
+devices that are known at the time of the call. This list may change
+over time since some devices may be turned on or off or a remote host
+may boot or shutdown between different calls. It should be noted that
+this operation may be relatively slow since it requires contacting all
+configured devices (some of which may be on remote hosts). A frontend
+may therefore want to provide the ability for a user to directly
+select a desired device without requiring a call to this function.
+
+Once a device has been chosen, it is opened using a call to
+\code{sane\_open()}. Multiple devices can be open at any given time.
+A SANE backend must not impose artificial constraints on how many
+devices can be open at any given time.
+
+An opened device can be setup through the corresponding device handle
+using functions \code{sane\_get\_opt\-ion\_desc\-riptor()} and
+\code{sane\_control\_option()}. While setting up a device, obtaining
+option descriptors and setting and reading of option values can be
+mixed freely. It is typical for a frontend to read out all available
+options at the beginning and then build a dialog (either graphical or
+a command-line oriented option list) that allows to control the
+available options. It should be noted that the number of options is
+fixed for a given handle. However, as options are set, other options
+may become active or inactive. Thus, after setting an option, it
+maybe necessary to re-read some or all option descriptors. While
+setting up the device, it is also admissible to call
+\code{sane\_get\_parameters()} to get an estimate of what the image
+parameters will look like once image acquisition begins.
+
+The device handle can be put in blocking or non-blocking mode by a
+call to \code{sane\_set\_io\_mode()}. Devices are required to support
+blocking mode (which is the default mode), but support for
+non-blocking I/O is strongly encouraged for operating systems such as
+UNIX.
+
+After the device is setup properly, image acquisition can be started
+by a call to \code{sane\_start()}. The backend calculates the exact
+image parameters at this point. So future calls to
+\code{sane\_get\_parameters()} will return the exact values, rather
+than estimates. Whether the physical image acquisition starts at this
+point or during the first call to \code{sane\_read()} is unspecified
+by the SANE API. If non-blocking I/O and/or a select-style interface
+is desired, the frontend may attempt to call
+\code{sane\_set\_io\_mode()} and/or \code{sane\_get\_select\_fd()} at
+this point. Either of these functions may fail if the backend does
+not support the requested operation.
+
+Image data is collected by repeatedly calling \code{sane\_read()}.
+Eventually, this function will return an end-of-file status
+(\code{SANE\_STATUS\_EOF}). This indicates the end of the current
+frame. If the frontend expects additional frames (e.g., the
+individual channels in of a red/green/blue image or multiple images),
+it can call \code{sane\_start()} again. Once all desired frames have
+been acquired, function \code{sane\_cancel()} must be called. This
+operation can also be called at any other time to cancel a pending
+operation. Note that \code{sane\_cancel()} must be called even if the
+last read operation returned \code{SANE\_STATUS\_EOF}.
+
+When done using the device, the handle should be closed by a call to
+\code{sane\_close()}. Finally, before exiting the application,
+function \code{sane\_exit()} must be called. It is important not to
+forget to call this function since otherwise some resources (e.g.,
+temporary files or locks) may remain unclaimed.
+
+
+\section{Well-Known Options}\index{well-known options}
+
+While most backend options are completely self-describing, there are a
+cases where a user interface might want to special-case the handling
+of certain options. For example, the scan area is typically defined
+by four options that specify the top-left and bottom-right corners of
+the area. With a graphical user interface, it would be tedious to
+force the user to type in these four numbers. Instead, most such
+interfaces will want to present to the user a preview (low-resolution
+scan) of the scanner surface and let the user pick the scan area by
+dragging a rectangle into the desired position. For this reason, the
+SANE API specifies a small number of option names that have
+well-defined meanings.
+
+\subsection{Option Number Count}\index{option count}
+
+Option number 0 has an empty string as its name. The value of this
+option is of type \code{SANE\_TYPE\_INT} and it specifies the total
+number of options available for a given device (the count includes
+option number 0). This means that there are two ways of counting the
+number of options available: a frontend can either cycle through all
+option numbers starting at one until
+\code{sane\_get\_option\_descriptor()} returns \code{NULL}, or a
+frontend can directly read out the value of option number 0.
+
+\subsection{Scan Resolution Option}\index{scan resolution}\index{resolution option}
+
+Option \code{resolution} is used to select the resolution at which an
+image should be acquired. The type of this option is either
+\code{SANE\_TYPE\_INT} or \code{SANE\_TYPE\_FIXED}. The unit is
+\code{SANE\_UNIT\_DPI} (dots/inch).
+
+This option is not mandatory, but if a backend does support it, it
+must implement it in a manner consistent with the above definition.
+
+\subsection{Preview Mode Option}\index{preview mode}
+
+The boolean option \code{preview} is used by a frontend to inform the
+backend when image acquisition should be optimized for speed, rather
+than quality (``preview mode''). When set to \code{SANE\_TRUE},
+preview mode is in effect, when set to \code{SANE\_FALSE} image
+acquisition should proceed in normal quality mode. The setting of
+this option \emph{must not\/} affect any other option. That is, as
+far as the other options are concerned, the preview mode is completely
+side effect free. A backend can assume that the frontend will take
+care of appropriately setting the scan resolution for preview mode
+(through option \code{resolution}). A backend is free to override the
+\code{resolution} value with its own choice for preview mode, but it
+is advised to leave this choice to the frontend wherever possible.
+
+This option is not mandatory, but if a backend does support it, it
+must implement it in a manner consistent with the above definition.
+
+\subsection{Scan Area Options}\index{scan area options}
+
+The four most important well-known options are the ones that define
+the scan area. The scan area is defined by two points (x/y coordinate
+pairs) that specify the top-left and the bottom-right corners. This
+is illustrated in Figure~\ref{fig:area}. Note that the origin of the
+coordinate system is at the top-left corner of the scan surface as
+seen by the sensor (which typically is a mirror image of the scan
+surface seen by the user). For this reason, the top-left corner is
+the corner for which the abscissa and ordinate values are
+simultaneously the {\em smallest} and the bottom-right corner is the
+corner for which the abscissa and ordinate values are simulatenously
+the {\em largest}. If this coordinate system is not natural for a
+given device, it is the job of the backend to perform the necessary
+conversions.
+\begin{figure}[tbp]
+ \begin{center}
+ \leavevmode
+ \psfig{file=figs/area.eps,height=0.3\textheight}
+ \caption{Scan area options}
+ \label{fig:area}
+ \end{center}
+\end{figure}
+
+The names of the four options that define the scan area are given in
+the table below:
+\begin{center}
+\begin{tabular}{ll}
+{\bf Name} & {\bf Description} \\
+\code{\defn{tl-x}} & Top-left $x$ coordinate value \\
+\code{\defn{tl-y}} & Top-left $y$ coordinate value \\
+\code{\defn{br-x}} & Bottom-right $x$ coordinate value \\
+\code{\defn{br-y}} & Bottom-right $y$ coordinate value \\
+\end{tabular}
+\end{center}
+There are several rules that should be followed by front and backends
+regarding these options:
+\begin{itemize}
+
+\item Backends must attach a unit of either pixels
+ (\code{SANE\_UNIT\_PIXEL}) or millimeters (\code{SANE\_UNIT\_MM}) to
+ these options. The unit of all four options must be identical.
+
+\item Whenever meaningful, a backend should attach a range or a
+ word-list constraint to these options.
+
+\item A frontend can determine the size of the scan surface by first
+ checking that the options have range constraints associated. If a
+ range or word-list constraints exist, the frontend can take the
+ minimum and maximum values of one of the x and y option
+ range-constraints to determine the scan surface size.
+
+\item A frontend must work properly with any or all of these options
+ missing.
+
+\end{itemize}
+
+\input{net.tex}
+
+\chapter{Contact Information}\label{chap:contact}
+
+The SANE standard is discussed and evolved via a mailing list.
+Anybody with email access to the Internet can automatically join and
+leave the discussion group by sending mail to the following address.
+\begin{quote}\index{mailing list}
+\begin{verbatim}
+sane-devel-request@lists.alioth.debian.org
+\end{verbatim}
+\end{quote}
+To subscribe, send a mail with the body ``\verb|subscribe sane-devel|'' to the
+above address.
+
+A complete list of commands supported can be obtained by sending a
+mail with a subject of ``\code{help}'' to the above address. The
+mailing list is archived and available through the SANE home page at
+URL:
+\begin{quote}
+\url{http://www.sane-project.org/}
+\end{quote}
+
+\newpage
+\input{sane.ind}
+
+\end{document}