summaryrefslogtreecommitdiff
path: root/doc/manual-html
diff options
context:
space:
mode:
Diffstat (limited to 'doc/manual-html')
-rw-r--r--doc/manual-html/gimpprint_1.html63
-rw-r--r--doc/manual-html/gimpprint_10.html53
-rw-r--r--doc/manual-html/gimpprint_11.html86
-rw-r--r--doc/manual-html/gimpprint_12.html558
-rw-r--r--doc/manual-html/gimpprint_13.html45
-rw-r--r--doc/manual-html/gimpprint_14.html102
-rw-r--r--doc/manual-html/gimpprint_15.html141
-rw-r--r--doc/manual-html/gimpprint_16.html184
-rw-r--r--doc/manual-html/gimpprint_17.html61
-rw-r--r--doc/manual-html/gimpprint_18.html156
-rw-r--r--doc/manual-html/gimpprint_19.html38
-rw-r--r--doc/manual-html/gimpprint_2.html495
-rw-r--r--doc/manual-html/gimpprint_20.html315
-rw-r--r--doc/manual-html/gimpprint_21.html22
-rw-r--r--doc/manual-html/gimpprint_22.html22
-rw-r--r--doc/manual-html/gimpprint_23.html37
-rw-r--r--doc/manual-html/gimpprint_24.html29
-rw-r--r--doc/manual-html/gimpprint_25.html611
-rw-r--r--doc/manual-html/gimpprint_26.html31
-rw-r--r--doc/manual-html/gimpprint_27.html152
-rw-r--r--doc/manual-html/gimpprint_28.html77
-rw-r--r--doc/manual-html/gimpprint_29.html111
-rw-r--r--doc/manual-html/gimpprint_3.html41
-rw-r--r--doc/manual-html/gimpprint_30.html246
-rw-r--r--doc/manual-html/gimpprint_31.html87
-rw-r--r--doc/manual-html/gimpprint_32.html723
-rw-r--r--doc/manual-html/gimpprint_33.html247
-rw-r--r--doc/manual-html/gimpprint_34.html29
-rw-r--r--doc/manual-html/gimpprint_35.html52
-rw-r--r--doc/manual-html/gimpprint_36.html560
-rw-r--r--doc/manual-html/gimpprint_37.html663
-rw-r--r--doc/manual-html/gimpprint_38.html115
-rw-r--r--doc/manual-html/gimpprint_39.html59
-rw-r--r--doc/manual-html/gimpprint_4.html82
-rw-r--r--doc/manual-html/gimpprint_40.html115
-rw-r--r--doc/manual-html/gimpprint_41.html52
-rw-r--r--doc/manual-html/gimpprint_42.html457
-rw-r--r--doc/manual-html/gimpprint_43.html189
-rw-r--r--doc/manual-html/gimpprint_44.html117
-rw-r--r--doc/manual-html/gimpprint_45.html49
-rw-r--r--doc/manual-html/gimpprint_46.html249
-rw-r--r--doc/manual-html/gimpprint_47.html124
-rw-r--r--doc/manual-html/gimpprint_5.html36
-rw-r--r--doc/manual-html/gimpprint_6.html106
-rw-r--r--doc/manual-html/gimpprint_7.html39
-rw-r--r--doc/manual-html/gimpprint_8.html66
-rw-r--r--doc/manual-html/gimpprint_9.html79
-rw-r--r--doc/manual-html/gimpprint_foot.html33
-rw-r--r--doc/manual-html/gimpprint_toc.html108
-rw-r--r--doc/manual-html/print-color.pngbin0 -> 11217 bytes
-rw-r--r--doc/manual-html/print-main.pngbin0 -> 17787 bytes
-rw-r--r--doc/manual-html/print-setup.pngbin0 -> 3539 bytes
52 files changed, 8112 insertions, 0 deletions
diff --git a/doc/manual-html/gimpprint_1.html b/doc/manual-html/gimpprint_1.html
new file mode 100644
index 0000000..efd7c7f
--- /dev/null
+++ b/doc/manual-html/gimpprint_1.html
@@ -0,0 +1,63 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Instructions</TITLE>
+</HEAD>
+<BODY>
+Go to the first, previous, <A HREF="gimpprint_2.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC1" HREF="gimpprint_toc.html#TOC1">Preface</A></H1>
+
+<P>
+<A NAME="IDX1"></A>
+<A NAME="IDX2"></A>
+<A NAME="IDX3"></A>
+This manual documents the use of the GIMP-Print package, focusing mainly on the
+libgimpprint library that is the core of GIMP-Print. Parts of the manual which
+describe the use of libgimpprint are aimed primarily at programmers, and do
+assume that the reader is familiar with C programming, and using standard
+programming tools on GNU or UNIX systems. Other parts of the manual document
+the use of the programs that make up the GIMP-Print package, and assume no
+knowledge other than the basics of using a shell and editor.
+
+</P>
+<P>
+The best way to learn how to use libgimpprint in your own programs is to read
+the manual from start to finish, using the examples given in the text to learn
+how it works. The bulk of the manual can be used as a reference once one
+understands the basics.
+
+</P>
+<P>
+The manual is split into several parts for the programmer. It starts
+with a simple usage example of how to link a program with libgimpprint,
+then how to integrate this into package build scripts, using
+@command{make}, @command{autoconf} and @command{automake}. This is
+followed by a detailed function reference, including descriptions of all
+the data types used.
+
+</P>
+<P>
+For the end-user, there is a section on all of the programs that come
+with GIMP-Print, including the GIMP @command{print} plugin, and the CUPS
+and Ghostscript drivers.
+
+</P>
+<P>
+The appendices at the end of the manual detail the dither and weave
+algorithms used in libgimpprint, the ESC/P2 printer control language
+used in Epson printers and how to add support for a new printer to
+libgimpprint.
+
+</P>
+<P>
+We hope you enjoy using GIMP-Print!
+--The GIMP-Print project
+<P><HR><P>
+Go to the first, previous, <A HREF="gimpprint_2.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_10.html b/doc/manual-html/gimpprint_10.html
new file mode 100644
index 0000000..03be2c3
--- /dev/null
+++ b/doc/manual-html/gimpprint_10.html
@@ -0,0 +1,53 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Functions</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_9.html">previous</A>, <A HREF="gimpprint_11.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC15" HREF="gimpprint_toc.html#TOC15">4 Functions</A></H1>
+<P>
+<A NAME="IDX13"></A>
+
+</P>
+<P>
+This section of the manual is a complete reference to all of the functions
+comprising libgimpprint, with examples.
+
+</P>
+<P>
+All of the libgimpprint functions can be declared by including the master
+libgimpprint header, <TT>`&#60;gimp-print/gimp-print.h&#62;'</TT>. This should be done in
+every source file that uses gimpprint functions by putting
+
+</P>
+
+<PRE>
+#include &#60;gimp-print/gimp-print.h&#62;
+</PRE>
+
+<P>
+at the top of each file.
+
+</P>
+
+<UL>
+<LI><A HREF="gimpprint_11.html#SEC16">Main functions</A>: Essential functions every program must call.
+<LI><A HREF="gimpprint_12.html#SEC17">stp_vars_t functions</A>: Using stp_vars_t.
+<LI><A HREF="gimpprint_13.html#SEC18">Dither functions</A>: Dither algorithms.
+<LI><A HREF="gimpprint_14.html#SEC19">Options functions</A>: Options.
+<LI><A HREF="gimpprint_15.html#SEC20">Paper functions</A>: Paper size and orientation.
+<LI><A HREF="gimpprint_16.html#SEC21">Printer functions</A>: Printer selection.
+<LI><A HREF="gimpprint_17.html#SEC22">Settings functions</A>: Getting and changing settings.
+<LI><A HREF="gimpprint_18.html#SEC23">Version functions</A>: Getting libgimpprint version information.
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_9.html">previous</A>, <A HREF="gimpprint_11.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_11.html b/doc/manual-html/gimpprint_11.html
new file mode 100644
index 0000000..3ba2822
--- /dev/null
+++ b/doc/manual-html/gimpprint_11.html
@@ -0,0 +1,86 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Main functions</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_10.html">previous</A>, <A HREF="gimpprint_12.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC16" HREF="gimpprint_toc.html#TOC16">4.1 Main functions</A></H2>
+<P>
+<A NAME="IDX14"></A>
+
+</P>
+<P>
+These functions are essential to the correct functioning of
+libgimpprint. All or most other functions in the library depend
+absolutely upon them. In the case of <CODE>stp_init</CODE>, this function
+<EM>must</EM> be called before any of the other functions in the library.
+
+</P>
+
+<P>
+<A NAME="IDX15"></A>
+<DL>
+<DT><U>Function:</U> int <B>stp_init</B> <I>(void)</I>
+<DD><A NAME="IDX16"></A>
+
+</P>
+<P>
+This function initialises the libgimpprint library. It must be called before
+any of the other libgimpprint functions are called. It is responsible for
+setting up message catalogues (for internationalisation). This function
+may be called more than once, at any stage during the execution of a
+program.
+
+</P>
+<P>
+It returns zero on success, nonzero on failure.
+</DL>
+
+</P>
+<P>
+<CODE>stp_init</CODE> might be used as follows:
+
+</P>
+
+<PRE>
+int
+main (int argc, char **argv)
+{
+ stp_init();
+
+ ...
+
+}
+</PRE>
+
+<P>
+<A NAME="IDX17"></A>
+<DL>
+<DT><U>Function:</U> void * <B>stp_malloc</B> <I>(size_t <VAR>size</VAR>)</I>
+<DD><A NAME="IDX18"></A>
+
+</P>
+<P>
+Where <VAR>size</VAR> is the amount of memory to allocate (in bytes).
+
+</P>
+<P>
+This function allocates memory. It will always return a pointer to the
+allocated memory. It will not return on failure.
+
+</P>
+<P>
+It returns a pointer to the allocated memory.
+</DL>
+
+</P>
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_10.html">previous</A>, <A HREF="gimpprint_12.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_12.html b/doc/manual-html/gimpprint_12.html
new file mode 100644
index 0000000..59eb45e
--- /dev/null
+++ b/doc/manual-html/gimpprint_12.html
@@ -0,0 +1,558 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - stp_vars_t functions</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_11.html">previous</A>, <A HREF="gimpprint_13.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC17" HREF="gimpprint_toc.html#TOC17">4.2 <CODE>stp_vars_t</CODE> functions</A></H2>
+<P>
+<A NAME="IDX19"></A>
+
+</P>
+<P>
+<DL>
+<DT><U>Data type:</U> void * <B>stp_vars_t</B>
+<DD><A NAME="IDX20"></A>
+This is an opaque data type, whose structure is not visible to the
+user. This object contains all of the information about settings for
+a given printer, such as color (contrast, brightness), the type of
+printer, the dithering algorithm in use, and so forth. Please see the
+<CODE>stp_set_*</CODE> and <CODE>stp_get_*</CODE> functions below for the
+accessors and mutators for this data type.
+</DL>
+
+</P>
+
+<P>
+<DL>
+<DT><U>Function:</U> stp_vars_t <B>stp_allocate_vars</B> <I>(void)</I>
+<DD><A NAME="IDX21"></A>
+Allocate a new <CODE>stp_vars_t</CODE> with default settings for all members.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stp_copy_vars</B> <I>(stp_vars_t <VAR>vd</VAR>, const stp_vars_t <VAR>vs</VAR>)</I>
+<DD><A NAME="IDX22"></A>
+Copy the settings from <VAR>vs</VAR> to <VAR>vd</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> stp_vars_t <B>stp_allocate_copy</B> <I>(const stp_vars_t <VAR>vs</VAR>)</I>
+<DD><A NAME="IDX23"></A>
+Allocate a new <CODE>stp_vars_t</CODE>, copying settings from <VAR>vs</VAR>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stp_free_vars</B> <I>(stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX24"></A>
+Free all resources associated with <VAR>vv</VAR>. <VAR>vv</VAR> must not be
+used in any way following this call.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_get_output_to</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX25"></A>
+<DT><U>Function:</U> void <B>stp_set_output_to</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX26"></A>
+<DT><U>Function:</U> void <B>stp_set_output_to_n</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>, int <VAR>bytes</VAR>)</I>
+<DD><A NAME="IDX27"></A>
+Get or set the name of the command that this job will be printed to.
+This is used by front ends; the driver library always prints to a
+stream provided by the front end and never uses this directly.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_get_driver</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX28"></A>
+<DT><U>Function:</U> void <B>stp_set_driver</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX29"></A>
+<DT><U>Function:</U> void <B>stp_set_driver_n</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>, int <VAR>bytes</VAR>)</I>
+<DD><A NAME="IDX30"></A>
+Get or set the name of the driver (the type of printer).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_get_ppd_file</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX31"></A>
+<DT><U>Function:</U> void <B>stp_set_ppd_file</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX32"></A>
+<DT><U>Function:</U> void <B>stp_set_ppd_file_n</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>, int <VAR>bytes</VAR>)</I>
+<DD><A NAME="IDX33"></A>
+Get or set the name of the PPD file used by this print job. Normally,
+only PostScript printers use PPD files.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_get_resolution</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX34"></A>
+<DT><U>Function:</U> void <B>stp_set_resolution</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX35"></A>
+<DT><U>Function:</U> void <B>stp_set_resolution_n</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>, int <VAR>bytes</VAR>)</I>
+<DD><A NAME="IDX36"></A>
+Get or set the resolution to be used in this print job. Different
+drivers support different resolutions, and many drivers support
+multiple quality settings for a given DPI resolution.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_get_media_size</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX37"></A>
+<DT><U>Function:</U> void <B>stp_set_media_size</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX38"></A>
+<DT><U>Function:</U> void <B>stp_set_media_size_n</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>, int <VAR>bytes</VAR>)</I>
+<DD><A NAME="IDX39"></A>
+Get or set the name of the media size (e. g. A3, letter, legal) to be
+used in this print job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_get_media_type</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX40"></A>
+<DT><U>Function:</U> void <B>stp_set_media_type</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX41"></A>
+<DT><U>Function:</U> void <B>stp_set_media_type_n</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>, int <VAR>bytes</VAR>)</I>
+<DD><A NAME="IDX42"></A>
+Get or set the name of the media type (e. g. plain paper, photo
+quality inkjet paper) to be used in this print job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_get_media_source</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX43"></A>
+<DT><U>Function:</U> void <B>stp_set_media_source</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX44"></A>
+<DT><U>Function:</U> void <B>stp_set_media_source_n</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>, int <VAR>bytes</VAR>)</I>
+<DD><A NAME="IDX45"></A>
+Get or set the name of the media source (e. g. manual feed, tray A) to
+be used in this print job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_get_ink_type</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX46"></A>
+<DT><U>Function:</U> void <B>stp_set_ink_type</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX47"></A>
+<DT><U>Function:</U> void <B>stp_set_ink_type_n</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>, int <VAR>bytes</VAR>)</I>
+<DD><A NAME="IDX48"></A>
+Get or set the name of the ink type (e. g. four color standard, six
+color photo) to be used in this print job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_get_dither_algorithm</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX49"></A>
+<DT><U>Function:</U> void <B>stp_set_dither_algorithm</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX50"></A>
+<DT><U>Function:</U> void <B>stp_set_dither_algorithm_n</B> <I>(stp_vars_t <VAR>vv</VAR>, const char *<VAR>val</VAR>, int <VAR>bytes</VAR>)</I>
+<DD><A NAME="IDX51"></A>
+Get or set the dither algorithm to be used in this print job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_output_type</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX52"></A>
+<DT><U>Function:</U> void <B>stp_set_output_type</B> <I>(stp_vars_t <VAR>vv</VAR>, int <VAR>val</VAR>)</I>
+<DD><A NAME="IDX53"></A>
+Get or set the output type (color, grayscale, black and white) for
+this print job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_orientation</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX54"></A>
+<DT><U>Function:</U> void <B>stp_set_orientation</B> <I>(stp_vars_t <VAR>vv</VAR>, int <VAR>val</VAR>)</I>
+<DD><A NAME="IDX55"></A>
+Get or set the paper orientation for this print job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_left</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX56"></A>
+<DT><U>Function:</U> void <B>stp_set_left</B> <I>(stp_vars_t <VAR>vv</VAR>, int <VAR>val</VAR>)</I>
+<DD><A NAME="IDX57"></A>
+Get or set the left margin (in 1/72 inch units, or "points") for this
+print job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_top</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX58"></A>
+<DT><U>Function:</U> void <B>stp_set_top</B> <I>(stp_vars_t <VAR>vv</VAR>, int <VAR>val</VAR>)</I>
+<DD><A NAME="IDX59"></A>
+Get or set the top margin (in 1/72 inch units, or "points") for this
+print job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_image_type</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX60"></A>
+<DT><U>Function:</U> void <B>stp_set_image_type</B> <I>(stp_vars_t <VAR>vv</VAR>, int <VAR>val</VAR>)</I>
+<DD><A NAME="IDX61"></A>
+Get or set the image type (line art, continuous tone, solid colors)
+for this print job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_unit</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX62"></A>
+<DT><U>Function:</U> void <B>stp_set_unit</B> <I>(stp_vars_t <VAR>vv</VAR>, int <VAR>val</VAR>)</I>
+<DD><A NAME="IDX63"></A>
+Get or set the base unit (inches or centimeters) for this print job.
+This is provided for front ends; the package itself uses points as its
+unit of measurement.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_page_width</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX64"></A>
+<DT><U>Function:</U> void <B>stp_set_page_width</B> <I>(stp_vars_t <VAR>vv</VAR>, int <VAR>val</VAR>)</I>
+<DD><A NAME="IDX65"></A>
+Get or set the width of the printed region of the page.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_page_height</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX66"></A>
+<DT><U>Function:</U> void <B>stp_set_page_height</B> <I>(stp_vars_t <VAR>vv</VAR>, int <VAR>val</VAR>)</I>
+<DD><A NAME="IDX67"></A>
+Get or set the height of the printed region of the page.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_input_color_model</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX68"></A>
+<DT><U>Function:</U> void <B>stp_set_input_color_model</B> <I>(stp_vars_t <VAR>vv</VAR>, int <VAR>val</VAR>)</I>
+<DD><A NAME="IDX69"></A>
+Get or set the color model (currently RGB or CMY) of the input to the
+driver. Most front ends will use RGB input.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_output_color_model</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX70"></A>
+<DT><U>Function:</U> void <B>stp_set_output_color_model</B> <I>(stp_vars_t <VAR>vv</VAR>, int <VAR>val</VAR>)</I>
+<DD><A NAME="IDX71"></A>
+Get or set the color model (currently RGB or CMY) of the output of the
+driver. Most printers will use CMY.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> float <B>stp_get_scaling</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX72"></A>
+<DT><U>Function:</U> void <B>stp_set_scaling</B> <I>(stp_vars_t <VAR>vv</VAR>, float <VAR>val</VAR>)</I>
+<DD><A NAME="IDX73"></A>
+Get or set the scaling factor of the image. If the scaling factor is
+greater than 0, it is interpreted as a percent (5.0-100.0 is the valid
+range) of the printable page region, using the more restrictive axis.
+For example, if the image to be printed should be 3" (wide) x 2"
+(high), and the printable page region is 8"x10.5", the scale factor
+should be 37.5 (3"/8").
+
+</P>
+<P>
+If the scaling is less than zero, it is interpreted as pixels per
+inch.
+
+</P>
+<P>
+It is likely that in the future this will be migrated into the front
+end. There is no particular reason why the driver needs to know about
+this.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> float <B>stp_get_gamma</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX74"></A>
+<DT><U>Function:</U> void <B>stp_set_gamma</B> <I>(stp_vars_t <VAR>vv</VAR>, float <VAR>val</VAR>)</I>
+<DD><A NAME="IDX75"></A>
+Get or set the gamma of the print job (valid range: 0.1-4.0; default
+1.0). Note that this is not the absolute gamma used by the print job;
+it is scaled by the gamma appropriate for the printer. This is true
+for all of the numerical parameters.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> float <B>stp_get_brightness</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX76"></A>
+<DT><U>Function:</U> void <B>stp_set_brightness</B> <I>(stp_vars_t <VAR>vv</VAR>, float <VAR>val</VAR>)</I>
+<DD><A NAME="IDX77"></A>
+Get or set the brightness of the print job (valid range: 0.0-2.0;
+default: 1.0). Any value other than 1.0 will result in some possible
+values not being used; if brightness is less than 1.0, no output point
+will be pure white, and if brightness is greater than 1.0, no output
+point will be pure black (or cyan, or magenta, or yellow).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> float <B>stp_get_contrast</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX78"></A>
+<DT><U>Function:</U> void <B>stp_set_contrast</B> <I>(stp_vars_t <VAR>vv</VAR>, float <VAR>val</VAR>)</I>
+<DD><A NAME="IDX79"></A>
+Get or set the contrast of the print job (valid range: 0.0-4.0;
+default: 1.0). Values less than 1.0 will result in pure white or
+black not being used (0.0 will make the entire image 50% gray).
+Values greater than 1.0 do not hard clip; while the contrast in the
+midtones increases, it only asymptotically approaches the limits.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> float <B>stp_get_cyan</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX80"></A>
+<DT><U>Function:</U> void <B>stp_set_cyan</B> <I>(stp_vars_t <VAR>vv</VAR>, float <VAR>val</VAR>)</I>
+<DD><A NAME="IDX81"></A>
+Get or set the cyan adjustment of the print job (range: 0.0-4.0; default:
+1.0). This currently adjusts the gamma of the cyan curve. It is
+scaled by the cyan adjustment for the printer model in question.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> float <B>stp_get_magenta</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX82"></A>
+<DT><U>Function:</U> void <B>stp_set_magenta</B> <I>(stp_vars_t <VAR>vv</VAR>, float <VAR>val</VAR>)</I>
+<DD><A NAME="IDX83"></A>
+Get or set the magenta adjustment of the print job (range: 0.0-4.0; default:
+1.0). This currently adjusts the gamma of the magenta curve. It is
+scaled by the magenta adjustment for the printer model in question.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> float <B>stp_get_yellow</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX84"></A>
+<DT><U>Function:</U> void <B>stp_set_yellow</B> <I>(stp_vars_t <VAR>vv</VAR>, float <VAR>val</VAR>)</I>
+<DD><A NAME="IDX85"></A>
+Get or set the yellow adjustment of the print job (range: 0.0-4.0; default:
+1.0). This currently adjusts the gamma of the yellow curve. It is
+scaled by the yellow adjustment for the printer model in question.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> float <B>stp_get_saturation</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX86"></A>
+<DT><U>Function:</U> void <B>stp_set_saturation</B> <I>(stp_vars_t <VAR>vv</VAR>, float <VAR>val</VAR>)</I>
+<DD><A NAME="IDX87"></A>
+Get or set the saturation of the print job (range: 0.0-9.0; default: 1.0).
+Saturation of 0.0 produces grayscale output using composite (CMY or
+CMYK, as appropriate for the printer) color.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> float <B>stp_get_density</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX88"></A>
+<DT><U>Function:</U> void <B>stp_set_density</B> <I>(stp_vars_t <VAR>vv</VAR>, float <VAR>val</VAR>)</I>
+<DD><A NAME="IDX89"></A>
+Get or set the density of the print job (range: 0.0-2.0; default:
+1.0). This adjusts the amount of ink deposited in a linear fashion
+for all channels. It is scaled by the density appropriate for the
+choice of printer, resolution, paper type, and other factors that the
+driver may deem appropriate.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> float <B>stp_get_app_gamma</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX90"></A>
+<DT><U>Function:</U> void <B>stp_set_app_gamma</B> <I>(stp_vars_t <VAR>vv</VAR>, float <VAR>val</VAR>)</I>
+<DD><A NAME="IDX91"></A>
+Get or set the gamma of the input (i. e. what the driving application
+uses).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void * <B>stp_get_lut</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX92"></A>
+<DT><U>Function:</U> void <B>stp_set_lut</B> <I>(stp_vars_t <VAR>vv</VAR>, void *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX93"></A>
+Get or set the color lookup table for the print job. This is useful
+outside of the library for computing a preview of the printed result.
+The lookup table itself should be treated as an opaque handle.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> unsigned char * <B>stp_get_cmap</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX94"></A>
+<DT><U>Function:</U> void <B>stp_set_cmap</B> <I>(stp_vars_t <VAR>vv</VAR>, unsigned char *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX95"></A>
+Get or set the color map for the print job. This is a table of R,G,B
+values for 8-bit indexed input. This may be moved outside of the
+library in the future; in this case, the front end would be required
+to do its own mapping and supply true-color RGB to the driver.
+</DL>
+
+</P>
+<P>
+The following methods are used to perform output and error reporting
+by the driver. The driver supplies a stream of output bytes; the
+front end is responsible for providing methods that accept this output
+and handle it appropriately.
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> stp_outfunc_t <B>stp_get_outfunc</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX96"></A>
+<DT><U>Function:</U> void <B>stp_set_outfunc</B> <I>(const stp_vars_t <VAR>vv</VAR>, stp_outfunc_t <VAR>val</VAR>)</I>
+<DD><A NAME="IDX97"></A>
+<DT><U>Function:</U> void * <B>stp_get_outdata</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX98"></A>
+<DT><U>Function:</U> void <B>stp_set_outdata</B> <I>(stp_vars_t <VAR>vv</VAR>, void *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX99"></A>
+
+</P>
+<P>
+<DL>
+<DT><U>Data type:</U> <B>stp_outfunc_t</B>
+<DD><A NAME="IDX100"></A>
+
+<PRE>
+typedef void (*stp_outfunc_t) (void *data,
+ const char *buffer, size_t bytes);
+</PRE>
+
+</DL>
+<P>
+Get or set the output function the driver will use. The front end
+must supply a suitable function for accepting the output data. The
+<CODE>stp_set_outdata</CODE> method provides a way of passing an appropriate
+object to the output function.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> stp_outfunc_t <B>stp_get_errfunc</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX101"></A>
+<DT><U>Function:</U> void <B>stp_set_errfunc</B> <I>(const stp_vars_t <VAR>vv</VAR>, stp_outfunc_t <VAR>val</VAR>)</I>
+<DD><A NAME="IDX102"></A>
+<DT><U>Function:</U> void * <B>stp_get_errdata</B> <I>(const stp_vars_t <VAR>vv</VAR>)</I>
+<DD><A NAME="IDX103"></A>
+<DT><U>Function:</U> void <B>stp_set_errdata</B> <I>(stp_vars_t <VAR>vv</VAR>, void *<VAR>val</VAR>)</I>
+<DD><A NAME="IDX104"></A>
+Get or set the error reporting function that the driver will use.
+This is used to report errors or debugging information, and must be
+supplied. A typical errfunc will simply print whatever it's passed to
+stderr.
+</DL>
+
+</P>
+<P>
+/*
+ * hue_map is an array of 49 doubles representing the mapping of hue
+ * from (0..6) to (0..6) in increments of .125. The hue_map is in CMY space,
+ * so hue=0 is cyan.
+ */
+typedef void (*stp_convert_t)(const stp_vars_t vars, const unsigned char *in,
+ unsigned short *out, int *zero_mask,
+ int width, int bpp, const unsigned char *cmap,
+ const double *hue_map, const double *lum_map,
+ const double *sat_map);
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stp_merge_printvars</B> <I>(stp_vars_t <VAR>user</VAR>, const stp_vars_t <VAR>print</VAR>)</I>
+<DD><A NAME="IDX105"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stp_allocate_lut</B> <I>(stp_vars_t <VAR>v</VAR>, size_t <VAR>steps</VAR>)</I>
+<DD><A NAME="IDX106"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stp_free_lut</B> <I>(stp_vars_t <VAR>v</VAR>)</I>
+<DD><A NAME="IDX107"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stp_compute_lut</B> <I>(stp_vars_t <VAR>v</VAR>, size_t <VAR>steps</VAR>)</I>
+<DD><A NAME="IDX108"></A>
+
+</P>
+</DL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_11.html">previous</A>, <A HREF="gimpprint_13.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_13.html b/doc/manual-html/gimpprint_13.html
new file mode 100644
index 0000000..8942a5e
--- /dev/null
+++ b/doc/manual-html/gimpprint_13.html
@@ -0,0 +1,45 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Dither functions</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_12.html">previous</A>, <A HREF="gimpprint_14.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC18" HREF="gimpprint_toc.html#TOC18">4.3 Dither functions</A></H2>
+<P>
+<A NAME="IDX109"></A>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> size_t <B>stp_dither_algorithm_count</B> <I>(void)</I>
+<DD><A NAME="IDX110"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_dither_algorithm_name</B> <I>(int <VAR>id</VAR>)</I>
+<DD><A NAME="IDX111"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_default_dither_algorithm</B> <I>(void)</I>
+<DD><A NAME="IDX112"></A>
+
+</P>
+</DL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_12.html">previous</A>, <A HREF="gimpprint_14.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_14.html b/doc/manual-html/gimpprint_14.html
new file mode 100644
index 0000000..5384d1a
--- /dev/null
+++ b/doc/manual-html/gimpprint_14.html
@@ -0,0 +1,102 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Options functions</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_13.html">previous</A>, <A HREF="gimpprint_15.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC19" HREF="gimpprint_toc.html#TOC19">4.4 Options functions</A></H2>
+<P>
+<A NAME="IDX113"></A>
+
+</P>
+<P>
+<DL>
+<DT><U>Data type:</U> void * <B>stp_option_t</B>
+<DD><A NAME="IDX114"></A>
+This is an opaque data type, whose structure is not visible to the
+user.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stp_set_option(stp_vars_t</B> <I><VAR>v</VAR>, const char *<VAR>name</VAR>, const char *<VAR>data</VAR>, int <VAR>bytes</VAR>)</I>
+<DD><A NAME="IDX115"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stp_clear_option</B> <I>(stp_vars_t <VAR>v</VAR>, const char *<VAR>name</VAR>)</I>
+<DD><A NAME="IDX116"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stp_clear_all_options</B> <I>(stp_vars_t <VAR>v</VAR>)</I>
+<DD><A NAME="IDX117"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> size_t <B>stp_option_count</B> <I>(const stp_vars_t <VAR>v</VAR>)</I>
+<DD><A NAME="IDX118"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_option_t <B>stp_get_option_by_index</B> <I>(const stp_vars_t <VAR>v</VAR>, size_t <VAR>idx</VAR>)</I>
+<DD><A NAME="IDX119"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_option_t <B>stp_get_option_by_name</B> <I>(const stp_vars_t <VAR>v</VAR>, const char *<VAR>name</VAR>)</I>
+<DD><A NAME="IDX120"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_option_data</B> <I>(const stp_option_t <VAR>option</VAR>)</I>
+<DD><A NAME="IDX121"></A>
+<STRONG>Note</STRONG>: not null delimited!
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_option_name</B> <I>(const stp_option_t <VAR>option</VAR>)</I>
+<DD><A NAME="IDX122"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> size_t <B>stp_option_length</B> <I>(const stp_option_t <VAR>option</VAR>)</I>
+<DD><A NAME="IDX123"></A>
+
+</P>
+</DL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_13.html">previous</A>, <A HREF="gimpprint_15.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_15.html b/doc/manual-html/gimpprint_15.html
new file mode 100644
index 0000000..3bc88e2
--- /dev/null
+++ b/doc/manual-html/gimpprint_15.html
@@ -0,0 +1,141 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Paper functions</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_14.html">previous</A>, <A HREF="gimpprint_16.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC20" HREF="gimpprint_toc.html#TOC20">4.5 Paper functions</A></H2>
+<P>
+<A NAME="IDX124"></A>
+
+</P>
+<P>
+<DL>
+<DT><U>Data type:</U> void * <B>stp_papersize_t</B>
+<DD><A NAME="IDX125"></A>
+This is an opaque data type, whose structure is not visible to the
+user.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Data type:</U> <B>stp_papersize_unit_t</B>
+<DD><A NAME="IDX126"></A>
+
+<PRE>
+typedef enum papersize_unit
+{
+ PAPERSIZE_ENGLISH,
+ PAPERSIZE_METRIC
+} stp_papersize_unit_t;
+</PRE>
+
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_known_papersizes</B> <I>(void)</I>
+<DD><A NAME="IDX127"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_papersize_t <B>stp_get_papersize_by_name</B> <I>(const char *<VAR>name</VAR>)</I>
+<DD><A NAME="IDX128"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_papersize_t <B>stp_get_papersize_by_size</B> <I>(int <VAR>l</VAR>, int <VAR>w</VAR>)</I>
+<DD><A NAME="IDX129"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_papersize_t <B>stp_get_papersize_by_index</B> <I>(int <VAR>index</VAR>)</I>
+<DD><A NAME="IDX130"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_papersize_get_name</B> <I>(const stp_papersize_t <VAR>pt</VAR>)</I>
+<DD><A NAME="IDX131"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> unsigned <B>stp_papersize_get_width</B> <I>(const stp_papersize_t <VAR>pt</VAR>)</I>
+<DD><A NAME="IDX132"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> unsigned <B>stp_papersize_get_height</B> <I>(const stp_papersize_t <VAR>pt</VAR>)</I>
+<DD><A NAME="IDX133"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> unsigned <B>stp_papersize_get_top</B> <I>(const stp_papersize_t <VAR>pt</VAR>)</I>
+<DD><A NAME="IDX134"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> unsigned <B>stp_papersize_get_left</B> <I>(const stp_papersize_t <VAR>pt</VAR>)</I>
+<DD><A NAME="IDX135"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> unsigned <B>stp_papersize_get_bottom</B> <I>(const stp_papersize_t <VAR>pt</VAR>)</I>
+<DD><A NAME="IDX136"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> unsigned <B>stp_papersize_get_right</B> <I>(const stp_papersize_t <VAR>pt</VAR>)</I>
+<DD><A NAME="IDX137"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> stp_papersize_unit_t <B>stp_papersize_get_unit</B> <I>(const stp_papersize_t <VAR>pt</VAR>)</I>
+<DD><A NAME="IDX138"></A>
+
+</P>
+</DL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_14.html">previous</A>, <A HREF="gimpprint_16.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_16.html b/doc/manual-html/gimpprint_16.html
new file mode 100644
index 0000000..dd8f55d
--- /dev/null
+++ b/doc/manual-html/gimpprint_16.html
@@ -0,0 +1,184 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Printer functions</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_15.html">previous</A>, <A HREF="gimpprint_17.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC21" HREF="gimpprint_toc.html#TOC21">4.6 Printer functions</A></H2>
+<P>
+<A NAME="IDX139"></A>
+
+</P>
+<P>
+<DL>
+<DT><U>Data type:</U> void * <B>stp_printer_t</B>
+<DD><A NAME="IDX140"></A>
+This is an opaque data type, whose structure is not visible to the
+user.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_known_printers</B> <I>(void)</I>
+<DD><A NAME="IDX141"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_printer_t <B>stp_get_printer_by_index</B> <I>(int <VAR>idx</VAR>)</I>
+<DD><A NAME="IDX142"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_printer_get_long_name</B> <I>(const stp_printer_t <VAR>p</VAR>)</I>
+<DD><A NAME="IDX143"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_printer_t <B>stp_get_printer_by_long_name</B> <I>(const char *<VAR>long_name</VAR>)</I>
+<DD><A NAME="IDX144"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_printer_t <B>stp_get_printer_by_driver</B> <I>(const char *<VAR>driver</VAR>)</I>
+<DD><A NAME="IDX145"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_get_printer_index_by_driver</B> <I>(const char *<VAR>driver</VAR>)</I>
+<DD><A NAME="IDX146"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_printer_get_driver</B> <I>(const stp_printer_t <VAR>p</VAR>)</I>
+<DD><A NAME="IDX147"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> int <B>stp_printer_get_model</B> <I>(const stp_printer_t <VAR>p</VAR>)</I>
+<DD><A NAME="IDX148"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_printfuncs_t * <B>stp_printer_get_printfuncs</B> <I>(const stp_printer_t <VAR>p</VAR>)</I>
+<DD><A NAME="IDX149"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Data type:</U> <B>stp_printfuncs_t</B>
+<DD><A NAME="IDX150"></A>
+
+<PRE>
+typedef struct
+{
+ char **(*parameters)(const stp_printer_t printer,
+ const char *ppd_file,
+ const char *name, int *count);
+ void (*media_size)(const stp_printer_t printer,
+ const stp_vars_t v, int *width,
+ int *height);
+ void (*imageable_area)(const stp_printer_t printer,
+ const stp_vars_t v,
+ int *left, int *right,
+ int *bottom, int *top);
+ void (*limit)(const stp_printer_t printer,
+ const stp_vars_t v,
+ int *width, int *height);
+ void (*print)(const stp_printer_t printer,
+ stp_image_t *image, const stp_vars_t v);
+ const char *(*default_parameters)(const stp_printer_t printer,
+ const char *ppd_file,
+ const char *name);
+ void (*describe_resolution)(const stp_printer_t printer,
+ const char *resolution,
+ int *x, int *y);
+ int (*verify)(const stp_printer_t p, const stp_vars_t v);
+} stp_printfuncs_t;
+</PRE>
+
+</DL>
+
+<P>
+<DL>
+<DT><U>Data type:</U> <B>stp_image_t</B>
+<DD><A NAME="IDX151"></A>
+
+<PRE>
+typedef struct stp_image
+{
+ void (*init)(struct stp_image *image);
+ void (*reset)(struct stp_image *image);
+ void (*transpose)(struct stp_image *image);
+ void (*hflip)(struct stp_image *image);
+ void (*vflip)(struct stp_image *image);
+ void (*crop)(struct stp_image *image,
+ int left, int top, int right,
+ int bottom);
+ void (*rotate_ccw)(struct stp_image *image);
+ void (*rotate_cw)(struct stp_image *image);
+ void (*rotate_180)(struct stp_image *image);
+ int (*bpp)(struct stp_image *image);
+ int (*width)(struct stp_image *image);
+ int (*height)(struct stp_image *image);
+ void (*get_row)(struct stp_image *image,
+ unsigned char *data, int row);
+ const char *(*get_appname)(struct stp_image *image);
+ void (*progress_init)(struct stp_image *image);
+ void (*note_progress)(struct stp_image *image,
+ double current, double total);
+ void (*progress_conclude)(struct stp_image *image);
+ void *rep;
+} stp_image_t;
+</PRE>
+
+<P>
+This is an abstract data type for interfacing with the program which
+created the image.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const stp_vars_t <B>stp_printer_get_printvars</B> <I>(const stp_printer_t <VAR>p</VAR>)</I>
+<DD><A NAME="IDX152"></A>
+
+</P>
+</DL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_15.html">previous</A>, <A HREF="gimpprint_17.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_17.html b/doc/manual-html/gimpprint_17.html
new file mode 100644
index 0000000..f6dc2bb
--- /dev/null
+++ b/doc/manual-html/gimpprint_17.html
@@ -0,0 +1,61 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Settings functions</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_16.html">previous</A>, <A HREF="gimpprint_18.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC22" HREF="gimpprint_toc.html#TOC22">4.7 Settings functions</A></H2>
+<P>
+<A NAME="IDX153"></A>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> stp_convert_t <B>stp_choose_colorfunc</B> <I>(int <VAR>output_type</VAR>, int <VAR>image_bpp</VAR>, const unsigned char *<VAR>cmap</VAR>, int *<VAR>out_bpp</VAR>, const stp_vars_t <VAR>v</VAR>)</I>
+<DD><A NAME="IDX154"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> void <B>stp_compute_page_parameters</B> <I>(int <VAR>page_right</VAR>, int <VAR>page_left</VAR>, int <VAR>page_top</VAR>, int <VAR>page_bottom</VAR>, double <VAR>scaling</VAR>, int <VAR>image_width</VAR>, int <VAR>image_height</VAR>, stp_image_t *<VAR>image</VAR>, int *<VAR>orientation</VAR>, int *{page_width}, int *<VAR>page_height</VAR>, int *<VAR>out_width</VAR>, int *<VAR>out_height</VAR>, int *<VAR>left</VAR>, int *<VAR>top</VAR>)</I>
+<DD><A NAME="IDX155"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_vars_t <B>stp_default_settings</B> <I>(void)</I>
+<DD><A NAME="IDX156"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_vars_t <B>stp_maximum_settings</B> <I>(void)</I>
+<DD><A NAME="IDX157"></A>
+
+</P>
+</DL>
+
+<P>
+<DL>
+<DT><U>Function:</U> const stp_vars_t <B>stp_minimum_settings</B> <I>(void)</I>
+<DD><A NAME="IDX158"></A>
+
+</P>
+</DL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_16.html">previous</A>, <A HREF="gimpprint_18.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_18.html b/doc/manual-html/gimpprint_18.html
new file mode 100644
index 0000000..96bc5a4
--- /dev/null
+++ b/doc/manual-html/gimpprint_18.html
@@ -0,0 +1,156 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Version functions</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_17.html">previous</A>, <A HREF="gimpprint_19.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC23" HREF="gimpprint_toc.html#TOC23">4.8 Version functions</A></H2>
+<P>
+<A NAME="IDX159"></A>
+
+</P>
+<P>
+<DL>
+<DT><U>Function:</U> const char * <B>stp_check_version</B> <I>(unsigned int <VAR>required_major</VAR>,</I>
+<DD><A NAME="IDX160"></A>
+unsigned int <VAR>required_minor</VAR>, unsigned int <VAR>required_micro</VAR>)
+
+</P>
+<P>
+This function checks whether the version of libgimpprint that the program
+is linked with is equal to the version number passed to it. If the version
+is the same, the function returns <CODE>NULL</CODE>. If any of the version
+numbers do not match (i.e. the library version is too old or too new), a string containing a desription of the difference is
+returned. The first error found is returned. The function checks in the order
+major, minor, micro.
+</DL>
+
+</P>
+
+
+<H3><A NAME="SEC24" HREF="gimpprint_toc.html#TOC24">4.8.1 Version macros</A></H3>
+
+<P>
+<DL>
+<DT><U>Macro:</U> <B>GIMPPRINT_CHECK_VERSION</B> <I>(major,minor,micro)</I>
+<DD><A NAME="IDX161"></A>
+
+</P>
+<P>
+This macro returns zero if the version of the libgimpprint headers are
+greater or equal to the version given as an argument. It returns nonzero
+if the version of the libgimpprint headers are less than the argument.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Macro:</U> <B>GIMPPRINT_MAJOR_VERSION</B>
+<DD><A NAME="IDX162"></A>
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Macro:</U> <B>GIMPPRINT_MINOR_VERSION</B>
+<DD><A NAME="IDX163"></A>
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Macro:</U> <B>GIMPPRINT_MICRO_VERSION</B>
+<DD><A NAME="IDX164"></A>
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Macro:</U> <B>GIMPPRINT_CURRENT_INTERFACE</B>
+<DD><A NAME="IDX165"></A>
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Macro:</U> <B>GIMPPRINT_BINARY_AGE</B>
+<DD><A NAME="IDX166"></A>
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Macro:</U> <B>GIMPPRINT_INTERFACE_AGE</B>
+<DD><A NAME="IDX167"></A>
+</DL>
+
+</P>
+<P>
+These macros are integers holding the version numbers. They should be
+used for compile-time checking only. To check version numbers at
+run-time, use the equivalent variables. Note that at present (4.1.x
+development branch) the library interface version numbers are not used.
+
+</P>
+
+
+<H3><A NAME="SEC25" HREF="gimpprint_toc.html#TOC25">4.8.2 Version variables</A></H3>
+
+<P>
+<DL>
+<DT><U>Variable:</U> const unsigned int <B>gimpprint_major_version</B>
+<DD><A NAME="IDX168"></A>
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> const unsigned int <B>gimpprint_minor_version</B>
+<DD><A NAME="IDX169"></A>
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> const unsigned int <B>gimpprint_micro_version</B>
+<DD><A NAME="IDX170"></A>
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> const unsigned int <B>gimpprint_current_interface</B>
+<DD><A NAME="IDX171"></A>
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> const unsigned int <B>gimpprint_binary_age</B>
+<DD><A NAME="IDX172"></A>
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>Variable:</U> const unsigned int <B>gimpprint_interface_age</B>
+<DD><A NAME="IDX173"></A>
+</DL>
+
+</P>
+<P>
+These variables hold the library version numbers. Because the version of
+the library may change on a system using shared libraries, these should
+be used instead of the equivalent macros when checking the library
+version at run-time. Note that library interface version numbers are not
+used in the development branch, but are in the stable branch.
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_17.html">previous</A>, <A HREF="gimpprint_19.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_19.html b/doc/manual-html/gimpprint_19.html
new file mode 100644
index 0000000..0ba0d14
--- /dev/null
+++ b/doc/manual-html/gimpprint_19.html
@@ -0,0 +1,38 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Programs</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_18.html">previous</A>, <A HREF="gimpprint_20.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC26" HREF="gimpprint_toc.html#TOC26">5 Programs</A></H1>
+<P>
+<A NAME="IDX174"></A>
+
+</P>
+<P>
+This chapter of the manual describes the use of some of the programs
+which use the GIMP-Print library (libgimpprint). Note that there is now
+a user manual in DocBook/SGML format, currently provided in HTML,
+PostScript and PDF formats which is distributed with GIMP-Print. This
+manual currently covers the use of the GIMP Print plugin and CUPS
+drivers.
+
+</P>
+
+
+<UL>
+<LI><A HREF="gimpprint_20.html#SEC27">The GIMP plugin</A>: The print plugin for the GIMP
+<LI><A HREF="gimpprint_21.html#SEC36">Ghostscript</A>: Printer driver
+<LI><A HREF="gimpprint_22.html#SEC37">CUPS</A>: Printer driver
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_18.html">previous</A>, <A HREF="gimpprint_20.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_2.html b/doc/manual-html/gimpprint_2.html
new file mode 100644
index 0000000..4820f55
--- /dev/null
+++ b/doc/manual-html/gimpprint_2.html
@@ -0,0 +1,495 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Copying</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_1.html">previous</A>, <A HREF="gimpprint_3.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+</P>
+
+
+<H1><A NAME="SEC2" HREF="gimpprint_toc.html#TOC2">GNU GENERAL PUBLIC LICENSE</A></H1>
+<P>
+Version 2, June 1991
+
+</P>
+
+<PRE>
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+675 Mass Ave, Cambridge, MA 02139, USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+</PRE>
+
+
+
+<H2><A NAME="SEC3" HREF="gimpprint_toc.html#TOC3">Preamble</A></H2>
+
+<P>
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users. This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it. (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.) You can apply it to
+your programs, too.
+
+</P>
+<P>
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+</P>
+<P>
+ To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+</P>
+<P>
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must show them these terms so they know their
+rights.
+
+</P>
+<P>
+ We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+</P>
+<P>
+ Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software. If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+</P>
+<P>
+ Finally, any free program is threatened constantly by software
+patents. We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary. To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+</P>
+<P>
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+</P>
+<P>
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+</P>
+
+<OL>
+<LI>
+
+This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License. The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language. (Hereinafter, translation is included without limitation in
+the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+<LI>
+
+You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+<LI>
+
+You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+
+<OL>
+<LI>
+
+You must cause the modified files to carry prominent notices
+stating that you changed the files and the date of any change.
+
+<LI>
+
+You must cause any work that you distribute or publish, that in
+whole or in part contains or is derived from the Program or any
+part thereof, to be licensed as a whole at no charge to all third
+parties under the terms of this License.
+
+<LI>
+
+If the modified program normally reads commands interactively
+when run, you must cause it, when started running for such
+interactive use in the most ordinary way, to print or display an
+announcement including an appropriate copyright notice and a
+notice that there is no warranty (or else, saying that you provide
+a warranty) and that users may redistribute the program under
+these conditions, and telling the user how to view a copy of this
+License. (Exception: if the Program itself is interactive but
+does not normally print such an announcement, your work based on
+the Program is not required to print an announcement.)
+</OL>
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+<LI>
+
+You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+
+<OL>
+<LI>
+
+Accompany it with the complete corresponding machine-readable
+source code, which must be distributed under the terms of Sections
+1 and 2 above on a medium customarily used for software interchange; or,
+
+<LI>
+
+Accompany it with a written offer, valid for at least three
+years, to give any third party, for a charge no more than your
+cost of physically performing source distribution, a complete
+machine-readable copy of the corresponding source code, to be
+distributed under the terms of Sections 1 and 2 above on a medium
+customarily used for software interchange; or,
+
+<LI>
+
+Accompany it with the information you received as to the offer
+to distribute corresponding source code. (This alternative is
+allowed only for noncommercial distribution and only if you
+received the program in object code or executable form with such
+an offer, in accord with Subsection b above.)
+</OL>
+
+The source code for a work means the preferred form of the work for
+making modifications to it. For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable. However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+<LI>
+
+You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License. Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+<LI>
+
+You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Program or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+<LI>
+
+Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+<LI>
+
+If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all. For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+<LI>
+
+If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded. In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+<LI>
+
+The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation. If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+<LI>
+
+If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission. For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this. Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+<LI>
+
+BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+<LI>
+
+IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+</OL>
+
+<P>
+END OF TERMS AND CONDITIONS
+
+</P>
+
+
+<H2><A NAME="SEC4" HREF="gimpprint_toc.html#TOC4">How to Apply These Terms to Your New Programs</A></H2>
+
+<P>
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+</P>
+<P>
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+</P>
+
+<PRE>
+<VAR>one line to give the program's name and an idea of what it does.</VAR>
+Copyright (C) 19<VAR>yy</VAR> <VAR>name of author</VAR>
+
+This program is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License
+as published by the Free Software Foundation; either version 2
+of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+</PRE>
+
+<P>
+Also add information on how to contact you by electronic and paper mail.
+
+</P>
+<P>
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+</P>
+
+<PRE>
+Gnomovision version 69, Copyright (C) 19<VAR>yy</VAR> <VAR>name of author</VAR>
+Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
+type `show w'. This is free software, and you are welcome
+to redistribute it under certain conditions; type `show c'
+for details.
+</PRE>
+
+<P>
+The hypothetical commands <SAMP>`show w'</SAMP> and <SAMP>`show c'</SAMP> should show
+the appropriate parts of the General Public License. Of course, the
+commands you use may be called something other than <SAMP>`show w'</SAMP> and
+<SAMP>`show c'</SAMP>; they could even be mouse-clicks or menu items--whatever
+suits your program.
+
+</P>
+<P>
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary. Here is a sample; alter the names:
+
+</P>
+
+<PRE>
+Yoyodyne, Inc., hereby disclaims all copyright
+interest in the program `Gnomovision'
+(which makes passes at compilers) written
+by James Hacker.
+
+<VAR>signature of Ty Coon</VAR>, 1 April 1989
+Ty Coon, President of Vice
+</PRE>
+
+<P>
+This General Public License does not permit incorporating your program into
+proprietary programs. If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library. If this is what you want to do, use the GNU Library General
+Public License instead of this License.
+
+</P>
+
+
+<H1><A NAME="SEC5" HREF="gimpprint_toc.html#TOC5">Copying summary</A></H1>
+<P>
+GIMP-Print is <STRONG>free</STRONG>; this means that everyone is free to use it and
+free to redistribute it on a free basis. GIMP-Print is not in the public
+domain; it is copyrighted and there are restrictions on its
+distribution, but these restrictions are designed to permit everything
+that a good cooperating citizen would want to do. What is not allowed is
+to try to prevent others from further sharing any version of GIMP-Print
+that they might get from you.
+
+</P>
+<P>
+Specifically, we want to make sure that you have the right to give away
+copies of GIMP-Print, that you receive source code or else can get it if
+you want it, that you can change GIMP-Print or use pieces of it in new
+free programs, and that you know you can do these things.
+
+</P>
+<P>
+To make sure that everyone has such rights, we have to forbid you to
+deprive anyone else of these rights. For example, if you distribute
+copies of GIMP-Print, you must give the recipients all the rights that
+you have. You must make sure that they, too, receive or can get the
+source code. And you must tell them their rights.
+
+</P>
+<P>
+Also, for our own protection, we must make certain that everyone finds
+out that there is no warranty for GIMP-Print. If GIMP-Print is modified
+by someone else and passed on, we want their recipients to know that
+what they have is not what we distributed, so that any problems
+introduced by others will no reflect on our reputation.
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_1.html">previous</A>, <A HREF="gimpprint_3.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_20.html b/doc/manual-html/gimpprint_20.html
new file mode 100644
index 0000000..e53165e
--- /dev/null
+++ b/doc/manual-html/gimpprint_20.html
@@ -0,0 +1,315 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - The GIMP plugin</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_19.html">previous</A>, <A HREF="gimpprint_21.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC27" HREF="gimpprint_toc.html#TOC27">5.1 The GIMP Print plugin</A></H2>
+<P>
+<A NAME="IDX175"></A>
+<A NAME="IDX176"></A>
+
+</P>
+<P>
+The GIMP Print plugin is the printing facility for the GNU Image
+Manipulation Program<A NAME="DOCF1" HREF="gimpprint_foot.html#FOOT1">(1)</A>}. This section
+examines the features offered by the Print plugin.
+
+</P>
+<P>
+The main window is divided into five panes:
+
+</P>
+
+
+
+<H3><A NAME="SEC28" HREF="gimpprint_toc.html#TOC28">5.1.1 Preview</A></H3>
+
+<P>
+The Preview pane contains a positioning widget that allows interactively
+positioning the output on the page. It contains an outer border,
+representing the sheet of paper; an inner border, representing the
+printable area of the printer; an arrow, pointing to the top of the page
+(the end that's fed into the printer); and a black rectangle,
+representing the position of the image on the page. The image can be
+moved around on the paper. When the first (left) button is used, the
+image is moved in screen pixels; when any other button is used, the
+image is moved in points<A NAME="DOCF2" HREF="gimpprint_foot.html#FOOT2">(2)</A>.
+The arrow resizes depending upon the media size chosen; the shaft of the
+arrow is always equal to one inch on the output.
+
+</P>
+<P>
+@image{print-main,,4in}
+
+</P>
+
+
+
+<H3><A NAME="SEC29" HREF="gimpprint_toc.html#TOC29">5.1.2 Printer Settings</A></H3>
+
+<P>
+The Printer Settings pane contains a dropdown menu for selecting a
+printer to print to. There is a special `printer' named <SAMP>`File'</SAMP>
+that allows you to choose a file to print to, rather than a printer
+queue. The Setup box to the right allows specification of a printer
+type, a PPD file<A NAME="DOCF3" HREF="gimpprint_foot.html#FOOT3">(3)</A>, and the command to
+be used to print. Each distinct printer in the Printer list can have
+different settings applied to it. Below that is a combo box allowing
+choice of media size. The choices are constrained to those that the
+printer supports. Below that are dropdown menus for choosing media type
+(what kind of paper), media source (what input tray), ink type, and
+resolution. All of these settings are printer-specific.
+
+</P>
+<P>
+@image{print-setup,,2in}
+
+</P>
+
+
+
+<H3><A NAME="SEC30" HREF="gimpprint_toc.html#TOC30">5.1.3 Position</A></H3>
+
+<P>
+The Position pane contains various widgets to place the image on the
+paper. These widgets work in conjunction with the Preview pane. At the
+top of the pane is a button to center the image on the paper (not on the
+printable area), and on either side buttons to center vertically and
+horizontally. Below these are four boxes that allow entry of the left,
+top, right, and bottom of the image. These positions are relative to
+the top left of the paper<A NAME="DOCF4" HREF="gimpprint_foot.html#FOOT4">(4)</A>. There are
+two additional boxes that allow specification of the right margin and
+bottom margin if you prefer; these are relative to the bottom right
+corner of the paper. Any of these may have values entered into them;
+the preview image will be moved appropriately.
+
+</P>
+<P>
+<STRONG>Note</STRONG>: These entries do not resize the image.
+
+</P>
+<P>
+Finally, there is a pick box for orientation (landscape or portrait).
+There is an <SAMP>`Auto'</SAMP> mode that picks the orientation that yields the
+orientation that best matches that of the image to be printed.
+
+</P>
+
+
+<H3><A NAME="SEC31" HREF="gimpprint_toc.html#TOC31">5.1.4 Scaling</A></H3>
+
+<P>
+The Scaling pane contains a slider that allows scaling of the image.
+The image can be scaled in either percent of the printable area
+(<STRONG>not</STRONG> the page in this case) or pixels per inch (PPI) via a
+radio button below the slider. PPI allows matching image resolution to
+printer resolution. The image may be scaled using either method to
+between 5 and 100% of the imageable area. It is not possible to crop
+with the Print plugin. In Percent mode, the image is scaled so that
+neither axis will be longer than the percent of the printable area
+specified. For example, if you print an image at 20%, it will be
+possible to tile the image 5 times on one axis and at least 5 times on
+the other. To the right of the radio button is a button called Set
+Image Scale. This sets the scaling to PPI, and sets the resolution as
+closely as possible to the resolution stored in the image. To the right
+of the Set Image Scale button are two boxes that allow entry of width
+and height of the image. These set the scaling mode to PPI. Specifying
+one automatically sets the other, and the image is repositioned as
+needed to prevent it from falling off the edge of the page.
+
+</P>
+<P>
+To its right is a button group that allows choosing English (inch)
+units or metric (centimeter) units.
+
+</P>
+
+
+<H3><A NAME="SEC32" HREF="gimpprint_toc.html#TOC32">5.1.5 Image Settings</A></H3>
+
+<P>
+The Image Settings pane allows choice of Line Art, Solid Colors, or
+Photograph image type. Line art or Solid Colors should be used for
+graphics containing mostly solid areas of color. They're very similar
+to each other. Photograph mode dithers more slowly, but produces more
+accurate colors. To the right of these three radio buttons is a button
+called Adjust Color. This pops up a new window that controls various
+output quality settings. That will be described separately. Finally,
+there is a choice of Black and White, Color and Monochrome output.
+Monochrome output can be used to print absolute black and white very
+quickly.
+
+</P>
+
+
+
+<H4><A NAME="SEC33" HREF="gimpprint_toc.html#TOC33">5.1.5.1 Adjust Output</A></H4>
+
+<P>
+The Adjust Output button button pops up a non-modal dialog that allows
+adjustment of various parameters related to the print quality. These
+are independent of the controls within the GIMP itself and only affect
+the print.
+
+</P>
+<P>
+@image{print-color,,2in}
+
+</P>
+<P>
+At the top of the window is a thumbnail of the image that changes to
+reflect the color settings of the image. This enables you to get an
+idea of how the image will print out as you adjust settings.
+
+</P>
+<P>
+Below that there are eight sliders:
+
+</P>
+<DL COMPACT>
+
+<DT><EM>Brightness</EM>
+<DD>
+(0--2.0, default 1.0) Adjust the brightness of the image.
+
+<DT><EM>Contrast</EM>
+<DD>
+(0--4.0, default 1.0) Adjust the output contrast.
+
+<DT><EM>Cyan, Magenta, Yellow</EM>
+<DD>
+(0--4.0, default 1.0) Adjust the cyan, magenta, and yellow in the
+output. These should not normally need to be adjusted very much; even
+very small adjustments can go quite a long way to restoring color
+balance.
+
+<DT><EM>Saturation</EM>
+<DD>
+(0--9.0, default 1.0) Adjust the color brilliance (saturation) of the
+output. Saturation of 0 means pure gray scale, with no color.
+Saturation of 9.0 will make just about anything but pure grays
+brilliantly colored.
+
+<DT><EM>Density</EM>
+<DD>
+(0.1--2.0, default 1.0) Adjust the density (amount of ink) in the print.
+The density is automatically corrected for the particular printer,
+resolution, and in some cases paper choices. If solid black in the
+input is not solid in the print, the density needs to be increased; if
+there is excessive ink bleed-through and muddy dark colors, the density
+should be decreased.
+
+<STRONG>Note</STRONG>: the density will not increase beyond a certain amount no
+matter what the slider is set to.
+
+<DT><EM>Gamma</EM>
+<DD>
+(0.1--4.0, default 1.0) Adjust the output gamma. The gamma value is
+automatically corrected for the choice of printer; this is used if you
+believe the automatic setting is incorrect.
+</DL>
+
+
+
+<H4><A NAME="SEC34" HREF="gimpprint_toc.html#TOC34">5.1.5.2 Dither Algorithm</A></H4>
+<P>
+There is also a selection box for the dither algorithm to be used in the
+pop-up dialog. There are currently seven choices:
+
+</P>
+<DL COMPACT>
+
+<DT><EM>Adaptive Hybrid</EM>
+<DD>
+Adaptive Hybrid usually yields the best output quality; it chooses a
+modified Floyd-Steinberg error diffusion algorithm or ordered dithering
+depending upon the image characteristics.
+
+<DT><EM>Ordered</EM>
+<DD>
+Ordered uses a pure ordered dither. It generally yields excellent
+quality for simple black and white or four color printers without
+variable drop size or drop modulation; it is not recommended if high
+quality is desired on six color printers. It is considerably faster
+than Adaptive Hybrid.
+
+<DT><EM>Fast</EM>
+<DD>
+Fast also uses a pure ordered dither, but uses a very simple black model
+and makes no attempt to handle multi-level (6-color, variable drop size,
+or drop modulation) at all cleanly. It is substantially faster than
+Ordered dither. The quality tends to be quite poor except on simple
+four color printers. On three color printers, quality is probably
+competitive with anything else.
+
+<DT><EM>Very Fast</EM>
+<DD>
+Very Fast is similar to Fast, except that it uses a very simple dither
+matrix that can be looked up much more quickly than the matrix used in
+the Fast dither. For simple pure black and white images dominated by
+horizontal and vertical lines, this may actually yield the best results;
+for other types of image, the quality will be poor.
+
+<DT><EM>Adaptive Random</EM>
+<DD>
+Adaptive Random is similar to Adaptive Hybrid, except that the
+modifications to the Floyd-Steinberg algorithm are slightly different.
+This is slower than Adaptive Hybrid on most systems. For some images
+the quality may be better than Adaptive Hybrid, but generally Adaptive
+Hybrid should yield slightly superior images.
+
+<DT><EM>Hybrid Floyd-Steinberg</EM>
+<DD>
+Hybrid Floyd-Steinberg uses the modified Floyd-Steinberg algorithm of
+Adaptive Hybrid on the entire image. Generally, the results are poor in
+pale regions.
+
+<DT><EM>Random Floyd-Steinberg</EM>
+<DD>
+Random Floyd-Steinberg uses the modified Floyd-Steinberg algorithm of
+Adaptive Random on the entire image. Generally, the results are poor in
+pale regions.
+</DL>
+
+
+
+<H3><A NAME="SEC35" HREF="gimpprint_toc.html#TOC35">5.1.6 Action Buttons</A></H3>
+
+<P>
+The last pane contains four action buttons:
+
+</P>
+<DL COMPACT>
+
+<DT><EM>Print and Save Settings</EM>
+<DD>
+Immediately print the image (or, if the File printer is chosen, display
+a file selection window to pick the output file), and save all current
+settings for all printers.
+
+<DT><EM>Save Settings</EM>
+<DD>
+Immediately save the settings, and continue working in the Print plugin.
+
+<DT><EM>Print</EM>
+<DD>
+Immediately print the image (or, if the <SAMP>`File'</SAMP> printer is chosen,
+display a file selection window to pick the output file), but do not
+save settings.
+
+<DT><EM>Cancel</EM>
+<DD>
+Immediately quit without saving settings or printing.
+</DL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_19.html">previous</A>, <A HREF="gimpprint_21.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_21.html b/doc/manual-html/gimpprint_21.html
new file mode 100644
index 0000000..9f83de8
--- /dev/null
+++ b/doc/manual-html/gimpprint_21.html
@@ -0,0 +1,22 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Ghostscript</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_20.html">previous</A>, <A HREF="gimpprint_22.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC36" HREF="gimpprint_toc.html#TOC36">5.2 Ghostscript driver</A></H2>
+<P>
+<A NAME="IDX177"></A>
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_20.html">previous</A>, <A HREF="gimpprint_22.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_22.html b/doc/manual-html/gimpprint_22.html
new file mode 100644
index 0000000..11b0fec
--- /dev/null
+++ b/doc/manual-html/gimpprint_22.html
@@ -0,0 +1,22 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - CUPS</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_21.html">previous</A>, <A HREF="gimpprint_23.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC37" HREF="gimpprint_toc.html#TOC37">5.3 CUPS driver</A></H2>
+<P>
+<A NAME="IDX178"></A>
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_21.html">previous</A>, <A HREF="gimpprint_23.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_23.html b/doc/manual-html/gimpprint_23.html
new file mode 100644
index 0000000..e1bd23b
--- /dev/null
+++ b/doc/manual-html/gimpprint_23.html
@@ -0,0 +1,37 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Problems</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_22.html">previous</A>, <A HREF="gimpprint_24.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC38" HREF="gimpprint_toc.html#TOC38">6 Reporting Bugs</A></H1>
+<P>
+<A NAME="IDX179"></A>
+<A NAME="IDX180"></A>
+
+</P>
+<P>
+If you find a bug in GIMP-Print or have any suggestions for modification
+or improvement, please send electronic mail to the GIMP-Print bug
+reporting address <A NAME="DOCF5" HREF="gimpprint_foot.html#FOOT5">(5)</A>}. Include the version
+number, which you can find by running <SAMP>`gimpprint-config
+--version'</SAMP>. Also include in your message the output that the program
+produced and the output you expected, if applicable, otherwise the best
+description of the problem that you can provide.
+
+</P>
+<P>
+If you have other questions, comments or suggestions about GIMP-Print,
+contact the developers via electronic mail to the GIMP-Print mailing
+list <A NAME="DOCF6" HREF="gimpprint_foot.html#FOOT6">(6)</A>}. They will try to help you out,
+although they may not have time to fix your problems.
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_22.html">previous</A>, <A HREF="gimpprint_24.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_24.html b/doc/manual-html/gimpprint_24.html
new file mode 100644
index 0000000..31838f9
--- /dev/null
+++ b/doc/manual-html/gimpprint_24.html
@@ -0,0 +1,29 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Appendices</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_23.html">previous</A>, <A HREF="gimpprint_25.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC39" HREF="gimpprint_toc.html#TOC39">7 Appendices</A></H1>
+<P>
+<A NAME="IDX181"></A>
+
+</P>
+
+<UL>
+<LI><A HREF="gimpprint_25.html#SEC40">Dithering</A>: Dither algorithms.
+<LI><A HREF="gimpprint_26.html#SEC41">Weaving</A>: Weaving algorithms.
+<LI><A HREF="gimpprint_34.html#SEC49">ESC/P2</A>: Epson ESC/P2 printer control language.
+<LI><A HREF="gimpprint_39.html#SEC54">New Printer</A>: Adding a new printer to libgimpprint.
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_23.html">previous</A>, <A HREF="gimpprint_25.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_25.html b/doc/manual-html/gimpprint_25.html
new file mode 100644
index 0000000..bbccb97
--- /dev/null
+++ b/doc/manual-html/gimpprint_25.html
@@ -0,0 +1,611 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Dithering</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_24.html">previous</A>, <A HREF="gimpprint_26.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC40" HREF="gimpprint_toc.html#TOC40">A Dithering</A></H1>
+<P>
+<A NAME="IDX182"></A>
+
+</P>
+<P>
+The dithering code in <TT>`print-dither.c'</TT> attempts to reproduce
+various shades of gray (or all colors) from only a few different inks
+(black, cyan, magenta, yellow, and sometimes light cyan and light
+magenta). The dots can't vary in darkness or size (except for certain
+special printers), and so we need to lay down a certain fraction of dots
+to represent each distinct level.
+
+</P>
+<P>
+This sounds straightforward; in practice, it isn't. Completely random
+distribution of dots (simple probabilistic dithering) would create
+grainy clumps and light spots. The smoothest pattern results from an
+equidistant spacing of dots. Approximating this requires sophisticated
+algorithms. We have two dithering algorithms, an ordered dither
+algorithm that uses a grid (matrix) to decide whether to print, and a
+modified Floyd-Steinberg error diffusion algorithm that uses a grid in a
+slightly different way.
+
+</P>
+
+<P>
+We currently have three dithering functions:
+
+</P>
+
+<OL>
+<LI>
+
+<CODE>dither_fastblack</CODE> produces pure black or white from a pre-dithered
+input. This is used for two purposes: for printing pure black and white
+very quickly (e. g. text), and for printing pre-screened monochrome
+output that was rasterized externally.
+
+<LI>
+
+<CODE>dither_black</CODE> produces black from grayscale input. The new
+dither_black can produce either a single or multiple levels of black,
+for printers supporting variable dot size.
+
+<LI>
+
+<CODE>dither_cmyk</CODE> produces 3, 4, 5, 6, or 7 color output (CMY, CMYK,
+CcMmYK, CcMmYy, CcMmYyK, or any variants). The new routine can handle
+single or multiple levels of each color.
+</OL>
+
+<P>
+There is a choice of dithering algorithms. Four of them are based on a
+basic error diffusion, with a few tweaks of my own. The other one is
+`ordered'. However, they all share the basic operation in common.
+First, the algorithm picks what kind of dot (if there are multiple dot
+sizes and/or tones that may be picked) is the candidate to be printed.
+This decision is made based on the darkness at the point being dithered.
+Then, it decides whether the dot will be printed at all. What this is
+based on depends upon which algorithm family we use. This is all
+described in more detail below.
+
+</P>
+
+<P>
+Ordered dithering works by comparing the value at a given point with the
+value of a tiled matrix. If the value at the point is greater than the
+value in the matrix, the dot is printed. The matrix should consist of a
+set of evenly spaced points between 0 and the upper limit. The choice
+of matrix is very important for print quality. A good dither matrix
+will emphasize high frequency components, which distributes dots evenly
+with a minimum of clumping. The matrices used here are all simple
+matrices that are expanded recursively to create larger matrices with
+the same kind of even point distribution. This is described below.
+
+</P>
+<P>
+Note that it is important to use different matrices for the two
+sub-operations, because otherwise the choice about whether to print and
+the choice of dot size will be correlated. The usual result is that the
+print is either too dark or too light, but there can be other problems.
+
+</P>
+<P>
+Ordered dithering works quite well on single dot size, four color
+printers. It has not been well tested on four color, variable dot size
+printers. It should be avoided on six color printers.
+
+</P>
+
+<P>
+Error diffusion works by taking the output error at a given pixel and
+"diffusing" it into surrounding pixels. Output error is the
+difference between the amount of ink output and the input level at each
+pixel. For simple printers, with one or four ink colors and only one
+dot size, the amount of ink output is either 65536 (i. e. full output)
+or 0 (no output). The difference between this and the input level is
+the error. Normal error diffusion adds part of this error to the
+adjoining pixels in the next column and the next row (the algorithm
+simply scans each row in turn, never backing up). The error adds up
+until it reaches a threshold (half of the full output level, or 32768),
+at which point a dot is output, the output is subtracted from the
+current value, and the (now negative) error is diffused similarly.
+
+</P>
+<P>
+Error diffusion works quite well in general, but it tends to generate
+artifacts which usually appear as worm-like lines or areas of anomalous
+density. I have devised some ways, as described below, of ameliorating
+these artifacts.
+
+</P>
+<P>
+There are two sub-classes of error diffusion that we use here, `random'
+and `hybrid'. One of the techniques that we use to ameliorate the
+artifacts is to use a fuzzy threshold rather than the hard threshold of
+half of the output level. Random error diffusion uses a pseudo-random
+number to perturb the threshold, while hybrid error diffusion uses a
+matrix. Hybrid error diffusion worked very poorly in 3.1.3, and I
+couldn't figure out why until I found a bug. It now works very well.
+
+</P>
+<P>
+There is one additional variant (on both sub-classes), called `adaptive
+hybrid' and `adaptive random'. The adaptive variant takes advantage of
+the fact that the patterns that ordered dithering create are less
+visible at very low densities, while the artifacts created by error
+diffusion are more objectionable at low densities. At low densities,
+therefore, it uses ordered dithering; at higher densities it uses error
+diffusion.
+
+</P>
+
+<P>
+Handling multiple output levels makes life a bit more complicated. In
+principle, it shouldn't be much harder: simply figure out what the ratio
+between the available output levels is and have multiple thresholds. In
+practice, getting these right involves a lot of trial and error. The
+other thing that's important is to maximize the number of dots that have
+some ink. This will reduce the amount of speckling. More on this
+later.
+
+</P>
+<P>
+The next question: how do we handle black when printing in color? Black
+ink is much darker than colored inks. It's possible to produce black by
+adding some mixture of cyan, magenta, and yellow--in principle. In
+practice, the black really isn't very black, and different inks and
+different papers will produce different color casts. However, by using
+CMY to produce gray, we can output a lot more dots! This makes for a much
+smoother image. What's more, one cyan, one magenta, and one yellow dot
+produce less darkness than one black dot, so we're outputting that many
+more dots. Better yet, with 6 or 7 color printers, we have to output even
+more light ink dots. So Epson Stylus Photo printers can produce really
+smooth grays--if we do everything right. The right idea is to use
+CMY at lower black levels, and gradually mix in black as the overall
+amount of ink increases, so the black dots don't really become visible
+within the ink mass.
+
+</P>
+<P>
+Variable dot sizes are handled by dividing the range between 0 and
+65536 into segments. Each segment can either represent a range in
+which all of one kind of ink (color and/or dot size) is used, with
+varying amounts of ink, or a transition region between inks, in which
+equal numbers of dots are printed but the amount of each ink will be
+adjusted throughout the range. Each range is represented by four
+numbers:
+
+</P>
+
+<OL>
+<LI>
+
+bottom of the range
+<LI>
+
+top of the range
+<LI>
+
+value of the lighter ink
+<LI>
+
+value of the darker ink
+</OL>
+
+<P>
+In addition, the bit patterns and which type of ink are also
+represented, but they don't affect the actual algorithm.
+
+</P>
+
+<P>
+As mentioned above, the basic algorithm is the same whether we use
+ordered dither or error diffusion. We perform the following steps on
+each color of each pixel:
+
+</P>
+
+<OL>
+<LI>
+
+Compute the value of the particular color we're printing. This isn't
+usually the pure CMY value; it's adjusted to improve saturation and to
+limit the use of black in light toned regions (to avoid speckling).
+
+<LI>
+
+Find the range containing this value.
+
+<LI>
+
+Compute where this value lies within the range. We scale the endpoints
+between 0 and 65536 for this purpose. So for example, if the bottom of
+the range is 10,000 and the top of the range is 20,000, and the value is
+12,500, we're 1/4 of the way between the bottom and the top of the
+range, so our scale point is 16384.
+
+<LI>
+
+Compute the "virtual value". The virtual value is the distance between
+the value of the lighter and the value of the darker ink. So if the
+value of the light ink is 32768 and the dark ink is 65536, we compute a
+virtual value scaled appropriately between these two values, which is
+40960 in this case.
+
+<LI>
+
+Using either error diffusion or ordered dither, the standard threshold
+is 1/2 of the value (20480 in this case). Using ordered dither, we want
+to compute a value between 0 and 40960 that we will compare the input
+value against to decide whether to print. Using pure error diffusion,
+we would compare the accumulated error against 20480 to decide whether
+to print. In practice, we use the same matrix method to decide whether
+to print. The correct amount of ink will be printed this way, but we
+minimize the squiggly lines characteristic of error diffusion by
+dithering the threshold in this fashion. A future enhancement will
+allow us to control the amount of dithering applied to the threshold.
+</OL>
+
+<P>
+The matrices were generated by Thomas Tonino
+@email{&#60;ttonino@bio.vu.nl&#62;} with an algorithm of his devising. The
+algorithm is designed to maximize the spacing between dots at any given
+density by searching the matrix for holes and placing a dot in the
+largest available hole. It requires careful selection of initial points
+to achieve good results, and is very time consuming. For best results,
+a different matrix must be used for modes with 2:1 aspect ratio
+(e.g. 1440x720) than for 1:1 (e. g. 720x720). It is essential with any
+of these matrices that every point be used. Skipping points generates
+low-frequency noise.
+
+</P>
+<P>
+It's essential to use different matrices for deciding whether to print
+and for deciding what color (dark or light) to print. This should be
+obvious; the decision about whether to print at all should be as
+independent as possible from the decision about what color to print,
+because any bias will result in excess light or dark ink being
+printed, shifting the tonal balance. We actually use the same
+matrices, but we shift them vertically and horizontally. Assuming
+that the matrices are not self-correlated, this will yield good
+results.
+
+</P>
+<P>
+The ranges are computed from a list of ink values (between 0 and 1 for
+each possible combination of dot size and ink tone, where the value
+represents the darkness of the ink) and the desired maximum density of
+the ink. This is done in dither_set_ranges, and needs more
+documentation.
+
+</P>
+
+<P>
+I stated earlier that I've tweaked the basic error diffusion algorithm.
+Here's what I've done to improve it:
+
+</P>
+
+<OL>
+<LI>
+
+We use a variable threshold to decide when to print, as discussed above.
+This does two things for us: it reduces the slightly squiggly diagonal
+lines that are the mark of error diffusion; and it allows us to lay down
+some ink even in very light areas near the edge of the image. The
+squiggly lines that error diffusion algorithms tend to generate are
+caused by the gradual accumulation of error. This error is partially
+added horizontally and partially vertically. The horizontal
+accumulation results in a dot eventually being printed. The vertical
+accumulation results in a dot getting laid down in roughly the same
+horizontal position in the next row. The diagonal squigglies result
+from the error being added to pixels one forward and one below the
+current pixel; these lines slope from the top right to the bottom left
+of the image.
+
+Error diffusion also results in pale areas being completely white near
+the top left of the image (the origin of the printing coordinates).
+This is because enough error has to accumulate for anything at all to
+get printed. In very pale areas it takes quite a long time to build up
+anything printable at all; this results in the bare spots.
+
+Randomizing the threshold somewhat breaks up the diagonals to some
+degree by randomizing the exact location that the accumulated output
+crosses the threshold. It reduces the false white areas by allowing
+some dots to be printed even when the accumulated output level is very
+low. It doesn't result in excess ink because the full output level is
+still subtracted and diffused.
+
+Excessive randomization leads to blobs at high densities. Therefore, as
+the density increases, the degree of randomization decreases.
+
+<LI>
+
+Alternating scan direction between rows (first row is scanned left to
+right, second is scanned right to left, and so on). This also helps
+break up white areas, and it also seems to break up squigglies a bit.
+Furthermore, it eliminates directional biases in the horizontal
+direction. This isn't necessary for ordered dither, but it doesn't hurt
+either.
+
+<LI>
+
+Diffusing the error into more pixels. Instead of diffusing the entire
+error into @math{(X+1, Y)} and @math{(X, Y+1)}, we diffuse it into
+@math{(X+1, Y)}, @math{(X+K, Y+1)}, @math{(X, Y+1)}, @math{(X-K, Y+1)}
+where @math{K} depends upon the output level (it never exceeds about 10
+dots, and is greater at higher output levels). This really reduces
+squigglies and graininess. The amount of this spread can be controlled;
+for line art, it should be less than for photographs (of course, line
+art doesn't usually contain much light color, but the <STRONG>error</STRONG>
+value can be small in places!) In addition to requiring more
+computation, a wide ink spread results in patterning at high dot
+densities (note that the dot density can be high even in fairly pale
+regions if multiple dot sizes are in use).
+
+<LI>
+
+Don't lay down any colored ink if we're laying down black ink. There's
+no point; the colored ink won't show. We still pretend that we did for
+purposes of error diffusion (otherwise excessive error will build up,
+and will take a long time to clear, resulting in heavy bleeding of ink
+into surrounding areas, which is very ugly indeed), but we don't bother
+wasting the ink. How well this will do with variable dot size remains
+to be seen.
+
+<LI>
+
+Oversampling. This is how to print 1440x720 with Epson Stylus printers.
+Printing full density at 1440x720 will result in excess ink being laid
+down. The trick is to print only every other dot. We still compute the
+error as though we printed every dot. It turns out that randomizing
+which dots are printed results in very speckled output. This can be
+taken too far; oversampling at 1440x1440 or 1440x2880 virtual resolution
+results in other problems. However, at present 1440x1440 (which is more
+accurately called "1440x720 enhanced", as the Epson printers cannot
+print 1440 rows per inch) does quite well, although it's slow.
+</OL>
+
+<P>
+What about multiple output levels? For 6 and 7 color printers, simply
+using different threshold levels has a problem: the pale inks have trouble
+being seen when a lot of darker ink is being printed. So rather than
+just using the output level of the particular color to decide which ink
+to print, we look at the total density (sum of all output levels).
+If the density's high enough, we prefer to use the dark ink. Speckling
+is less visible when there's a lot of ink, anyway. I haven't yet figured
+out what to do for multiple levels of one color.
+
+</P>
+<P>
+You'll note that I haven't quoted a single source on color or printing
+theory. I simply did all of this empirically.
+
+</P>
+<P>
+There are various other tricks to reduce speckling. One that I've seen
+is to reduce the amount of ink printed in regions where one color
+(particularly cyan, which is perceived as the darkest) is very pale.
+This does reduce speckling all right, but it also results in strange
+tonal curves and weird (to my eye) colors.
+
+</P>
+
+<P>
+Before any dither routine is used, <CODE>init_dither()</CODE> must be called.
+This takes three arguments: the input width (number of pixels in the
+input), the output width (number of pixels in the output), and a
+<CODE>vars_t</CODE> structure containing the parameters for the print job.
+
+</P>
+<P>
+<CODE>init_dither()</CODE> returns a pointer to an opaque object representing
+the dither. This object is passed as the first argument to all of the
+dither-related routines.
+
+</P>
+<P>
+After a page is fully dithered, <CODE>free_dither()</CODE> must be called to
+free the dither object and perform any cleanup. In the future, this may
+do more (such as flush output). This arrangement permits using these
+routines with programs that create multiple output pages, such as
+GhostScript.
+
+</P>
+<P>
+The dithering routines themselves have a number of control knobs that
+control internal aspects of the dithering process. These knobs are
+accessible via a number of functions that can be called after
+<CODE>init_dither()</CODE>.
+
+</P>
+
+<UL>
+<LI>
+
+<CODE>dither_set_density()</CODE> takes a double between 0 and 1 representing
+the desired ink density for printing solid colors. This is used in a
+number of places in the dithering routine to make decisions.
+
+<LI>
+
+<CODE>dither_set_black_density()</CODE> takes a double between 0 and 1
+representing the desired ink density for printing black ink in color
+printing. This is used to balance black against color ink. By default,
+this is equal to the density set by <CODE>dither_set_density()</CODE>. By
+setting it higher, more black ink will be printed. For example, if the
+base density is .4 and the black density is .8, twice as much black ink
+will be printed as would otherwise be called for.
+
+This is not used when printing in monochrome. When printing monochrome,
+the base density (<CODE>dither_set_density</CODE>) should be adjusted
+appropriately.
+
+<LI>
+
+<CODE>dither_set_ink_budget()</CODE> takes an unsigned number representing the
+most ink that may be deposited at a given point. This number is
+arbitrary; the limit is computed by summing the size of each ink dot,
+which is supplied as a parameter in <CODE>dither_set_<VAR>X</VAR>_ranges</CODE>.
+By default, there is no limit.
+
+<LI>
+
+<CODE>dither_set_black_lower()</CODE> takes a double that should be between 0
+and 1 that represents the lowest density level at which black ink will
+start to mix in with colored ink to generate grays. The lower this is,
+the less density is required to use black ink. Setting this too low
+will result in speckling from black dots, particularly on 6 and 7 color
+printers. Setting this too high will make it hard to get satisfactory
+black or may result in sharp transition between blended colors and
+black. Default: 0.0468.
+
+It is important to note that since the density scale is never linear
+(and since this value is adjusted via other things happening during the
+dithering process) that this does not mean that 95% gray will use any
+black ink. At this setting, there will be no black ink used until about
+50% gray.
+
+This only applies to color mode.
+
+This value should be set lower for printers capable of variable dot
+size, since more dots can be laid down close to each other.
+
+<LI>
+
+<CODE>dither_set_black_upper()</CODE> takes a double that should be between 0
+and 1 that represents the highest density level at which colored inks
+will be mixed to create gray. Setting this too low will result in
+speckly dark grays because there is not enough ink to fill all the
+holes, or sharp transition between blended colors and black if it is too
+close to the value of dither_set_black_upper(). Setting this too high
+will result in poor black and dark tone quality. Default: 0.5. This
+results in 10% and darker grays being printed with essentially all
+black.
+
+This only applies to color mode.
+
+<LI>
+
+<CODE>dither_set_black_levels()</CODE> takes three doubles that represent the
+amount of cyan, magenta, and yellow respectively that are blended to
+create gray. The defaults are 1.0 for each, which is probably too low
+for most printers. These values are adjusted to create a good gray
+balance. Setting these too low will result in pale light and midtone
+grays, with a sharp transition to darker tones as black mixes in.
+Setting them too high will result in overly dark grays and use of too
+much ink, possibly creating bleed-through.
+
+This only applies to color mode.
+
+<LI>
+
+<CODE>dither_set_randomizers()</CODE> takes four integer values representing
+the degree of randomness used for cyan, magenta, yellow, and black.
+This is used to allow some printing to take place in pale areas. Zero
+is the most random; greater than 8 or so gives very little randomness at
+all. Defaults are 0 for cyan, magenta, and yellow, and 4 for black.
+Setting the value for black too low will result in black speckling in
+pale areas. Setting values too high will result in pale areas getting
+no ink at all.
+
+This currently only applies to single dot size in color and black. It
+should be extended to operate in variable dot size mode, although
+actually applying it correctly will be tricky.
+
+<LI>
+
+<CODE>dither_set_ink_darkness()</CODE> takes three doubles representing the
+contribution to perceived darkness of cyan, magenta, and yellow. This
+is used to help decide when to switch between light and dark inks in 6
+and 7 color printers (with light cyan, light magenta, and possibly light
+yellow). Setting these too low will result in too much light ink being
+laid down, creating flat spots in the darkness curves and bleed-through.
+Setting them too high will result in dark ink being used in pale areas,
+creating speckle. The defaults are .4 for cyan, .3 for magenta, and .2
+for yellow. Dark cyan will show against yellow much more than dark
+magenta will show against cyan, since the cyan appears much darker than
+the yellow.
+
+<LI>
+
+<CODE>dither_set_light_inks()</CODE> takes three doubles between 0 and 1
+representing the ratio in darkness between the light and dark versions
+of the inks. Setting these too low will result in too much dark ink
+being used in pale areas, creating speckling, while setting them too
+high will result in very smooth texture but too much use of light ink,
+resulting in flat spots in the density curves and ink bleed-through.
+There are no defaults. Any light ink specified as zero indicates that
+there is no light ink for that color.
+
+This only applies to 6 and 7 color printers in single dot size color
+mode, and only to those inks which have light versions (usually cyan and
+magenta).
+
+<LI>
+
+<CODE>dither_set_ink_spread()</CODE> takes a small integer representing the
+amount of ink spread in the dither. Larger numbers mean less spread.
+Larger values are appropriate for line art and solid tones; they will
+yield sharper transitions but more dither artifacts. Smaller values are
+more appropriate for photos. They will reduce resolution and sharpness
+but reduce dither artifacts up to a point. A value of 16 or higher
+implies minimum ink spread at any resolution no matter what the
+overdensity. A value of 14 is typical for photos on single dot size, 6
+color printers. For 4 color printers, subtract 1 (more spread; the dots
+are farther apart). For variable dot size printers, add 1 (more small
+dots are printed; less spread is desirable).
+
+<LI>
+
+<CODE>dither_set_adaptive_divisor()</CODE> takes a float representing the
+transition point between error diffusion and ordered dither if adaptive
+dithering is used. The float is a fraction of the printing density.
+For example, if you wish the transition to be at 1/4 of the maximum
+density (which works well on simple 4-color printers), you would pass
+.25 here. With six colors and/or with multiple dot sizes, the values
+should be set lower.
+
+<LI>
+
+<CODE>dither_set_transition()</CODE> takes a float representing the exponent
+of the transition curve between light and dark inks/dot sizes. A value
+less than 1 (typical when using error diffusion) mixes in less dark
+ink/small dots at lower ends of the range, to reduce speckling. When
+using ordered dithering, this must be set to 1.
+
+<LI>
+
+<CODE>dither_set_<VAR>X</VAR>_ranges_simple</CODE> (<VAR>X</VAR>=<SAMP>`c'</SAMP>, <SAMP>`m'</SAMP>,
+<SAMP>`y'</SAMP>, or <SAMP>`k'</SAMP>) describes the ink choices available for each
+color. This is useful in typical cases where a four color printer with
+variable dot sizes is in use. It is passed an array of doubles between
+(0, 1] representing the relative darkness of each dot size. The dot
+sizes are assigned bit patterns (and ink quantities, see
+<CODE>dither_set_ink_budget()</CODE> above) from 1 to the number of levels.
+This also requires a density, which is the desired density for this
+color. This density need not equal the density specified in
+<CODE>dither_set_density()</CODE>. Setting it lower will tend to print more
+dark ink (because the curves are calculated for this color assuming a
+lower density than is actually supplied).
+
+<LI>
+
+<CODE>dither_set_<VAR>X</VAR>_ranges</CODE> (<VAR>X</VAR>=<SAMP>`c'</SAMP>, <SAMP>`m'</SAMP>, <SAMP>`y'</SAMP>,
+or <SAMP>`k'</SAMP>) describes in a more general way the ink choices available
+for each color. For each possible ink choice, a bit pattern, dot size,
+value (i. e. relative darkness), and whether the ink is the dark or
+light variant ink is specified.
+</UL>
+
+<P>
+---Robert Krawitz @email{&#60;rlk@alum.mit.edu&#62;} May 8, 2000
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_24.html">previous</A>, <A HREF="gimpprint_26.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_26.html b/doc/manual-html/gimpprint_26.html
new file mode 100644
index 0000000..49ba0d0
--- /dev/null
+++ b/doc/manual-html/gimpprint_26.html
@@ -0,0 +1,31 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Weaving</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_25.html">previous</A>, <A HREF="gimpprint_27.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC41" HREF="gimpprint_toc.html#TOC41">B Weaving for inkjet printers</A></H1>
+<P>
+<A NAME="IDX183"></A>
+
+</P>
+<P>
+by Charles Briscoe-Smith and Robert Krawitz.
+
+</P>
+
+<UL>
+<LI><A HREF="gimpprint_27.html#SEC42">Weaving introduction</A>: Just what is weaving?
+<LI><A HREF="gimpprint_28.html#SEC43">Weaving algorithms</A>: How to weave.
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_25.html">previous</A>, <A HREF="gimpprint_27.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_27.html b/doc/manual-html/gimpprint_27.html
new file mode 100644
index 0000000..dbd76d4
--- /dev/null
+++ b/doc/manual-html/gimpprint_27.html
@@ -0,0 +1,152 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Weaving introduction</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_26.html">previous</A>, <A HREF="gimpprint_28.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC42" HREF="gimpprint_toc.html#TOC42">B.1 Introduction</A></H2>
+
+<P>
+The Epson Stylus Color/Photo printers don't have memory to print using
+all of the nozzles in the print head. For example, the Stylus Photo
+700/EX has 32 nozzles. At 720 dpi, with an 8" wide image, a single line
+requires @math{(8 * 720 * 6 / 8)} bytes, or 4320 bytes (because the
+Stylus Photo printers have 6 ink colors). To use 32 nozzles per color
+would require 138240 bytes. It's actually worse than that, though,
+because the nozzles are spaced 8 rows apart. Therefore, in order to
+store enough data to permit sending the page as a simple raster, the
+printer would require enough memory to store 256 rows, or 1105920 bytes.
+Considering that the Photo EX can print 11" wide, we're looking at more
+like 1.5 MB. In fact, these printers are capable of 1440 dpi horizontal
+resolution. This would require 3 MB. The printers actually have
+64K-256K.
+
+</P>
+<P>
+With the newer (740/750 and later) printers it's even worse, since these
+printers support multiple dot sizes; of course, the even newer
+2880x720 printers don't help either.
+
+</P>
+<P>
+Older Epson printers had a mode called <STRONG>MicroWeave</STRONG> (tm). In this
+mode, the host fed the printer individual rows of dots, and the printer
+bundled them up and sent them to the print head in the correct order to
+achieve high quality. This MicroWeave mode still works in new printers,
+but in some cases the implementation is very minimal: the printer uses
+exactly one nozzle of each color (the first one). This makes printing
+extremely slow (more than 30 minutes for one 8.5x11" page), although the
+quality is extremely high with no visible banding whatsoever. It's not
+good for the print head, though, since no ink is flowing through the
+other nozzles. This leads to drying of ink and possible permanent
+damage to the print head.
+
+</P>
+<P>
+By the way, although the Epson manual says that microweave mode should be
+used at 720 dpi, 360 dpi continues to work in much the same way. At 360
+dpi, data is fed to the printer one row at a time on all Epson printers.
+The pattern that the printer uses to print is very prone to banding.
+However, 360 dpi is inherently a low quality mode; if you're using it,
+presumably you don't much care about quality. It is possible to do
+microweave at 360 DPI, with significantly improved quality.
+
+</P>
+<P>
+Except for the Stylus Pro printers (5000, 5500, 7000, 7500, 9000,
+9500, and when it's released the 10000), which can do microweave at
+any resolution, printers from roughly the Stylus Color 600 and later
+do not have the capability to do MicroWeave correctly in many cases
+(some printers can do MicroWeave correctly at 720 DPI). Instead, the
+host must arrange the output in the order that it will be sent to the
+print head. This is a very complex process; the jets in the print
+head are spaced more than one row (1/720") apart, so we can't simply
+send consecutive rows of dots to the printer. Instead, we have to
+pass e. g. the first, ninth, 17th, 25th... rows in order for them to
+print in the correct position on the paper. This interleaving process
+is called "soft" weaving.
+
+</P>
+<P>
+This decision was probably made to save money on memory in the
+printer. It certainly makes the driver code far more complicated than
+it would be if the printer could arrange the output. Is that a bad
+thing? Usually this takes far less CPU time than the dithering
+process, and it does allow us more control over the printing process,
+e.g. to reduce banding. Conceivably, we could even use this ability
+to map out bad jets.
+
+</P>
+<P>
+Interestingly, apparently the Windows (and presumably Macintosh) drivers
+for most or all Epson printers still list a "microweave" mode.
+Experiments have demonstrated that this does not in fact use the
+"microweave" mode of the printer. Possibly it does nothing, or it
+uses a different weave pattern from what the non-"microweave" mode
+does. This is unnecessarily confusing, at least for people who write
+drivers who try to explain them to people who don't.
+
+</P>
+<P>
+What makes this interesting is that there are many different ways of of
+accomplishing this goal. The naive way would be to divide the image up
+into groups of 256 rows (for a printer with 32 jets and a separation of
+8 rows), and print all the mod8=0 rows in the first pass, mod8=1 rows in
+the second, and so forth. The problem with this approach is that the
+individual ink jets are not perfectly uniform; some emit slightly bigger
+or smaller drops than others. Since each group of 8 adjacent rows is
+printed with the same nozzle, that means that there will be distinct
+streaks of lighter and darker bands within the image (8 rows is 1/90",
+which is visible; 1/720" is not). Possibly worse is that these patterns
+will repeat every 256 rows. This creates banding patterns that are
+about 1/3" wide.
+
+</P>
+<P>
+So we have to do something to break up this patterning.
+
+</P>
+<P>
+Epson does not publish the weaving algorithms that they use in their
+bundled drivers. Indeed, their developer web site
+(http://www.ercipd.com/isv/edr_docs.htm) does not even describe how to
+do this weaving at all; it says that the only way to achieve 720 dpi is
+to use MicroWeave. It does note (correctly) that 1440 dpi horizontal
+can only be achieved by the driver (i. e. in software). The manual
+actually makes it fairly clear how to do this (it requires two passes
+with horizontal head movement between passes), and it is presumably
+possible to do this with MicroWeave.
+
+</P>
+<P>
+The information about how to do this is apparently available under
+non-disclosure agreement (NDA). It's actually easy enough to reverse
+engineer what's inside a print file with a simple Perl script, which is
+supplied with the Gimp-Print distribution as tests/parse-escp2. In any
+event, we weren't particularly interested in the weaving patterns Epson
+used. There are many factors that go into choosing a good weaving
+pattern; we're learning them as we go along. Issues such as drying time
+(giving the ink a few seconds more or less to dry can have highly
+visible effects) affect the quality of the output.
+
+</P>
+<P>
+The Uniprint GhostScript driver has been able to do weaving for a long
+time. It uses patterns that must be specified for each choice of
+resolution and printer. We preferred an algorithmic approach that
+computes a weave pattern for any given choice of inputs. This
+obviously requires extensive testing; we developed a test suite
+specifically for this purpose.
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_26.html">previous</A>, <A HREF="gimpprint_28.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_28.html b/doc/manual-html/gimpprint_28.html
new file mode 100644
index 0000000..3116157
--- /dev/null
+++ b/doc/manual-html/gimpprint_28.html
@@ -0,0 +1,77 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Weaving algorithms</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_27.html">previous</A>, <A HREF="gimpprint_29.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC43" HREF="gimpprint_toc.html#TOC43">B.2 Weaving algorithms</A></H2>
+<P>
+<A NAME="IDX184"></A>
+
+</P>
+<P>
+I considered a few algorithms to perform the weave. The first one I
+devised let me use only @math{(jets-distance_between_jets+1)}
+nozzles, or 25. This is OK in principle, but it's slower than using all
+nozzles. By playing around with it some more, I came up with an
+algorithm that lets me use all of the nozzles, except near the top and
+bottom of the page.
+
+</P>
+<P>
+This still produces some banding, though. Even better quality can be
+achieved by using multiple nozzles on the same line. How do we do
+this? In 1440x720 mode, we're printing two output lines at the same
+vertical position. However, if we want four passes, we have to
+effectively print each line twice. Actually doing this would increase
+the density, so what we do is print half the dots on each pass. This
+produces near-perfect output, and it's far faster than using (pseudo)
+"MicroWeave".
+
+</P>
+<P>
+Yet another complication is how to get near the top and bottom of the
+page. This algorithm lets us print to within one head width of the
+top of the page, and a bit more than one head width from the bottom.
+That leaves a lot of blank space. Doing the weave properly outside of
+this region is increasingly difficult as we get closer to the edge of
+the paper; in the interior region, any nozzle can print any line, but
+near the top and bottom edges, only some nozzles can print. We
+originally handled this by using the naive way mentioned above near
+the borders, and switching over to the high quality method in the
+interior. Unfortunately, this meant that the quality is quite visibly
+degraded near the top and bottom of the page. We have since devised
+better algorithms that allow printing to the extreme top and bottom of
+the region that can physically be printed, with only minimal loss of
+quality.
+
+</P>
+<P>
+Epson does not advertise that the printers can print at the very top
+of the page, although in practice most of them can. The quality is
+degraded to some degree, and we have observed that in some cases not
+all of the dots get printed. Epson may have decided that the
+degradation in quality is sufficient that printing in that region
+should not be allowed. That is a valid decision, although we have
+taken another approach.
+
+</P>
+
+<UL>
+<LI><A HREF="gimpprint_29.html#SEC44">Simple weaving algorithms</A>: Starting to weave.
+<LI><A HREF="gimpprint_30.html#SEC45">Perfect weaving</A>: Improving the weave.
+<LI><A HREF="gimpprint_31.html#SEC46">Weaving collisions</A>: Bang!
+<LI><A HREF="gimpprint_32.html#SEC47">What is perfect weaving?</A>: What makes a "perfect" weave?
+<LI><A HREF="gimpprint_33.html#SEC48">Oversampling</A>: Increasing resolution, reducing banding
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_27.html">previous</A>, <A HREF="gimpprint_29.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_29.html b/doc/manual-html/gimpprint_29.html
new file mode 100644
index 0000000..bd893a6
--- /dev/null
+++ b/doc/manual-html/gimpprint_29.html
@@ -0,0 +1,111 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Simple weaving algorithms</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_28.html">previous</A>, <A HREF="gimpprint_30.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H3><A NAME="SEC44" HREF="gimpprint_toc.html#TOC44">B.2.1 Simple weaving algorithms</A></H3>
+
+<P>
+The initial problem is to calculate the starting position of each
+pass; the row number of the printer's top jet when printing that pass.
+Since we assume the paper cannot be reverse-fed, the print head must,
+for each pass, start either further down the page than the previous
+pass or at the same position. Each pass's start point is therefore at
+a non-negative offset from the previous pass's start point.
+
+</P>
+<P>
+Once we have a formula for the starting row of each pass, we then turn
+that "inside out" to get a formula for the pass number containing each
+row.
+
+</P>
+<P>
+First, let's define how our printer works. We measure vertical
+position on the paper in "rows"; the resolution with which the printer
+can position the paper vertically. The print head contains @math{J} ink
+jets, which are spaced @math{S} rows apart.
+
+</P>
+<P>
+Consider a very simple case: we want to print a page as quickly as
+possible, and we mostly don't care how sparse the printing is, so long
+as it's fairly even.
+
+</P>
+<P>
+It's pretty obvious how to do this. We make one pass with the print
+head, printing @math{J} lines of data, each line @math{S} rows after the
+previous one. We then advance the paper by @math{S*J} rows and print
+the next row. For example, if @math{J=7} and @math{S=4}, this method
+can be illustrated like this:
+
+</P>
+
+<PRE>
+pass number
+| row number-------&#62;
+| | 111111111122222222223333333333444444444455555555556666666666
+| 0123456789012345678901234567890123456789012345678901234567890123456789
+0 *---*---*---*---*---*---*
+1 *---*---*---*---*---*---*
+2 \-----------------------/ *---*---*---*---*---*-
+ 7 jets \---/
+ 4 rows offset from one jet to the next
+ \---------------------------/
+ 7*4=28 rows offset from one pass to the next
+</PRE>
+
+<P>
+In these examples, the vertical axis can be thought of as the time axis,
+with the pass number shown at the left margin, while the row number runs
+horizontally. A <SAMP>`*'</SAMP> shows each row printed by a pass, and a row of
+<SAMP>`-'</SAMP> is used to link together the rows printed by one pass of the
+print head. The first pass is numbered <SAMP>`0'</SAMP> and starts at row 0.
+Each subsequent pass @math{p} starts at row @math{p*S*J}. Each pass
+prints @math{J} lines, each line being @math{S} rows after the previous
+one. (For ease of viewing this file on a standard terminal, I'm
+clipping the examples at column 80.)
+
+</P>
+<P>
+This method covers the whole page with lines printed evenly @math{S}
+rows apart. However, we want to fill in all the other rows with
+printing to get a full-density page (we're ignoring oversampling at this
+stage). Where we have previously printed a single pass, we'll now print
+a "pass block": we print extra passes to fill in the empty rows. A
+naive implementation might look like this:
+
+</P>
+
+<PRE>
+0 *---*---*---*---*---*---*
+1 *---*---*---*---*---*---*
+2 *---*---*---*---*---*---*
+3 *---*---*---*---*---*---*
+4 *---*---*---*---*---*---*
+5 *---*---*---*---*---*---*
+6 *---*---*---*---*---*---*
+7 *---*---*---*---*---*---*
+8 *---*---*---*---*---*-
+9 *---*---*---*---*---*
+10 *---*---*---*---*---
+11 *---*---*---*---*--
+</PRE>
+
+<P>
+(Now you can see why this process is called "weaving"!)
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_28.html">previous</A>, <A HREF="gimpprint_30.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_3.html b/doc/manual-html/gimpprint_3.html
new file mode 100644
index 0000000..e64b2eb
--- /dev/null
+++ b/doc/manual-html/gimpprint_3.html
@@ -0,0 +1,41 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Overview</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_2.html">previous</A>, <A HREF="gimpprint_4.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC6" HREF="gimpprint_toc.html#TOC6">1 Overview</A></H1>
+<P>
+<A NAME="IDX4"></A>
+
+</P>
+<P>
+The GIMP-Print package is a collection of programs and a library for
+high quality printing on modern inkjets, including `photographic
+quality' models which offer very high resolutions and several inks.
+
+</P>
+
+<P>
+META: Short history of the project
+
+</P>
+<P>
+GIMP-Print is the print facility of the <STRONG>GNU Image Manipulation Program</STRONG>
+(GIMP). It is in addition
+a suite of drivers that may be used with common UNIX spooling systems
+using GhostScript or CUPS. These drivers provide printing quality for
+UNIX/Linux on a par with proprietary vendor-supplied drivers in many
+cases, and can be used for many of the most demanding printing tasks.
+The core of GIMP-Print is a shared library (libgimpprint) which may be
+used by any program that wishes to produce high-qulaity printed output.
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_2.html">previous</A>, <A HREF="gimpprint_4.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_30.html b/doc/manual-html/gimpprint_30.html
new file mode 100644
index 0000000..b947f40
--- /dev/null
+++ b/doc/manual-html/gimpprint_30.html
@@ -0,0 +1,246 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Perfect weaving</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_29.html">previous</A>, <A HREF="gimpprint_31.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H3><A NAME="SEC45" HREF="gimpprint_toc.html#TOC45">B.2.2 Perfect weaving</A></H3>
+<P>
+<A NAME="IDX185"></A>
+
+</P>
+<P>
+This simple weave pattern prints every row, but will give conspicuous
+banding patterns for the reasons discussed above.
+
+</P>
+<P>
+Let's start improving this for our simple case. We can reduce banding
+by making sure that any given jet never prints a row too close to
+another row printed by the same jet. This means we want to space the
+rows printed by a given jet evenly down the page. In turn, this
+implies we want to advance the paper by as nearly an equal amount
+after each pass as possible.
+
+</P>
+<P>
+Each pass block prints @math{S*J} lines in @math{S} passes. The first
+line printed in each pass block is @math{S*J} rows lower on the page
+than the first line printed in the previous pass block. Therefore, if
+we advance the paper by @math{J} rows between each pass, we can print
+the right number of passes in each block and advance the paper perfectly
+evenly.
+
+</P>
+<P>
+Here's what this "perfect" weave looks like:
+
+</P>
+
+<PRE>
+ start of full weave
+ |
+0 *---*---*---*---*---*---*
+1 *---*---*---*---*---*---*
+2 *---*---*---*---*---*---*
+3 *---*---*---*---*---*---*
+4 *---*---*---*---*---*---*
+5 *---*---*---*---*---*---*
+6 *---*---*---*---*---*---*
+7 *---*---*---*---*---*---*
+8 *---*---*---*---*---*-
+9 *---*---*---*--
+10 *---*---
+11 *
+</PRE>
+
+<P>
+You'll notice that, for the first few rows, this weave is too sparse.
+It is not until the row marked "start of full weave" that every
+subsequent row is printed. We can calculate this start position as
+follows:
+
+</P>
+
+<PRE>
+@math{start = (S-1) * (J-1)}
+</PRE>
+
+<P>
+For the moment, we will ignore this problem with the weave. We'll
+consider later how to fill in the missing rows.
+
+</P>
+<P>
+Let's look at a few more examples of perfect weaves:
+
+</P>
+
+<P>
+@math{S=2}, @math{J=7}, @math{start=(2-1)*(7-1)=6}:
+
+</P>
+
+<PRE>
+ starting row of full weave
+ |
+0 *-*-*-*-*-*-*
+1 *-*-*-*-*-*-*
+2 *-*-*-*-*-*-*
+3 *-*-*-*-*-*-*
+4 *-*-*-*-*-*-*
+5 *-*-*-*-*-*-*
+6 *-*-*-*-*-*-*
+7 *-*-*-*-*-*-*
+</PRE>
+
+<P>
+@math{S=7}, @math{J=2}, @math{start=6}:
+
+</P>
+
+<PRE>
+ start
+ |
+0 *------*
+1 *------*
+2 *------*
+3 *------*
+4 *------*
+5 *------*
+6 *------*
+7 *------*
+8 *------*
+9 *------*
+</PRE>
+
+<P>
+@math{S=4}, @math{J=13}, @math{start=36}:
+
+</P>
+
+<PRE>
+ start
+ |
+0 *---*---*---*---*---*---*---*---*---*---*---*---*
+1 *---*---*---*---*---*---*---*---*---*---*---*---*
+2 *---*---*---*---*---*---*---*---*---*---*---*---*
+3 *---*---*---*---*---*---*---*---*---*--
+4 *---*---*---*---*---*---*-
+5 *---*---*---*
+</PRE>
+
+<P>
+@math{S=13}, @math{J=4}, @math{start=36}:
+
+</P>
+
+<PRE>
+ start
+ |
+0 *------------*------------*------------*
+1 *------------*------------*------------*
+2 *------------*------------*------------*
+3 *------------*------------*------------*
+4 *------------*------------*------------*
+5 *------------*------------*------------*
+6 *------------*------------*------------*
+7 *------------*------------*------------*
+8 *------------*------------*------------*
+9 *------------*------------*------------*
+10 *------------*------------*-----------
+11 *------------*------------*-------
+12 *------------*------------*---
+13 *------------*------------
+14 *------------*--------
+15 *------------*----
+16 *------------*
+17 *---------
+18 *-----
+19 *-
+</PRE>
+
+<P>
+@math{S=8}, @math{J=5}, @math{start=28}:
+
+</P>
+
+<PRE>
+ start
+ |
+0 *-------*-------*-------*-------*
+1 *-------*-------*-------*-------*
+2 *-------*-------*-------*-------*
+3 *-------*-------*-------*-------*
+4 *-------*-------*-------*-------*
+5 *-------*-------*-------*-------*
+6 *-------*-------*-------*-------*
+7 *-------*-------*-------*-------*
+8 *-------*-------*-------*-------*
+9 *-------*-------*-------*-------*
+10 *-------*-------*-------*---
+11 *-------*-------*------
+12 *-------*-------*-
+13 *-------*----
+14 *-------
+15 *--
+</PRE>
+
+<P>
+@math{S=9}, @math{J=5}, @math{start=32}:
+
+</P>
+
+<PRE>
+ start
+ |
+0 *--------*--------*--------*--------*
+1 *--------*--------*--------*--------*
+2 *--------*--------*--------*--------*
+3 *--------*--------*--------*--------*
+4 *--------*--------*--------*--------*
+5 *--------*--------*--------*--------*
+6 *--------*--------*--------*--------*
+7 *--------*--------*--------*--------*
+8 *--------*--------*--------*--------*
+9 *--------*--------*--------*-----
+10 *--------*--------*--------*
+11 *--------*--------*----
+12 *--------*--------
+13 *--------*---
+14 *-------
+15 *--
+</PRE>
+
+<P>
+@math{S=6}, @math{J=7}, @math{start=30}:
+
+</P>
+
+<PRE>
+ start
+ |
+0 *-----*-----*-----*-----*-----*-----*
+1 *-----*-----*-----*-----*-----*-----*
+2 *-----*-----*-----*-----*-----*-----*
+3 *-----*-----*-----*-----*-----*-----*
+4 *-----*-----*-----*-----*-----*-----*
+5 *-----*-----*-----*-----*-----*-----*
+6 *-----*-----*-----*-----*-----*-----
+7 *-----*-----*-----*-----*----
+8 *-----*-----*-----*---
+9 *-----*-----*--
+10 *-----*-
+11 *
+</PRE>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_29.html">previous</A>, <A HREF="gimpprint_31.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_31.html b/doc/manual-html/gimpprint_31.html
new file mode 100644
index 0000000..c4c1a4b
--- /dev/null
+++ b/doc/manual-html/gimpprint_31.html
@@ -0,0 +1,87 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Weaving collisions</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_30.html">previous</A>, <A HREF="gimpprint_32.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H3><A NAME="SEC46" HREF="gimpprint_toc.html#TOC46">B.2.3 Weaving collisions</A></H3>
+<P>
+<A NAME="IDX186"></A>
+<A NAME="IDX187"></A>
+
+</P>
+<P>
+This perfect weave is not possible in all cases. Let's look at another
+example:
+
+</P>
+<P>
+@math{S=6}, @math{J=4}:
+
+</P>
+
+<PRE>
+0 *-----*-----*-----*
+1 *-----*-----*-----*
+2 *-----*-----*-----*
+3 *-----*-----*-----*
+4 ^ *-^---*-----*-----*
+5 | ^ | *-^---*-----*-----*
+ OUCH! ^ | ^
+ | |
+</PRE>
+
+<P>
+Here we have a collision. Some lines printed in later passes overprint
+lines printed by earlier passes. We can see why by considering which
+row number is printed by a given jet number @math{j} (numbered from 0)
+of a given pass, @math{p}:
+
+</P>
+
+<PRE>
+@math{row(p, j) = p*J + j*S}
+</PRE>
+
+<P>
+Because @math{J=4} and @math{S=6} have a common factor of 2, jet 2 of
+pass 0 prints the same row as jet 0 of pass 3:
+
+</P>
+
+<PRE>
+@math{row(0, 2) = 0*4 + 2*6 = 12}
+@math{row(3, 0) = 3*4 + 0*6 = 12}
+</PRE>
+
+<P>
+In fact, with this particular weave pattern, jets 0 and 1 of pass
+@math{p+3} always overprint jets 2 and 3 of pass @math{p}. We'll
+represent overprinting rows by a <SAMP>`^'</SAMP> in our diagrams, and correct
+rows by <SAMP>`*'</SAMP>:
+
+</P>
+<P>
+@math{S=6} @math{J=4}:
+
+</P>
+
+<PRE>
+0 *-----*-----*-----*
+1 *-----*-----*-----*
+2 *-----*-----*-----*
+3 ^-----^-----*-----*
+4 ^-----^-----*-----*
+5 ^-----^-----*-----*
+</PRE>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_30.html">previous</A>, <A HREF="gimpprint_32.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_32.html b/doc/manual-html/gimpprint_32.html
new file mode 100644
index 0000000..3a118f5
--- /dev/null
+++ b/doc/manual-html/gimpprint_32.html
@@ -0,0 +1,723 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - What is perfect weaving?</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_31.html">previous</A>, <A HREF="gimpprint_33.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H3><A NAME="SEC47" HREF="gimpprint_toc.html#TOC47">B.2.4 What makes a "perfect" weave?</A></H3>
+<P>
+<A NAME="IDX188"></A>
+
+</P>
+<P>
+So what causes the perfect weave cases to be perfect, and the other
+cases not to be? In all the perfect cases above, @math{S} and @math{J}
+are relatively prime (i.e. their greatest common divisor (GCD) is 1).
+As we mentioned above, @math{S=6} and @math{J=4} have a common factor,
+which causes the overprinting. Where @math{S} and @math{J} have a GCD
+of 1, they have no common factor other than 1 and, as a result, no
+overprinting occurs. If @math{S} and @math{J} are not relatively prime,
+their common factor will cause overprinting.
+
+</P>
+<P>
+We can work out the greatest common divisor of a pair of natural numbers
+using Euler's algorithm:
+
+</P>
+
+<UL>
+<LI>Start with the two numbers: (e.g.) 9, 24
+
+<LI>Swap them if necessary so that the larger one comes first: 24, 9
+
+<LI>Subtract the second number from the first: 15, 9
+
+<LI>Repeat until the first number becomes smaller: 6, 9
+
+<LI>Swap the numbers again, so the larger one comes first: 9, 6
+
+<LI>Subtract again: 3, 6
+
+<LI>Swap: 6, 3
+
+<LI>Subtract: 3, 3
+
+<LI>And again: 0, 3
+
+<LI>When one of the numbers becomes 0, the other number is the GCD of the two numbers you started with.
+
+</UL>
+
+<P>
+These repeated subtractions can be done with C's <SAMP>`%'</SAMP> operator, so we
+can write this in C as follows:
+
+</P>
+
+<PRE>
+unsigned int
+gcd(unsigned int x, unsigned int y)
+{
+ if (y == 0)
+ return x;
+ while (x != 0) {
+ if (y &#62; x)
+ swap (&#38;x, &#38;y);
+ x %= y;
+ }
+ return y;
+}
+</PRE>
+
+<P>
+<SAMP>`gcd(S,J)'</SAMP> will feature quite prominently in our weaving algorithm.
+
+</P>
+<P>
+If @math{0 &#60;= j &#60; J}, there should only be a single pair @math{(p, j)}
+for any given row number. If @math{S} and @math{J} are not relatively
+prime, this assumption breaks down. (For conciseness, let
+@math{G=GCD(S,J)}.)
+
+</P>
+<P>
+@math{S=8}, @math{J=6}, @math{G=2}:
+
+</P>
+
+<PRE>
+0 *-------*-------*-------*-------*-------*
+1 *-------*-------*-------*-------*-------*
+2 *-------*-------*-------*-------*-------*
+3 *-------*-------*-------*-------*-------*
+4 ^-------^-------^-------*-------*-------*
+5 ^-------^-------^-------*-------*-------*
+</PRE>
+
+<P>
+In this case, jets 0, 1 and 2 of pass @math{p+4} collide with jets 3, 4
+and 5 of pass @math{p}.
+
+</P>
+<P>
+How can we calculate these numbers? Suppose we were to print using
+fewer jets, say @math{J/G} jets. The greatest common divisor of
+@math{J/G} and @math{S} is 1, enabling a perfect weave. But to get a
+perfect weave, we also have to advance the paper by a factor of @math{G}
+less:
+
+</P>
+
+<PRE>
+0 *-------*-------* - - -
+1 *-------*-------* - - -
+2 *-------*-------* - - -
+3 *-------*-------* - - -
+4 *-------*-------* - - -
+5 *-------*-------* - - -
+</PRE>
+
+<P>
+If we left the paper advance alone, we'd get a sparse weave; only one
+row can be printed every @math{G} rows:
+
+</P>
+
+<PRE>
+0 *-------*-------* - - -
+1 *-------*-------* - - -
+2 *-------*-------* - - -
+3 *-------*-------* - - -
+4 *-------*-------* - - -
+5 *-------*-------* - - -
+ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^ ^
+ These rows need filling in.
+</PRE>
+
+<P>
+The rows that would have been printed by the jets we've now omitted
+(shown as <SAMP>`-'</SAMP>) are printed by other jets on later passes.
+
+</P>
+<P>
+Let's analyse this. Consider how a pass @math{p} could collide with
+pass 0. Pass @math{p} starts at offset @math{p*J}. Pass 0 prints at
+rows which are multiples of @math{S}. If @math{p*J} is exactly
+divisible by @math{S}, a collision has occurred, unless @math{p*J &#62;=
+J*S} (which will happen when we finish a pass block).
+
+</P>
+<P>
+So, we want to find @math{p} and @math{q} such that @math{p*J=q*S} and
+@math{p} is minimised. Then @math{p} is the number of rows before a
+collision, and @math{q} is the number of jets in pass 0 which are not
+involved in the collision. To do this, we find the lowest common
+multiple of @math{J} and @math{S}, which is @math{L=J*S/G}. @math{L/J}
+is the number of rows before a collision, and @math{L/S} is the number
+of jets in the first pass not involved in the collision.
+
+</P>
+<P>
+Thus, we see that the first @math{J/G} rows printed by a given pass are
+not overprinted by any later pass. However, the rest of the rows
+printed by pass @math{p} are overprinted by the first
+@math{J-(J/G)} jets of pass @math{p+(S/G)}. We will use @math{C}
+to refer to @math{S/G}, the number of rows after which a collision
+occurs.
+
+</P>
+<P>
+Another example:
+
+</P>
+<P>
+@math{S=6}, @math{J=9}, @math{G=3}, @math{C=S/G=2}:
+
+</P>
+
+<PRE>
+0 *-----*-----*-----*-----*-----*-----*-----*-----*
+1 *-----*-----*-----*-----*-----*-----*-----*-----*
+2 ^-----^-----^-----^-----^-----^-----*-----*-----*
+3 ^-----^-----^-----^-----^-----^-----*-----*-----*
+4 ^-----^-----^-----^-----^-----^-----*-----
+5 ^-----^-----^-----^-----^-----^--
+ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^ ^^
+ These rows need filling in.
+</PRE>
+
+<P>
+In this case, the first @math{J-(J/G) = 9-9/3 = 6} jets of pass
+@math{p+(6/3)=p+2} collide with the last 6 jets of pass @math{p}. Only
+one row in every @math{G=2} rows is printed by this weave.
+
+</P>
+<P>
+@math{S=9}, @math{J=6}, @math{G=3}, @math{C=3}:
+
+</P>
+
+<PRE>
+0 *--------*--------*--------*--------*--------*
+1 *--------*--------*--------*--------*--------*
+2 *--------*--------*--------*--------*--------*
+3 ^--------^--------^--------^--------*--------*
+4 ^--------^--------^--------^--------*--------*
+5 ^--------^--------^--------^--------*--------*
+</PRE>
+
+<P>
+Here, the first @math{J-(J/G) = 6-6/3 = 4} jets of pass
+@math{p+(9/3)=p+3} collide with the last 4 jets of pass @math{p}.
+
+</P>
+<P>
+Note that, in these overprinting cases, only rows divisible by @math{G}
+are ever printed. The other rows, those not divisible by @math{G}, are
+not touched by this weave.
+
+</P>
+<P>
+We can modify our weave pattern to avoid overprinting any rows and
+simultaneously fill in the missing rows. Instead of using @math{J}
+alone to determine the start of each pass from the previous pass, we
+adjust the starting position of some passes. As mentioned before, we
+will divide the page into pass blocks, with @math{S} passes in each
+block. This ensures that the first jet of the first pass in a block
+prints the row which the @math{J}th jet of the first pass of the
+previous block would have printed, if the print head had one extra jet.
+
+</P>
+<P>
+Looking back at an example of a perfect weave, we can divide it into
+pass blocks:
+
+</P>
+<P>
+@math{S=7}, @math{J=2}, @math{G=1}:
+
+</P>
+
+<PRE>
+ imaginary extra jet
+ |
+0 *------* * &#60;--start of pass block 0
+1 *------* |
+2 *------* |
+3 *------*|
+4 *-----|*
+5 *---|--*
+6 *-|----*
+ |
+7 *------* &#60;--start of pass block 1
+8 *------*
+9 *------*
+</PRE>
+
+<P>
+We can now calculate the start of a given pass by reference to its pass
+block. The first pass of pass block @math{b} always starts at row
+@math{(b*S*J)}. The start row of each of the other passes in the block
+are calculated using offsets from this row.
+
+</P>
+<P>
+For the example above, there are 7 passes in each pass block, and their
+offsets are 0, 2, 4, 6, 8, 10 and 12. The next pass block is offset
+@math{S*J=14} rows from the start of the current pass block.
+
+</P>
+<P>
+The simplest way to modify the "perfect" weave pattern to give a
+correct weave in cases where @math{G!=1} is to simply change any offsets
+which would result in a collision, until the collision disappears.
+Every printed row in the weave, as we have shown it up to now, is
+separated from each of its neighbouring printed rows by @math{G} blank
+rows. We will add an extra offset to each colliding pass in such a way
+that we push the pass onto these otherwise blank rows.
+
+</P>
+<P>
+We have seen that, unless @math{G=1}, the plain weave pattern results in
+each pass colliding with the pass @math{S/G} passes before. We will now
+subdivide our pass block into subblocks, each consisting of @math{B=S/G}
+passes. There are therefore @math{G} subblocks in a pass block.
+
+</P>
+<P>
+For each subblock, the passes in that subblock have a constant offset
+added to them. The offset is different for each subblock in a block.
+There are many ways we can choose the offsets, but the simplest is to
+make the offset equal to the subblock number (starting from 0).
+
+</P>
+<P>
+Thus, the passes in the first subblock in each pass block remain at the
+offsets we've already calculated from @math{J}. The passes in the
+second subblock each have 1 added to their offset, the passes in the
+third subblock have 2 added, and so on. Thus, the offset of pass
+@math{p} (numbered relative to the start of its pass block) is @math{p*J
++ floor(p/B)}.
+
+</P>
+<P>
+This gives us a weave pattern looking like this:
+
+</P>
+<P>
+@math{S=6}, @math{J=9}, @math{G=3}, @math{B=2}:
+
+</P>
+
+<PRE>
+0 *-----*-----*-----*-----*-----*-----*-----*-----*
+1 ^ *-----*-----*-----*-----*-----*-----*-----*-----*
+2 | +-&#62; *-----*-----*-----*-----*-----*-----*-----*-----*
+3 | | *-----*-----*-----*-----*-----*-----*-----*-----*
+4 | | +-&#62; *-----*-----*-----*-----*-----*-----*---
+5 | | | *-----*-----*-----*-----*-----*
+6 | | | +-&#62; *-----*-----*-----*-----
+7 | | | | *-----*-----*--
+ | | | start of pass block 1
+ | | | (offset returns to 0)
+ | | start of subblock 2 (offset 2 rows)
+ | start of subblock 1 (following passes offset by 1 row)
+ start of passblock 0, subblock 0 (pass start calculated as p*J)
+</PRE>
+
+<P>
+@math{S=9}, @math{J=6}, @math{G=3}, @math{B=3}:
+
+</P>
+
+<PRE>
+0 *--------*--------*--------*--------*--------*
+1 *--------*--------*--------*--------*--------*
+2 *--------*--------*--------*--------*--------*
+3 *--------*--------*--------*--------*--------*
+4 *--------*--------*--------*--------*--------*
+5 *--------*--------*--------*--------*--------*
+6 *--------*--------*--------*--------*---
+7 *--------*--------*--------*------
+8 *--------*--------*--------*
+9 *--------*--------*-----
+10 \---/ *--------*--------
+11 small offset *--------*--
+12 *----
+</PRE>
+
+<P>
+This method of choosing offsets for subblocks can result in an occasional
+small offset (as shown above) between one pass and the next, particularly
+when @math{G} is large compared to @math{J}. For example:
+
+</P>
+<P>
+@math{S=8}, @math{J=4}, @math{G=4}, @math{B=2}:
+
+</P>
+
+<PRE>
+0 *-------*-------*-------*
+1 *-------*-------*-------*
+2 *-------*-------*-------*
+3 *-------*-------*-------*
+4 *-------*-------*-------*
+5 *-------*-------*-------*
+6 *-------*-------*-------*
+7 *-------*-------*-------*
+8 *-------*-------*-------*
+9 \/ *-------*-------*-------*
+ very small offset!
+</PRE>
+
+<P>
+We can plot the offset against the subblock number as follows:
+
+</P>
+
+<PRE>
+subblock number
+| offset
+| |
+| 0123
+0 *
+1 *
+2 *
+3 *
+0 *
+1 *
+2 *
+3 *
+</PRE>
+
+<P>
+The discontinuity in this plot results in the small offset between
+passes.
+
+</P>
+<P>
+As we said at the beginning, we want the offsets from each pass to the
+next to be as similar as possible. We can fix this by calculating the
+offset for a given subblock b as follows:
+
+</P>
+
+<PRE>
+ offset(b) = 2*b , if b &#60; ceiling(G/2)
+ = 2*(G-b)-1 , otherwise
+</PRE>
+
+<P>
+We can visualise this as follows, for @math{G=10}:
+
+</P>
+
+<PRE>
+ 0123456789
+0 *
+1 *
+2 *
+3 *
+4 *
+5 *
+6 *
+7 *
+8 *
+9 *
+0 *
+1 *
+2 *
+3 *
+4 *
+5 *
+6 *
+7 *
+8 *
+9 *
+</PRE>
+
+<P>
+and for @math{G=11}:
+
+</P>
+
+<PRE>
+ 1
+ 01234567890
+ 0 *
+ 1 *
+ 2 *
+ 3 *
+ 4 *
+ 5 *
+ 6 *
+ 7 *
+ 8 *
+ 9 *
+10 *
+ 0 *
+ 1 *
+ 2 *
+ 3 *
+ 4 *
+ 5 *
+ 6 *
+ 7 *
+ 8 *
+ 9 *
+10 *
+</PRE>
+
+<P>
+This gives a weave looking like this:
+
+</P>
+<P>
+@math{S=12}, @math{J=6}, @math{G=6}, @math{B=2}:
+
+</P>
+
+<PRE>
+0 *-----------*-----------*-----------*-----------*-----------*
+1 *-----------*-----------*-----------*-----------*-----------*
+2 *-----------*-----------*-----------*-----------*-----------*
+3 *-----------*-----------*-----------*-----------*---------
+4 *-----------*-----------*-----------*-----------*-
+5 *-----------*-----------*-----------*-------
+6 *-----------*-----------*-----------*
+7 *-----------*-----------*------
+8 *-----------*-----------*--
+9 *-----------*--------
+10 *-----------*----
+11 *----------
+12 *-----
+</PRE>
+
+<P>
+This method ensures that the offset between passes is always in the range
+@math{[J-2,J+2]}.
+
+</P>
+<P>
+(This might seem odd, but it occurs to me that a good weave pattern
+might also make a good score for bell ringers. When church bells are
+rung, a list of "changes" are used. For example, if 8 bells are being
+used, they will, at first, be rung in order: 12345678. If the first
+change is for bells 5 and 6, the bells will then be rung in the order
+12346578. If the second change is 1 and 2, the next notes are 21346578.
+After a long list of changes, the order the bells are rung in can become
+quite complex.
+
+</P>
+<P>
+For a group of bell-ringers to change the order of the notes, they must
+each either delay their bell's next ring, hasten it, or keep it the same
+as the time it takes to ring all the bells once. The length of time
+between each ring of a given bell can only be changed a little each
+time, though; with an ink-jet weave pattern, we want the same to apply
+to the distance between passes.)
+
+</P>
+<P>
+Finally, knowing the number of jets @math{J} and their separation
+@math{S}, we can calculate the starting row of any given pass @math{p}
+as follows:
+
+</P>
+
+<PRE>
+passesperblock = S
+passblock = floor(p / passesperblock)
+offsetinpassblock = p - passblock * passesperblock
+subblocksperblock = gcd(S, J)
+passespersubblock = S / subblocksperblock
+subpassblock = floor(offsetinpassblock / passespersubblock)
+if subpassblock &#60; ceiling(subblocksperblock/2)
+ subblockoffset = 2*subpassblock
+else
+ subblockoffset = 2*(subblocksperblock-subpassblock)-1
+startingrow = passblock * S * J + offsetinpassblock * J + subblockoffset
+</PRE>
+
+<P>
+We can simplify this down to the following:
+
+</P>
+
+<PRE>
+subblocksperblock = gcd(S, J)
+subpassblock = floor((p % S) * subblocksperblock / S)
+if subpassblock * 2 &#60; subblocksperblock
+ subblockoffset = 2*subpassblock
+else
+ subblockoffset = 2*(subblocksperblock-subpassblock)-1
+startingrow = p * J + subblockoffset
+</PRE>
+
+<P>
+So the row number of jet @math{j} of pass @math{p} is
+
+</P>
+
+<PRE>
+subblocksperblock = gcd(S, J)
+
+subblockoffset(p)
+ = 2*subpassblock , if subpassblock * 2 &#60; subblocksperblock
+ = 2*(subblocksperblock-subpassblock)-1 , otherwise
+ where
+ subpassblock = floor((p % S) * subblocksperblock / S)
+
+row(j, p) = p * J + subblockoffset(p) + j * S
+</PRE>
+
+<P>
+Together with the inequality @math{0 &#60;= j &#60; J}, we can use this
+definition in reverse to calculate the pass number containing a given
+row, @math{r}. Working out the inverse definition involves a little
+guesswork, but one possible result is as follows. Given a row,
+@math{r}, which is known to be the first row of a pass, we can calculate
+the pass number as follows:
+
+</P>
+
+<PRE>
+subblocksperblock = gcd(S, J)
+subblockoffset = r % subblocksperblock
+pass = (r - subblockoffset) / J
+</PRE>
+
+<P>
+If @math{G==1}, we can determine the pass number with this algorithm:
+
+</P>
+
+<PRE>
+offset = r % J
+pass = (r - offset) / J
+while (offset % S != 0)
+{
+ pass--
+ offset += J
+}
+jet = offset / S
+</PRE>
+
+<P>
+Generalising, we come up with this algorithm. Given @math{r}, @math{S}
+and @math{J}:
+
+</P>
+
+<PRE>
+G = gcd(S, J)
+passespersubblock = S/G
+subblockoffset = r % G
+subpassblock = subblockoffset / 2 , if subblockoffset % 2 == 0
+ = G - (subblockoffset+1)/2 , otherwise
+baserow = r - subblockoffset - (subpassblock * passespersubblock * J)
+offset = baserow % J
+pass = (baserow - offset) / J
+while (offset % S != 0)
+{
+ offset += J
+ pass -= 1
+}
+subblockretreat = floor(pass / passespersubblock) % G
+pass -= subblockretreat * passespersubblock
+pass += subpassblock * passespersubblock
+jet = (r - subblockoffset - pass * J) / S
+</PRE>
+
+<P>
+Let's look at some examples of imperfect but correct weave patterns:
+
+</P>
+<P>
+@math{S=6}, @math{J=4}, @math{GCD=2},
+<BR>passesperblock=@math{S}=6,
+<BR>passespersubblock=@math{S/G}=6/2=3:
+
+</P>
+
+<PRE>
+0 *-----*-----*-----*
+1 *-----*-----*-----*
+2 *-----*-----*-----*
+3 *-----*-----*-----*
+4 *-----*-----*-----*
+5 *-----*-----*-----*
+6 *-----*-----*-----*
+7 *-----*-----*-----*
+8 *-----*-----*-----*
+9 *-----*-----*-----*
+10 *-----*-----*-----*
+11 *-----*-----*-----*
+12 *-----*-----*-----*
+13 *-----*-----*-----*
+14 *-----*-----*-----*
+15 *-----*-----*----
+16 *-----*-----*
+17 *-----*--
+18 *-----
+19 *-
+</PRE>
+
+<P>
+@math{S=8}, @math{J=6}, @math{G=2},
+<BR>passesperblock=@math{S}=8,
+<BR>passespersubblock=@math{S/G}=8/2=4:
+
+</P>
+
+<PRE>
+0 *-------*-------*-------*-------*-------*
+1 *-------*-------*-------*-------*-------*
+2 *-------*-------*-------*-------*-------*
+3 *-------*-------*-------*-------*-------*
+4 *-------*-------*-------*-------*-------*
+5 *-------*-------*-------*-------*-------*
+6 *-------*-------*-------*-------*-------*
+7 *-------*-------*-------*-------*--
+8 *-------*-------*-------*-----
+9 *-------*-------*-------
+10 *-------*-------*-
+11 *-------*---
+12 *----
+</PRE>
+
+<P>
+@math{S=6}, @math{J=12}, @math{G=6},
+<BR>passesperblock=@math{S}=6,
+<BR>passespersubblock=@math{S/G}=6/6=1:
+
+</P>
+
+<PRE>
+0 *-----*-----*-----*-----*-----*-----*-----*-----*-----*-----*-----*
+1 *-----*-----*-----*-----*-----*-----*-----*-----*-----*-----*---
+2 *-----*-----*-----*-----*-----*-----*-----*-----*-
+3 *-----*-----*-----*-----*-----*-----*
+4 *-----*-----*-----*-----*--
+5 *-----*-----*----
+6 *-----
+</PRE>
+
+<P>
+We have now solved the basic weaving problem. There are two further
+refinements we need to consider: oversampling, and filling in the
+missing rows at the start of the weave.
+
+</P>
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_31.html">previous</A>, <A HREF="gimpprint_33.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_33.html b/doc/manual-html/gimpprint_33.html
new file mode 100644
index 0000000..edf4627
--- /dev/null
+++ b/doc/manual-html/gimpprint_33.html
@@ -0,0 +1,247 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Oversampling</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_32.html">previous</A>, <A HREF="gimpprint_34.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H3><A NAME="SEC48" HREF="gimpprint_toc.html#TOC48">B.2.5 Oversampling</A></H3>
+<P>
+<A NAME="IDX189"></A>
+
+</P>
+<P>
+By oversampling, we mean printing on the same row more than once.
+There are two reasons for oversampling: to increase the horizontal
+resolution of the printout and to reduce banding.
+
+</P>
+<P>
+Oversampling to increase horizontal resolution is necessary because,
+although the printer might be able to position an ink drop to, for
+example, 1/1440" horizontally, it may not be able to lay down two such
+drops 1/1440" apart. If it can print two drops 1/720" apart, 2x
+oversampling will be necessary to get a 1/1440" horizontal resolution.
+If it can only print two drops 1/360" apart, 4x oversampling will be
+necessary for a 1/1440" horizontal resolution. The printer enforces
+this "drop spacing" by only accepting raster passes with a horizontal
+resolution matching the spacing with which it can print dots, so we
+must print passes at different horizontal positions if we are to
+obtain a higher horizontal resolution. (Another reason it does this
+may be to reduce the amount of memory needed in the printer.)
+
+</P>
+<P>
+Oversampling can also be done to decrease the banding apparent in an
+image. By splitting a row into two or more sets of dots ("lines") and
+printing each line on the same row, but with a different nozzle for
+each line, we can get a smoother print.
+
+</P>
+<P>
+To quantify these two kinds of oversampling, we'll introduce two new
+constants: @math{H} shows how many different horizontal offsets we want
+to print at (the "horizontal oversampling") while @math{O} shows how
+many times we want to print each row, over and above the number of times
+necessary for horizontal oversampling (the "extra oversampling").
+
+</P>
+<P>
+It is necessary for all the lines printed by a given pass to have the
+same horizontal offset, but there need not be any relation between
+them in terms of extra oversampling. For the moment, however, we will
+treat all oversampling as potentially requiring this alignment; all
+lines in one pass must be derived from the original row data in the
+same way. Thus, we'll assume @math{O=1} for now.
+
+</P>
+<P>
+So, how do we do this oversampling? In fact, it can be done easily:
+advance the paper by a factor of @math{H} less between each pass. We'll
+define a new variable, @math{A}, to show how much we advance the paper
+between passes. Previously, we'd have defined @math{A=J}; we now let
+@math{A=J/H}. This also affects our pass blocks. Printing one pass
+block used to involve advancing the paper @math{S*J} rows; it now
+advances the paper @math{S*J/H} rows. We therefore name a group of
+@math{H} pass blocks a "band". Printing one band involves advancing
+the paper @math{S*J} rows, as a pass block did before.
+
+</P>
+<P>
+To keep our weave pattern working correctly, so that overprinting does
+not occur within a pass block, we also have to redefine @math{G} as
+@math{GCD(S,A)}. Here's an example of an oversampled weave pattern:
+
+</P>
+<P>
+@math{S=4}, @math{J=10}, @math{H=2}, @math{A=J/H=10/2=5},
+@math{G=GCD(4,5)=1},
+<BR>passesperblock=@math{S}=4,
+<BR>passespersubblock=@math{S/G}=4/1=4:
+
+</P>
+
+<PRE>
+0 *---*---*---*---*---*---*---*---*---*
+1 *---*---*---*---*---*---*---*---*---*
+2 *---*---*---*---*---*---*---*---*---*
+3 *---*---*---*---*---*---*---*---*---*
+4 *---*---*---*---*---*---*---*---*---*
+5 *---*---*---*---*---*---*---*---*---*
+6 *---*---*---*---*---*---*---*---*---*
+7 *---*---*---*---*---*---*---*---*---*
+8 *---*---*---*---*---*---*---*---*---*
+9 *---*---*---*---*---*---*---*---*
+10 *---*---*---*---*---*---*---
+11 *---*---*---*---*---*--
+12 *---*---*---*---*-
+13 *---*---*---*
+14 *---*---
+15 *--
+</PRE>
+
+<P>
+Now we have to determine which line is printed by each jet on each
+pass. If we number each line generated as we split up a row, we can
+use these numbers. We'll number the lines in our diagram by replacing
+the <SAMP>`*'</SAMP>s with integers in the range [0...@math{H-1}].
+
+</P>
+<P>
+Overprinting occurs once per pass block, so we can simply print pass
+block 0 with line 0, pass block 1 with line 1, pass block 2 with line
+2, etc, wrapping to 0 when we've run out of lines:
+
+</P>
+
+<PRE>
+0 0--0---0--0---0--0---0--0---0--0
+1 0--0---0--0---0--0---0--0---0--0
+2 0--0---0--0---0--0---0--0---0--0
+3 0--0---0--0---0--0---0--0---0--0
+4 1--1---1--1---1--1---1--1---1--1
+5 1--1---1--1---1--1---1--1---1--1
+6 1--1---1--1---1--1---1--1---1--1
+7 1--1---1--1---1--1---1--1---1--1
+8 0--0---0--0---0--0---0--0---0--0
+9 0--0---0--0---0--0---0--0---0
+10 0--0---0--0---0--0---0---
+11 0--0---0--0---0--0--
+12 1--1---1--1---1-
+13 1--1---1--1
+14 1--1---
+15 1--
+</PRE>
+
+<P>
+@math{S=4}, @math{J=12}, @math{H=2}, @math{A=J/H=12/2=6}, @math{G=GCD(4,6)=2},
+<BR>passesperblock=@math{S}=4,
+<BR>passespersubblock=@math{S/G}=4/2=2:
+
+</P>
+
+<PRE>
+0 0--0---0--0---0--0---0--0---0--0---0--0
+1 0--0---0--0---0--0---0--0---0--0---0--0
+2 0--0---0--0---0--0---0--0---0--0---0--0
+3 0--0---0--0---0--0---0--0---0--0---0--0
+4 1--1---1--1---1--1---1--1---1--1---1--1
+5 1--1---1--1---1--1---1--1---1--1---1--1
+6 1--1---1--1---1--1---1--1---1--1---1
+7 1--1---1--1---1--1---1--1---1--
+8 0--0---0--0---0--0---0--0-
+9 0--0---0--0---0--0---
+10 0--0---0--0---0
+11 0--0---0--
+12 1--1-
+</PRE>
+
+<P>
+But what do we do if @math{J} is not an exact multiple of @math{H}?
+This is a difficult problem, which I struggled with for quite a few days
+before giving in and taking the easy (but less elegant) way out. The
+easy solution is to round @math{J/H} down, then add on the accumulated
+error at the end of each band.
+
+</P>
+<P>
+@math{S=4}, @math{J=11}, @math{H=2} @math{A=floor(J/H)=floor(11/2)=5}, @math{G=GCD(4,5)},
+<BR>passesperblock=@math{S}=4,
+<BR>passespersubblock=@math{S/G}=4/1=4
+
+</P>
+
+<PRE>
+Band 0:
+0 0--0---0--0---0--0---0--0---0--0---0
+1 0--0---0--0---0--0---0--0---0--0---0
+2 0--0---0--0---0--0---0--0---0--0---0
+3 0--0---0--0---0--0---0--0---0--0---0
+4 1--1---1--1---1--1---1--1---1--1---1
+5 1--1---1--1---1--1---1--1---1--1---1
+6 1--1---1--1---1--1---1--1---1--1---1
+7 1--1---1--1---1--1---1--1---1--1---
+
+Band 1:
+8 | 0--0---0--0---0--0---0--0---0-
+9 \-----------------------------------------/ 0--0---0--0---0--0---0--0
+10 S*J rows 0--0---0--0---0--0---
+11 0--0---0--0---0--
+12 1--1---1--1-
+13 1--1---1
+14 1---
+</PRE>
+
+<P>
+We can calculate the starting row and subpass number of a given pass
+in this scheme as follows:
+
+</P>
+
+<PRE>
+A = floor(J / H)
+subblocksperblock = gcd(S, A)
+subpassblock = floor((p % S) * subblocksperblock / S)
+if subpassblock * 2 &#60; subblocksperblock
+ subblockoffset = 2*subpassblock
+else
+ subblockoffset = 2*(subblocksperblock-subpassblock)-1
+band = floor(P / (S * H))
+passinband = P % (S * H)
+startingrow = band * S * J + passinband * A + subblockoffset
+subpass = passinband / S
+</PRE>
+
+<P>
+So the row number of jet @math{j} of pass @math{p} is
+
+</P>
+
+<PRE>
+A = floor(J / H)
+subblocksperblock = gcd(S, A)
+
+subblockoffset(p)
+ = 2*subpassblock , if subpassblock * 2 &#60; subblocksperblock
+ = 2*(subblocksperblock-subpassblock)-1 , otherwise
+ where
+ subpassblock = floor((p % S) * subblocksperblock / S)
+
+band(p) = floor(p / (S * H))
+passinband(p) = p % (S * H)
+
+row(j, p) = band(p) * S * J + passinband(p) * A + subblockoffset(p) + j * S
+row(j, p) = p * J + subblockoffset(p) + j * S
+</PRE>
+
+<P>
+To be continued@enddots{}
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_32.html">previous</A>, <A HREF="gimpprint_34.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_34.html b/doc/manual-html/gimpprint_34.html
new file mode 100644
index 0000000..95372ef
--- /dev/null
+++ b/doc/manual-html/gimpprint_34.html
@@ -0,0 +1,29 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - ESC/P2</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_33.html">previous</A>, <A HREF="gimpprint_35.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC49" HREF="gimpprint_toc.html#TOC49">C ESC/P2</A></H1>
+<P>
+<A NAME="IDX190"></A>
+
+</P>
+
+<UL>
+<LI><A HREF="gimpprint_35.html#SEC50">ESC/P2 Introduction</A>: What is ESC/P2
+<LI><A HREF="gimpprint_36.html#SEC51">ESC/P2 Standard Commands</A>: Normal ESC/P2 commands
+<LI><A HREF="gimpprint_37.html#SEC52">ESC/P2 Remote Mode Commands</A>: Exotic ESC/P2 commands
+<LI><A HREF="gimpprint_38.html#SEC53">ESC/P2 Appropriate Remote Commands</A>: Useful remote command sequences
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_33.html">previous</A>, <A HREF="gimpprint_35.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_35.html b/doc/manual-html/gimpprint_35.html
new file mode 100644
index 0000000..38adfb3
--- /dev/null
+++ b/doc/manual-html/gimpprint_35.html
@@ -0,0 +1,52 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - ESC/P2 Introduction</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_34.html">previous</A>, <A HREF="gimpprint_36.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC50" HREF="gimpprint_toc.html#TOC50">C.1 Introduction to ESC/P2</A></H2>
+<P>
+<A NAME="IDX191"></A>
+
+</P>
+<P>
+This is a description of the ESC/P2 raster commands used by the
+gimp-print plugin and Ghostscript driver, which is a subset of the
+complete command set. The full documents are found on
+@url{http://www.ercipd.com/isv/edr_docs.htm}. Note that these are
+<STRONG>not</STRONG> always correct, and are certainly not complete.
+
+</P>
+<P>
+All ESCP/2 raster commands begin with the <SAMP>`ESC'</SAMP> character (1b hex),
+followed by either one or two command characters and arguments where
+applicable. Older commands generally have one command character. Newer
+commands usually have a <SAMP>`('</SAMP> (left parenthesis) followed by a
+command character and a byte count for the arguments that follow. The
+byte count is a 16-bit (2 byte) binary integer, in little endian order.
+
+</P>
+<P>
+All arguments listed here are of the form <SAMP>`name[bytes]'</SAMP> where
+<SAMP>`[bytes]'</SAMP> is the number of bytes that comprise the argument. The
+arguments themselves are usually one, two, or four byte integers, always
+little endian (the least significant bits come first). Presumably this
+is to match Intel processors.
+
+</P>
+<P>
+In some cases, the same command sequence identifies different versions
+of the same command, depending upon the number of bytes of arguments.
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_34.html">previous</A>, <A HREF="gimpprint_36.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_36.html b/doc/manual-html/gimpprint_36.html
new file mode 100644
index 0000000..d7e1677
--- /dev/null
+++ b/doc/manual-html/gimpprint_36.html
@@ -0,0 +1,560 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - ESC/P2 Standard Commands</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_35.html">previous</A>, <A HREF="gimpprint_37.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC51" HREF="gimpprint_toc.html#TOC51">C.2 Standard commands</A></H2>
+
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC @</CODE></B>
+<DD><A NAME="IDX192"></A>
+Reset the printer. Discards any output, ejects the existing page,
+returns all settings to their default. Always use this before printing
+a page.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (G <VAR>BC</VAR>=1 <VAR>ON1</VAR></CODE></B>
+<DD><A NAME="IDX193"></A>
+Turn on graphics mode. <VAR>ON</VAR> should be <SAMP>`1'</SAMP> (turn on graphics
+mode).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (U <VAR>BC</VAR>=1 <VAR>UNIT1</VAR></CODE></B>
+<DD><A NAME="IDX194"></A>
+Set basic unit of measurement used by printer. This is expressed in
+multiples of 1/3600". At 720 DPI, <VAR>UNIT</VAR> is <SAMP>`5'</SAMP>; at 360 DPI,
+<VAR>UNIT</VAR> is <SAMP>`10'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (U <VAR>BC</VAR>=5 <VAR>PAGEUNITS1</VAR> <VAR>VUNIT1</VAR> <VAR>HUNIT1</VAR> <VAR>BASEUNIT2</VAR></CODE></B>
+<DD><A NAME="IDX195"></A>
+Set basic units of measurement used by the printer. <VAR>PAGEUNIT</VAR> is
+the unit of page measurement (for commands that set page dimensions and
+the like). <VAR>VUNIT</VAR> is the unit of vertical measurement (for
+vertical movement commands). <VAR>HUNIT</VAR> is the unit of horizontal
+movement (for horizontal positioning commands). All of these units are
+expressed in <VAR>BASEUNIT</VAR>, which is in reciprocal inches. Typically,
+<VAR>BASEUNIT</VAR> is <SAMP>`1440'</SAMP>. In 720 DPI mode, <VAR>PAGEUNIT</VAR>,
+<VAR>VUNIT</VAR>, and <VAR>HUNIT</VAR> are all <SAMP>`2'</SAMP>; in 1440x720 DPI mode,
+<VAR>PAGEUNIT</VAR> and <VAR>VUNIT</VAR> are normally set to <SAMP>`2'</SAMP>; <VAR>HUNIT</VAR>
+is set to <SAMP>`1'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (K <VAR>BC</VAR>=2 <VAR>ZERO1</VAR> <VAR>GRAYMODE1</VAR></CODE></B>
+<DD><A NAME="IDX196"></A>
+Set color or grayscale mode, on printers supporting an explicit
+grayscale mode. These printers can be identified because they are
+advertised as having more black nozzles than nozzles of individual
+colors. Setting grayscale mode allows use of these extra nozzles for
+faster printing. <VAR>GRAYMODE</VAR> should be <SAMP>`0'</SAMP> or <SAMP>`2'</SAMP> for
+color, <SAMP>`1'</SAMP> for grayscale. <VAR>ZERO</VAR> should always be <SAMP>`0'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (i <VAR>BC</VAR>=1 <VAR>MICROWEAVE1</VAR></CODE></B>
+<DD><A NAME="IDX197"></A>
+If <VAR>MICROWEAVE</VAR> is <SAMP>`1'</SAMP>, use microweave mode. On older
+printers, this is used to turn on microweave; on newer printers, it
+prints one row at a time. All printers support this mode. It should
+only be used at 720 (or 1440x720) DPI. The Epson Stylus Pro series
+indicates additional modes:
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>`2'</SAMP>
+<DD>
+"Full-overlap"
+<DT><SAMP>`3'</SAMP>
+<DD>
+"Four-pass"
+<DT><SAMP>`4'</SAMP>
+<DD>
+"Full-overlap 2"
+</DL>
+
+<P>
+Any of these commands can be used with the high four bits set to either
+<SAMP>`3'</SAMP> or <SAMP>`0'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC U <VAR>DIRECTION1</VAR></CODE></B>
+<DD><A NAME="IDX198"></A>
+If <VAR>DIRECTION</VAR> is <SAMP>`1'</SAMP>, print unidirectionally; if <SAMP>`0'</SAMP>,
+print bidirectionally.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (s <VAR>BC</VAR>=1 <VAR>SPEED1</VAR></CODE></B>
+<DD><A NAME="IDX199"></A>
+On some older printers, this controls the print head speed. <VAR>SPEED</VAR>
+of <SAMP>`2'</SAMP> is 10 inches/sec; SPEED of <SAMP>`0'</SAMP> or 1 is 20.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (e <VAR>BC</VAR>=2 <VAR>ZERO1</VAR> <VAR>DOTSIZE1</VAR></CODE></B>
+<DD><A NAME="IDX200"></A>
+Choose print dotsize. <VAR>DOTSIZE</VAR> can take on various values,
+depending upon the printer. Almost all printers support <SAMP>`0'</SAMP> and
+<SAMP>`2'</SAMP>. Variable dot size printers allow a value of <VAR>16</VAR>. Other
+than the value of <VAR>16</VAR>, this appears to be ignored at resolutions of
+720 DPI and above.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (C <VAR>BC</VAR>=2 <VAR>PAGELENGTH2</VAR></CODE></B>
+<DD><A NAME="IDX201"></A>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (C <VAR>BC</VAR>=4 <VAR>PAGELENGTH4</VAR></CODE></B>
+<DD><A NAME="IDX202"></A>
+Set the length of the page in "pageunits" (see <SAMP>`ESC (U'</SAMP> above).
+The second form of the command allows setting of longer page lengths on
+new printers (these happen to be the printers that support variable dot
+size).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (c <VAR>BC</VAR>=4 <VAR>TOP2</VAR> <VAR>LENGTH2</VAR></CODE></B>
+<DD><A NAME="IDX203"></A>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (c <VAR>BC</VAR>=8 <VAR>TOP4</VAR> <VAR>LENGTH4</VAR></CODE></B>
+<DD><A NAME="IDX204"></A>
+Set the vertical page margins of the page in "pageunits" (see <SAMP>`ESC
+(U'</SAMP> above). The margins are specified as the top of the page and the
+length of the page. The second form of the command allows setting of
+longer page lengths on new printers (these happen to be the printers
+that support variable dot size).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (S <VAR>BC</VAR>=8 <VAR>WIDTH4</VAR> <VAR>LENGTH4</VAR></CODE></B>
+<DD><A NAME="IDX205"></A>
+Set the width and length of the printed page region in "pageunits" (see
+<SAMP>`ESC (U'</SAMP> above).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (v <VAR>BC</VAR>=2 <VAR>ADVANCE2</VAR></CODE></B>
+<DD><A NAME="IDX206"></A>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (v <VAR>BC</VAR>=4 <VAR>ADVANCE4</VAR></CODE></B>
+<DD><A NAME="IDX207"></A>
+Feed vertically <VAR>ADVANCE</VAR> "vertical units" (see <SAMP>`ESC (U'</SAMP> above)
+from the current print head position.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (V <VAR>BC</VAR>=2 <VAR>ADVANCE2</VAR></CODE></B>
+<DD><A NAME="IDX208"></A>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (V <VAR>BC</VAR>=4 <VAR>ADVANCE4</VAR></CODE></B>
+<DD><A NAME="IDX209"></A>
+Feed vertically <VAR>ADVANCE</VAR> "vertical units" (see <SAMP>`ESC (U'</SAMP> above)
+from the top margin.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC ($ <VAR>BC</VAR>=4 <VAR>OFFSET4</VAR></CODE></B>
+<DD><A NAME="IDX210"></A>
+Set horizontal position to <VAR>OFFSET</VAR> from the left margin. This
+command operates on printers of the 740 class and newer (all printers
+with variable dot size).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC $ <VAR>OFFSET2</VAR></CODE></B>
+<DD><A NAME="IDX211"></A>
+Set horizontal position to <VAR>OFFSET</VAR> from the left margin. This
+command operates on printers of the 740 class and newer (all printers
+with variable dot size).
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (\ <VAR>BC</VAR>=4 <VAR>UNITS2</VAR> <VAR>OFFSET2</VAR></CODE></B>
+<DD><A NAME="IDX212"></A>
+Set horizontal position to <VAR>OFFSET</VAR> from the previous print head
+position, measured in <VAR>UNITS</VAR>. <VAR>UNITS</VAR> is measured in inverse
+inches, and should be set to 1440 in all cases. This operates on all
+1440 dpi printers that do not support variable dot size.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (/ <VAR>BC</VAR>=4 <VAR>OFFSET4</VAR></CODE></B>
+<DD><A NAME="IDX213"></A>
+Set horizontal position to <VAR>OFFSET</VAR> from the previous print head
+position, measured in "horizontal units" (see <SAMP>`ESC (U'</SAMP> above).
+This operates on all variable dot size printers.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC \ <VAR>OFFSET2</VAR></CODE></B>
+<DD><A NAME="IDX214"></A>
+Set horizontal position to <VAR>OFFSET</VAR> from the previous print head
+position, measured in basic unit of measurement (see <SAMP>`ESC (U'</SAMP>
+above). This is used on all 720 dpi printers, and can also be used on
+1440 dpi printers in lower resolutions to save a few bytes. Note that
+<VAR>OFFSET</VAR> may be negative. The range of values for this command is
+between <SAMP>`-16384'</SAMP> and <SAMP>`16383'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC r <VAR>COLOR1</VAR></CODE></B>
+<DD><A NAME="IDX215"></A>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (r <VAR>BC</VAR>=2 <VAR>DENSITY1</VAR> <VAR>COLOR1</VAR></CODE></B>
+<DD><A NAME="IDX216"></A>
+Set the ink color. The first form is used on four-color printers; the
+second on six-color printers. <VAR>DENSITY</VAR> is <SAMP>`0'</SAMP> for dark inks,
+<SAMP>`1'</SAMP> for light. <VAR>COLOR</VAR> is
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>`0'</SAMP>
+<DD>
+black
+<DT><SAMP>`1'</SAMP>
+<DD>
+magenta
+<DT><SAMP>`2'</SAMP>
+<DD>
+cyan
+<DT><SAMP>`4'</SAMP>
+<DD>
+yellow
+</DL>
+
+<P>
+This command is not used on variable dot size printers in softweave
+mode.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC . <VAR>COMPRESS1</VAR> <VAR>VSEP1</VAR> <VAR>HSEP1</VAR> <VAR>LINES1</VAR> <VAR>WIDTH2</VAR> <VAR>data...</VAR></CODE></B>
+<DD><A NAME="IDX217"></A>
+ Print data. <VAR>COMPRESS</VAR> signifies the compression mode:
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>`0'</SAMP>
+<DD>
+no compression
+<DT><SAMP>`1'</SAMP>
+<DD>
+TIFF compression (incorrectly documented as "run length encoded")
+<DT><SAMP>`2'</SAMP>
+<DD>
+TIFF compression with a special command set.
+</DL>
+
+<P>
+<VAR>VSEP</VAR> depends upon resolution and printer type. At 360 DPI, it is
+always <SAMP>`10'</SAMP>. At 720 DPI, it is normally <SAMP>`5'</SAMP>5. On the ESC
+600, it is <SAMP>`40'</SAMP> (@math{8 * 5}). On some other printers, it varies.
+
+</P>
+<P>
+<VAR>HSEP1</VAR> is <SAMP>`10'</SAMP> at 360 DPI and <SAMP>`5'</SAMP> at 720 or 1440 DPI
+(1440 DPI cannot be printed in one pass; it is printed in two passes,
+with the dots separated in each pass by 1/720").
+
+</P>
+<P>
+<VAR>LINES</VAR> is the number of lines to be printed. It should be <SAMP>`1'</SAMP>
+in microweave and 360 DPI. At 720 DPI softweave, it should be the
+number of lines to be actually printed.
+
+</P>
+<P>
+<VAR>WIDTH</VAR> is the number of pixels to be printed in each row.
+Following this command, a carriage return (<SAMP>`13'</SAMP> decimal, <SAMP>`0A'</SAMP>
+hex) should be output to return the print head position to the left
+margin.
+
+</P>
+<P>
+The basic data format is a string of bytes, with data from left to right
+on the page. Within each byte, the highest bit is first.
+
+</P>
+<P>
+The TIFF compression is implemented as one count byte followed by one or
+more data bytes. There are two cases:
+
+</P>
+
+<OL>
+<LI>
+
+If the count byte is <SAMP>`128'</SAMP> or less, it is followed by @math{[count]
++ 1} data bytes. So if the count byte is <SAMP>`0'</SAMP>, it is followed by 1
+data byte; if it is <SAMP>`128'</SAMP>, it is followed by 129 data bytes.
+
+<LI>
+
+If the count byte is greater than 128, it is followed by one byte. This
+byte is repeated (257 - [count]) times. So if [count] is 129, the next
+byte is treated as though it were repeated 128 times; if [count] is 255,
+it is treated as though it were repeated twice.
+</OL>
+
+</DL>
+
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC i <VAR>COLOR1</VAR> <VAR>COMPRESS1</VAR> <VAR>BITS1</VAR> <VAR>BYTES2</VAR> <VAR>LINES2</VAR> <VAR>data...</VAR></CODE></B>
+<DD><A NAME="IDX218"></A>
+Print data in the newer printers (that support variable dot size), and
+Stylus Pro models.
+
+</P>
+<P>
+<VAR>COLOR</VAR> is the color:
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>`0'</SAMP>
+<DD>
+black
+<DT><SAMP>`1'</SAMP>
+<DD>
+magenta
+<DT><SAMP>`2'</SAMP>
+<DD>
+cyan
+<DT><SAMP>`4'</SAMP>
+<DD>
+yellow
+<DT><SAMP>`17'</SAMP>
+<DD>
+light magenta
+<DT><SAMP>`18'</SAMP>
+<DD>
+light cyan
+</DL>
+
+<P>
+<VAR>COMPRESS</VAR> signifies the
+compression mode:
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>`0'</SAMP>
+<DD>
+no compression
+<DT><SAMP>`1'</SAMP>
+<DD>
+TIFF compression (incorrectly documented as "run length encoded")
+<DT><SAMP>`2'</SAMP>
+<DD>
+TIFF compression with a special command set.
+</DL>
+
+<P>
+<VAR>BITS</VAR> is the number of bits per pixel.
+
+</P>
+<P>
+<VAR>BYTES</VAR> is the number of bytes wide for each row (@math{ceiling(BITS
+* width_of_row, 8)}). Note that this is different from the <SAMP>`ESC .'</SAMP>
+command above.
+
+</P>
+<P>
+<VAR>LINES</VAR> is the number of lines to be printed. This command is the
+only way to get variable dot size printing. In variable dot mode, the
+size of the dots increases as the value (<SAMP>`1'</SAMP>, <SAMP>`2'</SAMP>, or
+<SAMP>`3'</SAMP>) increases.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (D <VAR>BC</VAR>=4 <VAR>BASE2</VAR> <VAR>VERTICAL1</VAR> <VAR>HORIZONTAL1</VAR></CODE></B>
+<DD><A NAME="IDX219"></A>
+Set printer horizontal and vertical spacing. It only applies to
+variable dot size printers in softweave mode (and possibly other high
+end printers).
+
+</P>
+<P>
+<VAR>BASE</VAR> is the base unit for this command; it must be <SAMP>`14400'</SAMP>.
+
+</P>
+<P>
+<VAR>VERTICAL</VAR> is the distance in these units between printed rows; it
+should be (@math{separation_in_nozzles * BASE / 720}).
+
+</P>
+<P>
+<VAR>HORIZONTAL</VAR> is the horizontal separation between dots in a row.
+Depending upon the printer, this should be either (@math{14400 / 720})
+or (@math{14400 / 360}). The Stylus Pro 9000 manual suggests that the
+settings should match the chosen resolution, but that is apparently not
+the case (or not always the case) on other printers.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC (R <VAR>BC</VAR>=8 00 R E M O T E 1</CODE></B>
+<DD><A NAME="IDX220"></A>
+Enters "remote mode". This is a special, undocumented command set that
+is used to set up various printer options, such as paper feed tray, and
+perform utility functions such as head cleaning and alignment. It does
+not appear that anything here is actually required to make the printer
+print. Our best understanding of what is in a remote command sequence
+is described in a separate section below.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 command:</U> <B><CODE>ESC 01 @EJL [sp] ID\r\n</CODE></B>
+<DD><A NAME="IDX221"></A>
+Return the printer ID. This is considered a remote mode command,
+although the syntax is that of a conventional command. This returns the
+following information:
+
+</P>
+
+<PRE>
+@EJL ID\r
+MFG:EPSON;
+CMD:ESCPL2,BDC;
+MDL:[printer model];
+CLS:PRINTER;
+DES:EPSON [printer model];
+\f
+</PRE>
+
+</DL>
+
+<P>
+After all data has been sent, a form feed byte should be sent.
+
+</P>
+<P>
+All newer Epson printers (STC 440, STP 750) require the following
+command to be sent at least once to enable printing at all. This
+command specifically takes the printer out of the Epson packet mode
+communication protocol (whatever that is) and enables normal data
+transfer. Sending it multiple times is is not harmful, so it is
+normally sent at the beginning of each job:
+
+</P>
+
+<PRE>
+ESC 01@EJL[space]1284.4[newline]@EJL[space][space][space][space]
+[space][newline]ESC@
+</PRE>
+
+<P>
+The proper sequence of initialization commands is:
+
+</P>
+
+<PRE>
+magic command
+ESC
+remote mode if needed
+ESC (G
+ESC (U
+ESC (K (if appropriate)
+ESC (i
+ESC U (if needed)
+ESC (s (if appropriate)
+ESC (e
+ESC (C
+ESC (c
+ESC (S
+ESC (D (if needed)
+ESC (V (optional -- this can be accomplished with ESC (v)
+</PRE>
+
+<P>
+For printing, the proper sequence is:
+
+</P>
+
+<PRE>
+ESC (v
+</PRE>
+
+<P>
+and repeat for each color:
+
+</P>
+
+<PRE>
+ESC ($ or ESC (\ or ESC \
+ESC (r or ESC r (if needed--not used with <SAMP>`ESC i'</SAMP> and not needed if the color
+has not changed from the previous printed line)
+ESC . or ESC i ...data... [return] (0A hex)
+</PRE>
+
+<P>
+To terminate a page:
+
+</P>
+
+<PRE>
+[formfeed] (0C hex)
+ESC @
+</PRE>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_35.html">previous</A>, <A HREF="gimpprint_37.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_37.html b/doc/manual-html/gimpprint_37.html
new file mode 100644
index 0000000..d2cbd44
--- /dev/null
+++ b/doc/manual-html/gimpprint_37.html
@@ -0,0 +1,663 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - ESC/P2 Remote Mode Commands</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_36.html">previous</A>, <A HREF="gimpprint_38.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC52" HREF="gimpprint_toc.html#TOC52">C.3 Remote Mode Commands</A></H2>
+
+<P>
+The following description of remote commands comes out of an
+examination of the sequences used by the printer utilities bundled
+with the Windows drivers for the ESC740, and from other sources (some
+Epson manuals, experimentation, analysis of print files). It is
+largely speculative as these commands are not all documented in the
+Epson documentation we have access to. Generally, newer manuals
+provide more thorough documentation.
+
+</P>
+<P>
+Remote command mode is entered when the printer is sent the following
+sequence:
+
+</P>
+
+<PRE>
+ESC (R BC=8 00 R E M O T E 1
+</PRE>
+
+<P>
+Remote mode commands are then sent, and terminated with the following
+sequence:
+
+</P>
+
+<PRE>
+ESC 00 00 00
+</PRE>
+
+<P>
+All remote mode commands must be sent before the initial <SAMP>`ESC (G'</SAMP>
+command is sent.
+
+</P>
+<P>
+This introductory sequence is then followed by a sequence of commands.
+Each command is constructed as follows:
+
+</P>
+
+<UL>
+<LI>Two ASCII bytes indicating the function
+
+<LI>A byte count (two bytes, little-endian) for the parameters
+
+<LI>Binary parameters, if any
+
+</UL>
+
+<P>
+This is a list of all remote commands we have seen:
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>NC <VAR>BC</VAR>=2 00 00</CODE></B>
+<DD><A NAME="IDX222"></A>
+Print a nozzle check pattern
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>VI <VAR>BC</VAR>=2 00 00</CODE></B>
+<DD><A NAME="IDX223"></A>
+on my 740, prints the following:
+
+</P>
+
+<PRE>
+W01286 I02382\r\n
+</PRE>
+
+<P>
+probably "version information"
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* AI <VAR>BC</VAR>=3 00 00 00</CODE></B>
+<DD><A NAME="IDX224"></A>
+Prints a "printer ID". On one 870, prints the following:
+
+<PRE>
+51-51-50-51-49-48\r\n
+</PRE>
+
+<P>
+The Windows driver has a text entry field where this number can be
+entered, but its purpose is unknown.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* LD <VAR>BC</VAR>=0</CODE></B>
+<DD><A NAME="IDX225"></A>
+Load printer defaults from NVRAM, DIP switches, and/or ROM. This
+apparently does not load factory defaults per se, but any settings that
+are saved. This is commonly used right at the end of each print job
+after the <SAMP>`ESC @'</SAMP> printer reset command.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* CH <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></B>
+<DD><A NAME="IDX226"></A>
+Perform a head cleaning cycle. The heads to clean are determined by
+parameter <VAR>xx</VAR>:
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>`00'</SAMP>
+<DD>
+clean all heads
+<DT><SAMP>`01'</SAMP>
+<DD>
+clean black head
+<DT><SAMP>`02'</SAMP>
+<DD>
+clean color heads
+</DL>
+
+<P>
+While <VAR>xx</VAR> = <SAMP>`00'</SAMP> is probably supported by all printers, <VAR>xx</VAR> =
+<SAMP>`01'</SAMP> and <SAMP>`02'</SAMP> may well not be.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* DT <VAR>BC</VAR>=3 00 <VAR>xx</VAR> 00</CODE></B>
+<DD><A NAME="IDX227"></A>
+Print an alignment pattern. There are three patterns, which are picked
+via the choice of <VAR>xx</VAR>. Pattern <SAMP>`0'</SAMP> is coarse, pattern
+<SAMP>`1'</SAMP> is medium, and pattern <SAMP>`2'</SAMP> is fine.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* DU <VAR>BC</VAR>=6 00 <VAR>xx</VAR> 00 09 00 <VAR>yy</VAR></CODE></B>
+<DD><A NAME="IDX228"></A>
+Print another alignment pattern. It isn't entirely clear what <VAR>xx</VAR>
+and <VAR>yy</VAR> are, but it appears that <VAR>xx</VAR> takes on the values
+<SAMP>`1'</SAMP> and <SAMP>`2'</SAMP> , and <VAR>yy</VAR> takes on the values <SAMP>`0'</SAMP> and
+<VAR>1</VAR>. This may only work on the 580 and/or 480.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* DA <VAR>BC</VAR>=4 00 <VAR>xx</VAR> 00 <VAR>yy</VAR></CODE></B>
+<DD><A NAME="IDX229"></A>
+Set results for the first alignment pattern. <VAR>xx</VAR> is the pattern
+(<SAMP>`1'</SAMP>--<SAMP>`3'</SAMP>); <VAR>yy</VAR> is the best choice from the set
+(<SAMP>`1'</SAMP>--<SAMP>`7'</SAMP> or <SAMP>`1'</SAMP>--<SAMP>`15'</SAMP>). This does not save to
+NVRAM, so when the printer is powered off, the setting will be lost.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* DA <VAR>BC</VAR>=6 00 <VAR>xx</VAR> 00 <VAR>yy</VAR> 09 00</CODE></B>
+<DD><A NAME="IDX230"></A>
+Set results for alternate alignment pattern. <VAR>xx</VAR> appears to be the
+pass, and <VAR>yy</VAR> appears to be the optimum pattern. This does not
+save to NVRAM, so when the printer is powered off, the setting will be
+lost.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* SV <VAR>BC</VAR>=0</CODE></B>
+<DD><A NAME="IDX231"></A>
+Save the current settings to NVRAM.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* RS <VAR>BC</VAR>=1 01</CODE></B>
+<DD><A NAME="IDX232"></A>
+Reset the printer.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* IQ <VAR>BC</VAR>=1 01</CODE></B>
+<DD><A NAME="IDX233"></A>
+Get ink quantity. This requires direct access to the printer port. The
+return looks like
+
+</P>
+
+<PRE>
+IQ:KKCCMMYY
+</PRE>
+
+<P>
+or
+
+</P>
+
+<PRE>
+IQ:KKCCMMYYccmm
+</PRE>
+
+<P>
+(for 4-color and 6-color printers respectively), where each pair of
+digits are hexadecimal representations of percent.
+</DL>
+
+</P>
+<P>
+The following two commands have been observed on an STP 870.
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* IR <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></B>
+<DD><A NAME="IDX234"></A>
+<STRONG>Function unknown</STRONG>. This command has been observed on an STP 870
+with <VAR>xx</VAR>=<SAMP>`03'</SAMP> at the start of a job and <VAR>xx</VAR>=<SAMP>`02'</SAMP> at
+the end of a job (where it is followed by an <SAMP>`LD'</SAMP> command). When
+in roll mode, the values change to <VAR>xx</VAR>=<SAMP>`01'</SAMP> at the start of a
+job and <VAR>xx</VAR>=<SAMP>`00'</SAMP> at the end of a job.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* FP <VAR>BC</VAR>=3 00 <VAR>xx</VAR> <VAR>yy</VAR></CODE></B>
+<DD><A NAME="IDX235"></A>
+<VAR>xx</VAR>=<SAMP>`00'</SAMP> and <VAR>yy</VAR>=<SAMP>`00'</SAMP> selects the printer's normal
+left margin (about 3mm). <VAR>xx</VAR>=<SAMP>`0xb0'</SAMP> and <VAR>yy</VAR>=<SAMP>`0xff'</SAMP>
+selects zero-margin mode, where the left-most print position is shifted
+to a point about 0.1" to the left of the left-hand edge of the paper,
+allowing printing up to (and off) the left-hand edge of the paper.
+</DL>
+
+</P>
+<P>
+The commands below are partially documented in the Stylus Pro 9000
+manual. Much of this information is interpreted; none is tested.
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* SN <VAR>BC</VAR>=3 00 <VAR>xx</VAR> <VAR>yy</VAR></CODE></B>
+<DD><A NAME="IDX236"></A>
+Select Mechanism Sequence. <VAR>xx</VAR> controls which sub-operation is
+performed. <VAR>xx</VAR>=<SAMP>`00'</SAMP> selects the "Feed paper sequence
+setting". <VAR>yy</VAR> can take on the following values (on the STP 870,
+at any rate):
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>`0'</SAMP>
+<DD>
+default
+<DT><SAMP>`1'</SAMP>
+<DD>
+plain paper
+<DT><SAMP>`2'</SAMP>
+<DD>
+postcards
+<DT><SAMP>`3'</SAMP>
+<DD>
+film (photo quality glossy film, transparencies)
+<DT><SAMP>`4'</SAMP>
+<DD>
+envelopes
+<DT><SAMP>`5'</SAMP>
+<DD>
+plain paper (fast load)
+<DT><SAMP>`6'</SAMP>
+<DD>
+back light film (although this has been observed with heavyweight matte
+paper)
+<DT><SAMP>`7'</SAMP>
+<DD>
+matte paper (observed with 360 dpi inkjet paper, and photo quality
+inkjet paper)
+<DT><SAMP>`8'</SAMP>
+<DD>
+photo paper
+</DL>
+
+<P>
+Experimentation suggests that this setting changes details of how the
+printers' cut sheet feeder works, presumably to tune it for different
+types of paper.
+
+</P>
+<P>
+<VAR>xx</VAR>=<SAMP>`01'</SAMP> controls the platen gap setting; <VAR>yy</VAR>=<SAMP>`00'</SAMP>
+is the default, <VAR>yy</VAR>=<SAMP>`1'</SAMP> or <SAMP>`2'</SAMP> are higher settings.
+
+</P>
+<P>
+<VAR>xx</VAR>=<SAMP>`02'</SAMP> controls paper loading speed (<VAR>yy</VAR>=<SAMP>`0'</SAMP> is
+normal, <SAMP>`1'</SAMP> is fast, <SAMP>`2'</SAMP> is slow). It appears that <SAMP>`1'</SAMP>
+is used when printing on "plain paper", "360dpi ink jet paper" or
+"ink jet transparencies", and <VAR>yy</VAR>=<SAMP>`00'</SAMP> for all other paper
+type settings.
+
+</P>
+<P>
+<VAR>xx</VAR>=<SAMP>`07'</SAMP> controls duplex printing for printers with that
+capability (<VAR>yy</VAR>=<VAR>0</VAR> is default, for non-duplex printing;
+<SAMP>`1'</SAMP> is front side of the paper, and <VAR>2</VAR> is back side).
+
+</P>
+<P>
+<VAR>xx</VAR>=<SAMP>`09'</SAMP> controls zero margin printing on the printers with
+the capability of printing zero-margin on all sides (Stylus Photo
+780/790, 890, and 1280/1290). <VAR>yy</VAR>=<SAMP>`0'</SAMP> is the default;
+<SAMP>`1'</SAMP> enables zero margin printing.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* PP <VAR>BC</VAR>=3 00 <VAR>xx</VAR> <VAR>yy</VAR></CODE></B>
+<DD><A NAME="IDX237"></A>
+Set Paper Path. <VAR>xx</VAR>=<SAMP>`2'</SAMP> indicates manual feed,
+<VAR>xx</VAR>=<SAMP>`3'</SAMP> is for roll paper. <VAR>yy</VAR> selects "paper path
+number".
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* AC <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></B>
+<DD><A NAME="IDX238"></A>
+Set Auto Cutting State. <VAR>xx</VAR>=<SAMP>`0'</SAMP> selects auto cutting off,
+<VAR>xx</VAR>=<SAMP>`1'</SAMP> selects auto cutting on, and <VAR>xx</VAR>=<SAMP>`2'</SAMP>
+indicates horizontal print page line on. It appears that with auto
+cutting on, roll paper is cut automatically at the point a formfeed
+character is sent. The formfeed character is normally used to eject a
+page; with this turned on, it also cuts the roll paper. Horizontal
+print page line on prints a narrow line of black dots at the position
+the paper should be cut manually.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* DR <VAR>BC</VAR>=4 00 xx <VAR>DT2</VAR></CODE></B>
+<DD><A NAME="IDX239"></A>
+Set Drying Time. <VAR>xx</VAR>=<SAMP>`00'</SAMP> sets the drying time "per scan"
+(per pass?); <VAR>xx</VAR>=<SAMP>`01'</SAMP> sets the drying time per page. <VAR>DT</VAR>
+indicates the drying time, which is in seconds if page mode is used and
+in milliseconds if scan mode is used. <VAR>DT</VAR> must not exceed 3600
+seconds in per-page mode and 10000 milliseconds in per-scan mode.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* IK <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></B>
+<DD><A NAME="IDX240"></A>
+Select Ink Type. <VAR>xx</VAR>=<SAMP>`00'</SAMP> selects dye ink. Pigment ink is
+apparently selected by <VAR>xx</VAR>=<SAMP>`01'</SAMP>. This probably does not apply
+to the consumer-grade printers.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* PZ BC=2 00 xx</CODE></B>
+<DD><A NAME="IDX241"></A>
+Set Pause After Printing. <VAR>xx</VAR>=<SAMP>`00'</SAMP> selects no pause after
+printing; <VAR>xx</VAR>=<SAMP>`01'</SAMP> selects pause after printing. If turned
+on, the printer is paused after the page is ejected (by the FF
+byte). If cutting is turned on, the printer is paused <STRONG>after</STRONG>
+the cutting or printing of the horizontal cut line.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* EX <VAR>BC</VAR>=6 00 00 00 00 0x14 <VAR>xx</VAR></CODE></B>
+<DD><A NAME="IDX242"></A>
+Set Vertical Print Page Line Mode. <VAR>xx</VAR>=<SAMP>`00'</SAMP> is off,
+<VAR>xx</VAR>=<SAMP>`01'</SAMP> is on. If turned on, this prints vertical trim lines
+at the left and right margins.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* EX <VAR>BC</VAR>=6 00 00 00 00 0x05 <VAR>xx</VAR></CODE></B>
+<DD><A NAME="IDX243"></A>
+Set Roll Paper Mode. If <VAR>xx</VAR> is <SAMP>`0'</SAMP>, roll paper mode is off;
+if <VAR>xx</VAR> is <SAMP>`1'</SAMP>, roll paper mode is on.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* EX <VAR>BC</VAR>=3 00 <VAR>xx</VAR> <VAR>yy</VAR></CODE></B>
+<DD><A NAME="IDX244"></A>
+Appears to be a synonym for the <SAMP>`SN'</SAMP> command described above.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* PH <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></B>
+<DD><A NAME="IDX245"></A>
+Select Paper Thickness. Set the paper thickness <VAR>xx</VAR> in .1 mm
+units. This must not exceed 0x10 (1.6 mm). If the thickness is set
+"more than" .6 mm (which probably means "at least" .6 mm, since the
+other case reads "less than 0.5 mm"), the platen gap is set high
+irrespective of the <SAMP>`SN'</SAMP> command.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* PM <VAR>BC</VAR>=2 00 00</CODE></B>
+<DD><A NAME="IDX246"></A>
+<STRONG>Function unknown</STRONG>. Used on the STC 3000 at least when using roll
+feed, and on the STP 870 in all print files analysed to date.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* ST <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></B>
+<DD><A NAME="IDX247"></A>
+Epson's STP 750/1200 programming guide refers to the <SAMP>`ST'</SAMP> command
+as "Set printer state reply". If <VAR>xx</VAR> is <SAMP>`0'</SAMP> or <SAMP>`2'</SAMP>,
+the printer will not send status replies. If <VAR>xx</VAR> is <SAMP>`1'</SAMP> or
+<SAMP>`3'</SAMP>, the printer will send status replies. The status replies
+consist of state, error codes, ink leve, firmware version, and warning
+status.
+
+</P>
+<P>
+The actual reply is documented as
+
+</P>
+
+<PRE>
+@BDC ST\r
+ST: xx;
+[ER: yy;]
+IQ: n1n2n3n4;
+[WR: w1,w2...;]
+RV: zz;
+AI:CW:02kkccmmyy, MI:mm
+[TC:tttt;]
+INK:...;
+\f
+</PRE>
+
+<P>
+(<SAMP>`\r'</SAMP> is carriage return; <SAMP>`\n'</SAMP> is newline; <SAMP>`\f'</SAMP> is
+formfeed.)
+
+</P>
+<P>
+<SAMP>`ST'</SAMP> is the printer status:
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>`00'</SAMP>
+<DD>
+Error
+<DT><SAMP>`01'</SAMP>
+<DD>
+Self-test
+<DT><SAMP>`02'</SAMP>
+<DD>
+Busy
+<DT><SAMP>`03'</SAMP>
+<DD>
+Waiting while printing
+<DT><SAMP>`04'</SAMP>
+<DD>
+Idle
+<DT><SAMP>`07'</SAMP>
+<DD>
+Cleaning/filling ink heads
+<DT><SAMP>`08'</SAMP>
+<DD>
+Not yet initialized/filling heads
+</DL>
+
+<P>
+<SAMP>`ER'</SAMP>, if provided, is the error status:
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>`00'</SAMP>
+<DD>
+Fatal error
+<DT><SAMP>`01'</SAMP>
+<DD>
+Interface not selected
+<DT><SAMP>`04'</SAMP>
+<DD>
+Paper jam
+<DT><SAMP>`05'</SAMP>
+<DD>
+Out of ink
+<DT><SAMP>`06'</SAMP>
+<DD>
+Paper out
+</DL>
+
+<P>
+<SAMP>`IQ'</SAMP> is the amount of ink left, as a (decimal!) percentage
+expressed in hexadecimal. The values are black, cyan, magenta, and
+yellow (presumably 6-color printers supply light cyan and light magenta
+inks as additional parameters).
+
+</P>
+<P>
+<SAMP>`WR'</SAMP>, if provided, is the warning status:
+
+</P>
+<DL COMPACT>
+
+<DT><SAMP>`10'</SAMP>
+<DD>
+Black ink low
+<DT><SAMP>`11'</SAMP>
+<DD>
+Cyan
+<DT><SAMP>`12'</SAMP>
+<DD>
+Magenta
+<DT><SAMP>`13'</SAMP>
+<DD>
+Yellow
+<DT><SAMP>`14'</SAMP>
+<DD>
+Light cyan (presumably)
+<DT><SAMP>`15'</SAMP>
+<DD>
+Light magenta (presumably)
+</DL>
+
+<P>
+<SAMP>`RV'</SAMP> is the firmware revision (one byte ASCII).
+
+</P>
+<P>
+<SAMP>`AI'</SAMP> is actuator information. These are two byte ASCII codes that
+indicate "ink weight rank ID" of KCMY, respectively.
+
+</P>
+<P>
+<SAMP>`TC'</SAMP>, if provided, is the total time of cleaning or ink filling (?).
+
+</P>
+<P>
+<SAMP>`INK:'</SAMP> and <SAMP>`MI'</SAMP> are <STRONG>not documented</STRONG>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* SM <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></B>
+<DD><A NAME="IDX248"></A>
+Set Status Reply Rate. <VAR>xx</VAR> is the repeat interval in seconds. If
+<VAR>xx</VAR> is <SAMP>`0'</SAMP>, the status is returned only when the printer's
+state changes.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* ST <VAR>BC</VAR>=1 01</CODE></B>
+<DD><A NAME="IDX249"></A>
+Reply Printer Status. The reply is formatted as
+
+</P>
+
+<PRE>
+@BDC PS\r\nST:<VAR>xx</VAR>;\f
+</PRE>
+
+<P>
+(<SAMP>`\r'</SAMP> is carriage return; <SAMP>`\n'</SAMP> is newline; <SAMP>`\f'</SAMP> is
+formfeed). If <VAR>xx</VAR> (the reply value) is <SAMP>`0'</SAMP> or <SAMP>`2'</SAMP>,
+automatic status update is disabled; if <SAMP>`1'</SAMP> or <SAMP>`3'</SAMP>, it is
+enabled.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* SM <VAR>BC</VAR>=1 01</CODE></B>
+<DD><A NAME="IDX250"></A>
+Reply Printer Status Rate. The reply is formatted as
+
+</P>
+
+<PRE>
+@BDC PS\r\nST:xx;\f
+</PRE>
+
+<P>
+(<SAMP>`\r'</SAMP> is carriage return; <SAMP>`\n'</SAMP> is newline; <SAMP>`\f'</SAMP> is
+formfeed). See <SAMP>`SM <VAR>BC</VAR>=2'</SAMP> above for the meaning of the return
+value.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* ?? <VAR>BC</VAR>=<VAR>xx</VAR> <VAR>y</VAR>[1] ... <VAR>y</VAR>[xx]</CODE></B>
+<DD><A NAME="IDX251"></A>
+Echo Parameters (perhaps better described as Echo Commands). The
+command string is executed (it would appear from the documentation), and
+the string sent is returned using a sequence similar to that described
+in the <SAMP>`ST <VAR>BC</VAR>=1'</SAMP> and <SAMP>`SM <VAR>BC</VAR>=1'</SAMP> commands. Note
+that in this case the number of bytes is variable!
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U>ESC/P2 remote command:</U> <B><CODE>* SM <VAR>BC</VAR>=2 00 02</CODE></B>
+<DD><A NAME="IDX252"></A>
+<STRONG>Function unknown</STRONG>. Used on the STC 3000 at least when using
+roll feed.
+</DL>
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_36.html">previous</A>, <A HREF="gimpprint_38.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_38.html b/doc/manual-html/gimpprint_38.html
new file mode 100644
index 0000000..a71d5f1
--- /dev/null
+++ b/doc/manual-html/gimpprint_38.html
@@ -0,0 +1,115 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - ESC/P2 Appropriate Remote Commands</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_37.html">previous</A>, <A HREF="gimpprint_39.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC53" HREF="gimpprint_toc.html#TOC53">C.4 Appropriate Remote Commands</A></H2>
+
+<P>
+All of the remote commands described above are wrapped up with the usual
+boilerplate. The files always start with <SAMP>`00 00 00'</SAMP> and the
+"magic" command described above, then two <SAMP>`ESC @'</SAMP>s to reset the
+printer. The remote command sequences come next; if they print anything
+that is usually followed by a <SAMP>`FF'</SAMP> (0C hex) character to feed the
+page, then the file ends with another two <SAMP>`ESC @'</SAMP>s to get back to
+the ground state.
+
+</P>
+<P>
+An alignment sequence goes like this:
+
+</P>
+
+<OL>
+<LI>Host uses <SAMP>`DT'</SAMP> to print an alignment sheet
+
+<LI>User eyeballs the sheet to see which is the best aligned pattern.
+
+<LI>Host sends a <SAMP>`DA'</SAMP> command indicating which pattern the user chose
+
+<LI>If the user said "realign", meaning he isn't done yet, go to step 1
+
+<LI>We are done: host sends a <SAMP>`SV'</SAMP> command and exits
+
+</OL>
+
+<P>
+The sequence used (by the STC 3000, at least) to print from the roll
+feed is (with byte count omitted)
+
+</P>
+
+<PRE>
+ PM 00 00
+ SN 00 00 00
+ EX 00 00 00 00 05 01
+ ST 00 01
+ SM 00 02
+</PRE>
+
+<P>
+The sequence used by the STP 870 to print on plain paper is
+
+</P>
+
+<PRE>
+ PM 00 00
+ IR 00 03
+ SN 00 00 01
+ SN 00 01 00
+ SN 00 02 01
+ EX 00 00 00 00 05 00
+ FP 00 00 00
+</PRE>
+
+<P>
+and the job finishes with
+
+</P>
+
+<PRE>
+ IR 00 02
+ LD
+</PRE>
+
+<P>
+For different paper type settings on the STP 870, the arguments to
+<SAMP>`SN'</SAMP> vary. The arguments to the first and third <SAMP>`SN'</SAMP> commands
+are as outlined in the description of the <SAMP>`SN'</SAMP> command above; the
+arguments to the second ("platen gap") are <SAMP>`00 01 01'</SAMP> for thick
+papers ("matte paper--heavyweight", "photo paper" and "premium
+glossy photo paper") and <SAMP>`00 01 00'</SAMP> for all others.
+
+</P>
+<P>
+For roll-mode printing, the STP 870's sequence changes as follows.
+<SAMP>`IR'</SAMP>'s arguments become <SAMP>`00 01'</SAMP> in the header, and <SAMP>`00
+00'</SAMP> after the job, and <SAMP>`EX'</SAMP>'s last argument changes from <SAMP>`00'</SAMP>
+to <SAMP>`01'</SAMP>.
+
+</P>
+<P>
+For zero-margin printing on the STP 870, the arguments to <SAMP>`FP'</SAMP> become
+<SAMP>`00 0xb0 0xff'</SAMP>. This moves the origin about 5.5mm to the left, to a
+point one tenth of an inch to the left of the left-hand edge of the
+paper, allowing printing right up to (and beyond) the edge of the
+paper. Some printers (at least the STP 870) include white absorbent
+pads at the left margin position and other positions (89mm and 100mm
+on the STP 870) to soak up ink which misses the edge of the paper.
+Printing off the edge of paper of a width not aligned with a pad could
+result in making a mess of the inside of the printer and ink getting
+on the reverse of the paper.
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_37.html">previous</A>, <A HREF="gimpprint_39.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_39.html b/doc/manual-html/gimpprint_39.html
new file mode 100644
index 0000000..fd25fb0
--- /dev/null
+++ b/doc/manual-html/gimpprint_39.html
@@ -0,0 +1,59 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - New Printer</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_38.html">previous</A>, <A HREF="gimpprint_40.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC54" HREF="gimpprint_toc.html#TOC54">D Adding a new printer</A></H1>
+<P>
+<A NAME="IDX253"></A>
+<A NAME="IDX254"></A>
+<A NAME="IDX255"></A>
+
+</P>
+
+<P>
+This appendix covers adding a new ESCP/2, PCL, or Canon printer.
+Writing a new driver module is not covered.
+
+</P>
+<P>
+The three steps to adding a printer are:
+
+</P>
+
+<OL>
+<LI>Add an entry to <TT>`printers.xml'</TT>
+
+<LI>Add the appropriate code and data to the appropriate driver module
+
+<LI>Tune the printer
+
+</OL>
+
+<P>
+Printer information is stored in two places: in <TT>`printers.xml'</TT>
+(which contains the list of printer models available to the the
+upper-level application), and in the appropriate driver file
+(<TT>`print-escp2.c'</TT>, <TT>`print-pcl.c'</TT>, or <TT>`print-canon.c'</TT>).
+
+</P>
+
+<UL>
+<LI><A HREF="gimpprint_40.html#SEC55">printers.xml</A>: File format description.
+<LI><A HREF="gimpprint_41.html#SEC56">Driver file</A>: Data structures to use.
+<LI><A HREF="gimpprint_42.html#SEC57">Epson inkjet printers</A>: Adding an Epson printer.
+<LI><A HREF="gimpprint_43.html#SEC58">Tuning Epson printers</A>: Tweaking settings.
+<LI><A HREF="gimpprint_44.html#SEC59">Canon inkjet printers</A>: Adding a Canon printer.
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_38.html">previous</A>, <A HREF="gimpprint_40.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_4.html b/doc/manual-html/gimpprint_4.html
new file mode 100644
index 0000000..5b262af
--- /dev/null
+++ b/doc/manual-html/gimpprint_4.html
@@ -0,0 +1,82 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Using libgimpprint</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_3.html">previous</A>, <A HREF="gimpprint_5.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC7" HREF="gimpprint_toc.html#TOC7">2 Using libgimpprint</A></H1>
+<P>
+<A NAME="IDX5"></A>
+
+</P>
+<P>
+This chapter describes how to write programs that use libgimpprint.
+
+</P>
+
+
+
+<H2><A NAME="SEC8" HREF="gimpprint_toc.html#TOC8">2.1 Code prerequisites</A></H2>
+<P>
+To use libgimpprint with a program, several steps must be taken:
+
+</P>
+
+<OL>
+<LI>Include the master libgimpprint header <CODE>&#60;gimp-print/gimp-print.h&#62;.</CODE>
+
+<LI>Call <CODE>stp_init()</CODE>.
+
+<LI>Link with libgimpprint.
+
+</OL>
+
+<P>
+The following is a short example program. It does not do anything useful,
+but it does everything required to link with libgimpprint and call other
+functions from libgimpprint.
+
+</P>
+
+<PRE>
+#include &#60;gimp-print/gimp-print.h&#62;
+
+int
+main (int argc, char *argv[])
+{
+ stp_init ();
+ return (0);
+}
+</PRE>
+
+
+
+<H2><A NAME="SEC9" HREF="gimpprint_toc.html#TOC9">2.2 Linking with libgimpprint</A></H2>
+
+<P>
+To link a program with libgimpprint, then <SAMP>`-lgimpprint'</SAMP> needs to be passed
+to the compiler when linking. For example, to compile and link <TT>`prog.c'</TT>
+the following commands would be used:
+
+</P>
+
+<PRE>
+gcc -c prog.c
+gcc -o prog -lgimpprint prog.o
+</PRE>
+
+<P>
+The compiler and linker flags needed may vary depending on the options
+GIMP-Print was configured with when it was built. The
+@command{gimpprint-config} script will give the correct parameters for
+the local installation (see section <A HREF="gimpprint_6.html#SEC11">3.1 @command{gimpprint-config}</A>).
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_3.html">previous</A>, <A HREF="gimpprint_5.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_40.html b/doc/manual-html/gimpprint_40.html
new file mode 100644
index 0000000..d71cf27
--- /dev/null
+++ b/doc/manual-html/gimpprint_40.html
@@ -0,0 +1,115 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - printers.xml</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_39.html">previous</A>, <A HREF="gimpprint_41.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC55" HREF="gimpprint_toc.html#TOC55">D.1 <TT>`printers.xml'</TT></A></H2>
+
+<P>
+<TT>`printers.xml'</TT> is an XML-like file (there's no formal DTD) that
+contains very simple printer definitions. A typical definition follows:
+
+</P>
+
+<PRE>
+&#60;printer name="EPSON Stylus Color 1500" driver="escp2-1500"&#62;
+&#60;color&#62;
+&#60;model value=2&#62;
+&#60;gamma value=0.597&#62;
+&#60;density value=1.0&#62;
+&#60;language value=escp2&#62;
+&#60;/printer&#62;
+</PRE>
+
+<P>
+There are other tags that may be present. The only ones that are
+mandatory are <SAMP>`&#60;printer&#62;'</SAMP>, <SAMP>`&#60;color&#62;'</SAMP>, <SAMP>`&#60;model&#62;'</SAMP>, and
+<SAMP>`&#60;language&#62;'</SAMP>. The other optional parameters (gamma and density in
+this case) can be used to adjust control settings. This is probably not
+the right place for them; the printer drivers themselves should contain
+this information. There's probably no good reason for anything but
+gamma and density to be in here. Gamma refers to the printer's gamma
+factor; density is the desired base ink density for the printer. The
+Epson driver contains the density information for each printer at each
+resolution internally. An even better driver would adjust density and
+possibly even gamma for paper type. All the more reason not to have
+that information here.
+
+</P>
+<P>
+If you really are curious about what tags are permitted, please see
+<TT>`printdefl.l'</TT>. I deliberately want to make this obscure.
+
+</P>
+<P>
+Anyway, here's the definition of the tags that do matter:
+
+</P>
+<P>
+<DL>
+<DT><U><TT>`printers.xml'</TT> tag:</U> <B><CODE>&#60;printer name="<VAR>longname</VAR>" driver="<VAR>drivername</VAR>"&#62;</CODE></B>
+<DD><A NAME="IDX256"></A>
+This starts the definition of a printer. The <VAR>longname</VAR> should be
+something human readable; the <VAR>drivername</VAR> should consist of
+alphanumerics and hyphens, and be fairly short. The <VAR>longname</VAR> is
+what will appear in the GUI listing of printers; the <VAR>drivername</VAR> is
+what is actually used to key into the list of printers. It is legal to
+have multiple printers with the same driver name.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U><TT>`printers.xml'</TT> tag:</U> <B><CODE>&#60;color&#62;</CODE></B>
+<DD><A NAME="IDX257"></A>
+<DT><U><TT>`printers.xml'</TT> tag:</U> <B><CODE>&#60;nocolor&#62;</CODE></B>
+<DD><A NAME="IDX258"></A>
+Indicates that this printer is capable of color, or is not capable of
+color respectively
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U><TT>`printers.xml'</TT> tag:</U> <B><CODE>&#60;model value=<VAR>int</VAR>&#62;</CODE></B>
+<DD><A NAME="IDX259"></A>
+This defines a model number. This is passed into the driver, which may
+do whatever it cares to with it--index into a table, compute on, or
+whatever. This need not be unique.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U><TT>`printers.xml'</TT> tag:</U> <B><CODE>&#60;language value=<VAR>type</VAR>&#62;</CODE></B>
+<DD><A NAME="IDX260"></A>
+This defines what driver module this printer uses. <VAR>type</VAR> should be
+<SAMP>`escp2'</SAMP>, <SAMP>`pcl'</SAMP>, <SAMP>`canon'</SAMP>, or <SAMP>`ps'</SAMP>.
+</DL>
+
+</P>
+<P>
+<DL>
+<DT><U><TT>`printers.xml'</TT> tag:</U> <B><CODE>&#60;/printer&#62;</CODE></B>
+<DD><A NAME="IDX261"></A>
+This, of course, closes off a printer definition.
+</DL>
+
+</P>
+<P>
+This is handled very ad-hoc. It's ugly. But it's reasonably easy to
+extend, and it's buzzword-compliant.
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_39.html">previous</A>, <A HREF="gimpprint_41.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_41.html b/doc/manual-html/gimpprint_41.html
new file mode 100644
index 0000000..8f7fde6
--- /dev/null
+++ b/doc/manual-html/gimpprint_41.html
@@ -0,0 +1,52 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Driver file</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_40.html">previous</A>, <A HREF="gimpprint_42.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC56" HREF="gimpprint_toc.html#TOC56">D.2 The driver file</A></H2>
+<P>
+<A NAME="IDX262"></A>
+
+</P>
+<P>
+Adding a new printer to a driver module (<TT>`print-escp2.c'</TT>,
+<TT>`print-pcl.c'</TT>, or <TT>`print-canon.c'</TT>---<TT>`print-ps.c'</TT> is
+really ad hoc) requires a bit more planning. Each driver is somewhat
+different, but they all generally have a vector of printer definitions,
+and the code does some special casing based on particular printer
+capabilities. The PCL and Canon drivers are quite similar; the Canon
+driver was actually cribbed from the PCL driver, but it then returned
+the favor.
+
+</P>
+<P>
+The Epson driver is a little bit different. Canon and PCL printers
+have some amount of intelligence; a lot of them have specific ink
+options, and know about specific paper sizes and types, and must be
+told the right thing. Epson printers have somewhat less intelligence
+and will more or less do exactly what the host tells it to do in a
+fairly regular fashion. I actually prefer this; it isn't materially
+more work for the host to compute things like exact paper sizes and
+such, it allows a lot more tweaking, and it may be why Epson has been
+more open with information -- the communication protocol doesn't
+really contain very much IP, so they have less reason to keep it
+secret.
+
+</P>
+<P>
+Someone else will have to fill in the sections about PCL and Canon
+printers.
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_40.html">previous</A>, <A HREF="gimpprint_42.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_42.html b/doc/manual-html/gimpprint_42.html
new file mode 100644
index 0000000..4c5e557
--- /dev/null
+++ b/doc/manual-html/gimpprint_42.html
@@ -0,0 +1,457 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Epson inkjet printers</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_41.html">previous</A>, <A HREF="gimpprint_43.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC57" HREF="gimpprint_toc.html#TOC57">D.3 Epson inkjet printers</A></H2>
+<P>
+<A NAME="IDX263"></A>
+
+</P>
+<P>
+The <SAMP>`model_capabilities'</SAMP> vector in <TT>`print-escp2.c'</TT> contains
+one entry for each defined printer model. The <SAMP>`model'</SAMP> parameter in
+<TT>`printers.xml'</TT> is an index into this table.
+
+</P>
+<P>
+In general, the new printers have fewer eccentricities than the older
+printers. That doesn't mean they're simpler, just that they're more
+consistent.
+
+</P>
+<P>
+An <CODE>escp2_printer_t</CODE> is a C struct defined as follows:
+
+</P>
+<P>
+<DL>
+<DT><U>Data type:</U> <B>escp2_printer_t</B>
+<DD><A NAME="IDX264"></A>
+
+<PRE>
+typedef struct escp2_printer
+{
+ model_cap_t flags; /* Bitmask of flags, see below */
+/*****************************************************************************/
+ int nozzles; /* Number of nozzles per color */
+ int min_nozzles; /* Minimum number of nozzles per color */
+ int nozzle_separation; /* Separation between rows, in 1/360" */
+ int black_nozzles; /* Number of black nozzles (may be extra) */
+ int min_black_nozzles; /* # of black nozzles (may be extra) */
+ int black_nozzle_separation; /* Separation between rows */
+ int fast_nozzles; /* Number of fast nozzles */
+ int min_fast_nozzles; /* # of fast nozzles (may be extra) */
+ int fast_nozzle_separation; /* Separation between rows */
+/*****************************************************************************/
+ int xres; /* Normal distance between dots in */
+ /* softweave mode (inverse inches) */
+ int enhanced_xres; /* Distance between dots in highest */
+ /* quality modes */
+ int base_separation; /* Basic unit of row separation */
+ int base_resolution; /* Base hardware spacing (above this */
+ /* always requires multiple passes) */
+ int enhanced_resolution;/* Above this we use the */
+ /* enhanced_xres rather than xres */
+ int resolution_scale; /* Scaling factor for ESC(D command */
+ int max_black_resolution; /* Above this resolution, we */
+ /* must use color parameters */
+ /* rather than (faster) black */
+ /* only parameters*/
+ int max_hres;
+ int max_vres;
+ int min_hres;
+ int min_vres;
+/*****************************************************************************/
+ int max_paper_width; /* Maximum paper width, in points */
+ int max_paper_height; /* Maximum paper height, in points */
+ int min_paper_width; /* Maximum paper width, in points */
+ int min_paper_height; /* Maximum paper height, in points */
+ /* Printer interleave: */
+ int m_left_margin; /* Left margin, points */
+ int m_right_margin; /* Right margin, points */
+ int m_top_margin; /* Absolute top margin, points */
+ int m_bottom_margin; /* Absolute bottom margin, points */
+ /* ROLL FEED: */
+ /* Softweave: */
+ int roll_left_margin; /* Left margin, points */
+ int roll_right_margin; /* Right margin, points */
+ int roll_top_margin; /* Absolute top margin, points */
+ int roll_bottom_margin; /* Absolute bottom margin, points */
+ /* Printer interleave: */
+ int m_roll_left_margin; /* Left margin, points */
+ int m_roll_right_margin; /* Right margin, points */
+ int m_roll_top_margin; /* Absolute top margin, points */
+ int m_roll_bottom_margin; /* Absolute bottom margin, points */
+/*****************************************************************************/
+ int extra_feed; /* Extra distance the paper can be spaced */
+ /* beyond the bottom margin, in 1/360". */
+ /* (maximum useful value is */
+ /* nozzles * nozzle_separation) */
+ int separation_rows; /* Some printers require funky spacing */
+ /* arguments in interleave mode. */
+ int pseudo_separation_rows;/* Some printers require funky */
+ /* spacing arguments in softweave mode */
+
+ int zero_margin_offset; /* Offset to use to achieve */
+ /* zero-margin printing */
+ int initial_vertical_offset;
+ int black_initial_vertical_offset;
+ int extra_720dpi_separation;
+
+/*****************************************************************************/
+ const int *dot_sizes; /* Vector of dot sizes for resolutions */
+ const double *densities; /* List of densities for each printer */
+ const escp2_variable_inklist_t *inks; /* Choices of inks for this printer */
+/*****************************************************************************/
+ const paperlist_t *paperlist;
+ const res_t *reslist;
+ const inklist_t *inklist;
+/*****************************************************************************/
+ const int *bits;
+ const int *base_resolutions;
+ const input_slot_list_t *input_slots;
+/*****************************************************************************/
+ const init_sequence_t *preinit_sequence;
+ const init_sequence_t *postinit_remote_sequence;
+} escp2_printer_t;
+</PRE>
+
+</DL>
+
+<P>
+The printer definition block is divided into 8 sections. The first
+section is a set of miscellaneous printer options. These are
+described in the code, and will not be discussed further here.
+
+</P>
+
+<P>
+The second section describes the number of nozzles and the separation
+between nozzles in base units. The base unit is 1/360" for all
+currently supported printers, but future printers may support a
+smaller base unit.
+
+</P>
+<P>
+Many printers have more black nozzles than nozzles of other colors,
+and when used in black and white mode, it's possible to use these
+extra nozzles, which speeds up printing. As an example, a printer
+that is specified to have 48 cyan, magenta, and yellow nozzles, and
+144 black nozzles, can use all 144 black nozzles when printing black
+ink only. When printing in color, only 48 nozzles of each color
+(including black) can be used.
+
+</P>
+<P>
+Most printers can print using either the number of nozzles available
+or any smaller number. Some printers require that all of the nozzles
+be used. Those printers will set <CODE>min_nozzles</CODE> and/or
+<CODE>min_black_nozzles</CODE> to the same value as <CODE>nozzles</CODE> and/or
+<CODE>black_nozzles</CODE>.
+
+</P>
+
+<P>
+The third section defines basic units of measure for the printer,
+including the standard separation between dots, the base nozzle
+separation, and the minimum and maximum printing resolutions the
+printer supports. Most of these are fairly self-explanatory, but some
+are not obvious.
+
+</P>
+<P>
+Most Epson printers, other than the high-end Stylus Pro models, cannot
+print dots spaced more closely than 1/360" or 1/720" apart (this is
+the setting for <CODE>xres</CODE>. This is true even for printers that
+support resolutions of 1440 or 2880 DPI. In these cases, the data
+must be printed in 2, 4, or 8 passes. While the printer can position
+the head to a resolution of 1/1440" or 1/2880", the head cannot
+deposit ink that frequently.
+
+</P>
+<P>
+Some printers can only print in their very best quality (using the
+smallest dots available) printing at a lower resolution. For example,
+the Stylus Photo EX can normally print with a dot spacing of 1/720".
+The smallest dot size cannot be printed with a dot spacing of less
+than 1/360", however. In this case, we use <CODE>enhanced_xres</CODE>
+to specify the resolution to be used in this enhanced mode, and
+<CODE>enhanced_resolution</CODE> to specify the printing resolution above
+which we use the <CODE>enhanced_xres</CODE>.
+
+</P>
+<P>
+The <CODE>resolution_scale</CODE> command is used to specify scaling factors
+for the dot separation on newer printers. It should always be 14400
+with current printers.
+
+</P>
+
+<P>
+The fourth section specifies the minimum and maximum paper sizes, and
+the margins. Some printers allow use of narrower margins when
+softweave is used; both sets of margins are specified.
+
+</P>
+<P>
+There is a convenient <SAMP>`INCH'</SAMP> macro defined to make specification of
+the <CODE>max_paper_width</CODE> and <CODE>max_paper_height</CODE> more legible. It
+multiplies 72 by the provided expression to get the appropriate number
+of points. For example, to specify 8.5", <SAMP>`INCH(17/2)'</SAMP> expands to
+<SAMP>`(72 * 17/2)'</SAMP>, which is evaluated left to right, and hence
+generates the correct value.
+
+</P>
+
+<P>
+The fifth section specifies some miscellaneous values that are
+required for certain printers. For most printers, the correct values
+are 1 for <CODE>separation_rows</CODE> and 0 for the others. Very, very few
+printers require (or allow) <CODE>separation_rows</CODE> to be anything but
+1 and <CODE>pseudo_separation_rows</CODE> other than zero. The Stylus Color
+1520, Stylus Color 800, Stylus Color 850, and (strangely enough to my
+mind, since it's a new printer) Stylus Color 660 seem to be the only
+exceptions.
+
+</P>
+<P>
+The <CODE>zero_margin_offset</CODE> is used to specify an additional
+negative horizontal offset required to print to the edges of the paper
+on newer Stylus Photo printers. These must be determined empirically;
+good starting values are 100 for 1440 DPI and 50 for 2880 DPI
+printers. The goal is to print to the edge of the page, but not over
+it.
+
+</P>
+
+<P>
+The sixth section specifies head offsets for printers that do not have
+the color jets aligned. Certain printers, such as the Stylus Color
+480, have an unusual head arrangement whereby instead of all of the
+colors being aligned vertically, the nozzles are configured in
+groups. These printers are easy to determine; if the normal head
+offset of zero for each color is used, the printing will be vertically
+out of alignment. Most of these printers require specification of a
+negative offset for printing to the top edge of the paper; typically
+these printers do not require such an offset when printing black only.
+
+</P>
+<P>
+The seventh section specifies the most difficult values to tune, the
+dot sizes, printing densities, and ink values (for variable dot size
+enabled printers). These will be described in detail below.
+
+</P>
+
+<P>
+The last section specifies luminosity, hue, and saturation adjustment
+vectors for the printer, and the paper definitions. These are used to
+adjust the color in Photograph and Solid Colors output modes. These are
+each vectors of 48 (actually 49, as the first value must be duplicated)
+doubles that remap the luminosity, hue, and saturation respectively.
+The hue is calculated, and the value used to interpolate between the two
+closest points in each vector.
+
+</P>
+<P>
+The paper definitions is a set of paper definitions. The paper
+definition contains the name of the paper type, special settings that
+are required for printers to process the paper correctly, and a set of
+adjustment values. These are not currently discussed here.
+
+</P>
+
+<P>
+The lists of dot sizes and densities contain values for 13 printing
+modes: 120/180 DPI using printer weaving (single row;
+referred to as "interleave") and "soft" weaving (the driver
+determines the exact pattern of dot layout), 360 DPI interleave and
+softweave, 720x360 DPI interleave and softweave, 720 DPI interleave
+and softweave, 1440x720 interleave and softweave, 2880x720 interleave
+and softweave, and 2880x1440 softweave only.
+
+</P>
+<P>
+For the dot sizes, the value for each element in the vector selects
+the dot size to be used when printing at this (or similar)
+resolution. The dot sizes are determined by consulting the
+programming manual for the printer and experimenting as described
+below. Current Epson printers always use dot sizes less than
+<SAMP>`16'</SAMP>, or <SAMP>`0x10'</SAMP>, to indicate single dot size (each dot is
+represented by 1 bit, and it's either printed or not), and dot sizes
+of <SAMP>`16'</SAMP> or greater to indicate variable dot size (each dot is
+represented by 2 bits, and it can either be not printed or take on 2
+or 3 values, representing the relative size of the printed dot).
+Variable dot sizes permit the use of very small dots (which would be
+too small to fill the page and produce solid black) in light areas,
+while allowing the page to be filled with larger dots in darker areas.
+
+</P>
+<P>
+Even single dot size printers can usually produce dots of different
+sizes; it's just illegal to actually try to switch dot size during a
+page. These dots are also much bigger than those used in true
+variable dot size printing.
+
+</P>
+<P>
+A dot size of <SAMP>`-1'</SAMP> indicates that this resolution is illegal for
+the printer in question. Any resolutions that would use this dot size
+will not be presented to the user. A dot size of <SAMP>`-2'</SAMP> indicates
+that this resolution is legal, but that the driver is not to attempt
+to set any dot size. Some very old printers do not support the
+command to set the dot size.
+
+</P>
+<P>
+Most printers support a dot size of <SAMP>`0'</SAMP> as a mode-specific default,
+but it's often a bigger dot than necessary. Printers usually also
+support some dot sizes between <SAMP>`1'</SAMP> and <SAMP>`3'</SAMP>. Usually <SAMP>`1'</SAMP>
+is the right dot size for 720 and 1440 dpi printing, and <SAMP>`3'</SAMP> works
+best at 360 dpi.
+
+</P>
+<P>
+Variable dot size printers usually support 2 or 3 sets of variable dot
+sizes. Older printers based on a 6 picolitre drop (the 480, 720, 740,
+750, 900, and 1200) support two: mode 16 (0x10 in hexadecimal) for
+normal variable dots at 1440 or 720 dpi, and mode 17 (0x10) for
+special larger dots at 360 dpi. Newer printers based on 4 picolitre
+drops normally support three sizes: <SAMP>`0x10'</SAMP> for 4 pl base drops,
+<SAMP>`0x11'</SAMP> for 6 pl base drops, and <SAMP>`0x12'</SAMP> for special large
+drops. On these printers, <SAMP>`0x10'</SAMP> usually works best at 1440x720
+and <SAMP>`0x11'</SAMP> works best at 720x720. Unfortunately, <SAMP>`0x10'</SAMP>
+doesn't seem to generate quite enough density at 720x720, because if
+it did the output would be very smooth. Perhaps it's possible to
+tweak things@enddots{}
+
+</P>
+
+<P>
+The list of densities is a list of base density values for all of the
+above listed modes. "Density" refers to the amount of ink deposited
+when a solid color (or solid black) is printed. So if the density is
+<SAMP>`.5'</SAMP>, solid black actually prints only half the possible dots.
+"Base density" refers to the fact that the density value can be
+scaled in the GUI or on the Ghostscript command line. The density
+value specified (which is not made visible to the user) is multiplied
+by the base density to obtain the effective density value. All other
+things (such as ink drop size) remaining the same, doubling the
+resolution requires halving the base density. The base density in the
+density vector may exceed <SAMP>`1'</SAMP>, as many paper types require lower
+density than the base driver. The driver ensures that the actual
+density never exceeds 1.
+
+</P>
+<P>
+Tuning the density should be done on high quality paper (usually
+glossy photo paper). The goal is to find the lowest density value
+that results in solid black (no visible gaps under a fairly high power
+magnifying glass or loupe). If an appropriate density value is found
+for 720 DPI, it could be divided by 2 for 1440x720, by 4 for 2880x720,
+and by 8 for 2880x1440.
+
+</P>
+<P>
+However, for printers that offer a choice of dot size, this may not be
+the best strategy. The best choice for dot size is the smallest dot
+size that allows choosing a density value not greater than 1 that
+gives full coverage. This dot size may be different for different
+resolutions. Tuning variable dot size printers is more complicated;
+the process is described below.
+
+</P>
+<P>
+The last member is a pointer to a structure containing a list of ink
+values for variable dot size (or 6 color) inks. We model variable dot
+size inks as producing a certain "value" of ink for each available dot
+size, where the largest dot size has a value of 1. 6-color inks are
+handled similarly; the light cyan and light magenta inks are treated
+as a fractional ink value. The combination of variable dot size and 6
+color inks, of course, just creates that many more different ink
+choices.
+
+</P>
+<P>
+This structure is actually rather complicated; it contains entries for
+each combination of physical printer resolution (180, 360, 720, and
+1440 dpi), ink colors (4, 6, and 7), and single and variable dot sizes
+(since some printer modes can't handle variable dot size inks). Since
+there's so much data, it's actually a somewhat deeply nested
+structure:
+
+</P>
+<P>
+An <CODE>escp2_printer_t</CODE> contains a pointer (essentially, a reference
+rather than a copy) to an <CODE>escp2_variable_inklist_t</CODE>.
+
+</P>
+<P>
+An <CODE>escp2_variable_inklist_t</CODE> contains pointers to
+<CODE>escp2_variable_inkset_t</CODE> structures. There is one such pointer
+for each combination of resolution, dot type, and ink colors as
+described above. Yes, this is rather inflexible.
+
+</P>
+<P>
+An <CODE>escp2_variable_inkset_t</CODE> contains pointers to
+<CODE>escp2_variable_ink_t</CODE> structures. There is one such pointer for
+each of the four colors (C, M, Y, and K).
+
+</P>
+<P>
+An <CODE>escp2_variable_ink_t</CODE> contains a pointer to the actual list of
+ink values (<CODE>simple_dither_range_t</CODE>), the number of ink values, and
+a density value to be used for computing the transitions. This density
+value is actually a scaling value; it is multiplied by the effective
+density to compute the density to be used for computing the transitions.
+Normally, this value is <SAMP>`1'</SAMP>, but in some cases it may be possible
+to get smoother results with a different value (in particular, the
+single dot size 6-color inks work best with the effective density scaled
+to <SAMP>`.75'</SAMP> for this purpose). A lower density lowers the transition
+points, which results in more ink being deposited.
+
+</P>
+<P>
+A <CODE>simple_dither_range_t</CODE> is a structure containing four values:
+
+</P>
+
+<OL>
+<LI>The value of the particular ink
+
+<LI>The bit pattern used to represent the ink
+
+<LI>Whether the ink is light (0) or dark (1), for inks with light and dark variants
+
+<LI>The relative amount of ink actually deposited by this dot (not
+
+currently used for much; it can be used for ink reduction purposes, to
+reduce the amount of ink deposited on the paper).
+</OL>
+
+<P>
+These things are interesting as arrays. From an array of
+<CODE>simple_dither_range_t</CODE>'s, the dither code computes transition
+values that it looks up at run time to decide what ink to print, as well
+as whether to print at all.
+
+</P>
+<P>
+<STRONG>Really</STRONG> confused now? Yup. You'll probably find it easier to
+simply read the code.
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_41.html">previous</A>, <A HREF="gimpprint_43.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_43.html b/doc/manual-html/gimpprint_43.html
new file mode 100644
index 0000000..381ac9c
--- /dev/null
+++ b/doc/manual-html/gimpprint_43.html
@@ -0,0 +1,189 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Tuning Epson printers</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_42.html">previous</A>, <A HREF="gimpprint_44.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC58" HREF="gimpprint_toc.html#TOC58">D.4 Tuning the printer</A></H2>
+<P>
+<A NAME="IDX265"></A>
+<A NAME="IDX266"></A>
+
+</P>
+<P>
+Now, how do you use all this to tune a printer? There are a number of
+ways to do it; this one is my personal favorite.
+
+</P>
+<P>
+There's a file named <TT>`cyan-sweep.tif'</TT>. This consists of a thin bar
+of cyan sweeping from white to almost pure cyan, and from pure cyan to
+black. The first thing to do is to pick the appropriate
+<CODE>simple_dither_range_t</CODE> (or create a whole new
+<CODE>escp2_variable_inklist_t</CODE>) and comment out all but the darkest ink
+(this means you'll be using the largest dots of dark ink). At 8.5"
+width (the width of a letter-size piece of paper), the bar will be 1/8"
+high. Printing it on wider or narrower paper will change the height
+accordingly. Print it width-wise across a piece of photo quality paper
+in line art mode using ordered or adaptive hybrid dither. Do not use
+photographic mode; the colors in photographic mode vary non-linearly
+depending upon the presence of the three color components, while in line
+art mode the colors are much purer. Make sure that all the color
+adjustments are set to defaults (1.0). Use the highest quality version
+of the print mode you're testing to reduce banding and other artifacts.
+This is much easier to do with the Gimp than with Ghostscript.
+
+</P>
+<P>
+At this stage, you want to look for four things:
+
+</P>
+
+<OL>
+<LI>
+
+The black near the center of the line is solid, but not more so than
+that.
+
+<LI>
+
+The cyan immediately to the left of the black is <EM>almost</EM> solid.
+
+<LI>
+
+The dark cyan at the far right of the page is solid, but not more so.
+You can try tuning the density so that it isn't quite solid, then
+nudging up the density until it is.
+
+<LI>
+
+Both sweeps sweep smoothly from light to dark. In particular, the dark
+half of the bar shouldn't visibly change color; it should go smoothly
+from cyan to black.
+</OL>
+
+<P>
+Repeat this stage until you have everything just right. Use the
+positioning entry boxes in the dialog to position each bar exactly
+1/8" further down the page. Adjacent bars will be touching.
+
+</P>
+<P>
+The next step is to uncomment out the second darkest dot size. If
+you're using variable dots, use the second largest dot size of the
+dark ink rather than the largest dot size of the light ink. This will
+give you two inks.
+
+</P>
+<P>
+When you recompile the plugin, you simply need to copy the new
+executable into the correct place. You do not need to exit and
+restart the Gimp.
+
+</P>
+<P>
+Print another bar adjacent to the first one. Your goal is to match
+the bar using a single dot size as closely as possible. You'll find
+that the dark region of the bar shouldn't change to any great degree,
+but the light half probably will. If the lighter part of the light
+half is too dark, you need to increase the value of the smaller dot;
+if it's too light, you need to decrease the value. The reasoning is
+that if the value is too low, the ink isn't being given enough credit
+for its contribution to the darkness of the ink, and vice versa.
+Repeat until you have a good match. Make sure you let the ink dry
+fully, which will take a few minutes. Wet ink will look too dark.
+Don't look at the paper too closely; hold it at a distance. The extra
+graininess of the largest dot size will probably make it look lighter
+than it should; if you hold it far enough away so that you can't see
+the dots, you'll get a more accurate picture of what's going on.
+
+</P>
+<P>
+After you have what looks like a good match, print another bar using
+only the largest dot size (or dark ink, for single dot size 6-color
+printers). You want to ensure that the bars touching each other look
+identical, or as close as possible to it; your eye won't give you a
+good reading if the bars are separated from each other. You'll
+probably have to repeat the procedure.
+
+</P>
+<P>
+The next step is to comment out all but the largest and third-largest
+dot size, and repeat the procedure. When they match, use all three
+dot sizes of dark ink. Again, the goal is to match the single dot
+size.
+
+</P>
+<P>
+You'll probably find the match is imperfect. Now you have to figure
+out what region isn't right, which takes some experimentation. Even
+small adjustments can make a noticeable difference in what you see.
+At this stage, it's very important to hold the page far enough from
+your eye; when you use all three dot sizes, the texture will be much
+more even, which sometimes makes it look darker and sometimes lighter.
+
+</P>
+<P>
+After this is calibrated, it's time to calibrate the light ink against
+the dark ink. To do this, comment out all but the large dot version
+of the two inks, and repeat the procedure. This is trickier, because
+the hues of the inks might not be quite identical. Look at the dark
+half of the bar as well as the light half to see that the hue really
+doesn't change as you sweep from cyan to black. Sometimes it's easier
+to judge that way. You may find that it looks blotchy, in which case
+you should switch from ordered dither to adaptive hybrid.
+
+</P>
+<P>
+After you have the light and dark inks calibrated against each other,
+it's time to add everything back in. Usually you don't want to use
+the largest dot size of light ink. These dots will be much larger
+than the small dots of dark ink, but they'll still be lighter. This
+will cause problems when printing mixed colors, since you'll be
+depositing more ink on lighter regions of the page, and you'll
+probably get strange color casts that you can't get rid of in neutral
+tones. I normally use only the smallest one or two dot sizes of light
+ink.
+
+</P>
+<P>
+After you've tweaked everything, print the color bar with saturation
+set to zero. This will print neutral tones using color inks. Your
+goal here is to look for neutral tonality. If you're using a 6-color
+printer and get a yellow cast, it means that the values for your light
+inks are too high (remember, that means they're getting too much
+credit, so you're not depositing enough cyan and magenta ink, and the
+yellow dominates). If you get a bluish or bluish-purple cast, your
+light inks are too low (you're not giving them enough credit, so too
+much cyan and magenta is deposited, which overwhelms the yellow).
+Make sure you do this on very white, very high grade inkjet paper
+that's designed for 1440x720 dpi or higher; otherwise the ink will
+spread on contact and you'll get values that aren't really true for
+high grade paper. You can, of course, calibrate for low grade paper
+if that's what you're going to use, but that shouldn't be put into the
+distribution.
+
+</P>
+<P>
+You can also fully desaturate this bar inside the Gimp and print it as
+monochrome (don't print the cyan as monochrome; the driver does funny
+things with luminance), for comparison. You'll find it very hard to
+get rid of all color casts.
+
+</P>
+<P>
+There are other ways of tuning printers, but this one works pretty
+well for me.
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_42.html">previous</A>, <A HREF="gimpprint_44.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_44.html b/doc/manual-html/gimpprint_44.html
new file mode 100644
index 0000000..6e54c81
--- /dev/null
+++ b/doc/manual-html/gimpprint_44.html
@@ -0,0 +1,117 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Canon inkjet printers</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_43.html">previous</A>, <A HREF="gimpprint_45.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC59" HREF="gimpprint_toc.html#TOC59">D.5 Canon inkjet printers</A></H2>
+
+<P>
+Basically, a new Canon printer can be added to <TT>`print-canon.c'</TT> in a
+similar way as described above for the epson inkjet printers. The main
+differences are noted here:
+
+</P>
+<P>
+In general, Canon printers have more "built-in intelligence" than Epson
+printers which results in the fact that the driver only has to tell the
+printing conditions like resolutions, dot sizes, etc. to the printer and
+afterwards transfer the raster data line by line for each color used.
+
+</P>
+<P>
+<CODE>canon_cap_t</CODE> is a C struct defined as follows:
+
+</P>
+<P>
+<DL>
+<DT><U>Data type:</U> <B>canon_cap_t</B>
+<DD><A NAME="IDX267"></A>
+
+<PRE>
+typedef struct canon_caps {
+ int model; /* model number as used in printers.xml */
+ int max_width; /* maximum printable paper size */
+ int max_height;
+ int base_res; /* base resolution - shall be 150 or 180 */
+ int max_xdpi; /* maximum horizontal resolution */
+ int max_ydpi; /* maximum vertical resolution */
+ int max_quality;
+ int border_left; /* left margin, points */
+ int border_right; /* right margin, points */
+ int border_top; /* absolute top margin, points */
+ int border_bottom; /* absolute bottom margin, points */
+ int inks; /* installable cartridges (CANON_INK_*) */
+ int slots; /* available paperslots */
+ int features; /* special bjl settings */
+ canon_dot_size_t dot_sizes; /* Vector of dot sizes for resolutions */
+ canon_densities_t densities; /* List of densities for each printer */
+ canon_variable_inklist_t *inxs; /* Choices of inks for this printer */
+} canon_cap_t;
+</PRE>
+
+</DL>
+
+<P>
+Since there are Canon printers which print in resolutions of
+@math{2^n*150} dpi (e.g. 300, 600, 1200) and others which support
+resolutions of @math{2^n*180} dpi (e.g. 360, 720, 1440), there's a base
+resolution (150 or 180, respectively) given in the
+<CODE>canon_cap_t</CODE>. The structs <CODE>canon_dot_size_t</CODE>,
+<CODE>canon_densities_t</CODE> and <CODE>canon_variable_inklist_t</CODE> refer to
+resolutions being multiples of the base resolution.
+
+</P>
+<P>
+For the Canon driver, the struct <CODE>canon_dot_size_t</CODE> holds values
+for a model's capabilities at a given resolution: <SAMP>`-1'</SAMP> if the
+resolution is not supported. <SAMP>`0'</SAMP> if it can be used and <SAMP>`1'</SAMP> if
+the resolution can be used for variable dot size printing.
+
+</P>
+<P>
+In <CODE>canon_densities_t</CODE> the base densities for each resolution can
+be specified like for an epson printer, the same holds true for
+<CODE>canon_variable_inklist_t</CODE>. See the descriptions above to learn
+about how to adjust your model's output to yield nice results.
+
+</P>
+<P>
+There's a slight difference though in the way the Canon driver and the escp2
+driver define their variable inklists: In the Canon driver, you need to define
+an inklist like this:
+
+</P>
+
+<PRE>
+static const canon_variable_inklist_t canon_ink_myinks[] =
+{
+ {
+ 1,4, /* 1bit/pixel, 4 colors */
+ &#38;ci_CMYK_1, &#38;ci_CMYK_1, &#38;ci_CMYK_1,
+ &#38;ci_CMYK_1, &#38;ci_CMYK_1, &#38;ci_CMYK_1,
+ },
+ {
+ 3,4, /* 3bit/pixel, 4 colors */
+ &#38;ci_CMYK_3, &#38;ci_CMYK_3, &#38;ci_CMYK_3,
+ &#38;ci_CMYK_3, &#38;ci_CMYK_3, &#38;ci_CMYK_3,
+ },
+};
+</PRE>
+
+<P>
+where the <SAMP>`&#38;ci_CMYK_1'</SAMP> and <SAMP>`&#38;ci_CMYK_3'</SAMP> entries are references
+to a previously defined const of type <CODE>canon_variable_inkset_t</CODE>.
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_43.html">previous</A>, <A HREF="gimpprint_45.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_45.html b/doc/manual-html/gimpprint_45.html
new file mode 100644
index 0000000..b7214b1
--- /dev/null
+++ b/doc/manual-html/gimpprint_45.html
@@ -0,0 +1,49 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Data Type and Variable Index</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_44.html">previous</A>, <A HREF="gimpprint_46.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC60" HREF="gimpprint_toc.html#TOC60">Data Type and Variable Index</A></H1>
+
+<P>
+<H2>c</H2>
+<DIR>
+<LI><A HREF="gimpprint_44.html#IDX267">canon_cap_t</A>
+</DIR>
+<H2>e</H2>
+<DIR>
+<LI><A HREF="gimpprint_42.html#IDX264">escp2_printer_t</A>
+</DIR>
+<H2>g</H2>
+<DIR>
+<LI><A HREF="gimpprint_18.html#IDX172">gimpprint_binary_age</A>
+<LI><A HREF="gimpprint_18.html#IDX171">gimpprint_current_interface</A>
+<LI><A HREF="gimpprint_18.html#IDX173">gimpprint_interface_age</A>
+<LI><A HREF="gimpprint_18.html#IDX168">gimpprint_major_version</A>
+<LI><A HREF="gimpprint_18.html#IDX170">gimpprint_micro_version</A>
+<LI><A HREF="gimpprint_18.html#IDX169">gimpprint_minor_version</A>
+</DIR>
+<H2>s</H2>
+<DIR>
+<LI><A HREF="gimpprint_16.html#IDX151">stp_image_t</A>
+<LI><A HREF="gimpprint_14.html#IDX114">stp_option_t</A>
+<LI><A HREF="gimpprint_12.html#IDX100">stp_outfunc_t</A>
+<LI><A HREF="gimpprint_15.html#IDX125">stp_papersize_t</A>
+<LI><A HREF="gimpprint_15.html#IDX126">stp_papersize_unit_t</A>
+<LI><A HREF="gimpprint_16.html#IDX140">stp_printer_t</A>
+<LI><A HREF="gimpprint_16.html#IDX150">stp_printfuncs_t</A>
+<LI><A HREF="gimpprint_12.html#IDX20">stp_vars_t</A>
+</DIR>
+
+</P>
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_44.html">previous</A>, <A HREF="gimpprint_46.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_46.html b/doc/manual-html/gimpprint_46.html
new file mode 100644
index 0000000..88bb95b
--- /dev/null
+++ b/doc/manual-html/gimpprint_46.html
@@ -0,0 +1,249 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Function and Macro Index</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_45.html">previous</A>, <A HREF="gimpprint_47.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC61" HREF="gimpprint_toc.html#TOC61">Function and Macro Index</A></H1>
+
+<P>
+<H2>*</H2>
+<DIR>
+<LI><A HREF="gimpprint_37.html#IDX251"><CODE>* ?? <VAR>BC</VAR>=<VAR>xx</VAR> <VAR>y</VAR>[1] ... <VAR>y</VAR>[xx]</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX238"><CODE>* AC <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX224"><CODE>* AI <VAR>BC</VAR>=3 00 00 00</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX226"><CODE>* CH <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX229"><CODE>* DA <VAR>BC</VAR>=4 00 <VAR>xx</VAR> 00 <VAR>yy</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX230"><CODE>* DA <VAR>BC</VAR>=6 00 <VAR>xx</VAR> 00 <VAR>yy</VAR> 09 00</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX239"><CODE>* DR <VAR>BC</VAR>=4 00 xx <VAR>DT2</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX227"><CODE>* DT <VAR>BC</VAR>=3 00 <VAR>xx</VAR> 00</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX228"><CODE>* DU <VAR>BC</VAR>=6 00 <VAR>xx</VAR> 00 09 00 <VAR>yy</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX244"><CODE>* EX <VAR>BC</VAR>=3 00 <VAR>xx</VAR> <VAR>yy</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX243"><CODE>* EX <VAR>BC</VAR>=6 00 00 00 00 0x05 <VAR>xx</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX242"><CODE>* EX <VAR>BC</VAR>=6 00 00 00 00 0x14 <VAR>xx</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX235"><CODE>* FP <VAR>BC</VAR>=3 00 <VAR>xx</VAR> <VAR>yy</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX240"><CODE>* IK <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX233"><CODE>* IQ <VAR>BC</VAR>=1 01</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX234"><CODE>* IR <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX225"><CODE>* LD <VAR>BC</VAR>=0</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX245"><CODE>* PH <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX246"><CODE>* PM <VAR>BC</VAR>=2 00 00</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX237"><CODE>* PP <VAR>BC</VAR>=3 00 <VAR>xx</VAR> <VAR>yy</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX241"><CODE>* PZ BC=2 00 xx</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX232"><CODE>* RS <VAR>BC</VAR>=1 01</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX248"><CODE>* SM <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX250"><CODE>* SM <VAR>BC</VAR>=1 01</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX252"><CODE>* SM <VAR>BC</VAR>=2 00 02</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX236"><CODE>* SN <VAR>BC</VAR>=3 00 <VAR>xx</VAR> <VAR>yy</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX247"><CODE>* ST <VAR>BC</VAR>=2 00 <VAR>xx</VAR></CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX249"><CODE>* ST <VAR>BC</VAR>=1 01</CODE></A>
+<LI><A HREF="gimpprint_37.html#IDX231"><CODE>* SV <VAR>BC</VAR>=0</CODE></A>
+</DIR>
+<H2>&#60;</H2>
+<DIR>
+<LI><A HREF="gimpprint_40.html#IDX261"><CODE>&#60;/printer&#62;</CODE></A>
+<LI><A HREF="gimpprint_40.html#IDX257"><CODE>&#60;color&#62;</CODE></A>
+<LI><A HREF="gimpprint_40.html#IDX260"><CODE>&#60;language value=<VAR>type</VAR>&#62;</CODE></A>
+<LI><A HREF="gimpprint_40.html#IDX259"><CODE>&#60;model value=<VAR>int</VAR>&#62;</CODE></A>
+<LI><A HREF="gimpprint_40.html#IDX258"><CODE>&#60;nocolor&#62;</CODE></A>
+<LI><A HREF="gimpprint_40.html#IDX256"><CODE>&#60;printer name="<VAR>longname</VAR>" driver="<VAR>drivername</VAR>"&#62;</CODE></A>
+</DIR>
+<H2>a</H2>
+<DIR>
+<LI><A HREF="gimpprint_8.html#IDX11">AM_PATH_GIMPPRINT</A>
+</DIR>
+<H2>e</H2>
+<DIR>
+<LI><A HREF="gimpprint_36.html#IDX211"><CODE>ESC $ <VAR>OFFSET2</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX210"><CODE>ESC ($ <VAR>BC</VAR>=4 <VAR>OFFSET4</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX213"><CODE>ESC (/ <VAR>BC</VAR>=4 <VAR>OFFSET4</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX212"><CODE>ESC (\ <VAR>BC</VAR>=4 <VAR>UNITS2</VAR> <VAR>OFFSET2</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX201"><CODE>ESC (C <VAR>BC</VAR>=2 <VAR>PAGELENGTH2</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX202"><CODE>ESC (C <VAR>BC</VAR>=4 <VAR>PAGELENGTH4</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX203"><CODE>ESC (c <VAR>BC</VAR>=4 <VAR>TOP2</VAR> <VAR>LENGTH2</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX204"><CODE>ESC (c <VAR>BC</VAR>=8 <VAR>TOP4</VAR> <VAR>LENGTH4</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX219"><CODE>ESC (D <VAR>BC</VAR>=4 <VAR>BASE2</VAR> <VAR>VERTICAL1</VAR> <VAR>HORIZONTAL1</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX200"><CODE>ESC (e <VAR>BC</VAR>=2 <VAR>ZERO1</VAR> <VAR>DOTSIZE1</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX193"><CODE>ESC (G <VAR>BC</VAR>=1 <VAR>ON1</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX197"><CODE>ESC (i <VAR>BC</VAR>=1 <VAR>MICROWEAVE1</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX196"><CODE>ESC (K <VAR>BC</VAR>=2 <VAR>ZERO1</VAR> <VAR>GRAYMODE1</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX216"><CODE>ESC (r <VAR>BC</VAR>=2 <VAR>DENSITY1</VAR> <VAR>COLOR1</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX220"><CODE>ESC (R <VAR>BC</VAR>=8 00 R E M O T E 1</CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX199"><CODE>ESC (s <VAR>BC</VAR>=1 <VAR>SPEED1</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX205"><CODE>ESC (S <VAR>BC</VAR>=8 <VAR>WIDTH4</VAR> <VAR>LENGTH4</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX194"><CODE>ESC (U <VAR>BC</VAR>=1 <VAR>UNIT1</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX195"><CODE>ESC (U <VAR>BC</VAR>=5 <VAR>PAGEUNITS1</VAR> <VAR>VUNIT1</VAR> <VAR>HUNIT1</VAR> <VAR>BASEUNIT2</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX206"><CODE>ESC (v <VAR>BC</VAR>=2 <VAR>ADVANCE2</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX208"><CODE>ESC (V <VAR>BC</VAR>=2 <VAR>ADVANCE2</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX207"><CODE>ESC (v <VAR>BC</VAR>=4 <VAR>ADVANCE4</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX209"><CODE>ESC (V <VAR>BC</VAR>=4 <VAR>ADVANCE4</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX217"><CODE>ESC . <VAR>COMPRESS1</VAR> <VAR>VSEP1</VAR> <VAR>HSEP1</VAR> <VAR>LINES1</VAR> <VAR>WIDTH2</VAR> <VAR>data...</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX221"><CODE>ESC 01 @EJL [sp] ID\r\n</CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX192"><CODE>ESC @</CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX214"><CODE>ESC \ <VAR>OFFSET2</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX218"><CODE>ESC i <VAR>COLOR1</VAR> <VAR>COMPRESS1</VAR> <VAR>BITS1</VAR> <VAR>BYTES2</VAR> <VAR>LINES2</VAR> <VAR>data...</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX215"><CODE>ESC r <VAR>COLOR1</VAR></CODE></A>
+<LI><A HREF="gimpprint_36.html#IDX198"><CODE>ESC U <VAR>DIRECTION1</VAR></CODE></A>
+</DIR>
+<H2>g</H2>
+<DIR>
+<LI><A HREF="gimpprint_18.html#IDX166">GIMPPRINT_BINARY_AGE</A>
+<LI><A HREF="gimpprint_18.html#IDX161">GIMPPRINT_CHECK_VERSION</A>
+<LI><A HREF="gimpprint_18.html#IDX165">GIMPPRINT_CURRENT_INTERFACE</A>
+<LI><A HREF="gimpprint_18.html#IDX167">GIMPPRINT_INTERFACE_AGE</A>
+<LI><A HREF="gimpprint_18.html#IDX162">GIMPPRINT_MAJOR_VERSION</A>
+<LI><A HREF="gimpprint_18.html#IDX164">GIMPPRINT_MICRO_VERSION</A>
+<LI><A HREF="gimpprint_18.html#IDX163">GIMPPRINT_MINOR_VERSION</A>
+</DIR>
+<H2>n</H2>
+<DIR>
+<LI><A HREF="gimpprint_37.html#IDX222"><CODE>NC <VAR>BC</VAR>=2 00 00</CODE></A>
+</DIR>
+<H2>s</H2>
+<DIR>
+<LI><A HREF="gimpprint_12.html#IDX23">stp_allocate_copy</A>
+<LI><A HREF="gimpprint_12.html#IDX106">stp_allocate_lut</A>
+<LI><A HREF="gimpprint_12.html#IDX21">stp_allocate_vars</A>
+<LI><A HREF="gimpprint_18.html#IDX160">stp_check_version</A>
+<LI><A HREF="gimpprint_17.html#IDX154">stp_choose_colorfunc</A>
+<LI><A HREF="gimpprint_14.html#IDX117">stp_clear_all_options</A>
+<LI><A HREF="gimpprint_14.html#IDX116">stp_clear_option</A>
+<LI><A HREF="gimpprint_12.html#IDX108">stp_compute_lut</A>
+<LI><A HREF="gimpprint_17.html#IDX155">stp_compute_page_parameters</A>
+<LI><A HREF="gimpprint_12.html#IDX22">stp_copy_vars</A>
+<LI><A HREF="gimpprint_13.html#IDX112">stp_default_dither_algorithm</A>
+<LI><A HREF="gimpprint_17.html#IDX156">stp_default_settings</A>
+<LI><A HREF="gimpprint_13.html#IDX110">stp_dither_algorithm_count</A>
+<LI><A HREF="gimpprint_13.html#IDX111">stp_dither_algorithm_name</A>
+<LI><A HREF="gimpprint_12.html#IDX107">stp_free_lut</A>
+<LI><A HREF="gimpprint_12.html#IDX24">stp_free_vars</A>
+<LI><A HREF="gimpprint_12.html#IDX90">stp_get_app_gamma</A>
+<LI><A HREF="gimpprint_12.html#IDX76">stp_get_brightness</A>
+<LI><A HREF="gimpprint_12.html#IDX94">stp_get_cmap</A>
+<LI><A HREF="gimpprint_12.html#IDX78">stp_get_contrast</A>
+<LI><A HREF="gimpprint_12.html#IDX80">stp_get_cyan</A>
+<LI><A HREF="gimpprint_12.html#IDX88">stp_get_density</A>
+<LI><A HREF="gimpprint_12.html#IDX49">stp_get_dither_algorithm</A>
+<LI><A HREF="gimpprint_12.html#IDX28">stp_get_driver</A>
+<LI><A HREF="gimpprint_12.html#IDX103">stp_get_errdata</A>
+<LI><A HREF="gimpprint_12.html#IDX101">stp_get_errfunc</A>
+<LI><A HREF="gimpprint_12.html#IDX74">stp_get_gamma</A>
+<LI><A HREF="gimpprint_12.html#IDX60">stp_get_image_type</A>
+<LI><A HREF="gimpprint_12.html#IDX46">stp_get_ink_type</A>
+<LI><A HREF="gimpprint_12.html#IDX68">stp_get_input_color_model</A>
+<LI><A HREF="gimpprint_12.html#IDX56">stp_get_left</A>
+<LI><A HREF="gimpprint_12.html#IDX92">stp_get_lut</A>
+<LI><A HREF="gimpprint_12.html#IDX82">stp_get_magenta</A>
+<LI><A HREF="gimpprint_12.html#IDX37">stp_get_media_size</A>
+<LI><A HREF="gimpprint_12.html#IDX43">stp_get_media_source</A>
+<LI><A HREF="gimpprint_12.html#IDX40">stp_get_media_type</A>
+<LI><A HREF="gimpprint_14.html#IDX119">stp_get_option_by_index</A>
+<LI><A HREF="gimpprint_14.html#IDX120">stp_get_option_by_name</A>
+<LI><A HREF="gimpprint_12.html#IDX54">stp_get_orientation</A>
+<LI><A HREF="gimpprint_12.html#IDX98">stp_get_outdata</A>
+<LI><A HREF="gimpprint_12.html#IDX96">stp_get_outfunc</A>
+<LI><A HREF="gimpprint_12.html#IDX70">stp_get_output_color_model</A>
+<LI><A HREF="gimpprint_12.html#IDX25">stp_get_output_to</A>
+<LI><A HREF="gimpprint_12.html#IDX52">stp_get_output_type</A>
+<LI><A HREF="gimpprint_12.html#IDX66">stp_get_page_height</A>
+<LI><A HREF="gimpprint_12.html#IDX64">stp_get_page_width</A>
+<LI><A HREF="gimpprint_15.html#IDX130">stp_get_papersize_by_index</A>
+<LI><A HREF="gimpprint_15.html#IDX128">stp_get_papersize_by_name</A>
+<LI><A HREF="gimpprint_15.html#IDX129">stp_get_papersize_by_size</A>
+<LI><A HREF="gimpprint_12.html#IDX31">stp_get_ppd_file</A>
+<LI><A HREF="gimpprint_16.html#IDX145">stp_get_printer_by_driver</A>
+<LI><A HREF="gimpprint_16.html#IDX142">stp_get_printer_by_index</A>
+<LI><A HREF="gimpprint_16.html#IDX144">stp_get_printer_by_long_name</A>
+<LI><A HREF="gimpprint_16.html#IDX146">stp_get_printer_index_by_driver</A>
+<LI><A HREF="gimpprint_12.html#IDX34">stp_get_resolution</A>
+<LI><A HREF="gimpprint_12.html#IDX86">stp_get_saturation</A>
+<LI><A HREF="gimpprint_12.html#IDX72">stp_get_scaling</A>
+<LI><A HREF="gimpprint_12.html#IDX58">stp_get_top</A>
+<LI><A HREF="gimpprint_12.html#IDX62">stp_get_unit</A>
+<LI><A HREF="gimpprint_12.html#IDX84">stp_get_yellow</A>
+<LI><A HREF="gimpprint_11.html#IDX16">stp_init</A>
+<LI><A HREF="gimpprint_15.html#IDX127">stp_known_papersizes</A>
+<LI><A HREF="gimpprint_16.html#IDX141">stp_known_printers</A>
+<LI><A HREF="gimpprint_11.html#IDX18">stp_malloc</A>
+<LI><A HREF="gimpprint_17.html#IDX157">stp_maximum_settings</A>
+<LI><A HREF="gimpprint_12.html#IDX105">stp_merge_printvars</A>
+<LI><A HREF="gimpprint_17.html#IDX158">stp_minimum_settings</A>
+<LI><A HREF="gimpprint_14.html#IDX118">stp_option_count</A>
+<LI><A HREF="gimpprint_14.html#IDX121">stp_option_data</A>
+<LI><A HREF="gimpprint_14.html#IDX123">stp_option_length</A>
+<LI><A HREF="gimpprint_14.html#IDX122">stp_option_name</A>
+<LI><A HREF="gimpprint_15.html#IDX136">stp_papersize_get_bottom</A>
+<LI><A HREF="gimpprint_15.html#IDX133">stp_papersize_get_height</A>
+<LI><A HREF="gimpprint_15.html#IDX135">stp_papersize_get_left</A>
+<LI><A HREF="gimpprint_15.html#IDX131">stp_papersize_get_name</A>
+<LI><A HREF="gimpprint_15.html#IDX137">stp_papersize_get_right</A>
+<LI><A HREF="gimpprint_15.html#IDX134">stp_papersize_get_top</A>
+<LI><A HREF="gimpprint_15.html#IDX138">stp_papersize_get_unit</A>
+<LI><A HREF="gimpprint_15.html#IDX132">stp_papersize_get_width</A>
+<LI><A HREF="gimpprint_16.html#IDX147">stp_printer_get_driver</A>
+<LI><A HREF="gimpprint_16.html#IDX143">stp_printer_get_long_name</A>
+<LI><A HREF="gimpprint_16.html#IDX148">stp_printer_get_model</A>
+<LI><A HREF="gimpprint_16.html#IDX149">stp_printer_get_printfuncs</A>
+<LI><A HREF="gimpprint_16.html#IDX152">stp_printer_get_printvars</A>
+<LI><A HREF="gimpprint_12.html#IDX91">stp_set_app_gamma</A>
+<LI><A HREF="gimpprint_12.html#IDX77">stp_set_brightness</A>
+<LI><A HREF="gimpprint_12.html#IDX95">stp_set_cmap</A>
+<LI><A HREF="gimpprint_12.html#IDX79">stp_set_contrast</A>
+<LI><A HREF="gimpprint_12.html#IDX81">stp_set_cyan</A>
+<LI><A HREF="gimpprint_12.html#IDX89">stp_set_density</A>
+<LI><A HREF="gimpprint_12.html#IDX50">stp_set_dither_algorithm</A>
+<LI><A HREF="gimpprint_12.html#IDX51">stp_set_dither_algorithm_n</A>
+<LI><A HREF="gimpprint_12.html#IDX29">stp_set_driver</A>
+<LI><A HREF="gimpprint_12.html#IDX30">stp_set_driver_n</A>
+<LI><A HREF="gimpprint_12.html#IDX104">stp_set_errdata</A>
+<LI><A HREF="gimpprint_12.html#IDX102">stp_set_errfunc</A>
+<LI><A HREF="gimpprint_12.html#IDX75">stp_set_gamma</A>
+<LI><A HREF="gimpprint_12.html#IDX61">stp_set_image_type</A>
+<LI><A HREF="gimpprint_12.html#IDX47">stp_set_ink_type</A>
+<LI><A HREF="gimpprint_12.html#IDX48">stp_set_ink_type_n</A>
+<LI><A HREF="gimpprint_12.html#IDX69">stp_set_input_color_model</A>
+<LI><A HREF="gimpprint_12.html#IDX57">stp_set_left</A>
+<LI><A HREF="gimpprint_12.html#IDX93">stp_set_lut</A>
+<LI><A HREF="gimpprint_12.html#IDX83">stp_set_magenta</A>
+<LI><A HREF="gimpprint_12.html#IDX38">stp_set_media_size</A>
+<LI><A HREF="gimpprint_12.html#IDX39">stp_set_media_size_n</A>
+<LI><A HREF="gimpprint_12.html#IDX44">stp_set_media_source</A>
+<LI><A HREF="gimpprint_12.html#IDX45">stp_set_media_source_n</A>
+<LI><A HREF="gimpprint_12.html#IDX41">stp_set_media_type</A>
+<LI><A HREF="gimpprint_12.html#IDX42">stp_set_media_type_n</A>
+<LI><A HREF="gimpprint_14.html#IDX115">stp_set_option(stp_vars_t</A>
+<LI><A HREF="gimpprint_12.html#IDX55">stp_set_orientation</A>
+<LI><A HREF="gimpprint_12.html#IDX99">stp_set_outdata</A>
+<LI><A HREF="gimpprint_12.html#IDX97">stp_set_outfunc</A>
+<LI><A HREF="gimpprint_12.html#IDX71">stp_set_output_color_model</A>
+<LI><A HREF="gimpprint_12.html#IDX26">stp_set_output_to</A>
+<LI><A HREF="gimpprint_12.html#IDX27">stp_set_output_to_n</A>
+<LI><A HREF="gimpprint_12.html#IDX53">stp_set_output_type</A>
+<LI><A HREF="gimpprint_12.html#IDX67">stp_set_page_height</A>
+<LI><A HREF="gimpprint_12.html#IDX65">stp_set_page_width</A>
+<LI><A HREF="gimpprint_12.html#IDX32">stp_set_ppd_file</A>
+<LI><A HREF="gimpprint_12.html#IDX33">stp_set_ppd_file_n</A>
+<LI><A HREF="gimpprint_12.html#IDX35">stp_set_resolution</A>
+<LI><A HREF="gimpprint_12.html#IDX36">stp_set_resolution_n</A>
+<LI><A HREF="gimpprint_12.html#IDX87">stp_set_saturation</A>
+<LI><A HREF="gimpprint_12.html#IDX73">stp_set_scaling</A>
+<LI><A HREF="gimpprint_12.html#IDX59">stp_set_top</A>
+<LI><A HREF="gimpprint_12.html#IDX63">stp_set_unit</A>
+<LI><A HREF="gimpprint_12.html#IDX85">stp_set_yellow</A>
+</DIR>
+<H2>v</H2>
+<DIR>
+<LI><A HREF="gimpprint_37.html#IDX223"><CODE>VI <VAR>BC</VAR>=2 00 00</CODE></A>
+</DIR>
+
+</P>
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_45.html">previous</A>, <A HREF="gimpprint_47.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_47.html b/doc/manual-html/gimpprint_47.html
new file mode 100644
index 0000000..46f8520
--- /dev/null
+++ b/doc/manual-html/gimpprint_47.html
@@ -0,0 +1,124 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Concept Index</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_46.html">previous</A>, next, last section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC62" HREF="gimpprint_toc.html#TOC62">Concept Index</A></H1>
+
+<P>
+<H2>a</H2>
+<DIR>
+<LI><A HREF="gimpprint_39.html#IDX253">adding a printer</A>
+<LI><A HREF="gimpprint_24.html#IDX181">Appendices</A>
+<LI><A HREF="gimpprint_8.html#IDX9">autoconf</A>
+<LI><A HREF="gimpprint_9.html#IDX12">automake</A>
+</DIR>
+<H2>b</H2>
+<DIR>
+<LI><A HREF="gimpprint_23.html#IDX179">bugs</A>
+</DIR>
+<H2>c</H2>
+<DIR>
+<LI><A HREF="gimpprint_31.html#IDX186">collisions</A>
+<LI><A HREF="gimpprint_22.html#IDX178">CUPS driver</A>
+</DIR>
+<H2>d</H2>
+<DIR>
+<LI><A HREF="gimpprint_13.html#IDX109">dither functions</A>
+<LI><A HREF="gimpprint_25.html#IDX182">dithering</A>
+<LI><A HREF="gimpprint_41.html#IDX262">driver file</A>
+</DIR>
+<H2>e</H2>
+<DIR>
+<LI><A HREF="gimpprint_42.html#IDX263">Epson inkjet printers</A>
+<LI><A HREF="gimpprint_34.html#IDX190">ESC/P2</A>
+<LI><A HREF="gimpprint_35.html#IDX191">ESC/P2 introduction</A>
+</DIR>
+<H2>f</H2>
+<DIR>
+<LI><A HREF="gimpprint_10.html#IDX13">functions</A>
+</DIR>
+<H2>g</H2>
+<DIR>
+<LI><A HREF="gimpprint_21.html#IDX177">ghostscript driver</A>
+<LI><A HREF="gimpprint_20.html#IDX175">GIMP Print plugin</A>
+<LI><A HREF="gimpprint_6.html#IDX7">gimpprint-config</A>
+</DIR>
+<H2>h</H2>
+<DIR>
+<LI><A HREF="gimpprint_1.html#IDX3">how to read</A>
+</DIR>
+<H2>i</H2>
+<DIR>
+<LI><A HREF="gimpprint_11.html#IDX15">initialising libgimpprint</A>
+<LI><A HREF="gimpprint_5.html#IDX6">integrating</A>
+</DIR>
+<H2>m</H2>
+<DIR>
+<LI><A HREF="gimpprint_8.html#IDX10">m4 macros</A>
+<LI><A HREF="gimpprint_11.html#IDX14">main functions</A>
+<LI><A HREF="gimpprint_7.html#IDX8">make</A>
+<LI><A HREF="gimpprint_1.html#IDX2">manual, how to read</A>
+<LI><A HREF="gimpprint_11.html#IDX17">memory allocation</A>
+</DIR>
+<H2>n</H2>
+<DIR>
+<LI><A HREF="gimpprint_39.html#IDX255">new printer</A>
+</DIR>
+<H2>o</H2>
+<DIR>
+<LI><A HREF="gimpprint_14.html#IDX113">options functions</A>
+<LI><A HREF="gimpprint_33.html#IDX189">oversampling</A>
+<LI><A HREF="gimpprint_3.html#IDX4">overview</A>
+</DIR>
+<H2>p</H2>
+<DIR>
+<LI><A HREF="gimpprint_15.html#IDX124">paper functions</A>
+<LI><A HREF="gimpprint_30.html#IDX185">perfect weave</A>, <A HREF="gimpprint_32.html#IDX188">perfect weave</A>
+<LI><A HREF="gimpprint_20.html#IDX176">Print plugin</A>
+<LI><A HREF="gimpprint_16.html#IDX139">printer functions</A>
+<LI><A HREF="gimpprint_39.html#IDX254">printer, adding</A>
+<LI><A HREF="gimpprint_43.html#IDX266">printer, tuning</A>
+<LI><A HREF="gimpprint_23.html#IDX180">problems</A>
+<LI><A HREF="gimpprint_19.html#IDX174">programs</A>
+</DIR>
+<H2>r</H2>
+<DIR>
+<LI><A HREF="gimpprint_1.html#IDX1">reading</A>
+</DIR>
+<H2>s</H2>
+<DIR>
+<LI><A HREF="gimpprint_17.html#IDX153">settings functions</A>
+<LI><A HREF="gimpprint_12.html#IDX19"><CODE>stp_vars_t</CODE> functions</A>
+</DIR>
+<H2>t</H2>
+<DIR>
+<LI><A HREF="gimpprint_43.html#IDX265">tuning the printer</A>
+</DIR>
+<H2>u</H2>
+<DIR>
+<LI><A HREF="gimpprint_4.html#IDX5">using</A>
+</DIR>
+<H2>v</H2>
+<DIR>
+<LI><A HREF="gimpprint_18.html#IDX159">version functions</A>
+</DIR>
+<H2>w</H2>
+<DIR>
+<LI><A HREF="gimpprint_26.html#IDX183">weaving</A>
+<LI><A HREF="gimpprint_28.html#IDX184">weaving algorithms</A>
+<LI><A HREF="gimpprint_31.html#IDX187">weaving collisions</A>
+</DIR>
+
+</P>
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_46.html">previous</A>, next, last section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_5.html b/doc/manual-html/gimpprint_5.html
new file mode 100644
index 0000000..75dbead
--- /dev/null
+++ b/doc/manual-html/gimpprint_5.html
@@ -0,0 +1,36 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Integrating libgimpprint</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_4.html">previous</A>, <A HREF="gimpprint_6.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H1><A NAME="SEC10" HREF="gimpprint_toc.html#TOC10">3 Integrating libgimpprint</A></H1>
+<P>
+<A NAME="IDX6"></A>
+
+</P>
+<P>
+This chapter describes how to integrate the compiling and linking of
+programs using libgimpprint with build scripts. Commonly used systems include
+@command{make}, but more commonly <TT>`Makefile'</TT> files are generated by using
+tools such as @command{autoconf} and @command{automake}.
+
+</P>
+
+<UL>
+<LI><A HREF="gimpprint_6.html#SEC11">gimpprint-config</A>: Getting the correct compiler and linker flags
+<LI><A HREF="gimpprint_7.html#SEC12">make</A>: Normal makefiles
+<LI><A HREF="gimpprint_8.html#SEC13">autoconf</A>: Macro to automatically check for libgimpprint
+<LI><A HREF="gimpprint_9.html#SEC14">automake</A>: Automatically defined variables to use
+</UL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_4.html">previous</A>, <A HREF="gimpprint_6.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_6.html b/doc/manual-html/gimpprint_6.html
new file mode 100644
index 0000000..a0bc835
--- /dev/null
+++ b/doc/manual-html/gimpprint_6.html
@@ -0,0 +1,106 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - gimpprint-config</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_5.html">previous</A>, <A HREF="gimpprint_7.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC11" HREF="gimpprint_toc.html#TOC11">3.1 @command{gimpprint-config}</A></H2>
+<P>
+<A NAME="IDX7"></A>
+
+</P>
+<P>
+Depending on the setup of the computer system GIMP-Print was installed on, as
+well as the options passed to @command{configure} when configuring the
+package when it was built, the @env{CFLAGS} and @env{LIBS} parameters
+needed to compile and link programs with libgimpprint may vary. To make it
+simple to determine what these are on any given system, the script
+@command{gimpprint-config} was created. It's job is to output the
+correct parameters for the setup on your system. The following options
+are available:
+
+</P>
+
+<PRE>
+roger@whinlatter:~/gimpprint/devel$ gimpprint-config --help
+Usage: gimpprint-config [OPTIONS] [LIBRARIES]
+Options:
+ [--prefix[=DIR]]
+ [--exec-prefix[=DIR]]
+ [--version]
+ [--libs]
+ [--cflags]
+Libraries:
+ gimpprint
+</PRE>
+
+<P>
+The @option{--prefix} and @option{--exec-prefix} options are only needed if the
+installed locations of parts of GIMP-Print are different from the configured
+locations. These should never be needed if GIMP-Print was properly configured
+and installed.
+
+</P>
+<P>
+The installed version of GIMP-Print can be obtained with the
+@option{--version} option:
+
+</P>
+
+<PRE>
+roger@whinlatter:~/gimpprint/devel$ gimpprint-config --version
+4.2.7
+</PRE>
+
+<P>
+The correct @env{CFLAGS} to use can be obtained with the @option{--cflags}
+option:
+
+</P>
+
+<PRE>
+roger@whinlatter:~/gimpprint/devel$ gimpprint-config --cflags
+
+</PRE>
+
+<P>
+In this case, there are no special @env{CFLAGS} required to compile programs.
+
+</P>
+<P>
+The correct @env{LIBS} to use can the obtained with the @option{--libs} option:
+
+</P>
+
+<PRE>
+roger@whinlatter:~/gimpprint/devel$ gimpprint-config --libs
+-L/usr/lib -lgimpprint -lm
+</PRE>
+
+<P>
+The command can be used from the shell by enclosing it in backquotes <SAMP>``'</SAMP>:
+
+</P>
+
+<PRE>
+gcc `gimpprint-config --cflags` -c prog.c
+gcc `gimpprint-config --libs` -o prog prog.o
+</PRE>
+
+<P>
+However, this is not the way it it typically used. Normally it is used in a
+<TT>`Makefile'</TT> (see section <A HREF="gimpprint_7.html#SEC12">3.2 @command{make}</A>) or by an @command{m4} macro in a @command{configure}
+script (see section <A HREF="gimpprint_8.html#SEC13">3.3 @command{autoconf}</A>).
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_5.html">previous</A>, <A HREF="gimpprint_7.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_7.html b/doc/manual-html/gimpprint_7.html
new file mode 100644
index 0000000..7a792c3
--- /dev/null
+++ b/doc/manual-html/gimpprint_7.html
@@ -0,0 +1,39 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - make</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_6.html">previous</A>, <A HREF="gimpprint_8.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC12" HREF="gimpprint_toc.html#TOC12">3.2 @command{make}</A></H2>
+<P>
+<A NAME="IDX8"></A>
+
+</P>
+<P>
+If you use @command{make} with your own <TT>`Makefile'</TT> files, then you are on
+your own. This manual offers no assistance with doing this. Only the following
+suggestion is offered:
+
+</P>
+
+<PRE>
+GIMPPRINT_VERSION = $(shell gimpprint-config --version)
+GIMPPRINT_CFLAGS = $(shell gimpprint-config --cflags)
+GIMPPRINT_LIBS = $(shell gimpprint-config --libs)
+</PRE>
+
+<P>
+How you choose to use these variables is entirely up to you. See Info file `make', node `Top', for more information.
+
+</P>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_6.html">previous</A>, <A HREF="gimpprint_8.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_8.html b/doc/manual-html/gimpprint_8.html
new file mode 100644
index 0000000..e35f343
--- /dev/null
+++ b/doc/manual-html/gimpprint_8.html
@@ -0,0 +1,66 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - autoconf</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_7.html">previous</A>, <A HREF="gimpprint_9.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC13" HREF="gimpprint_toc.html#TOC13">3.3 @command{autoconf}</A></H2>
+<P>
+<A NAME="IDX9"></A>
+<A NAME="IDX10"></A>
+
+</P>
+<P>
+The @command{autoconf} program produces a Bourne shell script called
+<TT>`configure'</TT> from a template file called <TT>`configure.in'</TT>.
+<TT>`configure.in'</TT> contains both Bourne shell script, and @command{m4} macros.
+@command{autoconf} expands the @command{m4} macros into `real' shell script.
+The resulting <TT>`configure'</TT> script performs various checks for installed
+programs, compiler characteristics and other system information such as
+available headers and libraries. See Info file `autoconf', node `Top', for
+more information.
+
+</P>
+<P>
+GIMP-Print provides an @command{m4} macro, <CODE>AM_PATH_GIMPPRINT</CODE>, suitable for
+use in a <TT>`configure.in'</TT>. It defines the environment variables
+@env{GIMPPRINT_CFLAGS}, @env{GIMPPRINT_LIBS} and @env{GIMPPRINT_CONFIG}. You can
+optionally specify a minimum version of the library to use, and shell script to
+run if the test suceeds or fails.
+
+</P>
+<P>
+<DL>
+<DT><U>Macro:</U> <B>AM_PATH_GIMPPRINT</B> <I>([<VAR>minimum-version</VAR> [, <VAR>action-if-found</VAR> [, <VAR>action-if-not-found</VAR>]]])</I>
+<DD><A NAME="IDX11"></A>
+Check for an installed version of GIMP-Print greater than or equal to
+<VAR>minimum-version</VAR>.
+
+</P>
+<P>
+<VAR>action-if-found</VAR> is a list of shell commands to run if the check
+for the library succeeds; <VAR>action-if-not-found</VAR> is a list of
+shell commands to run if the check fails.
+
+</P>
+<P>
+The macro sets the following environment variables: @env{GIMPPRINT_CFLAGS},
+@env{GIMPPRINT_LIBS} and @env{GIMPPRINT_CONFIG}. It also will substitute them
+into any <TT>`Makefile.in'</TT> you specify in <CODE>AC_OUTPUT</CODE> because it calls
+<CODE>AC_SUBST</CODE> for each of them. However, you will probably be using
+@command{automake} to generate your <TT>`Makefile.in'</TT> files
+(see section <A HREF="gimpprint_9.html#SEC14">3.4 @command{automake}</A>).
+
+</P>
+</DL>
+
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_7.html">previous</A>, <A HREF="gimpprint_9.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_9.html b/doc/manual-html/gimpprint_9.html
new file mode 100644
index 0000000..93d7d58
--- /dev/null
+++ b/doc/manual-html/gimpprint_9.html
@@ -0,0 +1,79 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - automake</TITLE>
+</HEAD>
+<BODY>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_8.html">previous</A>, <A HREF="gimpprint_10.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+<P><HR><P>
+
+
+<H2><A NAME="SEC14" HREF="gimpprint_toc.html#TOC14">3.4 @command{automake}</A></H2>
+<P>
+<A NAME="IDX12"></A>
+
+</P>
+<P>
+The @command{automake} program can be used to generate <TT>`Makefile.in'</TT> files
+suitable for use with a <TT>`configure'</TT> script generated by
+@command{autoconf}. As @command{automake} <EM>requires</EM> @command{autoconf},
+this section will assume the use of a <TT>`configure'</TT> script which uses the
+<CODE>AM_PATH_GIMPPRINT</CODE> macro (there is little point in <EM>not</EM> using it!).
+
+</P>
+<P>
+It is highly recommeded that you use GNU @command{autoconf} and
+@command{automake}. They will allow you to make your software build on most
+platforms with most compilers. @command{automake} makes writing complex
+<TT>`Makefile'</TT> files very easy, by expressing how to build your packages
+in terms of what files are required to build a project and the installation
+locations of the files. It imposes a few limitations over using plain
+<TT>`Makefile'</TT> files, such as in the use of conditionals, but these problems
+are vastly outweighed by the benefits it brings. It also creates many extra
+targets in the generated <TT>`Makefile.in'</TT> files such as @command{dist},
+@command{distcheck}, @command{clean}, @command{distclean},
+@command{maintainer-clean} and @command{tags}, and there are many more more
+available. See Info file `automake', node `Top', for more information.
+
+</P>
+<P>
+Because <CODE>AM_PATH_GIMPPRINT</CODE> calls <CODE>AC_SUBST</CODE> to substitute
+@env{GIMPPRINT_CFLAGS}, @env{GIMPPRINT_LIBS} and @env{GIMPPRINT_CONFIG},
+@command{automake} will automatically set these variables in the
+<TT>`Makefile.in'</TT> files it generates, requiring no additional effort on
+your part!
+
+</P>
+<P>
+As in previous examples, we will make a program @command{prog} from a file <TT>`prog.c'</TT>. This is how one might build write a <TT>`Makefile.am'</TT> to do this:
+
+</P>
+
+<PRE>
+AUTOMAKE_OPTIONS = 1.4 gnu
+MAINT_CHARSET = latin1
+
+@SET_MAKE@
+
+CFLAGS = @CFLAGS@
+
+INCLUDES = @INCLUDES@ $(GIMPPRINT_CFLAGS)
+
+bin_PROGRAMS = prog
+prog_SOURCES = prog.c
+prog_LDADD = $(GIMPPRINT_LIBS)
+
+MAINTAINERCLEANFILES = Makefile.in
+</PRE>
+
+<P>
+That's all there is to it! Please note that this example also requires the
+macro <CODE>AC_PROG_MAKE_SET</CODE> to be used in <TT>`configure.in'</TT> and the use of
+<CODE>AC_SUBST</CODE> to substitute @env{CFLAGS} and @env{INCLUDES} where
+<CODE>@CFLAGS@</CODE> and <CODE>@INCLUDES@</CODE> are found in the file, respectively.
+<P><HR><P>
+Go to the <A HREF="gimpprint_1.html">first</A>, <A HREF="gimpprint_8.html">previous</A>, <A HREF="gimpprint_10.html">next</A>, <A HREF="gimpprint_47.html">last</A> section, <A HREF="gimpprint_toc.html">table of contents</A>.
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_foot.html b/doc/manual-html/gimpprint_foot.html
new file mode 100644
index 0000000..1980040
--- /dev/null
+++ b/doc/manual-html/gimpprint_foot.html
@@ -0,0 +1,33 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Footnotes</TITLE>
+</HEAD>
+<BODY>
+<H1>GIMP-Print</H1>
+<H2>The print plugin for the GIMP</H2>
+<H2>Version 4.2.7, 27 October 2001</H2>
+<ADDRESS>The GIMP-Print Project</ADDRESS>
+<P>
+<P><HR><P>
+<H3><A NAME="FOOT1" HREF="gimpprint_20.html#DOCF1">(1)</A></H3>
+<P>@uref{http://www.gimp.org
+<H3><A NAME="FOOT2" HREF="gimpprint_20.html#DOCF2">(2)</A></H3>
+<P>The output resolution of the plugin.
+<H3><A NAME="FOOT3" HREF="gimpprint_20.html#DOCF3">(3)</A></H3>
+<P>For Postscript printers.
+<H3><A NAME="FOOT4" HREF="gimpprint_20.html#DOCF4">(4)</A></H3>
+<P>Again, that's relative to the paper
+corner, not the printable area, which is usually smaller.
+<H3><A NAME="FOOT5" HREF="gimpprint_23.html#DOCF5">(5)</A></H3>
+<P>@email{gimp-print-devel@lists.sourceforge.net
+<H3><A NAME="FOOT6" HREF="gimpprint_23.html#DOCF6">(6)</A></H3>
+<P>@email{gimp-print-devel@lists.sourceforge.net
+<P><HR><P>
+This document was generated on 11 June 2004 using the
+<A HREF="http://wwwcn.cern.ch/dci/texi2html/">texi2html</A>
+translator version 1.51.</P>
+</BODY>
+</HTML>
diff --git a/doc/manual-html/gimpprint_toc.html b/doc/manual-html/gimpprint_toc.html
new file mode 100644
index 0000000..4c34629
--- /dev/null
+++ b/doc/manual-html/gimpprint_toc.html
@@ -0,0 +1,108 @@
+<HTML>
+<HEAD>
+<!-- This HTML file has been created by texi2html 1.51
+ from .././gimpprint.texi on 11 June 2004 -->
+
+<TITLE>GIMP-Print - Table of Contents</TITLE>
+</HEAD>
+<BODY>
+<H1>GIMP-Print</H1>
+<H2>The print plugin for the GIMP</H2>
+<H2>Version 4.2.7, 27 October 2001</H2>
+<ADDRESS>The GIMP-Print Project</ADDRESS>
+<P>
+<P><HR><P>
+<UL>
+<LI><A NAME="TOC1" HREF="gimpprint_1.html#SEC1">Preface</A>
+<LI><A NAME="TOC2" HREF="gimpprint_2.html#SEC2">GNU GENERAL PUBLIC LICENSE</A>
+<UL>
+<LI><A NAME="TOC3" HREF="gimpprint_2.html#SEC3">Preamble</A>
+<LI><A NAME="TOC4" HREF="gimpprint_2.html#SEC4">How to Apply These Terms to Your New Programs</A>
+</UL>
+<LI><A NAME="TOC5" HREF="gimpprint_2.html#SEC5">Copying summary</A>
+<LI><A NAME="TOC6" HREF="gimpprint_3.html#SEC6">1 Overview</A>
+<LI><A NAME="TOC7" HREF="gimpprint_4.html#SEC7">2 Using libgimpprint</A>
+<UL>
+<LI><A NAME="TOC8" HREF="gimpprint_4.html#SEC8">2.1 Code prerequisites</A>
+<LI><A NAME="TOC9" HREF="gimpprint_4.html#SEC9">2.2 Linking with libgimpprint</A>
+</UL>
+<LI><A NAME="TOC10" HREF="gimpprint_5.html#SEC10">3 Integrating libgimpprint</A>
+<UL>
+<LI><A NAME="TOC11" HREF="gimpprint_6.html#SEC11">3.1 @command{gimpprint-config}</A>
+<LI><A NAME="TOC12" HREF="gimpprint_7.html#SEC12">3.2 @command{make}</A>
+<LI><A NAME="TOC13" HREF="gimpprint_8.html#SEC13">3.3 @command{autoconf}</A>
+<LI><A NAME="TOC14" HREF="gimpprint_9.html#SEC14">3.4 @command{automake}</A>
+</UL>
+<LI><A NAME="TOC15" HREF="gimpprint_10.html#SEC15">4 Functions</A>
+<UL>
+<LI><A NAME="TOC16" HREF="gimpprint_11.html#SEC16">4.1 Main functions</A>
+<LI><A NAME="TOC17" HREF="gimpprint_12.html#SEC17">4.2 <CODE>stp_vars_t</CODE> functions</A>
+<LI><A NAME="TOC18" HREF="gimpprint_13.html#SEC18">4.3 Dither functions</A>
+<LI><A NAME="TOC19" HREF="gimpprint_14.html#SEC19">4.4 Options functions</A>
+<LI><A NAME="TOC20" HREF="gimpprint_15.html#SEC20">4.5 Paper functions</A>
+<LI><A NAME="TOC21" HREF="gimpprint_16.html#SEC21">4.6 Printer functions</A>
+<LI><A NAME="TOC22" HREF="gimpprint_17.html#SEC22">4.7 Settings functions</A>
+<LI><A NAME="TOC23" HREF="gimpprint_18.html#SEC23">4.8 Version functions</A>
+<UL>
+<LI><A NAME="TOC24" HREF="gimpprint_18.html#SEC24">4.8.1 Version macros</A>
+<LI><A NAME="TOC25" HREF="gimpprint_18.html#SEC25">4.8.2 Version variables</A>
+</UL>
+</UL>
+<LI><A NAME="TOC26" HREF="gimpprint_19.html#SEC26">5 Programs</A>
+<UL>
+<LI><A NAME="TOC27" HREF="gimpprint_20.html#SEC27">5.1 The GIMP Print plugin</A>
+<UL>
+<LI><A NAME="TOC28" HREF="gimpprint_20.html#SEC28">5.1.1 Preview</A>
+<LI><A NAME="TOC29" HREF="gimpprint_20.html#SEC29">5.1.2 Printer Settings</A>
+<LI><A NAME="TOC30" HREF="gimpprint_20.html#SEC30">5.1.3 Position</A>
+<LI><A NAME="TOC31" HREF="gimpprint_20.html#SEC31">5.1.4 Scaling</A>
+<LI><A NAME="TOC32" HREF="gimpprint_20.html#SEC32">5.1.5 Image Settings</A>
+<UL>
+<LI><A NAME="TOC33" HREF="gimpprint_20.html#SEC33">5.1.5.1 Adjust Output</A>
+<LI><A NAME="TOC34" HREF="gimpprint_20.html#SEC34">5.1.5.2 Dither Algorithm</A>
+</UL>
+<LI><A NAME="TOC35" HREF="gimpprint_20.html#SEC35">5.1.6 Action Buttons</A>
+</UL>
+<LI><A NAME="TOC36" HREF="gimpprint_21.html#SEC36">5.2 Ghostscript driver</A>
+<LI><A NAME="TOC37" HREF="gimpprint_22.html#SEC37">5.3 CUPS driver</A>
+</UL>
+<LI><A NAME="TOC38" HREF="gimpprint_23.html#SEC38">6 Reporting Bugs</A>
+<LI><A NAME="TOC39" HREF="gimpprint_24.html#SEC39">7 Appendices</A>
+<LI><A NAME="TOC40" HREF="gimpprint_25.html#SEC40">A Dithering</A>
+<LI><A NAME="TOC41" HREF="gimpprint_26.html#SEC41">B Weaving for inkjet printers</A>
+<UL>
+<LI><A NAME="TOC42" HREF="gimpprint_27.html#SEC42">B.1 Introduction</A>
+<LI><A NAME="TOC43" HREF="gimpprint_28.html#SEC43">B.2 Weaving algorithms</A>
+<UL>
+<LI><A NAME="TOC44" HREF="gimpprint_29.html#SEC44">B.2.1 Simple weaving algorithms</A>
+<LI><A NAME="TOC45" HREF="gimpprint_30.html#SEC45">B.2.2 Perfect weaving</A>
+<LI><A NAME="TOC46" HREF="gimpprint_31.html#SEC46">B.2.3 Weaving collisions</A>
+<LI><A NAME="TOC47" HREF="gimpprint_32.html#SEC47">B.2.4 What makes a "perfect" weave?</A>
+<LI><A NAME="TOC48" HREF="gimpprint_33.html#SEC48">B.2.5 Oversampling</A>
+</UL>
+</UL>
+<LI><A NAME="TOC49" HREF="gimpprint_34.html#SEC49">C ESC/P2</A>
+<UL>
+<LI><A NAME="TOC50" HREF="gimpprint_35.html#SEC50">C.1 Introduction to ESC/P2</A>
+<LI><A NAME="TOC51" HREF="gimpprint_36.html#SEC51">C.2 Standard commands</A>
+<LI><A NAME="TOC52" HREF="gimpprint_37.html#SEC52">C.3 Remote Mode Commands</A>
+<LI><A NAME="TOC53" HREF="gimpprint_38.html#SEC53">C.4 Appropriate Remote Commands</A>
+</UL>
+<LI><A NAME="TOC54" HREF="gimpprint_39.html#SEC54">D Adding a new printer</A>
+<UL>
+<LI><A NAME="TOC55" HREF="gimpprint_40.html#SEC55">D.1 <TT>`printers.xml'</TT></A>
+<LI><A NAME="TOC56" HREF="gimpprint_41.html#SEC56">D.2 The driver file</A>
+<LI><A NAME="TOC57" HREF="gimpprint_42.html#SEC57">D.3 Epson inkjet printers</A>
+<LI><A NAME="TOC58" HREF="gimpprint_43.html#SEC58">D.4 Tuning the printer</A>
+<LI><A NAME="TOC59" HREF="gimpprint_44.html#SEC59">D.5 Canon inkjet printers</A>
+</UL>
+<LI><A NAME="TOC60" HREF="gimpprint_45.html#SEC60">Data Type and Variable Index</A>
+<LI><A NAME="TOC61" HREF="gimpprint_46.html#SEC61">Function and Macro Index</A>
+<LI><A NAME="TOC62" HREF="gimpprint_47.html#SEC62">Concept Index</A>
+</UL>
+<P><HR><P>
+This document was generated on 11 June 2004 using the
+<A HREF="http://wwwcn.cern.ch/dci/texi2html/">texi2html</A>
+translator version 1.51.</P>
+</BODY>
+</HTML>
diff --git a/doc/manual-html/print-color.png b/doc/manual-html/print-color.png
new file mode 100644
index 0000000..db1af3f
--- /dev/null
+++ b/doc/manual-html/print-color.png
Binary files differ
diff --git a/doc/manual-html/print-main.png b/doc/manual-html/print-main.png
new file mode 100644
index 0000000..2d78222
--- /dev/null
+++ b/doc/manual-html/print-main.png
Binary files differ
diff --git a/doc/manual-html/print-setup.png b/doc/manual-html/print-setup.png
new file mode 100644
index 0000000..904e03b
--- /dev/null
+++ b/doc/manual-html/print-setup.png
Binary files differ