diff options
Diffstat (limited to 'doc/manual-html')
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>`<gimp-print/gimp-print.h>'</TT>. This should be done in +every source file that uses gimpprint functions by putting + +</P> + +<PRE> +#include <gimp-print/gimp-print.h> +</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{<ttonino@bio.vu.nl>} 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{<rlk@alum.mit.edu>} 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-------> +| | 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 > x) + swap (&x, &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 <= j < 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 >= +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 *------* * <--start of pass block 0 +1 *------* | +2 *------* | +3 *------*| +4 *-----|* +5 *---|--* +6 *-|----* + | +7 *------* <--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 | +-> *-----*-----*-----*-----*-----*-----*-----*-----* +3 | | *-----*-----*-----*-----*-----*-----*-----*-----* +4 | | +-> *-----*-----*-----*-----*-----*-----*--- +5 | | | *-----*-----*-----*-----*-----* +6 | | | +-> *-----*-----*-----*----- +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 < 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 < 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 < 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 < 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 <= j < 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 < 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 < 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><gimp-print/gimp-print.h>.</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 <gimp-print/gimp-print.h> + +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> +<printer name="EPSON Stylus Color 1500" driver="escp2-1500"> +<color> +<model value=2> +<gamma value=0.597> +<density value=1.0> +<language value=escp2> +</printer> +</PRE> + +<P> +There are other tags that may be present. The only ones that are +mandatory are <SAMP>`<printer>'</SAMP>, <SAMP>`<color>'</SAMP>, <SAMP>`<model>'</SAMP>, and +<SAMP>`<language>'</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><printer name="<VAR>longname</VAR>" driver="<VAR>drivername</VAR>"></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><color></CODE></B> +<DD><A NAME="IDX257"></A> +<DT><U><TT>`printers.xml'</TT> tag:</U> <B><CODE><nocolor></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><model value=<VAR>int</VAR>></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><language value=<VAR>type</VAR>></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></printer></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 */ + &ci_CMYK_1, &ci_CMYK_1, &ci_CMYK_1, + &ci_CMYK_1, &ci_CMYK_1, &ci_CMYK_1, + }, + { + 3,4, /* 3bit/pixel, 4 colors */ + &ci_CMYK_3, &ci_CMYK_3, &ci_CMYK_3, + &ci_CMYK_3, &ci_CMYK_3, &ci_CMYK_3, + }, +}; +</PRE> + +<P> +where the <SAMP>`&ci_CMYK_1'</SAMP> and <SAMP>`&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><</H2> +<DIR> +<LI><A HREF="gimpprint_40.html#IDX261"><CODE></printer></CODE></A> +<LI><A HREF="gimpprint_40.html#IDX257"><CODE><color></CODE></A> +<LI><A HREF="gimpprint_40.html#IDX260"><CODE><language value=<VAR>type</VAR>></CODE></A> +<LI><A HREF="gimpprint_40.html#IDX259"><CODE><model value=<VAR>int</VAR>></CODE></A> +<LI><A HREF="gimpprint_40.html#IDX258"><CODE><nocolor></CODE></A> +<LI><A HREF="gimpprint_40.html#IDX256"><CODE><printer name="<VAR>longname</VAR>" driver="<VAR>drivername</VAR>"></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 Binary files differnew file mode 100644 index 0000000..db1af3f --- /dev/null +++ b/doc/manual-html/print-color.png diff --git a/doc/manual-html/print-main.png b/doc/manual-html/print-main.png Binary files differnew file mode 100644 index 0000000..2d78222 --- /dev/null +++ b/doc/manual-html/print-main.png diff --git a/doc/manual-html/print-setup.png b/doc/manual-html/print-setup.png Binary files differnew file mode 100644 index 0000000..904e03b --- /dev/null +++ b/doc/manual-html/print-setup.png |