gutenprint: add gutenprint as a mandatory package.

* use the shared library libgutenprint.so
* remove the xml data files from the tree and the Haiku package.
This commit is contained in:
Jérôme Duval 2014-05-10 13:08:35 +02:00
parent 0217077b04
commit c73c8e2367
816 changed files with 2 additions and 742322 deletions

View File

@ -17,7 +17,7 @@ AddHaikuImagePackages [ FFilterByBuildFeatures
curl freetype icu libsolv zlib
regular_image @{
bzip2 ctags ffmpeg findutils gawk glu grep jpeg less libpng
bzip2 ctags ffmpeg findutils gawk glu grep gutenprint jpeg less libpng
mesa mesa_devel mesa_swrast sed sharutils tar which
}@
] ;

View File

@ -210,7 +210,7 @@ if [ IsPackageAvailable gutenprint_devel ] {
runtime: lib
file: devel gutenprint_devel
depends: base
library: $(developLibDir)/libgutenprint.a
library: $(developLibDir)/libgutenprint.so
headers: $(developHeadersDir) $(developHeadersDir)/gutenprint
;

View File

@ -140,11 +140,6 @@ SEARCH on $(postInstallFiles)
= [ FDirName $(HAIKU_TOP) data system boot post_install ] ;
AddFilesToPackage boot post-install : $(postInstallFiles) ;
# Gutenprint data files
CopyDirectoryToPackage data
: [ FDirName $(HAIKU_TOP) src libs print libgutenprint src xml ]
: gutenprint : -x *.c -x Makefile.am -x Makefile.in ;
# artwork and sounds
local logoArtwork =
$(HAIKU_INCLUDE_TRADEMARKS)"HAIKU logo - white on blue - big.png"

File diff suppressed because it is too large Load Diff

View File

@ -1,124 +0,0 @@
The original version, up to release 2.0, of the Gimp Print plug-in was
written by Mike Sweet <mike@easysw.com>.
Version 3.0, which is based on version 2, was written by Robert
Krawitz <rlk@alum.mit.edu> in late 1999, and frozen in early 2000.
The code was based on the 2.0 release.
Version 4.0 was developed by a team led by Robert Krawitz. It was
released in November 2000. We hosted the development on SourceForge,
a service provided to the free source community by VA Linux Systems.
The complete hosting service provided by SourceForge permitted the
development team to concentrate on improving the software rather than
having to worry about maintaining a development system.
Version 4.2 was developed by the same team, with some additions, and
was released in November 2001. Roger Leigh in particular has
reimplemented the build system to match the GNU standard, making for a
far more flexible and powerful system.
Version 4.3 is being developed by essentially the same team.
The list of contributors, in alphabetical order, is as follows. The
principal areas that each contributed to are listed in addition.
Andreas Kemnade <akemnade@tzi.de>
Cd printing support for Canon PIXMA printers
Andy Stewart <andystewart@attbi.com>
User manual
Andy Thaller <thaller@ph.tum.de>
Canon driver
Charles Briscoe-Smith <cpbs@debian.org>
Epson driver
Internals
UI
Dave Hill <dave@minnie.demon.co.uk>
PCL driver
David Pace <dpace@echo-on.net>
Inspiration for user interface library
Generalized print panel
Eric Sharkey <sharkey@ale.physics.sunysb.edu>
Debian support
Epson unprinter
Eugene Anikin <eugene@anikin.com>
Performance instrumentation
Sharp-eyed bug fixer
Grant Taylor <gtaylor@picante.com>
Implementor of the "foomatic" spooler configuration system
Henryk "Buggs" Richter <tfa652@cks1.rz.uni-rostock.de>
Initial implementation of the Ghostscript (stp) front end
Ian Young <ian@iay.org.uk>
Documentation of the Epson driver
Experimental inks/color management
Jean-Marc Verbavatz <verbavatz@ifrance.fr>
Dithering and color management
Karl Heinz Kremer <khk@khk.net>
Liaison with Epson
Engineering and design
Karsten Festag <karsten.festag@gmx.de>
Canon S200 support
Mark Tomlinson <mark.tomlinson@xtra.co.nz>
Implementation of Raph Levien's EvenTone dither
Michael Mraka <michael.mraka@linux.cz>
DyeSub (formerly Olympus) driver
Michael Natterer <mitschel@cs.tu-berlin.de>
New user interface
Liaison with the Gimp development team
Mike Sweet <mike@easysw.com>
CUPS front end
Portability
Lots o'details
Peter Missel <peter.missel@eplus-online.de>
Canon driver
Piotr Stachura <albert1@autocom.pl>
Canon PIXMA iP4200 support
Richard Wisenoecker <Richard.Wisenoecker@gmx.at>
Lexmark driver
Robert Krawitz <rlk@alum.mit.edu>
Epson driver
Dithering and color management
User interface
Engineering/Project lead
Documentation
Ghostscript front end
Roger Leigh <rleigh@debian.org>
Complete reimplementation of the configure/build system
Architecture
Debian support
Sascha Sommer <saschasommer@freenet.de>
Canon PIXMA support
Steve Kann <stevek@stevek.com>
Roll feed support for Epson printers
Steve Miller <smiller@rni.net>
User interface
Thomas Tonino <ttonino@bio.vu.nl>
Vastly improved dithering and color management
Till Kamppeter <till.kamppeter@gmail.com>
Foomatic interface

View File

@ -1,340 +0,0 @@
GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
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.
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.
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.
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.
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.
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.
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.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. 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.
1. 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.
2. 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:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) 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.
c) 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.)
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.
3. 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:
a) 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,
b) 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,
c) 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.)
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.
4. 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.
5. 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.
6. 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.
7. 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.
8. 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.
9. 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.
10. 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
11. 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.
12. 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.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
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.
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.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
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.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
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:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
<signature of Ty Coon>, 1 April 1989
Ty Coon, President of Vice
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.

File diff suppressed because it is too large Load Diff

View File

@ -1,365 +0,0 @@
Installation Instructions
*************************
Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,
2006, 2007, 2008, 2009 Free Software Foundation, Inc.
Copying and distribution of this file, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. This file is offered as-is,
without warranty of any kind.
Basic Installation
==================
Briefly, the shell commands `./configure; make; make install' should
configure, build, and install this package. The following
more-detailed instructions are generic; see the `README' file for
instructions specific to this package. Some packages provide this
`INSTALL' file but do not implement all of the features documented
below. The lack of an optional feature in a given package is not
necessarily a bug. More recommendations for GNU packages can be found
in *note Makefile Conventions: (standards)Makefile Conventions.
The `configure' shell script attempts to guess correct values for
various system-dependent variables used during compilation. It uses
those values to create a `Makefile' in each directory of the package.
It may also create one or more `.h' files containing system-dependent
definitions. Finally, it creates a shell script `config.status' that
you can run in the future to recreate the current configuration, and a
file `config.log' containing compiler output (useful mainly for
debugging `configure').
It can also use an optional file (typically called `config.cache'
and enabled with `--cache-file=config.cache' or simply `-C') that saves
the results of its tests to speed up reconfiguring. Caching is
disabled by default to prevent problems with accidental use of stale
cache files.
If you need to do unusual things to compile the package, please try
to figure out how `configure' could check whether to do them, and mail
diffs or instructions to the address given in the `README' so they can
be considered for the next release. If you are using the cache, and at
some point `config.cache' contains results you don't want to keep, you
may remove or edit it.
The file `configure.ac' (or `configure.in') is used to create
`configure' by a program called `autoconf'. You need `configure.ac' if
you want to change it or regenerate `configure' using a newer version
of `autoconf'.
The simplest way to compile this package is:
1. `cd' to the directory containing the package's source code and type
`./configure' to configure the package for your system.
Running `configure' might take a while. While running, it prints
some messages telling which features it is checking for.
2. Type `make' to compile the package.
3. Optionally, type `make check' to run any self-tests that come with
the package, generally using the just-built uninstalled binaries.
4. Type `make install' to install the programs and any data files and
documentation. When installing into a prefix owned by root, it is
recommended that the package be configured and built as a regular
user, and only the `make install' phase executed with root
privileges.
5. Optionally, type `make installcheck' to repeat any self-tests, but
this time using the binaries in their final installed location.
This target does not install anything. Running this target as a
regular user, particularly if the prior `make install' required
root privileges, verifies that the installation completed
correctly.
6. You can remove the program binaries and object files from the
source code directory by typing `make clean'. To also remove the
files that `configure' created (so you can compile the package for
a different kind of computer), type `make distclean'. There is
also a `make maintainer-clean' target, but that is intended mainly
for the package's developers. If you use it, you may have to get
all sorts of other programs in order to regenerate files that came
with the distribution.
7. Often, you can also type `make uninstall' to remove the installed
files again. In practice, not all packages have tested that
uninstallation works correctly, even though it is required by the
GNU Coding Standards.
8. Some packages, particularly those that use Automake, provide `make
distcheck', which can by used by developers to test that all other
targets like `make install' and `make uninstall' work correctly.
This target is generally not run by end users.
Compilers and Options
=====================
Some systems require unusual options for compilation or linking that
the `configure' script does not know about. Run `./configure --help'
for details on some of the pertinent environment variables.
You can give `configure' initial values for configuration parameters
by setting variables in the command line or in the environment. Here
is an example:
./configure CC=c99 CFLAGS=-g LIBS=-lposix
*Note Defining Variables::, for more details.
Compiling For Multiple Architectures
====================================
You can compile the package for more than one kind of computer at the
same time, by placing the object files for each architecture in their
own directory. To do this, you can use GNU `make'. `cd' to the
directory where you want the object files and executables to go and run
the `configure' script. `configure' automatically checks for the
source code in the directory that `configure' is in and in `..'. This
is known as a "VPATH" build.
With a non-GNU `make', it is safer to compile the package for one
architecture at a time in the source code directory. After you have
installed the package for one architecture, use `make distclean' before
reconfiguring for another architecture.
On MacOS X 10.5 and later systems, you can create libraries and
executables that work on multiple system types--known as "fat" or
"universal" binaries--by specifying multiple `-arch' options to the
compiler but only a single `-arch' option to the preprocessor. Like
this:
./configure CC="gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
CXX="g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64" \
CPP="gcc -E" CXXCPP="g++ -E"
This is not guaranteed to produce working output in all cases, you
may have to build one architecture at a time and combine the results
using the `lipo' tool if you have problems.
Installation Names
==================
By default, `make install' installs the package's commands under
`/usr/local/bin', include files under `/usr/local/include', etc. You
can specify an installation prefix other than `/usr/local' by giving
`configure' the option `--prefix=PREFIX', where PREFIX must be an
absolute file name.
You can specify separate installation prefixes for
architecture-specific files and architecture-independent files. If you
pass the option `--exec-prefix=PREFIX' to `configure', the package uses
PREFIX as the prefix for installing programs and libraries.
Documentation and other data files still use the regular prefix.
In addition, if you use an unusual directory layout you can give
options like `--bindir=DIR' to specify different values for particular
kinds of files. Run `configure --help' for a list of the directories
you can set and what kinds of files go in them. In general, the
default for these options is expressed in terms of `${prefix}', so that
specifying just `--prefix' will affect all of the other directory
specifications that were not explicitly provided.
The most portable way to affect installation locations is to pass the
correct locations to `configure'; however, many packages provide one or
both of the following shortcuts of passing variable assignments to the
`make install' command line to change installation locations without
having to reconfigure or recompile.
The first method involves providing an override variable for each
affected directory. For example, `make install
prefix=/alternate/directory' will choose an alternate location for all
directory configuration variables that were expressed in terms of
`${prefix}'. Any directories that were specified during `configure',
but not in terms of `${prefix}', must each be overridden at install
time for the entire installation to be relocated. The approach of
makefile variable overrides for each directory variable is required by
the GNU Coding Standards, and ideally causes no recompilation.
However, some platforms have known limitations with the semantics of
shared libraries that end up requiring recompilation when using this
method, particularly noticeable in packages that use GNU Libtool.
The second method involves providing the `DESTDIR' variable. For
example, `make install DESTDIR=/alternate/directory' will prepend
`/alternate/directory' before all installation names. The approach of
`DESTDIR' overrides is not required by the GNU Coding Standards, and
does not work on platforms that have drive letters. On the other hand,
it does better at avoiding recompilation issues, and works well even
when some directory options were not specified in terms of `${prefix}'
at `configure' time.
Optional Features
=================
If the package supports it, you can cause programs to be installed
with an extra prefix or suffix on their names by giving `configure' the
option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.
Some packages pay attention to `--enable-FEATURE' options to
`configure', where FEATURE indicates an optional part of the package.
They may also pay attention to `--with-PACKAGE' options, where PACKAGE
is something like `gnu-as' or `x' (for the X Window System). The
`README' should mention any `--enable-' and `--with-' options that the
package recognizes.
For packages that use the X Window System, `configure' can usually
find the X include and library files automatically, but if it doesn't,
you can use the `configure' options `--x-includes=DIR' and
`--x-libraries=DIR' to specify their locations.
Some packages offer the ability to configure how verbose the
execution of `make' will be. For these packages, running `./configure
--enable-silent-rules' sets the default to minimal output, which can be
overridden with `make V=1'; while running `./configure
--disable-silent-rules' sets the default to verbose, which can be
overridden with `make V=0'.
Particular systems
==================
On HP-UX, the default C compiler is not ANSI C compatible. If GNU
CC is not installed, it is recommended to use the following options in
order to use an ANSI C compiler:
./configure CC="cc -Ae -D_XOPEN_SOURCE=500"
and if that doesn't work, install pre-built binaries of GCC for HP-UX.
On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot
parse its `<wchar.h>' header file. The option `-nodtk' can be used as
a workaround. If GNU CC is not installed, it is therefore recommended
to try
./configure CC="cc"
and if that doesn't work, try
./configure CC="cc -nodtk"
On Solaris, don't put `/usr/ucb' early in your `PATH'. This
directory contains several dysfunctional programs; working variants of
these programs are available in `/usr/bin'. So, if you need `/usr/ucb'
in your `PATH', put it _after_ `/usr/bin'.
On Haiku, software installed for all users goes in `/boot/system',
not `/usr/local'. It is recommended to use the following options:
./configure --prefix=/boot/system
Specifying the System Type
==========================
There may be some features `configure' cannot figure out
automatically, but needs to determine by the type of machine the package
will run on. Usually, assuming the package is built to be run on the
_same_ architectures, `configure' can figure that out, but if it prints
a message saying it cannot guess the machine type, give it the
`--build=TYPE' option. TYPE can either be a short name for the system
type, such as `sun4', or a canonical name which has the form:
CPU-COMPANY-SYSTEM
where SYSTEM can have one of these forms:
OS
KERNEL-OS
See the file `config.sub' for the possible values of each field. If
`config.sub' isn't included in this package, then this package doesn't
need to know the machine type.
If you are _building_ compiler tools for cross-compiling, you should
use the option `--target=TYPE' to select the type of system they will
produce code for.
If you want to _use_ a cross compiler, that generates code for a
platform different from the build platform, you should specify the
"host" platform (i.e., that on which the generated programs will
eventually be run) with `--host=TYPE'.
Sharing Defaults
================
If you want to set default values for `configure' scripts to share,
you can create a site shell script called `config.site' that gives
default values for variables like `CC', `cache_file', and `prefix'.
`configure' looks for `PREFIX/share/config.site' if it exists, then
`PREFIX/etc/config.site' if it exists. Or, you can set the
`CONFIG_SITE' environment variable to the location of the site script.
A warning: not all `configure' scripts look for a site script.
Defining Variables
==================
Variables not defined in a site shell script can be set in the
environment passed to `configure'. However, some packages may run
configure again during the build, and the customized values of these
variables may be lost. In order to avoid this problem, you should set
them in the `configure' command line, using `VAR=value'. For example:
./configure CC=/usr/local2/bin/gcc
causes the specified `gcc' to be used as the C compiler (unless it is
overridden in the site shell script).
Unfortunately, this technique does not work for `CONFIG_SHELL' due to
an Autoconf bug. Until the bug is fixed you can use this workaround:
CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash
`configure' Invocation
======================
`configure' recognizes the following options to control how it
operates.
`--help'
`-h'
Print a summary of all of the options to `configure', and exit.
`--help=short'
`--help=recursive'
Print a summary of the options unique to this package's
`configure', and exit. The `short' variant lists options used
only in the top level, while the `recursive' variant lists options
also present in any nested packages.
`--version'
`-V'
Print the version of Autoconf used to generate the `configure'
script, and exit.
`--cache-file=FILE'
Enable the cache: use and save the results of the tests in FILE,
traditionally `config.cache'. FILE defaults to `/dev/null' to
disable caching.
`--config-cache'
`-C'
Alias for `--cache-file=config.cache'.
`--quiet'
`--silent'
`-q'
Do not print messages saying which checks are being made. To
suppress all normal output, redirect it to `/dev/null' (any error
messages will still be shown).
`--srcdir=DIR'
Look for the package's source code in directory DIR. Usually
`configure' can determine that directory automatically.
`--prefix=DIR'
Use DIR as the installation prefix. *note Installation Names::
for more details, including other options available for fine-tuning
the installation locations.
`--no-create'
`-n'
Run the configure checks, but stop before creating any output
files.
`configure' also accepts some other, not widely useful, options. Run
`configure --help' for more details.

View File

@ -1,3 +0,0 @@
SubDir HAIKU_TOP src libs print libgutenprint ;
SubInclude HAIKU_TOP src libs print libgutenprint src ;

View File

@ -1,214 +0,0 @@
## Process this file with automake to produce Makefile.in
## $Id: Makefile.am,v 1.155 2008/10/24 00:37:13 rleigh Exp $
## Copyright (C) 2000-2004 Roger Leigh
##
## 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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
## Process this file with automake to produce Makefile.in.
@SET_MAKE@
ACLOCAL_AMFLAGS = -I m4 -I m4local
include $(top_srcdir)/scripts/global.mk
## Variables
SUBDIRS = include src samples test po man doc scripts
DISTDIRS = m4 m4extra
docdir = $(datadir)/$(PACKAGE)/doc
## Rules
# Libtool dependency
libtool: $(LIBTOOL_DEPS)
cd $(srcdir); \
$(SHELL) ./config.status --recheck
# Don't list ChangeLog as a dependency here because it forces network
# access, and because it usually runs as superuser rather than the user
# who normally builds Gutenprint.
install-data-local: NEWS AUTHORS COPYING README
$(mkdir_p) $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/NEWS $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/ChangeLog $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/AUTHORS $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/COPYING $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/README $(DESTDIR)$(docdir)
# This rather strange-looking code ensures that the change log is only
# rebuilt if any of the CVS/Entries files have changed since the change log
# was last built.
ChangeLogPhony:
@cd $(top_srcdir) ; \
for f in `find . -name Entries -print | grep CVS` ; do \
if @TEST@ ! -f ChangeLogStamp -o ChangeLogStamp -ot $$f ; then \
rm -f ChangeLogStamp ; \
touch ChangeLogStamp ; \
fi ; \
done
ChangeLogStamp: ChangeLogPhony
@@TRUE@
ChangeLog: ChangeLogStamp
@cd $(top_srcdir) ; \
if test -f $(top_builddir)/.noupdate ; then \
echo "$@: .noupdate found: NOT updating $@ from CVS" ; \
elif test -d CVS ; then \
echo "$@: Updating $@ from CVS" ; \
cvs log | $(PERL) scripts/mkchlog -e @sourceforge.net -X src/xml/escp2/resolutions -s '^(guten|gimp-|)print-[0-9]+_' > $@.tmp ; \
if test -s $@.tmp ; then \
mv $@.tmp $@ ; \
else \
echo "$@: Failed to update $@ ['touch .noupdate' to skip]" ; \
$(RM) $@.tmp ; \
exit 1 ; \
fi \
elif test -s $@ ; then \
echo "$@: This is not a CVS version of Gutenprint" ; \
echo "$@: Not updating $@ from CVS!" ; \
else \
echo "$@: No $@ or $@ of zero size found!" ; \
echo "$@: Failed to update $@ ['touch .noupdate' to skip]" ; \
exit 1 ; \
fi
configure.in:
$(LN_S) $(srcdir)/configure.ac $(srcdir)/configure.in
dist-time-check:
@current_date=`date +%Y%m%d`; \
configure_date=`ls -l --time-style=+%Y%m%d $(top_builddir)/configure | awk '{print $$6}'`; \
echo "Checking that 'configure' was built today."; \
if test "$$current_date" != "$$configure_date" ; then \
echo "configure is out of date -- rerun ./autogen.sh first!"; \
exit 1; \
fi
dist-hook: dist-time-check
for dir in $(DISTDIRS) ; do \
if test -d $(srcdir)/$$dir ; then \
mkdir $(distdir)/$$dir; \
for dirfile in $(srcdir)/$$dir/*; do \
if test -f $$dirfile ; then \
cp -p $$dirfile $(distdir)/$$dir; \
fi \
done \
fi \
done
# Remove configure.in (libtool bug workaround)
$(RM) -f $(distdir)/configure.in
# Remove any backup files found in distdir
$(FIND) $(distdir) -name '.*' -print | xargs $(RM) -rf
$(FIND) $(distdir) -name '#*' -print | xargs $(RM) -rf
$(FIND) $(distdir) -name '*~' -print | xargs $(RM) -rf
install-cups: all
cd src/cups ; \
$(MAKE) install
install-ghost: all
cd src/ghost ; \
$(MAKE) install
install-gimp: all
cd src/gimp ; \
$(MAKE) install
docs:
cd doc ; \
$(MAKE) docs
html:
cd doc ; \
$(MAKE) html
ps:
cd doc ; \
$(MAKE) ps
pdf:
cd doc ; \
$(MAKE) pdf
snapshot:
$(MAKE) dist distdir=$(PACKAGE)`date +"%Y%m%d"`
## Clean
CLEANSCRIPTS = \
scripts/depcomp \
scripts/install-sh \
scripts/ltconfig \
scripts/mdate-sh \
scripts/missing \
scripts/mkinstalldirs
CLEANMFOUR = \
m4/codeset.m4 \
m4/gettext.m4 \
m4/glibc21.m4 \
m4/iconv.m4 \
m4/intdiv0.m4 \
m4/inttypes_h.m4 \
m4/inttypes.m4 \
m4/inttypes-pri.m4 \
m4/isc-posix.m4 \
m4/lcmessage.m4 \
m4/lib-ld.m4 \
m4/lib-link.m4 \
m4/lib-prefix.m4 \
m4/progtest.m4 \
m4/stdint_h.m4 \
m4/uintmax_t.m4 \
m4/ulonglong.m4
CLEANPO = \
po/boldquot.sed \
po/en@boldquot.header \
po/en@quot.header \
po/insert-header.sin \
po/Makevars.template \
po/quot.sed \
po/remove-potcdate.sin \
po/Rules-quot
CLEANFILES = .noupdate ChangeLog.tmp
MAINTAINERCLEANFILES = \
ABOUT-NLS \
INSTALL \
aclocal.m4 \
config.h.in \
configure \
configure.in \
Makefile.in \
stamp-h.in \
stamp-h1.in \
stamp-h2.in \
stamp-h3.in \
stamp-h4.in \
$(CLEANSCRIPTS) \
$(CLEANMFOUR) \
$(CLEANPO)
EXTRA_DIST = autogen.sh ChangeLogStamp README.package
.PHONY: deb html install-cups install-gimp install-ghost snapshot ChangeLog Phony dist-time-check

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,821 +0,0 @@
Welcome to Gutenprint 5.2.7! Please read these notes carefully.
*** NOTE TO PACKAGERS: Please read the file README.package for issues
that are of interest to distributors and packagers of Gutenprint.
It is not necessary for end users of Gutenprint to read this file.
================================================================
I) INTRODUCTION
This is Gutenprint version 5.2.7, a stable release of Gutenprint
5.2. Gutenprint, formerly named Gimp-Print, is a suite of printer
drivers that may be used with most common UNIX print spooling
systems, including CUPS, lpr, LPRng, or others. These drivers
provide high quality printing for UNIX (including Macintosh OS X
10.3 and newer) and Linux systems in many cases equal to or better
than proprietary vendor-supplied drivers. Gutenprint also
includes an enhanced print plug-in for the GIMP image editor,
replacing the Gimp-Print 4.2-based plugin supplied with GIMP 1.2,
2.0, and 2.2, and offering an alternative with additional
capabilities to the GtkPrint-based plugin supplied with GIMP 2.4
and beyond.
Gutenprint has been renamed in order to clearly distinguish it
from GIMP. While this package started out as the Print plugin for
GIMP, it has expanded into a collection of general purpose printer
drivers, and the enhanced Print plugin for GIMP is now only a
small part of the package. Furthermore, the name Gutenprint
recognizes Johannes Gutenberg, the inventor of the movable type
printing press. Finally, the word "guten" means "good" in German.
Please read the user's manual (in ODF format as
doc/gutenprint-users-manual.odt or PDF format as
doc/gutenprint-users-manual.pdf) carefully, as it covers much more
information than this README file. The user's manual contains a
complete list of supported printers. In addition, please read the
release notes (NEWS), as it has information on the latest changes.
This package has changed significantly since Gutenprint 5.0.
Gutenprint supports only the printer part of multi-function
devices (devices that typically include scanning, copying, and fax
capabilities).
We recommend that all users who wish to use this package for
general purpose printing use either CUPS or, if they use another
printing system or no spooler at all, use Foomatic with the
Ghostscript driver (both described below), rather than integrating
the Ghostscript driver with self-made scripts or even manually
typing in Ghostscript command lines. It is much simpler to manage
with CUPS or Foomatic and its PPDs. CUPS provides an excellent
web-based interface for easy printer administration, and all
CUPS-enabled applications (OpenOffice.org, all KDE apps, etc.) and
printing dialogs (kprinter, xpp, etc.) show all the options in
easy to use GUIs. Please visit http://www.cups.org/ for
information on downloading and installing CUPS.
================================================================
II) INSTALLATION
This section is provided for people installing the package from
source. If you are installing from a pre-compiled package (such
as the Macintosh OS X package, or a package provided by your
distribution vendor), you may skip this section.
Installing packages from source requires some level of system
administration skills along with superuser privileges. Superuser
privilege allows you to perform actions that may be damaging to
your system. If you are not comfortable with the material
discussed here and in the release notes, or with performing simple
administrative actions, we recommend that you not attempt to
install this package from source.
Before beginning, please read the release notes carefully for any
updates.
----------------
A) OVERVIEW
Gutenprint includes the following primary components:
- The core driver library (required for everything else)
- A CUPS (Common UNIX Printing System) driver
- An enhanced Print plug-in for GIMP
- GTK-based UI libraries (used by the enhanced GIMP plug-in)
- Support for the Foomatic spooler configuration system
- A Ghostscript driver using the IJS plugin facility
- A command-line utility to administer and maintain Epson
printers
This package requires the use of GNU Make to compile. On systems
with both GNU make and another make installed, GNU make may be
named `gmake' or `gnumake'. BSD users in particular must take
care to use 'gmake'.
The general procedure to build Gutenprint is as follows:
./configure [options]
make
make install
The "configure" script, which must be run before doing anything
else, controls which of these components are built along with any
options desired. This script determines what software is
installed on your system and what components will be compatible
with it, and prepares the package to be built and installed. If
the script emits any warnings or errors, please be certain that
you understand them before proceeding.
After the configure script has completed its work, it will print
a summary of its choices. Please ensure that it is correct before
proceeding. The summary looks like this:
Configuration Summary:
------------- --------
If you have any problems, please report the information below to
gimp-print-devel@lists.sourceforge.net
================================================================
Release: gutenprint 5.2.7 generated on 02 Mar 2011
Features:
Build CUPS: yes, installing in /usr
Build CUPS 1.2 enhancements: yes
Build CUPS PPD files: no
Generate PS level 3 CUPS PPD files: yes
Build genppd statically: yes
Build Ghostscript IJS driver: yes
Build Foomatic data: yes
Build Foomatic 3.x data: yes
Build enhanced Print plugin for GIMP: yes
GIMP plugin will be named: gutenprint
Install plugin(s) in home directory: no
Build EPSON Stylus utility: yes
Build test programs: yes
Build testpattern generator: yes
Installation summary:
Installation prefix: /usr/local
Data directory: /usr/local/share/gutenprint
Library directory: /usr/local/lib/gutenprint
XML data directory: /usr/local/share/gutenprint/5.2/xml
Module directory: /usr/local/lib/gutenprint/5.2/modules
Install sample images: yes
General configuration:
Compiler options: -Disfinite=finite -O6 -Wall -Wcast-align -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wnested-externs -Wwrite-strings -Werror-implicit-function-declaration -Winline -Wformat=2 -finline-limit=131072 -pedantic -Waggregate-return -Wcast-qual -Wshadow -Wredundant-decls
Build static libraries: yes
Build shared libraries: no
Maintainer mode: yes
Use i18n: yes
Generate profiling information: no
Generate debugging symbols: no
Use modules: static
Use readline libraries: yes, extra arguments: -lncurses
uname -a output: Linux dsl092-065-009 2.6.27.45-0.1-default #1 SMP 2010-02-22 16:49:47 +0100 x86_64 x86_64 x86_64 GNU/Linux
================================================================
The CUPS, GIMP, Foomatic, and Ghostscript components require that
the appropriate packages be installed on your system. Many
distribution vendors separate packages into runtime and
development packages. The development packages are required in
order to successfully compile Gutenprint. In many cases the
configure script cannot detect whether these development packages
are installed, in which case you will get an error during
compilation. Also note that it is necessary for the versions of
the development packages to match exactly the versions of the
runtime packages they are related to.
PLEASE INSPECT THE OUTPUT CAREFULLY BEFORE PROCEEDING. If you
expect to build a particular component (particularly the CUPS
driver or enhanced Print plugin for GIMP), and the configure
output states that that component will not be built, please make
certain that you have the required development packages installed,
as described below in the sections for the particular components.
----------------
B) CORE DRIVER LIBRARY
The core driver library, which is always built, contains all of
the printer drivers comprising the Gutenprint package. When the
package is built, it consists of a core library (libgutenprint), a
set of XML files, and depending upon the options selected,
additional libraries containing the drivers for each family of
printers.
By default dynamically loadable modules (plug-ins) will be built
for the family drivers, and loaded at run-time if your operating
system supports it. If you experience problems,
--with-modules=dlopen or --with-modules=ltdl may be used to select
the module loading method (dlopen is the default, but GNU libltdl
is more portable), or --with-modules=static or --without-modules
disables them. If you wish to compile Gutenprint entirely
statically (with no use of shared libraries), you may use the
option --disable-shared.
----------------
C) CUPS
Gutenprint may be used as a driver under CUPS (Common UNIX
Printing System), if your system uses that spooler. Full
description of CUPS is beyond the scope of this README file; full
information may be found at http://www.cups.org. Gutenprint 5.2
requires CUPS 1.1.9 or higher. We recommend use of 1.1.15 or
above; that release of CUPS fixes some important bugs. Gutenprint
supports CUPS 1.2, and supports the CUPS 1.2 enhancements,
including dynamic PPD file generation.
Gutenprint will normally detect the presence of CUPS on your
system and will attempt to build the CUPS driver if it finds CUPS
installed. If your distribution separates the CUPS installation
into development and runtime packages, you must install the CUPS
development package (cups-devel or similar). You may need to
install other development packages depending upon how your
distribution has built CUPS. The list of packages varies, but
commonly development packages for TIFF (libtiff-devel), JPEG
(jpeg-devel or libjpeg-devel), PNG (libpng-devel), OpenSSL
(openssl-devel), and libc (glibc-devel or libc-devel) will be
required. Failure to install these packages will lead to errors
when the package is compiled. The errors will typically look like
this; the important error is "cups/cups.h: No such file or
directory" (other ".h" files may also be missing, depending upon
the missing packages):
make[3]: Entering directory `/opt/gutenprint/gutenprint-5.2.7/src/cups'
gcc -DHAVE_CONFIG_H -I. -I../.. -I../../include -I../../include
-Wall -Wcast-align -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wnested-externs -Wwrite-strings
-Werror-implicit-function-declaration -Winline -Wformat=2
-finline-limit=131072 -DCUPS_DRIVER_INTERFACE -DALL_LINGUAS='"cs da
de el en_GB es fr hu it ja nb nl pl pt sk sv zh_TW"'
-Disfinite=finite -O6 -MT gutenprint_5_2-genppd.o -MD -MP -MF
.deps/gutenprint_5_2-genppd.Tpo -c -o gutenprint_5_2-genppd.o
`test -f 'genppd.c' || echo './'`genppd.c
genppd.c:79:23: error: cups/cups.h: No such file or directory
genppd.c:80:25: error: cups/raster.h: No such file or directory
make[3]: *** [gutenprint_5_2-genppd.o] Error 1
make[3]: Leaving directory `/opt/gutenprint/gutenprint-5.2.7/src/cups'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/opt/gutenprint/gutenprint-5.2.7/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/opt/gutenprint/gutenprint-5.2.7'
make: *** [all] Error 2
Installing the CUPS driver for Gutenprint 5.2 will not interfere
with your ability to continue using the Gutenprint 5.0 or
Gimp-Print 4.2 CUPS driver.
WARNING: The "canon" and "epson" CUPS backends that previously
were distributed with Gutenprint are no longer distributed, so you
will need to ensure that none of your printer queues use these
backends. Please read the Critical Upgrade Note in the release
notes for more information and the procedure for modifying your
printer queues.
The Gutenprint CUPS driver consists of the following components:
* The core Gutenprint CUPS driver, rastertogutenprint.5.2. This
is a CUPS filter that converts CUPS raster data into
printer-specific data. This is most commonly installed in
/usr/lib/cups/filter.
* Additional utilities to send certain commands to these printers
are installed as commandtocanon and commandtoepson; they are
installed in /usr/lib/cups/filter.
* One or more sets of PPD files describing all of the printers
supported by Gutenprint. These are normally installed in
/usr/share/cups/model/gutenprint. These PPD files can only be
used by the precise version of Gutenprint that they were built
with; for example, it is not possible to use PPD files from
Gutenprint 5.0.0 with Gutenprint 5.2.0.
If you are using CUPS 1.2 or above, these PPD files are not
actually installed by default. Instead, a CUPS driver generates
these PPD files on demand.
* A utility to update PPD files from an earlier release of
Gutenprint, cups-genppdupdate. This utility may be used to
update PPD files generated by earlier versions of Gutenprint
starting from 4.3.21, including any 5.0, 5.1, or 5.2 release or
pre-release. This is normally installed in /usr/sbin. This
utility cannot update PPD files from Gimp-Print 4.2.
* A utility to generate PPD files, cups-genppd.5.2. Normally this
is only required when the package is built, and only with CUPS
1.1.
* A driver to generate PPD files on the fly, gutenprint.5.2. This
is normally used to generate PPD files on the fly with CUPS 1.2
and above.
* A utility to permit additional color calibration for
Gutenprint-supported printers, cups-calibrate. This is normally
installed in /usr/bin.
WARNING: With certain versions of CUPS and in certain non-standard
configurations, if a new version of Gutenprint is installed
over an existing version genppd will create PPD files based on
the older version of Gutenprint rather than the newer version.
This will happen if all of the following are true:
i) The cups-config provided by the CUPS driver adds
-Wl,rpath=/usr/lib (or wherever the CUPS system libraries
live). This is done by some versions of CUPS reportedly
because in some cases the runtime linker does not pick up
libraries out of /usr/lib. This can be checked by running
cups-config --libs --ldflags
and inspecting the output for any mention of "rpath",
"RPATH", "RUN_PATH", or the like. This is controlled by
the CUPS installation on your system.
ii) There is presently a version of Gutenprint installed in
the system default, typically /usr (--prefix=/usr) rather
than /usr/local or the like. The default location of
Gutenprint installation is in /usr/local, but system
vendors typically install Gutenprint in /usr.
iii) Gutenprint is built dynamically only (--disable-static or
--disable-static-genppd). This is not standard, and
requires the explicit --disable-static or
--disable-static-genppd on the Gutenprint "configure"
command line. Therefore, if you build Gutenprint normally
you should not be vulnerable to this problem.
iv) Gutenprint is configured to build the PPD files at compile
time. This is the case when using CUPS 1.1, but is not the
case when using CUPS 1.2 unless you explicitly use
--enable-cups-ppds.
Note that in general if you install CUPS into a non-standard
location, and install Gutenprint into the same location, this
problem can surface. For example, if you choose to install
CUPS in /usr/local and Gutenprint in /usr/local you are
vulnerable to this. However, it is not standard practice to
install CUPS anywhere but /usr.
In this case, the run path embedded in the genppd executable
points to the version of Gutenprint installed in /usr/lib.
This run path overrides any attempt by libtool to look in the
build directory. The result is that cups-genppd and
rastertogutenprint are run against the older version of
Gutenprint. If the new version contains additional features
(more printers, changes to printer options, etc.) they will
not be available.
This bug is difficult to detect in a normal build. It
normally does not cause an error to happen during build unless
there is an API change from the version installed and the
version being built; the only failure is frequently that some
PPD files may not be built or may be built with missing
options. Due to the PPD version checking introduced in this
release, the behavior might manifest itself as a runtime
error. It is also possible that there will be no error at all
other than the older version of Gutenprint being used, with
the result that new features and bug fixes are not available.
If you wish to use only shared libraries, do not wish to build
static libraries at all, and are vulnerable to this issue
(because cups-config --ldflags sets the run path), there are
three workarounds available:
i) Build and install Gutenprint into /usr (rather than
/usr/local) and then rebuild Gutenprint from scratch. This
will install the correct libgutenprint.so in /usr/lib, and
in the rebuild genppd will be run against the correct
library.
ii) Remove the old version of Gutenprint prior to building the
new version of Gutenprint. The important files to remove
are anything named /usr/lib/libgutenprint*.
iii) Edit cups-config to remove the reference to the run path.
Following installation of the package with "make install", you
must restart CUPS to permit CUPS to see the new PPD files. The
exact command to restart CUPS varies; it is typically something
like /etc/init.d/cups restart, /etc/software/init.d/cups restart,
/etc/rc.d/cups restart, /usr/sbin/rccups, or even
/etc/rc.d/init.d/cups restart. Your system may have a different
way to restart the CUPS server. OS X (10.3, 10.4, and 10.5), for
example, uses the following command:
sudo /System/Library/StartupItems/PrintingServices/PrintingServices.sh restart
You may optionally choose to update your existing PPD files using
the command cups-genppdupdate, after which you should restart CUPS
as described above. We strongly recommend use of this update
procedure, which is fast and simple. This script will
automatically update Gutenprint PPD files from earlier versions
(5.0, 5.1, or 5.2 release or prerelease). This script will only
update PPD files from earlier versions of Gutenprint; it will not
update Gimp-Print 4.2 PPD files or PPD files from other drivers.
However, you may install Gutenprint 5.2 alongside Gimp-Print 4.2,
and use both Gimp-Print 4.2 and Gutenprint 5.2 drivers
concurrently in separate printer queues. Therefore, you need not
convert a workflow based on Gimp-Print 4.2 right away, but can
gradually convert or even permanently use both drivers for
different printer queues.
The following options to configure are available for compiling the
Gutenprint driver for CUPS:
--enable-cups-ppds
With CUPS 1.2, it is possible to arrange for PPD files to be
generated when a new printer queue is generated rather than
having all pre-generated PPD files in the filesystem. This
saves considerable disk space and avoids the possible build
problem described above. Normally, Gutenprint detects which
version of CUPS is in use and configures itself to create the
PPD files at build time only when CUPS 1.1 is in use.
If you wish to generate the PPD files at build time, you may
use this option. If you are running CUPS 1.1, and for some
reason do not wish to generate the PPD files, you may use
--disable-cups-ppds.
--disable-translated-cups-ppds
By default, PPD files for all languages available in
Gutenprint are created. If this option is used, only the
default (US-English) PPD files are created. Distributors may
wish to package up the PPD files separately for each language.
Some systems may not build the translated PPD files correctly,
in which case all of the PPD files will be in English. If
this is the case on your system, you should use
--disable-translated-cups-ppds to avoid having many duplicate
PPD files.
--disable-globalized-cups-ppds
Starting with Gutenprint 5.2, Gutenprint builds PPD files
containing translations for all languages if CUPS 1.2 or above
is in use. This greatly reduces the number of PPD files
created or PPD file choices offered.
If you have problems with the globalized PPD files, you may
use this option to generate standard translated PPD files (or
English-only, if --disable-translated-cups-ppds is also in
use). This option only has effect if --enable-cups-ppds is
used.
--enable-simplified-cups-ppds
Gutenprint 5.2 offers an option of creating simplified PPD
files (containing only basic options and standard paper sizes)
in addition to PPD files offering all available options
(including all color correction options). If this option is
used, both the simplified and standard PPD files are created.
If --enable-simplified-cups-ppds=only is specified, only the
simplified PPD files are built.
If the new dynamic PPD file generation is used with CUPS 1.2,
the simplified PPD files are always offered.
--disable-cups-level3-ppds
By default, the Gutenprint PPD files are configured for
PostScript Level 3. If this option is used, Level 2 PPD files
are created. This may be useful if you are using a version of
CUPS older than 1.1.15. It is normally not necessary to use
this explicitly, as the configure script detects the version
of CUPS in use and selects the appropriate PostScript level
automatically.
--disable-cups-ppds-at-top-level
Normally, the PPD files are placed in
/usr/share/cups/model/gutenprint/5.2. If this option is used,
the PPD files are placed in /usr/share/cups/model. There is
normally no good reason to use this option.
--disable-static-genppd
Build genppd and rastertogutenprint dynamically linked rather
than statically linked. WARNING: Use of this option may lead
to failure during build or installation, or incorrect
installation. It is *STRONGLY* recommended that you not use
this option unless you are certain that you understand the
problem and how to work around it.
----------------
D) FOOMATIC
Foomatic is a printer meta-driver that can be used with any
spooler (CUPS, lpd, LPRng, etc.) or even no spooler at all. It
uses XML data describing printer and driver capabilities in
conjunction with Ghostscript to allow printing in any environment.
Please visit http://www.openprinting.org/foomatic.html for more
information.
We normally recommend using the native CUPS driver described above
if your system uses CUPS as its spooler. However, some systems
(many releases of Fedora Core, for example) use Foomatic as the
repository for all printer information; the tools provided on
those systems will not recognize the CUPS PPD files. If your
system uses Foomatic in this way, or does not use CUPS, you should
use Foomatic to manage your printers. If you are using CUPS,
however, we strongly recommend using the CUPS driver described in
the previous section in preference to Foomatic.
The Gutenprint driver for Foomatic requires Foomatic 2.0 or
higher; Foomatic 3.0 or above is highly recommended. It also
requires GNU Ghostscript 6.53 or newer, AFPL Ghostscript 7.04 or
newer, or ESP Ghostscript 7.05 or newer for IJS support. We
recommend Ghostscript 8 or above.
The Foomatic support in Gutenprint consists of a data generator
and an IJS-based Ghostscript driver. It is possible to use the
Ghostscript driver without Foomatic, but the Gutenprint options
are complex and subject to change without notice. Older printer
configuration tools such as apsfilter and magicfilter do not
provide a convenient interface to the driver's capabilities.
Therefore, we no longer provide documentation on direct use of the
Ghostscript driver without the Foomatic front end.
The Ghostscript driver in Gutenprint 5.2 is based on the IJS
protocol. IJS is a protocol originally developed by
Hewlett-Packard to allow new drivers to be used with Ghostscript
without having to be compiled into Ghostscript.
Gutenprint 5.2 offers two Foomatic drivers, one supporting the
full range of options and the other supporting simplified options,
as describe above under CUPS. The full-featured driver is named
"gutenprint-ijs.5.2"; the simplified driver is named
"gutenprint-ijs-simplified.5.2".
Gutenprint 5.2 may coexist with Gimp-Print 4.2; both drivers may
be installed and used (on separate printer queues, of course) on
the same system.
Normally, the Gutenprint configure script will automatically
detect the presence of Foomatic and Ghostscript on your system.
In some cases, you may have to install a Ghostscript development
package that may be named gs-devel, ghostscript-library, or the
like for the IJS capability.
The Foomatic driver will not allow use of PPD files created from
Foomatic data from a different version of Gutenprint. This
ensures that the PPD files accurately match the driver in use.
However, there is no automatic upgrade tool provided for the
Foomatic driver, unlike the CUPS driver. Therefore, all queues
using a Gutenprint driver must be updated manually, using either
tools provided by your distribution or the Foomatic tool
"foomatic-ppdfile".
NOTES TO PACKAGERS:
* We recommend packaging the IJS driver
(/usr/bin/ijsgutenprint.5.2) and its man page
(/usr/man/man1/ijsgutenprint.1.gz) together with the Foomatic
data.
* The IJS driver and the Foomatic data kit and PPD files are
versioned, and hence you should consider permitting multiple
versions to be installed concurrently. The man page
(/usr/man/man1/ijsgutenprint.1.gz) is not versioned.
----------------
E) GIMP
Gutenprint may be used as an enhanced Print plug-in for GIMP (2.0
and above), providing the ability to print images. Please read
the release notes in addition to this README. Gutenprint 5.2 no
longer supports GIMP 1.2.
The enhanced Print plugin for GIMP replaces the Gimp-Print
4.2-based plugin provided with GIMP 2.0 and 2.2. As of the GIMP
2.4, GIMP team provides a new Print plugin based on the GtkPrint
framework. This plugin provides standard printing capabilities,
but does not provide all of the new Gutenprint 5.2 features.
Therefore, the enhanced Print plugin for GIMP distributed with
Gutenprint does not replace that plugin, but is installed
alongside that plugin.
If your system separates development packages from runtime
packages, you will typically have to install development packages
for GIMP itself, in addition to Gtk and Glib. With GIMP 2.x and
GTK 2.x, additional packages may be required. Failure to install
these packages will lead to errors when the package is compiled.
The errors will typically look like this; the important errors are
the ones "No such file or directory".
make[3]: Entering directory `/opt/gutenprint/gutenprint-5.2.7/src/gimp2'
gcc -DHAVE_CONFIG_H -I. -I../.. -I../../include -I../../include
-Wall -Wcast-align -Wstrict-prototypes -Wmissing-prototypes
-Wmissing-declarations -Wnested-externs -Wwrite-strings
-Werror-implicit-function-declaration -Winline -Wformat=2
-finline-limit=131072 -Disfinite=finite -O6 -MT print-image-gimp.o
-MD -MP -MF .deps/print-image-gimp.Tpo -c -o print-image-gimp.o
print-image-gimp.c
In file included from print-image-gimp.c:30:
print_gimp.h:36:21: error: gtk/gtk.h: No such file or directory
print_gimp.h:37:26: error: libgimp/gimp.h: No such file or directory
print_gimp.h:38:28: error: libgimp/gimpui.h: No such file or directory
make[3]: *** [print-image-gimp.o] Error 1
make[3]: Leaving directory `/opt/gutenprint/gutenprint-5.2.7/src/gimp2'
make[2]: *** [all-recursive] Error 1
make[2]: Leaving directory `/opt/gutenprint/gutenprint-5.2.7/src'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/opt/gutenprint/gutenprint-5.2.7'
make: *** [all] Error 2
Normally, the Gutenprint configure script detects which version,
if any, of GIMP is installed and builds an appropriate plugin. If
the configure script does not detect it properly, you may need to
specify --with-gimp or --with-gimp2. However, it's more likely
that you need to install appropriate development packages.
Normally Gutenprint installs GIMP Print plugin in your system
plug-in directory. If you wish to install it in your personal
plugin directory, you may use
./configure --enable-user-install
It is not possible for Gimp-Print 4.2, Gutenprint 5.0, and
Gutenprint 5.2 (or any future release) to coexist in the same
installation of GIMP. The Gutenprint 5.2-based plugin can read
settings from previous versions of Gutenprint and Gimp-Print, but
the configuration file format in Gutenprint 5.2 cannot be read by
older versions of Gimp-Print or Gutenprint.
----------------
F) ESCPUTIL
"escputil" is a command line utility for administering Epson
inkjet printers. It performs head alignment, retrieval of ink
levels and status information, printing of test patterns, etc. It
is built and installed by default; if you don't want it, you may
use --without-escputil when configuring.
escputil uses the readline package for interactive commands
(currently only head alignment falls into this category). Linking
against libreadline sometimes requires linking against other
packages. Gutenprint attempts to determine the correct packages
to link against; the exact sequence is described in the release
notes. If you do not wish to use readline, you may use
--without-readline.
================================================================
III) GETTING STARTED
This section describes how to get started by installing printers
under Gutenprint. Please see the user's manual (in
doc/gutenprint-users-manual.odt or
doc/gutenprint-users-manual.pdf) for more information.
----------------
A) PRINTER INSTALLATION
The actual procedure to install a printer depends upon your
operating system and the spooler (printing system) in use on your
system.
Gutenprint does not normally require the use of non-standard
procedures (such as starting special programs) to install
printers. Assuming that you are using either CUPS or Foomatic, it
integrates with your printing system, so the tools provided by
your distribution vendor should work correctly with Gutenprint.
Most printing systems currently use PPD files to describe printer
capabilities. Some printers are supported by more than one
driver, so you may find more than one PPD file for your printer.
Gutenprint PPD files are described as
Epson Stylus Photo R300 - CUPS+Gutenprint v5.2.0
Epson Stylus Photo R300 - CUPS+Gutenprint v5.2.0 Simplified
Epson Stylus Photo R300 Foomatic/gutenprint-ijs.5.2
Epson Stylus Photo R300 Foomatic/gutenprint-ijs-simplified.5.2
The "simplified" PPD files offer a basic set of options only, for
selecting printer options, standard paper sizes, and basic quality
settings. The PPD files that are not "simplified" offer a much
broader set of controls, giving the user extensive control over
quality and color adjustment.
If you are using CUPS, you may be offered a choice between
CUPS+Gutenprint and Foomatic/gutenprint-ijs PPD files. While
either kind of PPD file will work, we recommend using the
CUPS+Gutenprint PPD files. These PPD files can be automatically
updated with cups-genppdupdate when you later upgrade your
Gutenprint installation. Some systems mark the Foomatic PPD files
as "(recommended)"; we nevertheless recommend using the
CUPS+Gutenprint PPD files.
Other PPD files are described differently, such as
Epson MJ 520C Foomatic/stcolor (recommended)
These PPD files, whether "recommended" or not, are not Gutenprint
PPD files.
NOTES FOR CUPS USERS:
If you do not choose to automatically update existing PPD files,
you should reinstall any printer queues that you are using
Gutenprint PPD files with. The Gutenprint driver and the PPD
files must be kept in sync, since the PPD files reflect the
particular version of the driver that they were built against. If
you attempt to use a version of Gutenprint with PPD files not
built for that precise version, the driver will fail with a
diagnostic error message. For example, PPD files built for
Gutenprint 5.2.1 will not work with driver version 5.2.2. You can
identify printers using Gutenprint PPD files by the name of the
PPD file, which will be something like:
EPSON Stylus Photo EX - CUPS+Gutenprint v5.2.2(en)
Linux users please note: If you are using CUPS 1.1.11 or higher,
and you have a USB-connected printer, you must have a printer
connected to each USB port that you plan to use and powered on
when you restart CUPS. If you do not do so, you will not be able
to reinstall the printer. It is only necessary to do this if you
wish to update PPD files manually; if you use cups-genppdupdate,
you do not need to do this.
Starting with CUPS 1.1.11, you cannot choose an AppSocket
connection and enter "usb:/dev/usblp0" or the like as the URI; you
will get a "client-error-not-possible" error at the end of the
installation process, and you will have a message like the
following in your CUPS error log (typically
/var/log/cups/error_log):
E [21/Nov/2001:17:59:07 +0500] add_printer: bad device-uri attribute 'usb:/dev/usb/lp0'!
If the printer was turned on correctly, you will be given a choice
of a USB connection in the Device dialog.
You may also have problems if you have a .lpoptions file that has
old options set. If you have problems printing, please remove any
existing .lpoptions file in your home directory and try printing
again.
================================================================
IV) SOLVING PROBLEMS
While we have attempted to make use of Gutenprint as
straightforward and trouble-free as possible, we certainly
recognize that there may be problems with installing and using
Gutenprint. In the event of any difficulty, we ask that you take
the following actions:
1) Read the release notes (NEWS).
2) Read the FAQ, in doc/FAQ.html. Your question may be answered
there.
3) Make sure that the paper type and size, and media source, that
you have selected matches the paper loaded into the printer.
This is only necessary if the printer attempts to print, but
does not succeed. It is a good starting point if quality is
poor (too dark or too light, wet ink on the paper, etc.).
4) Reset all settings (particularly the color and quality
settings) to their defaults.
5) If you are using CUPS, search /var/log/cups/error_log (which
may be located elsewhere on some systems) for lines starting
with 'E' (these lines indicate errors). Also search for log
information produced by Gutenprint; all such output lines will
contain "Gutenprint". These lines may help you solve the
problem and will help us investigate your problem if necessary.
6) If you are using CUPS, enable debugging output. This can be
done by editing /etc/cups/cupsd.conf (which must be done as
root). There will be a line in that file:
LogLevel Info
which should be changed to
LogLevel Debug
This will allow CUPS to produce extensive debugging output.
You will need to restart CUPS (the exact procedure is
system-dependent) after doing this. If you report a problem to
the Gutenprint team, you will be asked for this information.
7) There are public forums on Sourceforge dedicated to this
package. Please see
http://sourceforge.net/forum/?group_id=1537 for more
information. The Help forum is a good source of information.
8) If you have a technical support issue that does not appear to
be a bug in the software, you can use the Tech Support Manager.
Please see http://sourceforge.net/support/?group_id=1537.
9) If you have found a clear bug in the package, you may file a
bug report at http://sourceforge.net/bugs/?group_id=1537.
10) You may send mail to the gimp-print-devel@sourceforge.net
mailing list. This is recommended as a last resort only.
================================================================
V) USE OF THE CVS REPOSITORY
Please read doc/README.maintaining for instructions on how to
build from the CVS repository. You will need additional packages
and tools for this purpose.

View File

@ -1,258 +0,0 @@
This file describes issues that packagers and distributors of
Gutenprint should be aware of. This information is targeted at Linux
distributions and others who deliver Gutenprint packages intended for
end-user use.
1) As of 5.2 and until further notice, Gutenprint will no longer
deliver separate "development" and "stable" release series.
The point release will be advanced between beta/RC releases and
stable releases. The first stable release of 5.2 will be numbered
5.2.1; the betas and release candidates will be numbered
5.2.0-betaN or 5.2.0-rcN. Any betas for the next stable release
will be numbered 5.2.2-betaN; the next stable release will be
numbered 5.2.3 (if there are beta or release candidate builds) or
5.2.2 (if there are not).
This ensures that the highest numbered release is always the most
current, and that there will be no confusion between beta releases
and stable releases. Our experience with 5.0 was that many users
continued to use beta releases of 5.0 even after 5.0.0 was
released, and worse, in some cases referred to the 5.0.0-beta2
release (for example) as "5.0.2". We believe that the numbering
scheme described above will avoid that problem.
2) We request that you subscribe to
gimp-print-devel@lists.sourceforge.net to get the latest
information about upcoming changes.
3) If you intend to make any changes or patches to the source code of
this package, we request that you inform us of these changes and
discuss them with us prior to distribution, and identify a point of
contact to us.
While this is not required by the GPL, we would greatly appreciate
knowing about any changes you plan to make for three reasons:
* The changes may benefit all users of Gutenprint.
* We may have already considered this kind of change in the past
and elected not to make it, or may be planning to make this kind
of change in a different way from what you have done.
Coordination in this case may save everyone a lot of work.
* If we receive bug reports or support requests from users of your
package, we will either know who we can direct them to or will
have a better understanding of what is different in your package
that may cause observed differences from what we expect.
4) We specifically request that you *not* make changes to the margins
of any paper size in src/xml/papers.xml, or in general change
papers.xml other than to add additional paper sizes. In the past,
a number of distributions have imposed margins for certain paper
sizes in this file because printing on certain printers was cut off
(cropped). Change to papers.xml to work around these problems is
not an appropriate workaround for this problem, as it results in
*all* printers being bound by those margins. Furthermore, the
margin problem has since been fixed in a different way. Margins
should only be listed in papers.xml for papers that intrinsically
have margins of their own, such as photo papers with tear-off
margins.
Historically, in Gutenprint 5.0.0 all printers that offered
different margins under different circumstances (e. g. a choice
between normal margins and full-bleed printing, such as many Epson
inkjet printers, or different margins for certain paper sizes, such
as many laser printers that offer different margins for A4 than for
other paper sizes) always listed the wide margins in the PPD files,
and if the full bleed option was not selected (or a paper size that
required narrower margins was), the printed image was simply
clipped to the margins. This preserved the image dimension on the
page, but in some cases resulted in parts of the image being
clipped. The workaround that some packagers applied, to add
margins in papers.xml, made it impossible to print full bleed to
these paper sizes even on printers capable of this. None of these
packagers ever discussed this change with us, and as a result we
were caught by surprise by some bug reports that it took us a while
to track down.
This issue was fixed in 5.0.1 (in the native CUPS driver) by means
of a new PPD option to allow users to either shrink the image to
the appropriate margins or to crop the image. This allows users to
select whether they prefer dimensional accuracy or printing the
entire image. However, we have observed that this workaround has
still not been removed from all distributors' packages.
At this point, there should be no reason to specify margins in
papers.xml for any reason other than adding a media size that has
intrinsic margins of its own, such as a new paper with tear-off
margins. If you think you need to do this for any other reason,
please discuss it with us first!
5) Packaging the Core Library (libgutenprint)
* You may wish to create a development package containing header
files and linkable libraries separate from the runtime package.
There are a few third party applications that link against
Gutenprint.
* Gutenprint permits installation of Gimp-Print 4.2 and Gutenprint
5.0 alongside Gutenprint 5.2, and in the future will permit
concurrent installation of different stable versions of
Gutenprint with different minor version numbers. Therefore, you
may consider allowing Gutenprint 5.0, Gutenprint 5.2, and
Gimp-Print 4.2 to be installed concurrently.
* The core driver library component also includes XML data files
(in src/xml), locale files for the libary, and documentation.
The XML data files in src/xml are mandatory; the driver will not
function without these files.
* We do not recommend installing any program linked against
libgutenprint with enhanced privileges (via the setuid or setgid
mechanism, or any other such mechanism). We have not audited
libgutenprint for safety in this kind of environment, and changes
in Gutenprint 5.2 (in particular, moving the Epson driver data
into external data files whose root can be changed by means of
the environment variable STP_DATA_PATH) may increase risk.
Furthermore, if you build the Gutenprint library in modular
fashion, such that drivers may be dynamically loaded into running
applications, there is an additional hazard in the form of an
environment variable that allows specifying where those modules
should be loaded from (STP_MODULE_PATH).
The only program in the core Gutenprint package that has any
reason to be installed this way is escputil, because it needs to
talk directly to the printer. See the discussion of escputil
below.
6) Packaging the CUPS Driver
* IMPORTANT: As a special part of the install/upgrade procedure,
your installer should check for any queues using the "epson" or
"canon" backends and convert them to use an appropriate standard
backend, usually the "usb" or "parallel" backend. Please see the
Critical Upgrade Note in the release notes (NEWS file) for more
information.
Note that the epson and canon backends are no longer distributed
by Gutenprint, so your installer will have to fix this up in any
event.
* We recommend that your installation package run cups-genppdupdate
and restart CUPS as part of the installation process. This will
copy changes made by the user and ensure that the user has
correct PPD files. The CUPS driver will refuse to use a PPD file
built with a different version of Gutenprint.
* Some applications do not translate PPD file contents (option
names and values) when globalized PPD files are used (see the
release notes for general discussion of globalized PPD files).
At the time these notes are being written, we have determined
that versions of OpenOffice.org up to and including 3.0.0-rc1 do
not translate PPD file contents with globalized PPD files, but
language-specific localized PPD files are translated correctly.
We have also determined that GIMP 2.4, using the GtkPrint plugin,
does not translate PPD contents using globalized PPD files, but
does with single language files.
The CUPS development team has informed us that they have not
received complaints from users about this, despite the fact that
the basic set of PPD files distributed by CUPS is globalized.
Unlike Gutenprint, however, CUPS does not require that its PPD
files be upgraded with each release, so users upgrading from
older versions of CUPS may not be exposed to this issue.
Gutenprint does provide a way to upgrade PPD files to
language-specific ones, using the -l option to
cups-genppdupdate. PPD files that are being upgraded from a
previous release of Gutenprint may be upgraded with
cups-genppdupdate -loriginal to update to the original language.
Note that this works even if the PPD files have been updated to
globalized files, since cups-genppdupdate stores the language of
the PPD file it was upgrading. cups-genppdupdate -l<language>
updates PPD files into the specified language; see the release
notes or user's manual for the set of languages supported.
Note that -loriginal will *not* work with PPD files that had been
upgraded with Gutenprint 5.2.0-beta4, since cups-genppdupdate in
that release does not preserve the original language of the PPD
file.
Distributions have a number of possible options to address this
issue, for example:
- Use globalized PPD files and accept the translation problem or
fix the applications that do not translate the PPD files
correctly. You may wish to document the procedure of using
cups-genppdupdate to generate language-specific PPD files in
this case.
- Configure Gutenprint with --disable-globalized-cups-ppds, to
generate only single-language PPD files.
- Provide an administrative utility to update either individual
PPD files or all PPD files on the system. If you provide this
kind of utility, we recommend using the -l<language> option
rather than -loriginal.
* All files and directories with versioned names (such as
rastertogutenprint and the PPD files) may be installed and used
concurrently with other versions of Gimp-Print and Gutenprint as
described above. Other executables (such as cups-calibrate) are
not versioned, but are not linked against libgutenprint and do
not have any other dependencies on Gutenprint.
7) Packaging the IJS Driver and Foomatic Data
* We recommend packaging the IJS driver
(/usr/bin/ijsgutenprint.5.2) and its man page
(/usr/man/man1/ijsgutenprint.1.gz) together with the Foomatic
data.
* If your distribution uses CUPS as its print spooler, we very
strongly recommend using the native CUPS driver rather than
Foomatic. The native CUPS driver has been better tested than the
IJS driver, and has more complete solutions for some issues
involving paper dimensions and presentation of numerical
options. The native CUPS driver also has better management tools
(cups-genppdupdate, specifically).
If you wish to improve the IJS driver and Foomatic data, please
contact us.
* The IJS driver and the Foomatic data kit and PPD files are
versioned (major and minor), and hence you may consider
permitting multiple versions to be installed concurrently. The
man page (/usr/man/man1/ijsgutenprint.1.gz) is not versioned, but
the interface to this command, which is intended only to be
invoked from within Ghostscript, is not likely to change.
8) Packaging the Enhanced Print Plugin for GIMP
* The enhanced Print plugin for GIMP, unlike the core library and
the Foomatic and CUPS drivers, may not be installed concurrently
with other versions. For example, you may not install both the
Gimp-Print 4.2 and the Gutenprint 5.2 version of the Print
plugin, as they use different configuration file formats.
9) Packaging the Epson Inkjet Management Utility, escputil
* We do not recommend installing this utility with enhanced
privileges (via the setuid or setgid mechanism, or any other such
mechanism) without a careful security audit on your part. If
elevated privileges are required in your installation, we suggest
ensuring that the variables STP_DATA_PATH and STP_MODULE_PATH be
cleared prior to invoking escputil (or that you patch escputil to
clear those variables prior to calling stp_init()) and otherwise
using the least privilege required to allow escputil to run.
Another option may be to allow (by means of device permissions)
an appropriate group of users to run this command.
With the conversion of the Epson driver to using external data
files in XML format rather than data hard-coded into the library
binary, there are more opportunities for injection of bad data
into the driver.
Note that the default configuration of Gutenprint does not
install escputil with elevated privileges.

File diff suppressed because it is too large Load Diff

View File

@ -1,25 +0,0 @@
#!/bin/sh
# Run this to generate all the initial makefiles, etc.
srcdir="`dirname $0`"
test -z "$srcdir" && srcdir=.
PKG_NAME="gutenprint"
(test -f "$srcdir/configure.ac") || {
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
echo " top-level directory"
exit 1
}
if test $# -gt 0 ; then
case "$1" in
-h|--help|--help=*)
if test -f "$srcdir/configure" ; then
exec "$srcdir/configure" "$1"
fi ;;
*) ;;
esac
fi
. $srcdir/scripts/autogen.sh

View File

@ -1,214 +0,0 @@
/* config.h. Generated from config.h.in by configure. */
/* config.h.in. Generated from configure.ac by autoheader. */
/* CUPS data directory. */
/* Not used in Haiku */
#define CUPS_DATADIR "/system/data/cups"
/* Not used in Haiku */
#define CUPS_MODELDIR "/system/data/model/gutenprint/5.2/"
/* */
/* Not used in Haiku */
#define CUPS_PPD_NICKNAME_STRING " - CUPS+Gutenprint v"
/* CUPS PPD PostScript level */
/* Not used in Haiku */
#define CUPS_PPD_PS_LEVEL 2
/* Define to 1 if translation of program messages to the user's native
language is requested. */
/* #define ENABLE_NLS 1 */
/* */
#define GUTENPRINT_RELEASE_VERSION "5.2"
/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
CoreFoundation framework. */
/* #undef HAVE_CFLOCALECOPYCURRENT */
/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
the CoreFoundation framework. */
/* #undef HAVE_CFPREFERENCESCOPYAPPVALUE */
/* Define if the GNU dcgettext() function is already present or preinstalled.
*/
#define HAVE_DCGETTEXT 1
/* Define to 1 if you have the <dlfcn.h> header file. */
#define HAVE_DLFCN_H 1
/* Define to 1 if you have the <fcntl.h> header file. */
#define HAVE_FCNTL_H 1
/* Define to 1 if GCC special attributes are supported */
#define HAVE_GCC_ATTRIBUTES 1
#if !defined(HAVE_GCC_ATTRIBUTES) && !defined(__attribute__)
/* This should really be a C99 anonymous variadic macro. */
#define __attribute__(attr)
#endif
/* Define to 1 if you have the <getopt.h> header file. */
#define HAVE_GETOPT_H 1
/* Define to 1 if you have the `getopt_long' function. */
#define HAVE_GETOPT_LONG 1
/* Define if the GNU gettext() function is already present or preinstalled. */
#define HAVE_GETTEXT 1
/* Define if GNU ld is present. */
/* #undef HAVE_GNU_LD */
/* Define if you have the iconv() function. */
#define HAVE_ICONV 1
/* Define to 1 if you have the <inttypes.h> header file. */
#define HAVE_INTTYPES_H 1
/* Is libreadline present? */
#define HAVE_LIBREADLINE 0
/* Define if libz is present. */
/* #undef HAVE_LIBZ */
/* Define to 1 if you have the <limits.h> header file. */
#define HAVE_LIMITS_H 1
/* Define to 1 if you have the <locale.h> header file. */
#define HAVE_LOCALE_H 1
/* Define to 1 if you have the <ltdl.h> header file. */
#define HAVE_LTDL_H 1
/* Define if maintainer-mode is to be used. */
/* #undef HAVE_MAINTAINER_MODE */
/* Define to 1 if you have the <memory.h> header file. */
#define HAVE_MEMORY_H 1
/* Define to 1 if you have the `nanosleep' function. */
#define HAVE_NANOSLEEP 1
/* Define to 1 if you have the `poll' function. */
#define HAVE_POLL 1
/* Define if libreadline header is present. */
/* #undef HAVE_READLINE_READLINE_H */
/* Define to 1 if you have the <stdarg.h> header file. */
#define HAVE_STDARG_H 1
/* Define to 1 if you have the <stdint.h> header file. */
#define HAVE_STDINT_H 1
/* Define to 1 if you have the <stdlib.h> header file. */
#define HAVE_STDLIB_H 1
/* Define to 1 if you have the <strings.h> header file. */
#define HAVE_STRINGS_H 1
/* Define to 1 if you have the <string.h> header file. */
#define HAVE_STRING_H 1
/* Define to 1 if you have the <sys/stat.h> header file. */
#define HAVE_SYS_STAT_H 1
/* Define to 1 if you have the <sys/time.h> header file. */
#define HAVE_SYS_TIME_H 1
/* Define to 1 if you have the <sys/types.h> header file. */
#define HAVE_SYS_TYPES_H 1
/* Define to 1 if you have the <time.h> header file. */
#define HAVE_TIME_H 1
/* Define to 1 if you have the <unistd.h> header file. */
#define HAVE_UNISTD_H 1
/* Define to 1 if you have the `usleep' function. */
#define HAVE_USLEEP 1
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#define LT_OBJDIR ".libs/"
/* Build a modular libgutenprint */
/* #undef MODULE */
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
/* #undef NO_MINUS_C_MINUS_O */
/* The operating system to build for */
#define OSTYPE "haiku"
/* Name of package */
#define PACKAGE "gutenprint"
/* Define to the address where bug reports for this package should be sent. */
#define PACKAGE_BUGREPORT "gimp-print-devel@lists.sourceforge.net"
/* */
#define PACKAGE_DATA_DIR "/system/data/gutenprint"
/* */
#define PACKAGE_LIB_DIR "/system/lib/gutenprint"
/* */
#define PACKAGE_LOCALE_DIR "/NOT_USED/locale"
/* Define to the full name of this package. */
#define PACKAGE_NAME "gutenprint"
/* Define to the full name and version of this package. */
#define PACKAGE_STRING "gutenprint 5.2.7"
/* Define to the one symbol short name of this package. */
#define PACKAGE_TARNAME "gutenprint"
/* Define to the version of this package. */
#define PACKAGE_VERSION "5.2.7"
/* */
#define PKGMODULEDIR "/system/lib/gutenprint/5.2/modules"
/* */
#define PKGXMLDATADIR "/system/data/gutenprint"
/* Package release date. */
#define RELEASE_DATE "01 May 2011"
/* Define as the return type of signal handlers (`int' or `void'). */
#define RETSIGTYPE void
/* Define to 1 if you have the ANSI C header files. */
#define STDC_HEADERS 1
/* Use libdl/dlopen as module loader */
/* #undef USE_DLOPEN */
/* Use GNU libltdl as module loader */
/* #undef USE_LTDL */
/* Version number of package */
#define VERSION "5.2.7"
/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
`char[]'. */
#define YYTEXT_POINTER 1
/* Define to empty if `const' does not conform to ANSI C. */
/* #undef const */
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
/* #undef inline */
#endif
/* Define to `long int' if <sys/types.h> does not define. */
/* #undef off_t */
/* Define to `unsigned int' if <sys/types.h> does not define. */
/* #undef size_t */

View File

@ -1,213 +0,0 @@
/* config.h.in. Generated from configure.ac by autoheader. */
/* CUPS data directory. */
#undef CUPS_DATADIR
/* */
#undef CUPS_MODELDIR
/* */
#undef CUPS_PPD_NICKNAME_STRING
/* CUPS PPD PostScript level */
#undef CUPS_PPD_PS_LEVEL
/* Define to 1 if translation of program messages to the user's native
language is requested. */
#undef ENABLE_NLS
/* */
#undef GUTENPRINT_RELEASE_VERSION
/* Define to 1 if you have the MacOS X function CFLocaleCopyCurrent in the
CoreFoundation framework. */
#undef HAVE_CFLOCALECOPYCURRENT
/* Define to 1 if you have the MacOS X function CFPreferencesCopyAppValue in
the CoreFoundation framework. */
#undef HAVE_CFPREFERENCESCOPYAPPVALUE
/* Define if the GNU dcgettext() function is already present or preinstalled.
*/
#undef HAVE_DCGETTEXT
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
/* Define to 1 if you have the <fcntl.h> header file. */
#undef HAVE_FCNTL_H
/* Define to 1 if GCC special attributes are supported */
#undef HAVE_GCC_ATTRIBUTES
#if !defined(HAVE_GCC_ATTRIBUTES) && !defined(__attribute__)
/* This should really be a C99 anonymous variadic macro. */
#define __attribute__(attr)
#endif
/* Define to 1 if you have the <getopt.h> header file. */
#undef HAVE_GETOPT_H
/* Define to 1 if you have the `getopt_long' function. */
#undef HAVE_GETOPT_LONG
/* Define if the GNU gettext() function is already present or preinstalled. */
#undef HAVE_GETTEXT
/* Define if GNU ld is present. */
#undef HAVE_GNU_LD
/* Define if you have the iconv() function. */
#undef HAVE_ICONV
/* Define to 1 if you have the <inttypes.h> header file. */
#undef HAVE_INTTYPES_H
/* Is libreadline present? */
#undef HAVE_LIBREADLINE
/* Define if libz is present. */
#undef HAVE_LIBZ
/* Define to 1 if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H
/* Define to 1 if you have the <locale.h> header file. */
#undef HAVE_LOCALE_H
/* Define to 1 if you have the <ltdl.h> header file. */
#undef HAVE_LTDL_H
/* Define if maintainer-mode is to be used. */
#undef HAVE_MAINTAINER_MODE
/* Define to 1 if you have the <memory.h> header file. */
#undef HAVE_MEMORY_H
/* Define to 1 if you have the `nanosleep' function. */
#undef HAVE_NANOSLEEP
/* Define to 1 if you have the `poll' function. */
#undef HAVE_POLL
/* Define if libreadline header is present. */
#undef HAVE_READLINE_READLINE_H
/* Define to 1 if you have the <stdarg.h> header file. */
#undef HAVE_STDARG_H
/* Define to 1 if you have the <stdint.h> header file. */
#undef HAVE_STDINT_H
/* Define to 1 if you have the <stdlib.h> header file. */
#undef HAVE_STDLIB_H
/* Define to 1 if you have the <strings.h> header file. */
#undef HAVE_STRINGS_H
/* Define to 1 if you have the <string.h> header file. */
#undef HAVE_STRING_H
/* Define to 1 if you have the <sys/stat.h> header file. */
#undef HAVE_SYS_STAT_H
/* Define to 1 if you have the <sys/time.h> header file. */
#undef HAVE_SYS_TIME_H
/* Define to 1 if you have the <sys/types.h> header file. */
#undef HAVE_SYS_TYPES_H
/* Define to 1 if you have the <time.h> header file. */
#undef HAVE_TIME_H
/* Define to 1 if you have the <unistd.h> header file. */
#undef HAVE_UNISTD_H
/* Define to 1 if you have the `usleep' function. */
#undef HAVE_USLEEP
/* Define to the sub-directory in which libtool stores uninstalled libraries.
*/
#undef LT_OBJDIR
/* Build a modular libgutenprint */
#undef MODULE
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
#undef NO_MINUS_C_MINUS_O
/* The operating system to build for */
#undef OSTYPE
/* Name of package */
#undef PACKAGE
/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT
/* */
#undef PACKAGE_DATA_DIR
/* */
#undef PACKAGE_LIB_DIR
/* */
#undef PACKAGE_LOCALE_DIR
/* Define to the full name of this package. */
#undef PACKAGE_NAME
/* Define to the full name and version of this package. */
#undef PACKAGE_STRING
/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME
/* Define to the home page for this package. */
#undef PACKAGE_URL
/* Define to the version of this package. */
#undef PACKAGE_VERSION
/* */
#undef PKGMODULEDIR
/* */
#undef PKGXMLDATADIR
/* Package release date. */
#undef RELEASE_DATE
/* Define as the return type of signal handlers (`int' or `void'). */
#undef RETSIGTYPE
/* Define to 1 if you have the ANSI C header files. */
#undef STDC_HEADERS
/* Use libdl/dlopen as module loader */
#undef USE_DLOPEN
/* Use GNU libltdl as module loader */
#undef USE_LTDL
/* Version number of package */
#undef VERSION
/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a
`char[]'. */
#undef YYTEXT_POINTER
/* Define to empty if `const' does not conform to ANSI C. */
#undef const
/* Define to `__inline__' or `__inline' if that's what the C compiler
calls it, or to nothing if 'inline' is not supported under any name. */
#ifndef __cplusplus
#undef inline
#endif
/* Define to `long int' if <sys/types.h> does not define. */
#undef off_t
/* Define to `unsigned int' if <sys/types.h> does not define. */
#undef size_t

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,286 +0,0 @@
<html>
<head>
<title>The Gutenprint FAQ</title>
</head>
<body>
<h2>Gutenprint FAQ</h2>
<ol>
<p><li><h3>Is it only for Gimp?</h3>
<p>No, it can be used for many printing needs. Gimp-print started out
as a driver for The Gimp, the well known image manipulation program.
Early in development versions for Ghostscript and later CUPS were
added. The emphasis is still on quality color printing, though
performance gets a lot of attention these days.
<p><li><h3>I cannot install it, it complains about missing Gimp files</h3>
<ul>
<p><li>If you have the Gimp installed on your system, you probably
have the user package, but not the development package, installed.
You will need to install the latter from your installation media; it's
usually named gimp-devel.
<p><li>If you do have the Gimp installed, and you've installed the
gimp-devel package, you may also need to install the gtk-devel and
glib-devel packages.
<p><li>If you've installed the Gimp from source, you may need to run
<tt>ldconfig</tt> as root. The installation procedure for the Gimp
doesn't run ldconfig, which is needed on many systems to tell the
system about the shared libraries that are installed. If you don't
understand this, don't worry; just do it. If you're nervous about
doing that, reboot.
<p><li>If you don't have the Gimp installed on your system, and just
want to compile Gutenprint for CUPS (for example), you need to pass
<tt>configure</tt> the option <tt>--with-gimp=no</tt>, so it won't try
to look for the Gimp and fail.
</ul>
<p><li><h3>What is the difference between B/W, Line art, solid color and
Photo mode (or ImageType in Ghostscript)?</h3>
<p>Photo mode does a lot of work to make colors as similar to screen
presentation as possible. This takes time. Line art is faster, but
colors may be off. Solid Colors is somewhere in between. B/W mode
does not use color ink when printing, and is much faster.
<p><li><h3>I selected my printer and it doesn't work at all!</h3>
<p>Please check your printing system (lpd, CUPS, LPRng, etc.)
configuration. You may also have a problem with your parallel port
or USB connection, so take a look at <tt>/var/log/messages</tt> (or
wherever your system logs are kept).
<p><li><h3>I selected my printer and it simply feeds paper without
printing</h3>
<p>Many Epson printers (in particular) do this if they encounter an
error in the command stream. This usually indicates a bug in
Gutenprint; please report it to <a
mailto="gimp-print-devel@sourceforge.net">gimp-print-devel@sourceforge.net</a>
or via the bug tracking system at <a
href="http://gimp-print.sourceforge.net">http://gimp-print.sourceforge.net</a>.
Make sure you report the printer you have and all of the settings that
you used. But first, triple check that you're using the right printer
model!
<p><li><h3>I selected my printer, and it prints the image badly
distorted, or at completely the wrong place on the page</h3>
<p>This usually indicates a bug in the package. Please report it as
described above. Also as described above, make sure you've set the
right printer.
<p><li><h3>I selected the right printer and nonsense, or only part of
the page, gets printed</h3>
<p>Printers for which support just has been added may not have been
tested, as the developers do not have access to the printer. It is
worth trying different settings. For example, change the resolution to
a mainstream value as used on that printer. Also photo mode is better
tested than the optimized versions. When you find out what works and
what doesn't, file a bug report.
<p>One common cause of this is not using "raw" mode when printing from
the Gimp plugin. Depending upon your printing system, you will need
to use either <tt>-l</tt> (traditional BSD lpd), <tt>-oraw</tt> (CUPS
lpr), or <tt>-d</tt> (most versions of System V lp, including CUPS).
Otherwise the printing system attempts to interpret the output as
something else, and tries to apply a filter to it to convert it to
something else (usually PostScript).
<p>Another less common cause of this (it usually causes other
symptoms, like printing only part of a page) is lack of space
somewhere. This is most commonly an issue when using the Gimp Print
plugin. The plugin creates a huge temporary file that gets sent to
the printing system. The size of the file varies; it's proportional
to the page size and the resolution setting chosen. Full-page, high
resolution photographs can result in 100 MB of output. The system may
need to have 2 or 3 copies of this file for short periods of time. If
your /tmp, /var, or wherever your spooler keeps its temporary files is
too small, you'll have problems.
<p>Finally, problems with your parallel or USB port may be the cause
of problems here. Certain Epson printers in particular are known to
be very sensitive to the quality of connecting cables, and may have
trouble with long or low quality cables, or USB hubs. If nothing else
works, and you're certain you've tried everything else, try a better
cable or a direct USB connection.
<p><li><h3>What's up with the HP Deskjet 1200?</h3>
<p>HP had sold two printers with the 1200 model designation. The old
version is 300 DPI and has a heating element to dry the ink. It was
manufactured around 1990. The new version is of 2000 vintage and has
higher resolution. The one supported by this package is the new
one???
<p><li><h3>I selected the right printer and the quality is lousy</h3>
<p>Try selecting a different resolution or quality setting. Especially
lower resolutions have a problem putting enough ink on paper. Also,
use Photo mode. If you find settings that do not work at all (you get
garbage or no output, but other settings work), report these as bugs.
High resolutions should produce a similar (but smoother) result than
medium resolutions. Resolutions under a certain printer dependent
figure are seen as draft-only - for example lower than 360 DPI on
Epsons with standard paper or lower than 300 DPI on HP.
<p>Also make sure that you have the right kind of paper selected.
Selecting plain paper when you're printing on high quality photo paper
is certain to result in a light, grainy image. Selecting photo paper
when you're printing on plain paper will result in a dark, muddy image
that bleeds through the paper. There are differences between
different kinds of paper; you may need to tweak the density and color
settings slightly.
<p>In addition, certain printers don't work well on certain kinds of
paper. Epson printers work well on Epson papers, but don't work
well on many third party papers (particularly the high quality photo
papers made by other vendors). This isn't a conspiracy to lock you
into their paper, it's because they've formulated the paper and ink to
work well together.
<p>If you use Ghostscript, make sure the Ghostscript resolution is not
set higher than the driver resolution. If it is higher, the driver has
to throw away part of the pixels, leading to uneven strokes in text
and slanted lines with interruptions.
<p><li><h3>How do I start setting options for Ghostscript?</h3>
<p>Please see src/ghost/README for more information.
<p><li><h3><tt>escputil -i</tt> or <tt>escputil -d</tt> fails as follows:</h3>
<p><pre>
% escputil -r /dev/lp0 -i
[ ... license info omitted ... ]
Cannot read from /dev/lp0: Invalid argument
</pre>
<p>You need to rebuild your kernel with CONFIG_PRINTER_READBACK
enabled.
<p><li><h3>I tried to test my Epson printer by 'cat .cshrc > /dev/lp0'
and nothing prints!!!???</h3>
<p>The classic test of printer connectivity -- sending an ASCII file
to it -- doesn't work on many Epson printers out of the box (or after
printing from Windows or Macintosh). Epson printers from the Stylus
Color 740 and newer use a special "packet mode" in which they do not
recognize standard commands or ASCII text. They must be sent a
special sequence that takes them out of packet mode. The command
<p><pre>escputil -u -s -r /dev/lp0</pre>
<p>will take the printer out of packet mode and enable you to print to
it. Of course, as soon as you've read back status from the printer,
you know it's working (although if you're unable to read status out of
the printer, you might have a different problem; see above).
<p>Printing to your printer from Gutenprint, whether you use the Print
plugin, the CUPS driver, or the Ghostscript driver, will also take the
printer out of packet mode. But then again, if you successfully print
to your printer, you know it's working, so why worry? If you're
trying to test your spooler, though, the escputil trick above will do
it. Just make sure that /dev/lp0 is the right device; if it isn't,
substitute whatever is.
<p><em>Note:</em> this does not apply to printers prior to the 740
(such as the Stylus Photo EX, Stylus Color 850, or anything even
older). Those printers are always capable of printing ASCII text, and
don't have packet mode. You can read status from them, but you must
leave off the '-u' option.
<p><li><h3>My USB-connected Epson Stylus printer won't work with
{Free,Net,Open}BSD!</h3>
<p>By default, the BSD device driver for the USB printer device (usually
ulpt0) does a prime, or USB bus reset, when the device is opened. This
causes the printer to reset itself (one can hear the print head moving back
and forth when this happens) and lose sync. After this the printer
won't go into graphics mode and instead spews characters all over you
expensive photo paper. This has been observed on the Stylus Photo
870; it likely exists with other USB-connected Epson Stylus printers.
<p>The fix is to use the "unlpt0" device instead of "ulpt0". The driver
doesn't perform the USB prime when unlpt is opened. If this device
doesn't exist on your system you can create it with
<p><pre>mknod unlpt0 c 113 64 root wheel</pre>
<p>in the /dev directory.
<p><li><h3>I try to print with StarOffice and it doesn't print
correctly!</h3>
<p>If you use CUPS, and your prints from StarOffice come out
incorrectly (particularly at low resolution), try the following. This
assumes a network installation of StarOffice 5.2.
<ol>
<p><li>Ensure that <tt>root</tt> does not have a .Xpdefaults file (if
it does, the procedure below will edit root's version rather than the
system-wide version in <tt>.../office52/share/xp3/Xpdefaults</tt>).
<p><li>As root, start <tt>.../office52/program/spadmin</tt>. This is
the StarOffice printer administration program.
<p><li>Click on <b>Install New Driver</b>. For the <b>Driver
directory</b>, select your CUPS PPD directory. This is usually
<tt>/etc/cups/ppd</tt>. This should list the names of all of the
drivers you have installed.
<p><li>If there are no drivers visible, you may need to give the .ppd
files names ending in .PS. The following script will accomplish this:
<p><pre>
# cd /etc/cups/ppd
# for f in * ; do
> ln -s $f `echo $f | sed 's/ppd$/PS/'`
> done
</pre>
<p>Following this, restart <tt>spadmin</tt> and click on <b>Install
New Driver</b>. When you select your CUPS PPD directory, you will
find the necessary drivers listed.
<p><li>Select the drivers you want StarOffice to know about and click
OK.
<p><li>If you have been using the generic Postscript printer, remove
all of your old queues.
<p><li>Select the appropriate new driver(s) and click <b>Add New
Printer</b>.
<p><li>Select the appropriate printer queue and click <b>Connect</b>
to connect it to the printer queue of your choice.
</ol>
<p>You can now set up appropriate options for this printer. Note that
you can create multiple queues with different settings, for example
one for draft mode and one for high quality.
<p><li><h3>I'm printing through Samba, and my printer prints
garbage!</h3>
<p>There are a number of Samba configuration issues that cause
problems; a common problem is translation from UNIX newlines (\n) to
Windows newlines (\r\n). It's important to ensure that sending raw
data, with no translation, to the printer.
</ol>
</body></html>

View File

@ -1,92 +0,0 @@
## $Id: Makefile.am,v 1.49 2006/07/30 23:24:38 rleigh Exp $
## Copyright (C) 2000 Roger Leigh
##
## 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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
## Process this file with automake to produce Makefile.in.
@SET_MAKE@
SUBDIRS = developer
include $(top_srcdir)/scripts/global.mk
## Variables
docdir = $(datadir)/$(PACKAGE)/doc
## Rules
if MAINTAINER_MODE
all-local: gutenprint-stamp gutenprintui2-stamp
else
all-local:
endif
# Rerun doxygen whenever autogen is run
gutenprintui2: gutenprintui2-stamp
gutenprintui2-stamp: gutenprintui2.dox $(top_srcdir)/configure
$(RM) -rf gutenprintui2/html
$(DOXYGEN) gutenprintui2.dox
touch $@
gutenprint: gutenprint-stamp
gutenprint-stamp: gutenprint.dox $(top_srcdir)/configure
$(RM) -rf gutenprint/html
$(DOXYGEN) gutenprint.dox
touch $@
docs: gutenprint-stamp
cd developer; $(MAKE)
ps: $(MANUAL).ps
cd developer; $(MAKE) ps
pdf: $(MANUAL).pdf
cd developer; $(MAKE) pdf
html:
cd developer; $(MAKE) html
install-data-local: FAQ.html gutenprint-users-manual.odt gutenprint-users-manual.pdf
$(mkdir_p) $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/FAQ.html $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/gutenprint-users-manual.odt $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/gutenprint-users-manual.pdf $(DESTDIR)$(docdir)
## Clean
maintainer-clean-local:
$(RM) -r gutenprint
MAINTAINERCLEANFILES = \
Makefile.in \
gutenprint-stamp
EXTRA_DIST = \
FAQ.html \
README.maintaining \
gutenprint-users-manual.odt \
gutenprint-users-manual.pdf \
gutenprint.dox.in \
gutenprintui2.dox.in \
gutenprint \
gutenprintui2 \
gutenprint-stamp \
gutenprintui2-stamp
.PHONY: html ps pdf docs

View File

@ -1,737 +0,0 @@
# Makefile.in generated by automake 1.11.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
# Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
# Variables
#export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
#export STP_DATA_PATH = $(top_srcdir)/src/xml
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkglibexecdir = $(libexecdir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(srcdir)/gutenprint.dox.in $(srcdir)/gutenprintui2.dox.in \
$(top_srcdir)/scripts/global.mk
subdir = doc
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/isc-posix.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/stp.m4 \
$(top_srcdir)/m4/stp_cups.m4 $(top_srcdir)/m4/stp_gimp.m4 \
$(top_srcdir)/m4/stp_option.m4 $(top_srcdir)/m4/stp_release.m4 \
$(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES = gutenprint.dox gutenprintui2.dox
CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \
html-recursive info-recursive install-data-recursive \
install-dvi-recursive install-exec-recursive \
install-html-recursive install-info-recursive \
install-pdf-recursive install-ps-recursive install-recursive \
installcheck-recursive installdirs-recursive pdf-recursive \
ps-recursive uninstall-recursive
RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \
distclean-recursive maintainer-clean-recursive
AM_RECURSIVE_TARGETS = $(RECURSIVE_TARGETS:-recursive=) \
$(RECURSIVE_CLEAN_TARGETS:-recursive=) tags TAGS ctags CTAGS \
distdir
ETAGS = etags
CTAGS = ctags
DIST_SUBDIRS = $(SUBDIRS)
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
am__relativize = \
dir0=`pwd`; \
sed_first='s,^\([^/]*\)/.*$$,\1,'; \
sed_rest='s,^[^/]*/*,,'; \
sed_last='s,^.*/\([^/]*\)$$,\1,'; \
sed_butlast='s,/*[^/]*$$,,'; \
while test -n "$$dir1"; do \
first=`echo "$$dir1" | sed -e "$$sed_first"`; \
if test "$$first" != "."; then \
if test "$$first" = ".."; then \
dir2=`echo "$$dir0" | sed -e "$$sed_last"`/"$$dir2"; \
dir0=`echo "$$dir0" | sed -e "$$sed_butlast"`; \
else \
first2=`echo "$$dir2" | sed -e "$$sed_first"`; \
if test "$$first2" = "$$first"; then \
dir2=`echo "$$dir2" | sed -e "$$sed_rest"`; \
else \
dir2="../$$dir2"; \
fi; \
dir0="$$dir0"/"$$first"; \
fi; \
fi; \
dir1=`echo "$$dir1" | sed -e "$$sed_rest"`; \
done; \
reldir="$$dir2"
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
BUILD_CUPS_PPDS = @BUILD_CUPS_PPDS@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CONVERT = @CONVERT@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CUPS_CFLAGS = @CUPS_CFLAGS@
CUPS_CONFIG = @CUPS_CONFIG@
CUPS_LIBS = @CUPS_LIBS@
CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
CYGPATH_W = @CYGPATH_W@
DB2HTML = @DB2HTML@
DB2PDF = @DB2PDF@
DB2PS = @DB2PS@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DIALOG = @DIALOG@
DOXYGEN = @DOXYGEN@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
DVIPDF = @DVIPDF@
DVIPS = @DVIPS@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
FIND = @FIND@
FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
GENPPD_LIBS = @GENPPD_LIBS@
GIMP2_CFLAGS = @GIMP2_CFLAGS@
GIMP2_LIBS = @GIMP2_LIBS@
GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
GLIB_MKENUMS = @GLIB_MKENUMS@
GMSGFMT = @GMSGFMT@
GMSGFMT_015 = @GMSGFMT_015@
GNUCFLAGS = @GNUCFLAGS@
GREP = @GREP@
GTK2_CFLAGS = @GTK2_CFLAGS@
GTK2_LIBS = @GTK2_LIBS@
GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
# Libraries
GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
IJS_CFLAGS = @IJS_CFLAGS@
IJS_CONFIG = @IJS_CONFIG@
IJS_LIBS = @IJS_LIBS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
INTLLIBS = @INTLLIBS@
INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
LD = @LD@
LDFLAGS = @LDFLAGS@
LEX = @LEX@
LEXLIB = @LEXLIB@
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBICONV = @LIBICONV@
LIBINTL = @LIBINTL@
LIBOBJS = @LIBOBJS@
LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
LIBS = $(INTLLIBS) @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LIPO = @LIPO@
LN_S = @LN_S@
LTALLOCA = @LTALLOCA@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
MAKEINFO = @MAKEINFO@
MKDIR_P = @MKDIR_P@
MSGFMT = @MSGFMT@
MSGFMT_015 = @MSGFMT_015@
MSGMERGE = @MSGMERGE@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PKG_CONFIG = @PKG_CONFIG@
PLUG_IN_PATH = @PLUG_IN_PATH@
POSUB = @POSUB@
RANLIB = @RANLIB@
RELEASE_DATE = @RELEASE_DATE@
RM = @RM@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TEST = @TEST@
TEXI2HTML = @TEXI2HTML@
TRUE = @TRUE@
USE_NLS = @USE_NLS@
VERSION = @VERSION@
WHICH_PPDS = @WHICH_PPDS@
XGETTEXT = @XGETTEXT@
XGETTEXT_015 = @XGETTEXT_015@
YACC = @YACC@
YFLAGS = @YFLAGS@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
cups_bindir = @cups_bindir@
cups_conf_datadir = @cups_conf_datadir@
cups_conf_serverbin = @cups_conf_serverbin@
cups_conf_serverroot = @cups_conf_serverroot@
cups_exec_prefix = @cups_exec_prefix@
cups_prefix = @cups_prefix@
cups_sbindir = @cups_sbindir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = $(datadir)/$(PACKAGE)/doc
dvidir = @dvidir@
exec_prefix = @exec_prefix@
gimp2_plug_indir = @gimp2_plug_indir@
gutenprint_cflags = @gutenprint_cflags@
gutenprint_libdeps = @gutenprint_libdeps@
gutenprint_libs = @gutenprint_libs@
gutenprintui2_cflags = @gutenprintui2_cflags@
gutenprintui2_libdeps = @gutenprintui2_libdeps@
gutenprintui2_libs = @gutenprintui2_libs@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
lt_ECHO = @lt_ECHO@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
SUBDIRS = developer
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
MAINTAINERCLEANFILES = \
Makefile.in \
gutenprint-stamp
EXTRA_DIST = \
FAQ.html \
README.maintaining \
gutenprint-users-manual.odt \
gutenprint-users-manual.pdf \
gutenprint.dox.in \
gutenprintui2.dox.in \
gutenprint \
gutenprintui2 \
gutenprint-stamp \
gutenprintui2-stamp
all: all-recursive
.SUFFIXES:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
&& { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \
$(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --gnu doc/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
gutenprint.dox: $(top_builddir)/config.status $(srcdir)/gutenprint.dox.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
gutenprintui2.dox: $(top_builddir)/config.status $(srcdir)/gutenprintui2.dox.in
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
# This directory's subdirectories are mostly independent; you can cd
# into them and run `make' without going through this Makefile.
# To change the values of `make' variables: instead of editing Makefiles,
# (1) if the variable is set in `config.status', edit `config.status'
# (which will cause the Makefiles to be regenerated when you run `make');
# (2) otherwise, pass the desired values on the `make' command line.
$(RECURSIVE_TARGETS):
@fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
target=`echo $@ | sed s/-recursive//`; \
list='$(SUBDIRS)'; for subdir in $$list; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
dot_seen=yes; \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done; \
if test "$$dot_seen" = "no"; then \
$(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \
fi; test -z "$$fail"
$(RECURSIVE_CLEAN_TARGETS):
@fail= failcom='exit 1'; \
for f in x $$MAKEFLAGS; do \
case $$f in \
*=* | --[!k]*);; \
*k*) failcom='fail=yes';; \
esac; \
done; \
dot_seen=no; \
case "$@" in \
distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \
*) list='$(SUBDIRS)' ;; \
esac; \
rev=''; for subdir in $$list; do \
if test "$$subdir" = "."; then :; else \
rev="$$subdir $$rev"; \
fi; \
done; \
rev="$$rev ."; \
target=`echo $@ | sed s/-recursive//`; \
for subdir in $$rev; do \
echo "Making $$target in $$subdir"; \
if test "$$subdir" = "."; then \
local_target="$$target-am"; \
else \
local_target="$$target"; \
fi; \
($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \
|| eval $$failcom; \
done && test -z "$$fail"
tags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \
done
ctags-recursive:
list='$(SUBDIRS)'; for subdir in $$list; do \
test "$$subdir" = . || ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \
done
ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
mkid -fID $$unique
tags: TAGS
TAGS: tags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
set x; \
here=`pwd`; \
if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \
include_option=--etags-include; \
empty_fix=.; \
else \
include_option=--include; \
empty_fix=; \
fi; \
list='$(SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test ! -f $$subdir/TAGS || \
set "$$@" "$$include_option=$$here/$$subdir/TAGS"; \
fi; \
done; \
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
shift; \
if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
test -n "$$unique" || unique=$$empty_fix; \
if test $$# -gt 0; then \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
"$$@" $$unique; \
else \
$(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
$$unique; \
fi; \
fi
ctags: CTAGS
CTAGS: ctags-recursive $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \
$(TAGS_FILES) $(LISP)
list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \
unique=`for i in $$list; do \
if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
done | \
$(AWK) '{ files[$$0] = 1; nonempty = 1; } \
END { if (nonempty) { for (i in files) print i; }; }'`; \
test -z "$(CTAGS_ARGS)$$unique" \
|| $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
$$unique
GTAGS:
here=`$(am__cd) $(top_builddir) && pwd` \
&& $(am__cd) $(top_srcdir) \
&& gtags -i $(GTAGS_ARGS) "$$here"
distclean-tags:
-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d "$(distdir)/$$file"; then \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
test -f "$(distdir)/$$file" \
|| cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
test -d "$(distdir)/$$subdir" \
|| $(MKDIR_P) "$(distdir)/$$subdir" \
|| exit 1; \
fi; \
done
@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \
if test "$$subdir" = .; then :; else \
dir1=$$subdir; dir2="$(distdir)/$$subdir"; \
$(am__relativize); \
new_distdir=$$reldir; \
dir1=$$subdir; dir2="$(top_distdir)"; \
$(am__relativize); \
new_top_distdir=$$reldir; \
echo " (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir="$$new_top_distdir" distdir="$$new_distdir" \\"; \
echo " am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)"; \
($(am__cd) $$subdir && \
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$$new_top_distdir" \
distdir="$$new_distdir" \
am__remove_distdir=: \
am__skip_length_check=: \
am__skip_mode_fix=: \
distdir) \
|| exit 1; \
fi; \
done
check-am: all-am
check: check-recursive
all-am: Makefile all-local
installdirs: installdirs-recursive
installdirs-am:
install: install-recursive
install-exec: install-exec-recursive
install-data: install-data-recursive
uninstall: uninstall-recursive
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-recursive
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
clean: clean-recursive
clean-am: clean-generic clean-libtool mostlyclean-am
distclean: distclean-recursive
-rm -f Makefile
distclean-am: clean-am distclean-generic distclean-tags
dvi: dvi-recursive
dvi-am:
html-am:
info: info-recursive
info-am:
install-data-am: install-data-local
install-dvi: install-dvi-recursive
install-dvi-am:
install-exec-am:
install-html: install-html-recursive
install-html-am:
install-info: install-info-recursive
install-info-am:
install-man:
install-pdf: install-pdf-recursive
install-pdf-am:
install-ps: install-ps-recursive
install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-recursive
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic \
maintainer-clean-local
mostlyclean: mostlyclean-recursive
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf-am:
ps-am:
uninstall-am:
.MAKE: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) ctags-recursive \
install-am install-strip tags-recursive
.PHONY: $(RECURSIVE_CLEAN_TARGETS) $(RECURSIVE_TARGETS) CTAGS GTAGS \
all all-am all-local check check-am clean clean-generic \
clean-libtool ctags ctags-recursive distclean \
distclean-generic distclean-libtool distclean-tags distdir dvi \
dvi-am html html-am info info-am install install-am \
install-data install-data-am install-data-local install-dvi \
install-dvi-am install-exec install-exec-am install-html \
install-html-am install-info install-info-am install-man \
install-pdf install-pdf-am install-ps install-ps-am \
install-strip installcheck installcheck-am installdirs \
installdirs-am maintainer-clean maintainer-clean-generic \
maintainer-clean-local mostlyclean mostlyclean-generic \
mostlyclean-libtool pdf pdf-am ps ps-am tags tags-recursive \
uninstall uninstall-am
@SET_MAKE@
# Rules
$(top_builddir)/src/main/libgutenprint.la:
cd $(top_builddir)/src/main; \
$(MAKE)
$(top_builddir)/src/gutenprintui/libgutenprintui.la:
cd $(top_builddir)/src/gutenprintui; \
$(MAKE)
$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
cd $(top_builddir)/src/gutenprintui2; \
$(MAKE)
@MAINTAINER_MODE_TRUE@all-local: gutenprint-stamp gutenprintui2-stamp
@MAINTAINER_MODE_FALSE@all-local:
# Rerun doxygen whenever autogen is run
gutenprintui2: gutenprintui2-stamp
gutenprintui2-stamp: gutenprintui2.dox $(top_srcdir)/configure
$(RM) -rf gutenprintui2/html
$(DOXYGEN) gutenprintui2.dox
touch $@
gutenprint: gutenprint-stamp
gutenprint-stamp: gutenprint.dox $(top_srcdir)/configure
$(RM) -rf gutenprint/html
$(DOXYGEN) gutenprint.dox
touch $@
docs: gutenprint-stamp
cd developer; $(MAKE)
ps: $(MANUAL).ps
cd developer; $(MAKE) ps
pdf: $(MANUAL).pdf
cd developer; $(MAKE) pdf
html:
cd developer; $(MAKE) html
install-data-local: FAQ.html gutenprint-users-manual.odt gutenprint-users-manual.pdf
$(mkdir_p) $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/FAQ.html $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/gutenprint-users-manual.odt $(DESTDIR)$(docdir)
$(INSTALL_DATA) $(srcdir)/gutenprint-users-manual.pdf $(DESTDIR)$(docdir)
maintainer-clean-local:
$(RM) -r gutenprint
.PHONY: html ps pdf docs
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -1,564 +0,0 @@
BUILD SCRIPTS: how they work and how to modify them
===================================================
A guide to the Gutenprint build system.
Introduction
------------
Gutenprint uses GNU autoconf and automake to generate the scripts that
build the software. It also uses libtool to create shared libraries.
This file describes how they work together. It also discusses the
thinking behind how they are used in Gutenprint, and how to modify the
Gutenprint build scripts without breaking other things. If you have
used autoconf and automake before, there will be little that is new in
this file, but you should note the conventions used in Gutenprint.
This file is split into the following sections:
o Setting up the autotools
o Integration of the autotools
o Normal use of the tools
- Using CVS
- Setting up the build scripts from CVS
- Building the package
o configure.ac
- Layout
- AC_SUBST
- AC_DEFINE and AC_DEFINE_UNQUOTED
- AM_CONDITIONAL
o Makefile.am
- Automake basics
- Make and subdirectories
- Conditional compilation
- When automake is not enough...
+ Rule syntax
+ Correctly referencing files
o aclocal
o config.h
o libgutenprint
o automake subtleties
o libtool tricks
o Testing changes to the build scripts
o Further information
o Known problems
I hope you find this useful. If any part was not clear, or there was
something that you would like covering, please let me know!
-- Roger Leigh <rleigh@debian.org>
$Id: README.maintaining,v 1.27 2008/07/29 01:52:09 rlk Exp $
1. Setting up the autotools
---------------------------
To build Gutenprint from CVS, or to regenerate the build scripts after
modifying them, you need to install a number of GNU tools:
i. GNU autoconf (at least 2.54; at least 2.59 recommended)
ii. GNU automake (at least 1.9)
iii. GNU libtool (at least 1.5; at least 1.5.20 recommended)
iv. GNU gettext (at least 0.16)
v. GNU make (any recent version)
and also
vi. pkg-config (at least 0.18.0)
Additional packages are required to build certain parts of Gutenprint
from CVS that are not needed when building from a normal distribution.
These packages include:
vii. flex/lex (for building the GIMP plugin and the test pattern generator)
viii. bison/yacc (for building the GIMP plugin and the test pattern generator)
ix. doxygen (for building documentation)
x. DocBook processors (db2html, db2pdf) (for building documentation)
xi. DocBook-toys (for building documentation
These packages are in addition to the packages normally required to
build Gutenprint, as described in the README at top level.
2. Integration of the autotools
-------------------------------
Each directory has a Makefile.am file which is processed by automake
to produce a Makefile.in. In the root directory there is a
configure.ac.in which is processed by autoconf to make a script called
configure. When run, configure does various tests and checks, and
then reads each Makefile.in to make a Makefile, and also generates a
header called config.h from config.h.in. config.h.in is produced with
autoheader from configure.ac and acconfig.h. autoconf also requires a
file aclocal.m4 which is generated by aclocal.
All these files are generated simply by running `./autogen.sh' in the
top directory. If you are using a distributed version of Gutenprint,
as opposed to CVS, then they will already be present and the following
will not be necessary.
This is probably best demonstrated graphically. The relationships
between the files are as follows:
During package setup (from CVS), running autogen.sh:
autogen.sh
m4extra/stp_release.m4.in ------------> m4/stp_release.m4
gettext files added
libtool files added
aclocal
m4/* + m4local/* + configure.ac ------------> aclocal.m4
autoheader
acconfig.h + configure.ac ------------> config.h.in
automake
Makefile.am ------------> Makefile.in
autoconf
aclocal.m4 + configure.ac ------------> configure
Running configure:
configure (->config.status)
Makefile.in ------------> Makefile
config.h.in ------------> config.h
headers.h.in ------------> headers.h
manpage.n.in ------------> manpage.n
3. Normal use of the tools
--------------------------
This section describes how to use the scripts for basic day-to-day
working.
3.1 Using CVS
-------------
The latest working copy of Gutenprint (HEAD) and all prior releases
are available from CVS either anonymously (read-only with CVS pserver)
or authenticated (read-write with SSH). The modulename for Gutenprint
is 'print'.
Anonymous CVS access:
The module you wish to check out must be specified as the modulename.
When prompted for a password for anonymous, simply press the Enter
key.
$ cvs -d:pserver:anonymous@gimp-print.cvs.sourceforge.net:/cvsroot/gimp-print login
$ cvs -z3 -d:pserver:anonymous@gimp-print.cvs.sourceforge.net:/cvsroot/gimp-print co -P print
Developer CVS access via SSH:
Only project developers can access the CVS tree via this method. SSH1
must be installed on your client machine. Substitute modulename and
developername with the proper values. Enter your site password when
prompted. See the sourceforge documentation for more details,
including how to use RSA keys for authentication.
$ export CVS_RSH=ssh
$ cvs -z3 -d:ext:developername@gimp-print.cvs.sourceforge.net:/cvsroot/gimp-print co -P print
The CVS info documentation has very detailed explanations of
everything that can be done with CVS.
3.2 Setting up the build scripts from CVS
-----------------------------------------
After initially getting a copy of Gutenprint from CVS, or if any of
the scripts have changed, simply run autogen.sh:
$ ./autogen.sh [options]
Note that one can pass any options to autogen.sh that one would
normally pass to configure. './configure --help' will give a complete
list of options one can use.
3.3 Building the package
------------------------
The normal method for building from CVS is to run the `autogen.sh'
script, and then `make'. The package can then be installed with 'make
install':
$ ./autogen.sh [options]
$ make
$ make [DESTDIR=... VAR1=val1 VARn=valn] install
If the build scripts have been modified, it will not normally be
necessary to re-run autogen.sh: the Makefiles will notice and
regenerate themselves, running autoconf, automake, aclocal and
configure again if needed.
The build is only guaranteed to work if make is run from the top
level. It should be possible to make individual subdirectories, but
sometimes this will cause problems e.g. if it depends on some other
directory that should have been built first.
A common problem is getting errors about a non-existent file called
`doc/version.texi'. This file is automatically generated. It will be
generated if you run make after running './autogen.sh' or './configure
--enable-maintainer-mode'. It is only generated if `maintainer-mode'
is enabled, and should be present in the release tarball.
3.4 Extra make targets
----------------------
The Makefiles can do much more than build the package. `targets' can
be given to make, which do various things. They are used as follows:
$ make target1 target2 ...
Some of the targets available are:
all same as make with no targets
clean remove everything generated by 'make all'
distclean as clean, and everything generated by configure
maintainer-clean as distclean, and everything generated by
autogen.sh
install install the package
uninstall uninstall the package
tags make tags tables
dist make a distribution
distcheck as dist, but test it as well
Other targets are available. See Makefile for details.
4. configure.ac
---------------
This file is a Bourne shell script with m4 macros embedded in it.
autoconf expands the m4 macros to produce configure. The configure
script includes macros from the m4 and m4local directories, including
ones to hard-code the release date into configure.
4.1 Layout
----------
The file is split into mostly discrete sections:
i. Versioning details (including library versioning)
ii. autoconf and automake initialisation
iii. libtool setup
iv. Default settings (now part of v)
v. configure --with and --enable options
vi. Checks for programs
vii. Compiler flags
viii. Checks for libraries
ix. Checks for headers
x. Checks for typedefs, structures, and compiler characteristics
xi. Define what has to be built (conditional compilation of things)
xii. CUPS path settings
xiii. Definitions and substitutions
xiv. Parse and output files
The ordering of sections is based solely on that some checks depend on
checks being performed previously. There is sometimes some overlap
between sections, but any additions should go into the appropriate
section, if at all possible. A new section may be created if there is
no suitable section.
4.2 AC_SUBST
------------
The main use of the configure script is to produce customised
Makefiles, and other files too. This is done through the use of
AC_SUBST, which makes a variable get substituted in a file:
ESCPUTIL_BIN="escputil"
AC_SUBST(ESCPUTIL_BIN)
will replace any instance of @ESCPUTIL_BIN@ in a template file (ending
in .in'). E.g.
bin_PROGRAMS = @ESCPUTIL_BIN@
4.3 AC_DEFINE and AC_DEFINE_UNQUOTED
------------------------------------
These macros are used to insert a #define in config.h.
AC_DEFINE(MACRO)
will cause '#define MACRO 1' to appear in config.h (this will be of
the form '#undef MACRO' in config.h.in)
AC_DEFINE_UNQUOTED is the same as AC_DEFINE, except that a second
option can be used to define a string literal.
4.4 AM_CONDITIONAL
------------------
This is used to make certain parts of a Makefile conditional depending
on what happens in configure. It is used in the form:
AM_CONDITIONAL(NAME, test)
where name is the name of the conditional you define, and test
is a check that must return true for the conditional to be
defined.
This is used in a Makefile.am as follows:
if NAME
[do stuff]
endif
Note that you cannot also use normal make conditionals. Its main use
is to define macros, or to make a rule conditional.
5. Makefile.am
--------------
There is a Makefile.am in each directory, apart from a few where the
Makefile the next level up handles things. Each Makefile.am is split
into several sections:
i. Macros common to every Makefile.am
ii. Path macros
iii. Compiler macros
iv. Build dependencies. This is further split into a) binaries and b) data.
Each of these sections has
1. list of objects to build (if applicable)
2. EXTRA_ objects (if applicable)
3. Dependencies for each object (e.g. sources)
v. Rules
vi. Cleaning macros
vii. EXTRA_DIST
Keeping everything in this logical order keeps them neat and readable.
Not every Makefile.am will have all these sections, but those that are
present should be ordered in this way.
5.1 Automake basics
-------------------
Automake parses Makefile.am, and generates rules in Makefile.in
depending on what it finds. There are `primary' variables, such as
PROGRAMS, SCRIPTS, MANS, HEADERS and DATA that describe the type of
source one is defining. These are coupled with a location to install
into. For example, these are a few standard locations: bindir,
sbindir, mandir, datadir, pkgdatadir. You can define your own quite
easily. They are used together as follows:
bin_PROGRAMS = myprog [where bindir=$(prefix)/bin]
pkgdata_DATA = datafile1 datafile2
[where pkgdatadir=$(prefix)/share/$(PACKAGE)]
Note! the 'dir' postfix is stripped off the location. I.e. bindir ->
bin. That is all there is to it! You can use these simple variables
to describe everything in your source, and where is gets installed to.
In the case of PROGRAMS, one also has to specify the SOURCES as well.
E.g. in the example above, a binary called `myprog' was defined. The
sources for this program are defined as follows:
myprog_SOURCES = myprog.c myprog.h
automake will create all of the rules needed to build and install
everything. An extra point is that suppose one doesn't want to
install something? For this there is a 'noinst' macro, so that
noinst_PROGRAMS will not ever be installed. One might also want
noinst_HEADERS. If one wanted to install headers, one would define
includedir=$(prefix)/include
and then
pkgincludedir=$(includedir)/$(PACKAGE).
Now
pkginclude_HEADERS = myheader.h
will install the header into the correct location. Some of the
locations in the above examples are defined by default. The others
must be defined by hand.
There are also some macros with specific functions. Any file that is
not mentioned in a macro, and also and MANS, will have to be put in an
EXTRA_DIST macro, so that automake knows to distribute them.
Also, some files might not be automatically cleaned. There are
CLEANFILES, DISTCLEANFILES and MAINTAINERCLEANFILES macros for use
with the 'clean', 'distclean' and 'maintainer-clean' make targets
respectively. Use with caution! One does not want to clean things
that cannot be recreated! CLEANFILES should be regenerated with
'make' as part of the build process, DISTCLEANFILES by configure
(e.g. Makefiles) and MAINTAINERCLEANFILES should be created by
'autogen.sh' and the programs it calls (e.g. Makefile.in's which are
created by automake).
5.2 Make and subdirectories
---------------------------
If a Makefile.am has a SUBDIRS macro, make will recurse through these
subdirectories, running make in each one. e.g. in the top-level
Makefile.am:
SUBDIRS = include src samples test po man doc scripts
In this case the order of directories is critical: lib, src and test
depend on include being built. Also, test depends on libgutenprint in
src and po must be run after all the source has been built (as it
parses all C source, possibly including dynamically generated code).
The same applies in src/Makefile.am: most directories require
libgutenprint for linking with, and libgutenprint requires printdef.
Therefore the order of building is critical! It should be technically
possible to run make in any subdirectory and have all the dependencies
satisfied by rules in that Makefile. Unfortunately, this requires
complex rules in each directory, and this cannot be done as the source
tree gets bigger and more complex. As a result, one should only run
make from the top level, as only this is certain to satisfy all
dependencies.
5.3 Conditional compilation
---------------------------
Most of the source is conditionally compiled according to the defaults
in configure.ac, which may be overridden by passing options to
configure, or possibly by the results of configure checks. Depending
on the result, configure may substitute what to build into the
generated Makefile, e.g.:
if BUILD_ESCPUTIL
bin_PROGRAMS = escputil
endif
If you use @@ substitutions, make sure that you use the EXTRA_ prefix
(e.g. EXTRA_PROGRAMS), so that automake knows what is to be built.
5.4 When automake is not enough...
----------------------------------
When one wants to do something that is not within the scope of the
facilities automake provides, one can write one's own rules, just like
in any other Makefile.
4.4.1 Rule syntax
Make rules take the following form:
target ... : prerequisites ...
commands
...
...
where
target is the name of a file (or files) to create
prerequisites are files that are needed to make the target
commands are commands to make the target
The target will only be made if it does not exist or the timestamp on
any of the prerequisites is newer, indicating that it is out of date.
make is a complex program, and this is just the bare basic
operation. See the GNU make info documentation for a detailed
explanation.
4.4.2 Correctly referencing files
A file may be present either in the _source_ or _build_ directory,
which may or may not be the same. The source directory contains the
unchanging source files, whereas the build directory contains all the
generated files, such as Makefiles, object code, libraries and
executables and also generated headers, C source and manual pages.
The macros to use are:
$(srcdir) The equivalent directory in the source tree
. The build directory (current directory)
$(top_srcdir) The highest level of the source tree
$(top_builddir) The highest level of the build tree
6. aclocal
----------
aclocal contains all the macros that are needed by autoconf to
generate configure from configure.ac. It is created by running
'aclocal'. If any of the macros are not present on your system, you
can point out where the macros distributed with Gutenprint are by
using '-I macrodir' with aclocal.
7. config.h
-----------
config.h is created by configure and should beincluded by all of the C
source files in the distribution. It is created from config.h.in by
'configure'. config.h.in is created from configure.ac by
'autoheader'.
8. libgutenprint
----------------
Any source that is to link with libgutenprint should include the gutenprint.h
header. The right way to do this is as follows:
#include <gutenprint/gutenprint.h>
To ensure proper linking, the Makefile.am should have the following:
program_LDADD = $(LIBGUTENPRINT_LIBS)
The Makefile.am should also include any necessary CFLAGS with:
LOCAL_CPPFLAGS = $(LIBGUTENPRINT_CFLAGS)
9. automake subtleties
----------------------
Automake parses Makefile.am to produce Makefile.in. Makefile.am looks
much like a normal Makefile, e.g. you can write your own rules in it.
However, it is not entirely like a normal Makefile. In particular,
automake conditionals are not the same as make conditionals (which are
not available).
Another gotcha is that automake adds rules of its own, so you must make sure
that the names do not clash, or you may get obscure problems occuring
when you override an automake rule.
10. libtool tricks
------------------
libtool is used to create shared libraries. One gotcha with libtool
is that if a program is linked with a libtool shared library in the
build tree, then it is actually created in '.libs/program', and not
'program'. However, if it is statically linked (e.g. the platform
does not support shared libraries, or you used --disable-shared with
configure, perhaps to make the build faster or to be able to use
`valgrind' usefully), then it will be created as 'program'. This is
so that you can run the program before you install it. If it is
linked with shared libraries, a wrapper script does some magic with
LD_LIBRARY_PATH. However, this means that your install rules must
take this into account by checking that '.libs/program exists', and
installing it if it is present, but otherwise installing 'program'.
Automake install rules do this automatically, but it you write your
own, you must take this into consideration. The best option is to not
use custom install rules for binaries.
11. Testing changes to the build scripts
---------------------------------------
If you make a change to one of the scripts, simply running autogen.sh
and seeing if 'make' and 'make install' work is not enough. In
particular, you must check that it does not break 'VPATH' builds where
the source and build directories are not the same. To do this:
$ mkdir /var/tmp/tmp-build
$ cd /var/tmp/tmp-build
$ ~roger/gutenprint/current/configure [options]
$ make
$ make DESTDIR=/var/tmp/tmp-inst install
You should also test that 'make install' works with and without
DESTDIR set. Note that old gettext releases do not support DESTDIR,
but the current 0.10.x versions do. The old gettext also breaks in
VPATH builds due to MKINSTALLDIRS being wrongly defined. This is also
fixed in the current version.
12. Further information
-----------------------
autoconf: autoconf.info
automake: automake.info
CVS: cvs.info
gettext: gettext.info
libtool: libtool.info
make: make.info
Local Variables:
mode: text
End:

View File

@ -1,193 +0,0 @@
## $Id: Makefile.am,v 1.22 2008/02/27 12:28:06 rlk Exp $
## Copyright (C) 2001 Andy Stewart and Roger Leigh
##
## 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, 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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
## Process this file with automake to produce Makefile.in.
@SET_MAKE@
include $(top_srcdir)/scripts/global.mk
## Variables
MANUAL_SRC_FILES = \
copying.xml \
dither.xml \
escp2.xml \
gutenprint.xml \
gpl-appendix.xml \
introduction.xml \
new-printer.xml \
problems.xml \
using.xml \
weave.xml
HTMLDIR = reference-html
STANDARD_TARGETS = html
DISTHOOKDIRS = $(HTMLDIR)
if MAINTAINER_MODE
MAINT_MODE = true
else
MAINT_MODE = false
endif
if MAINTAINER_MODE
ALL_LOCAL_TARGETS = docs
else
ALL_LOCAL_TARGETS = $(STANDARD_TARGETS)
endif
all-local: $(ALL_LOCAL_TARGETS)
## Rules
dist-hook: html-stamp
for dir in $(DISTHOOKDIRS) ; do \
if test -d $(srcdir)/$$dir ; then \
mkdir $(distdir)/$$dir; \
for dirfile in $(srcdir)/$$dir/*; do \
if test -f $$dirfile ; then \
cp -p $$dirfile $(distdir)/$$dir ; \
fi ; \
if test -d $$dirfile ; then \
cp -pR $$dirfile $(distdir)/$$dir ; \
fi ; \
done \
fi \
done
for file in $(DISTHOOKFILES) ; do \
if test -f $$file ; then \
cp -p $$file $(distdir) ; \
fi ; \
done
docs: html pdf
pdf: gutenprint.pdf
gutenprint.pdf: $(MANUAL_SRC_FILES)
@if [ -z "$(DB2PDF)" ] ; then \
echo "No db2pdf: cannot build documentation!"; \
exit 1; \
fi
if test $(srcdir) = '.' ; then \
: ; \
else \
for file in $(MANUAL_SRC_FILES) ; do \
if test -L $$file ; then \
$(RM) -f $$file ; \
fi ; \
$(LN_S) -f $(srcdir)/$$file $$file ; \
done ; \
fi ; \
$(DB2PDF) gutenprint.xml
html: html-stamp
# This ugly workaround with SOURCE is because db2html doesn't seem to like
# "./users-guide.sgml". Note that db2ps does not have the same limitation.
# html-stamp should *only* be called by html--it's just a timestamp!
html-stamp: $(MANUAL_SRC_FILES)
@if [ -z "$(DB2HTML)" ] ; then \
echo "No db2html: cannot build documentation!"; \
exit 1; \
fi
if test $(srcdir) = '.' ; then \
: ; \
else \
for file in $(MANUAL_SRC_FILES) ; do \
if test -L $$file ; then \
$(RM) -f $$file ; \
fi ; \
$(LN_S) -f $(srcdir)/$$file $$file ; \
done ; \
fi
$(DB2HTML) gutenprint.xml
-$(RM) -rf $(HTMLDIR)
mv gutenprint $(HTMLDIR)
chmod a+rx $(HTMLDIR)
touch html-stamp
install-data-local: $(STANDARD_TARGETS)
if test -n '$(STANDARD_TARGETS)' ; then \
$(mkdir_p) $(DESTDIR)$(datadir)/$(PACKAGE)/doc/$(HTMLDIR) ; \
if test -f gutenprint.pdf ; then \
$(INSTALL_DATA) gutenprint.pdf $(DESTDIR)$(datadir)/$(PACKAGE)/doc ; \
elif test -f $(srcdir)/gutenprint.pdf ; then \
$(INSTALL_DATA) $(srcdir)/gutenprint.pdf $(DESTDIR)$(datadir)/$(PACKAGE)/doc ; \
fi ; \
if test -d $(HTMLDIR) ; then \
HTMLGENDIR="$(HTMLDIR)" ; \
elif test -d $(srcdir)/$(HTMLDIR) ; then \
HTMLGENDIR="$(srcdir)/$(HTMLDIR)" ; \
else \
exit 1 ; \
fi ; \
for file in $$HTMLGENDIR/*.html $$HTMLGENDIR/*.css ; do \
if test -f $$file ; then \
$(INSTALL_DATA) $$file $(DESTDIR)$(datadir)/$(PACKAGE)/doc/$(HTMLDIR) ; \
fi ; \
done ; \
fi
uninstall-local:
-$(RM) -r $(DESTDIR)$(datadir)/$(PACKAGE)/doc
CLEAN_MANUALS = \
$(RM) -f gutenprint.pdf gutenprint.ps; \
$(RM) -rf *html-stamp $(HTMLDIR)
clean-local:
if test $(srcdir) = "." -a $(MAINT_MODE) = false ; then \
echo "clean-local: Not removing $(HTMLDIR)" ; \
echo 'clean-local: Not removing gutenprint.pdf' ; \
echo 'clean-local: Not removing gutenprint.ps' ; \
else \
$(CLEAN_MANUALS) ; \
fi
if test $(srcdir) = "." ; then \
: ; \
else \
$(RM) -f $(MANUAL_SRC_FILES) ; \
fi
-$(RM) -rf *.tex *.log *.aux *.dvi *.gz *.out *.junk *.out *.fot
-$(RM) -rf db2html* DB2HTML* CATALOG.local
veryclean:
$(MAKE) MAINT_MODE=true clean
maintainer-clean-local:
$(CLEAN_MANUALS)
## Clean
MAINTAINERCLEANFILES = Makefile.in *html-stamp
EXTRA_DIST = \
$(MANUAL_SRC_FILES) \
gutenprint.pdf \
html-stamp
.PHONY: docs html ps pdf

View File

@ -1,628 +0,0 @@
# Makefile.in generated by automake 1.11.1 from Makefile.am.
# @configure_input@
# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002,
# 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation,
# Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
# PARTICULAR PURPOSE.
@SET_MAKE@
# Variables
#export STP_MODULE_PATH = $(top_builddir)/src/main/.libs:$(top_builddir)/src/main
#export STP_DATA_PATH = $(top_srcdir)/src/xml
VPATH = @srcdir@
pkgdatadir = $(datadir)/@PACKAGE@
pkgincludedir = $(includedir)/@PACKAGE@
pkglibdir = $(libdir)/@PACKAGE@
pkglibexecdir = $(libexecdir)/@PACKAGE@
am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
install_sh_DATA = $(install_sh) -c -m 644
install_sh_PROGRAM = $(install_sh) -c
install_sh_SCRIPT = $(install_sh) -c
INSTALL_HEADER = $(INSTALL_DATA)
transform = $(program_transform_name)
NORMAL_INSTALL = :
PRE_INSTALL = :
POST_INSTALL = :
NORMAL_UNINSTALL = :
PRE_UNINSTALL = :
POST_UNINSTALL = :
build_triplet = @build@
host_triplet = @host@
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
$(top_srcdir)/scripts/global.mk
subdir = doc/developer
ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
am__aclocal_m4_deps = $(top_srcdir)/m4/gettext.m4 \
$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/isc-posix.m4 \
$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libtool.m4 \
$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \
$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \
$(top_srcdir)/m4/nls.m4 $(top_srcdir)/m4/po.m4 \
$(top_srcdir)/m4/progtest.m4 $(top_srcdir)/m4/stp.m4 \
$(top_srcdir)/m4/stp_cups.m4 $(top_srcdir)/m4/stp_gimp.m4 \
$(top_srcdir)/m4/stp_option.m4 $(top_srcdir)/m4/stp_release.m4 \
$(top_srcdir)/configure.ac
am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
$(ACLOCAL_M4)
mkinstalldirs = $(SHELL) $(top_srcdir)/scripts/mkinstalldirs
CONFIG_HEADER = $(top_builddir)/config.h
CONFIG_CLEAN_FILES =
CONFIG_CLEAN_VPATH_FILES =
SOURCES =
DIST_SOURCES =
DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
ACLOCAL = @ACLOCAL@
ALL_LINGUAS = @ALL_LINGUAS@
AMTAR = @AMTAR@
AR = @AR@
AUTOCONF = @AUTOCONF@
AUTOHEADER = @AUTOHEADER@
AUTOMAKE = @AUTOMAKE@
AWK = @AWK@
BUILD_CUPS_PPDS = @BUILD_CUPS_PPDS@
CC = @CC@
CCDEPMODE = @CCDEPMODE@
CFLAGS = @CFLAGS@
CONVERT = @CONVERT@
CPP = @CPP@
CPPFLAGS = @CPPFLAGS@
CUPS_CFLAGS = @CUPS_CFLAGS@
CUPS_CONFIG = @CUPS_CONFIG@
CUPS_LIBS = @CUPS_LIBS@
CUPS_PPD_PS_LEVEL = @CUPS_PPD_PS_LEVEL@
CYGPATH_W = @CYGPATH_W@
DB2HTML = @DB2HTML@
DB2PDF = @DB2PDF@
DB2PS = @DB2PS@
DEFS = @DEFS@
DEPDIR = @DEPDIR@
DIALOG = @DIALOG@
DOXYGEN = @DOXYGEN@
DSYMUTIL = @DSYMUTIL@
DUMPBIN = @DUMPBIN@
DVIPDF = @DVIPDF@
DVIPS = @DVIPS@
ECHO_C = @ECHO_C@
ECHO_N = @ECHO_N@
ECHO_T = @ECHO_T@
EGREP = @EGREP@
EXEEXT = @EXEEXT@
FGREP = @FGREP@
FIND = @FIND@
FOOMATIC_CONFIGURE = @FOOMATIC_CONFIGURE@
FOOMATIC_KITLOAD = @FOOMATIC_KITLOAD@
FOOMATIC_PPDFILE = @FOOMATIC_PPDFILE@
GENPPD_LIBS = @GENPPD_LIBS@
GIMP2_CFLAGS = @GIMP2_CFLAGS@
GIMP2_LIBS = @GIMP2_LIBS@
GIMPTOOL2_CHECK = @GIMPTOOL2_CHECK@
GLIB_MKENUMS = @GLIB_MKENUMS@
GMSGFMT = @GMSGFMT@
GMSGFMT_015 = @GMSGFMT_015@
GNUCFLAGS = @GNUCFLAGS@
GREP = @GREP@
GTK2_CFLAGS = @GTK2_CFLAGS@
GTK2_LIBS = @GTK2_LIBS@
GUTENPRINTUI2_BINARY_AGE = @GUTENPRINTUI2_BINARY_AGE@
GUTENPRINTUI2_CFLAGS = @GUTENPRINTUI2_CFLAGS@
GUTENPRINTUI2_CURRENT_INTERFACE = @GUTENPRINTUI2_CURRENT_INTERFACE@
GUTENPRINTUI2_INTERFACE_AGE = @GUTENPRINTUI2_INTERFACE_AGE@
GUTENPRINTUI2_LIBDEPS = @GUTENPRINTUI2_LIBDEPS@
GUTENPRINTUI2_LIBS = $(top_builddir)/src/gutenprintui2/libgutenprintui2.la
GUTENPRINTUI2_VERSION = @GUTENPRINTUI2_VERSION@
GUTENPRINT_BINARY_AGE = @GUTENPRINT_BINARY_AGE@
GUTENPRINT_CFLAGS = @GUTENPRINT_CFLAGS@
GUTENPRINT_CURRENT_INTERFACE = @GUTENPRINT_CURRENT_INTERFACE@
GUTENPRINT_INTERFACE_AGE = @GUTENPRINT_INTERFACE_AGE@
GUTENPRINT_LIBDEPS = @GUTENPRINT_LIBDEPS@
# Libraries
GUTENPRINT_LIBS = $(top_builddir)/src/main/libgutenprint.la
GUTENPRINT_MAJOR_VERSION = @GUTENPRINT_MAJOR_VERSION@
GUTENPRINT_MICRO_VERSION = @GUTENPRINT_MICRO_VERSION@
GUTENPRINT_MINOR_VERSION = @GUTENPRINT_MINOR_VERSION@
GUTENPRINT_VERSION = @GUTENPRINT_VERSION@
IJS_CFLAGS = @IJS_CFLAGS@
IJS_CONFIG = @IJS_CONFIG@
IJS_LIBS = @IJS_LIBS@
INSTALL = @INSTALL@
INSTALL_DATA = @INSTALL_DATA@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_SCRIPT = @INSTALL_SCRIPT@
INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
INTLLIBS = @INTLLIBS@
INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
LD = @LD@
LDFLAGS = @LDFLAGS@
LEX = @LEX@
LEXLIB = @LEXLIB@
LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@
LIBICONV = @LIBICONV@
LIBINTL = @LIBINTL@
LIBOBJS = @LIBOBJS@
LIBREADLINE_DEPS = @LIBREADLINE_DEPS@
LIBS = $(INTLLIBS) @LIBS@
LIBTOOL = @LIBTOOL@
LIBTOOL_DEPS = @LIBTOOL_DEPS@
LIPO = @LIPO@
LN_S = @LN_S@
LTALLOCA = @LTALLOCA@
LTLIBICONV = @LTLIBICONV@
LTLIBINTL = @LTLIBINTL@
LTLIBOBJS = @LTLIBOBJS@
MAINT = @MAINT@
MAINTAINER_CFLAGS = @MAINTAINER_CFLAGS@
MAKEINFO = @MAKEINFO@
MKDIR_P = @MKDIR_P@
MSGFMT = @MSGFMT@
MSGFMT_015 = @MSGFMT_015@
MSGMERGE = @MSGMERGE@
NM = @NM@
NMEDIT = @NMEDIT@
OBJDUMP = @OBJDUMP@
OBJEXT = @OBJEXT@
OTOOL = @OTOOL@
OTOOL64 = @OTOOL64@
PACKAGE = @PACKAGE@
PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
PACKAGE_NAME = @PACKAGE_NAME@
PACKAGE_STRING = @PACKAGE_STRING@
PACKAGE_TARNAME = @PACKAGE_TARNAME@
PACKAGE_URL = @PACKAGE_URL@
PACKAGE_VERSION = @PACKAGE_VERSION@
PATH_SEPARATOR = @PATH_SEPARATOR@
PERL = @PERL@
PKG_CONFIG = @PKG_CONFIG@
PLUG_IN_PATH = @PLUG_IN_PATH@
POSUB = @POSUB@
RANLIB = @RANLIB@
RELEASE_DATE = @RELEASE_DATE@
RM = @RM@
SED = @SED@
SET_MAKE = @SET_MAKE@
SHELL = @SHELL@
STRIP = @STRIP@
TEST = @TEST@
TEXI2HTML = @TEXI2HTML@
TRUE = @TRUE@
USE_NLS = @USE_NLS@
VERSION = @VERSION@
WHICH_PPDS = @WHICH_PPDS@
XGETTEXT = @XGETTEXT@
XGETTEXT_015 = @XGETTEXT_015@
YACC = @YACC@
YFLAGS = @YFLAGS@
abs_builddir = @abs_builddir@
abs_srcdir = @abs_srcdir@
abs_top_builddir = @abs_top_builddir@
abs_top_srcdir = @abs_top_srcdir@
ac_ct_CC = @ac_ct_CC@
ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
am__include = @am__include@
am__leading_dot = @am__leading_dot@
am__quote = @am__quote@
am__tar = @am__tar@
am__untar = @am__untar@
bindir = @bindir@
build = @build@
build_alias = @build_alias@
build_cpu = @build_cpu@
build_os = @build_os@
build_vendor = @build_vendor@
builddir = @builddir@
cups_bindir = @cups_bindir@
cups_conf_datadir = @cups_conf_datadir@
cups_conf_serverbin = @cups_conf_serverbin@
cups_conf_serverroot = @cups_conf_serverroot@
cups_exec_prefix = @cups_exec_prefix@
cups_prefix = @cups_prefix@
cups_sbindir = @cups_sbindir@
datadir = @datadir@
datarootdir = @datarootdir@
docdir = @docdir@
dvidir = @dvidir@
exec_prefix = @exec_prefix@
gimp2_plug_indir = @gimp2_plug_indir@
gutenprint_cflags = @gutenprint_cflags@
gutenprint_libdeps = @gutenprint_libdeps@
gutenprint_libs = @gutenprint_libs@
gutenprintui2_cflags = @gutenprintui2_cflags@
gutenprintui2_libdeps = @gutenprintui2_libdeps@
gutenprintui2_libs = @gutenprintui2_libs@
host = @host@
host_alias = @host_alias@
host_cpu = @host_cpu@
host_os = @host_os@
host_vendor = @host_vendor@
htmldir = @htmldir@
includedir = @includedir@
infodir = @infodir@
install_sh = @install_sh@
libdir = @libdir@
libexecdir = @libexecdir@
localedir = @localedir@
localstatedir = @localstatedir@
lt_ECHO = @lt_ECHO@
mandir = @mandir@
mkdir_p = @mkdir_p@
oldincludedir = @oldincludedir@
pdfdir = @pdfdir@
prefix = @prefix@
program_transform_name = @program_transform_name@
psdir = @psdir@
sbindir = @sbindir@
sharedstatedir = @sharedstatedir@
srcdir = @srcdir@
sysconfdir = @sysconfdir@
target_alias = @target_alias@
top_build_prefix = @top_build_prefix@
top_builddir = @top_builddir@
top_srcdir = @top_srcdir@
AM_CPPFLAGS = -I$(top_srcdir)/include -I$(top_builddir)/include $(LOCAL_CPPFLAGS) $(GNUCFLAGS)
GUTENPRINTUI_LIBS = $(top_builddir)/src/gutenprintui/libgutenprintui.la
MANUAL_SRC_FILES = \
copying.xml \
dither.xml \
escp2.xml \
gutenprint.xml \
gpl-appendix.xml \
introduction.xml \
new-printer.xml \
problems.xml \
using.xml \
weave.xml
HTMLDIR = reference-html
STANDARD_TARGETS = html
DISTHOOKDIRS = $(HTMLDIR)
@MAINTAINER_MODE_FALSE@MAINT_MODE = false
@MAINTAINER_MODE_TRUE@MAINT_MODE = true
@MAINTAINER_MODE_FALSE@ALL_LOCAL_TARGETS = $(STANDARD_TARGETS)
@MAINTAINER_MODE_TRUE@ALL_LOCAL_TARGETS = docs
CLEAN_MANUALS = \
$(RM) -f gutenprint.pdf gutenprint.ps; \
$(RM) -rf *html-stamp $(HTMLDIR)
MAINTAINERCLEANFILES = Makefile.in *html-stamp
EXTRA_DIST = \
$(MANUAL_SRC_FILES) \
gutenprint.pdf \
html-stamp
all: all-am
.SUFFIXES:
$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(top_srcdir)/scripts/global.mk $(am__configure_deps)
@for dep in $?; do \
case '$(am__configure_deps)' in \
*$$dep*) \
( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
&& { if test -f $@; then exit 0; else break; fi; }; \
exit 1;; \
esac; \
done; \
echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/developer/Makefile'; \
$(am__cd) $(top_srcdir) && \
$(AUTOMAKE) --gnu doc/developer/Makefile
.PRECIOUS: Makefile
Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
@case '$?' in \
*config.status*) \
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
*) \
echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
esac;
$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
$(am__aclocal_m4_deps):
mostlyclean-libtool:
-rm -f *.lo
clean-libtool:
-rm -rf .libs _libs
tags: TAGS
TAGS:
ctags: CTAGS
CTAGS:
distdir: $(DISTFILES)
@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
list='$(DISTFILES)'; \
dist_files=`for file in $$list; do echo $$file; done | \
sed -e "s|^$$srcdirstrip/||;t" \
-e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
case $$dist_files in \
*/*) $(MKDIR_P) `echo "$$dist_files" | \
sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
sort -u` ;; \
esac; \
for file in $$dist_files; do \
if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
if test -d $$d/$$file; then \
dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
if test -d "$(distdir)/$$file"; then \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
fi; \
cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
else \
test -f "$(distdir)/$$file" \
|| cp -p $$d/$$file "$(distdir)/$$file" \
|| exit 1; \
fi; \
done
$(MAKE) $(AM_MAKEFLAGS) \
top_distdir="$(top_distdir)" distdir="$(distdir)" \
dist-hook
check-am: all-am
check: check-am
all-am: Makefile all-local
installdirs:
install: install-am
install-exec: install-exec-am
install-data: install-data-am
uninstall: uninstall-am
install-am: all-am
@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
installcheck: installcheck-am
install-strip:
$(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
`test -z '$(STRIP)' || \
echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install
mostlyclean-generic:
clean-generic:
distclean-generic:
-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
maintainer-clean-generic:
@echo "This command is intended for maintainers to use"
@echo "it deletes files that may require special tools to rebuild."
-test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES)
clean: clean-am
clean-am: clean-generic clean-libtool clean-local mostlyclean-am
distclean: distclean-am
-rm -f Makefile
distclean-am: clean-am distclean-generic
dvi: dvi-am
dvi-am:
html-am:
info: info-am
info-am:
install-data-am: install-data-local
install-dvi: install-dvi-am
install-dvi-am:
install-exec-am:
install-html: install-html-am
install-html-am:
install-info: install-info-am
install-info-am:
install-man:
install-pdf: install-pdf-am
install-pdf-am:
install-ps: install-ps-am
install-ps-am:
installcheck-am:
maintainer-clean: maintainer-clean-am
-rm -f Makefile
maintainer-clean-am: distclean-am maintainer-clean-generic \
maintainer-clean-local
mostlyclean: mostlyclean-am
mostlyclean-am: mostlyclean-generic mostlyclean-libtool
pdf-am:
ps: ps-am
ps-am:
uninstall-am: uninstall-local
.MAKE: install-am install-strip
.PHONY: all all-am all-local check check-am clean clean-generic \
clean-libtool clean-local dist-hook distclean \
distclean-generic distclean-libtool distdir dvi dvi-am html \
html-am info info-am install install-am install-data \
install-data-am install-data-local install-dvi install-dvi-am \
install-exec install-exec-am install-html install-html-am \
install-info install-info-am install-man install-pdf \
install-pdf-am install-ps install-ps-am install-strip \
installcheck installcheck-am installdirs maintainer-clean \
maintainer-clean-generic maintainer-clean-local mostlyclean \
mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
uninstall uninstall-am uninstall-local
@SET_MAKE@
# Rules
$(top_builddir)/src/main/libgutenprint.la:
cd $(top_builddir)/src/main; \
$(MAKE)
$(top_builddir)/src/gutenprintui/libgutenprintui.la:
cd $(top_builddir)/src/gutenprintui; \
$(MAKE)
$(top_builddir)/src/gutenprintui2/libgutenprintui2.la:
cd $(top_builddir)/src/gutenprintui2; \
$(MAKE)
all-local: $(ALL_LOCAL_TARGETS)
dist-hook: html-stamp
for dir in $(DISTHOOKDIRS) ; do \
if test -d $(srcdir)/$$dir ; then \
mkdir $(distdir)/$$dir; \
for dirfile in $(srcdir)/$$dir/*; do \
if test -f $$dirfile ; then \
cp -p $$dirfile $(distdir)/$$dir ; \
fi ; \
if test -d $$dirfile ; then \
cp -pR $$dirfile $(distdir)/$$dir ; \
fi ; \
done \
fi \
done
for file in $(DISTHOOKFILES) ; do \
if test -f $$file ; then \
cp -p $$file $(distdir) ; \
fi ; \
done
docs: html pdf
pdf: gutenprint.pdf
gutenprint.pdf: $(MANUAL_SRC_FILES)
@if [ -z "$(DB2PDF)" ] ; then \
echo "No db2pdf: cannot build documentation!"; \
exit 1; \
fi
if test $(srcdir) = '.' ; then \
: ; \
else \
for file in $(MANUAL_SRC_FILES) ; do \
if test -L $$file ; then \
$(RM) -f $$file ; \
fi ; \
$(LN_S) -f $(srcdir)/$$file $$file ; \
done ; \
fi ; \
$(DB2PDF) gutenprint.xml
html: html-stamp
# This ugly workaround with SOURCE is because db2html doesn't seem to like
# "./users-guide.sgml". Note that db2ps does not have the same limitation.
# html-stamp should *only* be called by html--it's just a timestamp!
html-stamp: $(MANUAL_SRC_FILES)
@if [ -z "$(DB2HTML)" ] ; then \
echo "No db2html: cannot build documentation!"; \
exit 1; \
fi
if test $(srcdir) = '.' ; then \
: ; \
else \
for file in $(MANUAL_SRC_FILES) ; do \
if test -L $$file ; then \
$(RM) -f $$file ; \
fi ; \
$(LN_S) -f $(srcdir)/$$file $$file ; \
done ; \
fi
$(DB2HTML) gutenprint.xml
-$(RM) -rf $(HTMLDIR)
mv gutenprint $(HTMLDIR)
chmod a+rx $(HTMLDIR)
touch html-stamp
install-data-local: $(STANDARD_TARGETS)
if test -n '$(STANDARD_TARGETS)' ; then \
$(mkdir_p) $(DESTDIR)$(datadir)/$(PACKAGE)/doc/$(HTMLDIR) ; \
if test -f gutenprint.pdf ; then \
$(INSTALL_DATA) gutenprint.pdf $(DESTDIR)$(datadir)/$(PACKAGE)/doc ; \
elif test -f $(srcdir)/gutenprint.pdf ; then \
$(INSTALL_DATA) $(srcdir)/gutenprint.pdf $(DESTDIR)$(datadir)/$(PACKAGE)/doc ; \
fi ; \
if test -d $(HTMLDIR) ; then \
HTMLGENDIR="$(HTMLDIR)" ; \
elif test -d $(srcdir)/$(HTMLDIR) ; then \
HTMLGENDIR="$(srcdir)/$(HTMLDIR)" ; \
else \
exit 1 ; \
fi ; \
for file in $$HTMLGENDIR/*.html $$HTMLGENDIR/*.css ; do \
if test -f $$file ; then \
$(INSTALL_DATA) $$file $(DESTDIR)$(datadir)/$(PACKAGE)/doc/$(HTMLDIR) ; \
fi ; \
done ; \
fi
uninstall-local:
-$(RM) -r $(DESTDIR)$(datadir)/$(PACKAGE)/doc
clean-local:
if test $(srcdir) = "." -a $(MAINT_MODE) = false ; then \
echo "clean-local: Not removing $(HTMLDIR)" ; \
echo 'clean-local: Not removing gutenprint.pdf' ; \
echo 'clean-local: Not removing gutenprint.ps' ; \
else \
$(CLEAN_MANUALS) ; \
fi
if test $(srcdir) = "." ; then \
: ; \
else \
$(RM) -f $(MANUAL_SRC_FILES) ; \
fi
-$(RM) -rf *.tex *.log *.aux *.dvi *.gz *.out *.junk *.out *.fot
-$(RM) -rf db2html* DB2HTML* CATALOG.local
veryclean:
$(MAKE) MAINT_MODE=true clean
maintainer-clean-local:
$(CLEAN_MANUALS)
.PHONY: docs html ps pdf
# Tell versions [3.59,3.63) of GNU make to not export all variables.
# Otherwise a system limit (for SysV at least) may be exceeded.
.NOEXPORT:

View File

@ -1,40 +0,0 @@
<chapter>
<title>Copying, modification and redistribution</title>
<para>
Gutenprint is <emphasis>free</emphasis>; this means that everyone
is free to use it and free to redistribute it on a free basis.
Gutenprint 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 Gutenprint that they might get
from you.
</para>
<para>
Specifically, we want to make sure that you have the right to give
away copies of Gutenprint, that you receive source code or else
can get it if you want it, that you can change Gutenprint or use
pieces of it in new free programs, and that you know you can do
these things.
</para>
<para>
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 Gutenprint, 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.
</para>
<para>
Also, for our own protection, we must make certain that everyone
finds out that there is no warranty for Gutenprint. If Gutenprint
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.
</para>
<para>
Gutenprint is licensed under the terms of the GNU General Public
License (GPL), reproduced in <xref linkend="gpl"/>.
</para>
</chapter>

View File

@ -1,679 +0,0 @@
<chapter>
<title>Dithering</title>
<para>
The dithering code in
<filename>src/main/print-dither.c</filename> 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.
</para>
<para>
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.
</para>
<para>
We currently have three dithering functions:
</para>
<variablelist>
<varlistentry>
<term><literal>dither_fastblack</literal></term>
<listitem>
<para>
This 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.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>dither_black</literal></term>
<listitem>
<para>
This 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.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>dither_cmyk</literal></term>
<listitem>
<para>
This 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.
</para>
</listitem>
</varlistentry>
</variablelist>
<para>
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 &lsquo;ordered&rsquo;. 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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
Error diffusion works by taking the output error at a given
pixel and &ldquo;diffusing&rdquo; 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.
</para>
<para>
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.
</para>
<para>
There are two sub-classes of error diffusion that we use here,
&lsquo;random&rsquo; and &lsquo;hybrid&rsquo;. 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.
</para>
<para>
There is one additional variant (on both sub-classes), called
&lsquo;adaptive hybrid&rsquo; and &lsquo;adaptive random&rsquo;.
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.
</para>
<para>
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.
</para>
<para>
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&mdash;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.
</para>
<para>
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:
</para>
<itemizedlist>
<listitem>
<para>
Bottom of the range.
</para>
</listitem>
<listitem>
<para>
Top of the range.
</para>
</listitem>
<listitem>
<para>
Value of the lighter ink.
</para>
</listitem>
<listitem>
<para>Value of the darker ink.
</para>
</listitem>
</itemizedlist>
<para>
In addition, the bit patterns and which type of ink are also
represented, but they don't affect the actual algorithm.
</para>
<para>
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:
</para>
<orderedlist>
<listitem>
<para>
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).
</para>
</listitem>
<listitem>
<para>
Find the range containing this value.
</para>
</listitem>
<listitem>
<para>
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.
</para>
</listitem>
<listitem>
<para>
Compute the &ldquo;virtual value&rdquo;. 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.
</para>
</listitem>
<listitem>
<para>
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.
</para>
</listitem>
</orderedlist>
<para>
The matrices were generated by Thomas Tonino
<email>ttonino@bio.vu.nl</email> 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. 1440&times;720) than for 1:1 (e. g. 720&times;720). It is
essential with any of these matrices that every point be used.
Skipping points generates low-frequency noise.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
I stated earlier that I've tweaked the basic error diffusion
algorithm. Here's what I've done to improve it:
</para>
<itemizedlist>
<listitem>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
Excessive randomization leads to blobs at high densities.
Therefore, as the density increases, the degree of
randomization decreases.
</para>
</listitem>
<listitem>
<para>
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.
</para>
</listitem>
<listitem>
<para>
Diffusing the error into more pixels. Instead of diffusing
the entire error into (X+1, Y) and (X, Y+1), we diffuse it
into (X+1, Y), (X+K, Y+1), (X, Y+1), (X-K, Y+1) where 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 <emphasis>error</emphasis>
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).
</para>
</listitem>
<listitem>
<para>
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.
</para>
</listitem>
<listitem>
<para>
Oversampling. This is how to print 1440&times;720 with Epson
Stylus printers. Printing full density at 1440&times;720 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 1440&times;1440 or
1440&times;2880 virtual resolution results in other problems.
However, at present 1440&times;1440 (which is more accurately
called "1440&times;720 enhanced", as the Epson printers cannot
print 1440 rows per inch) does quite well, although it's slow.
</para>
</listitem>
</itemizedlist>
<para>
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.
</para>
<para>
You'll note that I haven't quoted a single source on color or
printing theory. I simply did all of this empirically.
</para>
<para>
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.
</para>
<para>
Before any dither routine is used,
<function>init_dither</function> 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
<type>stp_vars_t</type> structure containing the parameters for
the print job.
</para>
<para>
<function>init_dither</function> 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.
</para>
<para>
After a page is fully dithered, <function>free_dither</function>
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.
</para>
<para>
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 <function>init_dither</function>.
</para>
<itemizedlist>
<listitem>
<para>
<function>dither_set_density</function> 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.
</para>
</listitem>
<listitem>
<para>
<function>dither_set_black_density</function> 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
<function>dither_set_density</function>. 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.
</para>
<para>
This is not used when printing in monochrome. When printing
monochrome, the base density
(<function>dither_set_density</function>) should be adjusted
appropriately.
</para>
</listitem>
<listitem>
<para>
<function>dither_set_ink_budget</function> 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
<function>dither_set_X_ranges</function>. By default, there
is no limit.
</para>
</listitem>
<listitem>
<para>
<function>dither_set_black_lower</function> 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.
</para>
<para>
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.
</para>
<para>
This only applies to color mode.
</para>
<para>
This value should be set lower for printers capable of
variable dot size, since more dots can be laid down close to
each other.
</para>
</listitem>
<listitem>
<para>
<function>dither_set_black_upper</function> 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
<function>dither_set_black_upper</function> 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.
</para>
<para>
This only applies to color mode.
</para>
</listitem>
<listitem>
<para>
<function>dither_set_black_levels</function> 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.
</para>
<para>
This only applies to color mode.
</para>
</listitem>
<listitem>
<para>
<function>dither_set_randomizers</function> 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.
</para>
<para>
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.
</para>
</listitem>
<listitem>
<para>
<function>dither_set_ink_darkness</function> 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.
</para>
</listitem>
<listitem>
<para>
<function>dither_set_light_inks</function> 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.
</para>
<para>
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).
</para>
</listitem>
<listitem>
<para>
<function>dither_set_ink_spread</function> 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).
</para>
</listitem>
<listitem>
<para>
<function>dither_set_adaptive_divisor</function> 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.
</para>
</listitem>
<listitem>
<para>
<function>dither_set_transition</function> 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.
</para>
</listitem>
<listitem>
<para>
<function>dither_set_X_ranges_simple</function>
(<literal>X</literal> = <literal>c</literal>,
<literal>m</literal>, <literal>y</literal> or
<literal>k</literal>) 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
<function>dither_set_ink_budget</function> 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
<function>dither_set_density</function>. 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).
</para>
</listitem>
<listitem>
<para>
<function>dither_set_X_ranges</function>
(<literal>X</literal> = <literal>c</literal>,
<literal>m</literal>, <literal>y</literal> or
<literal>k</literal>) 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.
</para>
</listitem>
</itemizedlist>
</chapter>

File diff suppressed because it is too large Load Diff

View File

@ -1,502 +0,0 @@
<!--
The GNU Public License 2 in DocBook
Markup by Eric Baudais <baudais@okstate.edu>
Maintained by the GNOME Documentation Project
http://developer.gnome.org/projects/gdp
Version: 1.0.1
Last Modified: Nov 16, 2000
-->
<appendix id="gpl">
<appendixinfo>
<releaseinfo>
Version 2, June 1991
</releaseinfo>
<copyright>
<year>2000</year><holder>Free Software Foundation, Inc.</holder>
</copyright>
<legalnotice id="gpl-legalnotice">
<para>
<address>Free Software Foundation, Inc.
<street>59 Temple Place, Suite 330</street>,
<city>Boston</city>,
<state>MA</state>
<postcode>02111-1307</postcode>
<country>USA</country>
</address>
</para>
<para>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
</para>
</legalnotice>
</appendixinfo>
<title>GNU General Public License</title>
<sect1 id="gpl-preamble">
<title>Preamble</title>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
We protect your rights with two steps:
<orderedlist numeration="arabic">
<listitem>
<para>
copyright the software, and
</para>
</listitem>
<listitem>
<para>
offer you this license which gives you legal permission to
copy, distribute and/or modify the software.
</para>
</listitem>
</orderedlist>
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
The precise terms and conditions for copying, distribution and
modification follow.
</para>
</sect1>
<sect1 id="gpl-terms">
<title>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</title>
<sect2 id="gpl-sect0">
<title>Section 0</title>
<para>
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 <quote>work based on the Program</quote> 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 <quote>modification</quote>.)
Each licensee is addressed as <quote>you</quote>.
</para>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect1">
<title>Section 1</title>
<para>
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.
</para>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect2">
<title>Section 2</title>
<para>
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 <link linkend="gpl-sect1">Section 1</link> above, provided
that you also meet all of these conditions:
<orderedlist numeration="loweralpha">
<listitem>
<para>
You must cause the modified files to carry prominent
notices stating that you changed the files and the date
of any change.
</para>
</listitem>
<listitem>
<para>
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.
</para>
</listitem>
<listitem>
<para>
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.
<note>
<title>Exception:</title>
<para>
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.)
</para>
</note>
</para>
</listitem>
</orderedlist>
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect3">
<title>Section 3</title>
<para>
You may copy and distribute the Program (or a work based on
it, under <link linkend="gpl-sect2">Section 2</link> in object
code or executable form under the terms of <link
linkend="gpl-sect1">Sections 1</link> and <link
linkend="gpl-sect2">2</link> above provided that you also do
one of the following:
<orderedlist numeration="loweralpha">
<listitem>
<para>
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,
</para>
</listitem>
<listitem>
<para>
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,
</para>
</listitem>
<listitem>
<para>
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.)
</para>
</listitem>
</orderedlist>
</para>
<para>
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.
</para>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect4">
<title>Section 4</title>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect5">
<title>Section 5</title>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect6">
<title>Section 6</title>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect7">
<title>Section 7</title>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
This section is intended to make thoroughly clear what is
believed to be a consequence of the rest of this License.
</para>
</sect2>
<sect2 id="gpl-sect8">
<title>Section 8</title>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect9">
<title>Section 9</title>
<para>
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.
</para>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect10">
<title>Section 10</title>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect11">
<title>NO WARRANTY</title>
<subtitle>Section 11</subtitle>
<para>
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.
</para>
</sect2>
<sect2 id="gpl-sect12">
<title>Section 12</title>
<para>
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.
</para>
</sect2>
</sect1>
</appendix>

View File

@ -1,59 +0,0 @@
<?xml version='1.0'?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.2//EN"
"http://www.oasis-open.org/docbook/xml/4.2/docbookx.dtd" [
<!ENTITY copying SYSTEM "copying.xml">
<!ENTITY dither SYSTEM "dither.xml">
<!ENTITY escp2 SYSTEM "escp2.xml">
<!ENTITY gpl SYSTEM "gpl-appendix.xml">
<!ENTITY introduction SYSTEM "introduction.xml">
<!ENTITY new-printer SYSTEM "new-printer.xml">
<!ENTITY problems SYSTEM "problems.xml">
<!ENTITY using SYSTEM "using.xml">
<!ENTITY weave SYSTEM "weave.xml">
]>
<book>
<bookinfo>
<title>The Developer's Guide to Gutenprint</title>
<date>7th Nov, 2003</date>
<pubdate>7th Nov, 2003</pubdate>
<corpauthor>
The Gutenprint Project
</corpauthor>
<copyright>
<year>2003</year>
<holder>The Gutenprint Project</holder>
</copyright>
<legalnotice>
<para>
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.
</para>
<para>
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.
</para>
<para>
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., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
</para>
</legalnotice>
</bookinfo>
&introduction;
&copying;
&using;
&problems;
&new-printer;
&escp2;
&weave;
&dither;
&gpl;
</book>

View File

@ -1,62 +0,0 @@
<preface>
<title>Preface</title>
<indexterm><primary>reading</primary></indexterm>
<indexterm><primary>manual, how to read</primary></indexterm>
<para>
Gutenprint is the print facility of the GNU Image Manipulation
Program (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 Linux, MacOS X and UNIX
on a par with proprietary vendor-supplied drivers in many cases,
and can be used for many of the most demanding printing tasks,
especially for high quality printing on modern inkjets, including
&ldquo;photographic quality&rdquo; models which offer very high
resolutions and several inks. The core of Gutenprint is a shared
library (libgutenprint) which may be used by any program that
wishes to produce high-quality printed output.
</para>
<para>
This manual documents the use of the
<application>Gutenprint</application> package, focusing mainly on
the libgutenprint library that is the core of
<application>Gutenprint</application>. Parts of the manual which
describe the use of libgutenprint 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.
</para>
<para>
For the end-user, there is a separate manual documenting
programs that come with Gutenprint, including the
<application>GIMP</application> <command>print</command> plugin,
and the <application>CUPS</application> and
<application>Ghostscript</application> drivers.
</para>
<para>
To learn how to use libgutenprint in your own programs is to look
at the source of the <command>testpattern</command>, located in
<filename class="directory">src/testpattern</filename>, as well as
the source of the other programs that use libgutenprint, and
libgutenprint itself. Most importantly, please consult the API
reference and libgutenprint headers.
</para>
<para>
The manual is split into several parts for the programmer. It
starts with a simple usage example of how to link a program with
libgutenprint, then how to integrate this into package build
scripts, using <command>make</command>,
<command>autoconf</command> and <command>automake</command>. The
appendices cover the detail of the inner workings of some parts of
libgutenprint.
</para>
<para>
The following sections detail the dither and weave algorithms used
in libgutenprint, the ESC/P2 printer control language used in Epson
printers and how to add support for a new printer to libgutenprint.
</para>
<para>
<literallayout>We hope you enjoy using Gutenprint!
&mdash;The Gutenprint project
</literallayout>
</para>
</preface>

View File

@ -1,883 +0,0 @@
<chapter>
<title>Adding a new printer</title>
<para>
This chapter covers adding a new ESCP/2, PCL, or Canon printer.
Writing a new driver module is not covered.
</para>
<para>
The three steps to adding a printer are:
<orderedlist>
<listitem>
<para>
Add an entry to <filename>printers.xml</filename>.
</para>
</listitem>
<listitem>
<para>
Add the appropriate code and data to the appropriate
driver module.
</para>
</listitem>
<listitem>
<para>
Tune the printer.
</para>
</listitem>
</orderedlist>
</para>
<para>
Printer information is stored in two places: in
<filename>printers.xml</filename> (which contains the list of
printer models available to the the upper-level application),
and in the appropriate driver file
(<filename>print-escp2.c</filename>,
<filename>print-pcl.c</filename>, or
<filename>print-canon.c</filename>).
</para>
<sect1>
<title><filename>printers.xml</filename></title>
<para>
<filename>printers.xml</filename> is an XML file that contains
very simple printer definitions. A schema may be used to
validate the XML (<filename>src/main/gutenprint.xsd</filename>).
This is an example definition:
</para>
<informalexample>
<programlisting>&lt;printer name="EPSON Stylus Color 1500" driver="escp2-1500"&gt;
&lt;color value="true"/&gt;
&lt;model value="2"/&gt;
&lt;gamma value="0.597"/&gt;
&lt;density value="1.0"/&gt;
&lt;/printer&gt;</programlisting>
</informalexample>
<para>
There are other tags that may be present. The only ones that
are mandatory are <literal>&lt;printer&gt;</literal>,
<literal>&lt;color&gt;</literal> and
<literal>&lt;model&gt;</literal>. The other optional parameters
(<literal>&lt;gamma&gt;</literal> and
<literal>&lt;density&gt;</literal> 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.
</para>
<para>
If you really are curious about what tags are permitted, please
see the schema. These are the definitions of the tags that do
matter:
</para>
<variablelist>
<title>printdef XML elements</title>
<varlistentry>
<term><literal>&lt;family&gt;</literal></term>
<listitem>
<para>
This defines what driver module this printer uses. The
attribute <literal>name</literal> is the name of the
family driver to associate the printers with, for example
<literal>escp2</literal>, <literal>pcl</literal>,
<literal>canon</literal>, <literal>ps</literal> or
<literal>raw</literal>. This tag may only contain
<literal>&lt;printer&gt;</literal> elements.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>&lt;printer&gt;</literal></term>
<listitem>
<para>
This starts the definition of a printer. It must contain
the attributes <literal>name</literal> and
<literal>driver</literal>. <literal>name</literal> should
be is the full name of the printer, and must be human
readable. <literal>driver</literal> should consist of
alphanumerics and hyphens, and be fairly short.
<literal>name</literal> is what will appear in the
user-visible listing of printers, and may be translated
into the user's language, while <literal>driver</literal>
is what is actually used to key into the list of printers.
It is legal to have multiple printers with the same driver
name.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>&lt;color&gt;</literal></term>
<listitem>
<para>
This tag may not contain any content, but the
<literal>value</literal> attribute may be set to
<literal>true</literal> or <literal>false</literal>. This
indicates that this printer is capable of color, or is not
capable of color respectively.
</para>
</listitem>
</varlistentry>
<varlistentry>
<term><literal>&lt;model&gt;</literal></term>
<listitem>
<para>
This defines a model number. This tag may not contain any
content, but the <literal>value</literal> attribute may be
set to a positive integer. This is passed into the
driver, which may do whatever it cares to with
it&mdash;index into a table, compute on, or whatever.
This need not be unique.
</para>
</listitem>
</varlistentry>
</variablelist>
</sect1>
<sect1>
<title>The driver file</title>
<para>
Adding a new printer to a driver module
<filename>print-canon.c</filename>,
<filename>print-escp2.c</filename>,
<filename>print-lexmark.c</filename>, or
<filename>print-pcl.c</filename> or
(<filename>print-ps.c</filename> 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.
</para>
<para>
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&mdash;the communication protocol doesn't really
contain very much IP, so they have less reason to keep it
secret.
</para>
<para>
The sections about PCL and Canon printers need completing.
</para>
<sect2>
<title>Epson inkjet printers</title>
<para>
The <varname>model_capabilities</varname> vector in
<filename>print-escp2.c</filename> contains one entry for each
defined printer model. The <literal>model</literal> parameter
in <filename>printers.xml</filename> is an index into this
table.
</para>
<para>
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.
</para>
<para>
<type>escp2_printer_t</type> is a C struct defined as follows:
</para>
<informalexample>
<programlisting>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 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 */
/* Softweave: */
int left_margin; /* Left margin, points */
int right_margin; /* Right margin, points */
int top_margin; /* Absolute top margin, points */
int bottom_margin; /* Absolute bottom margin, points */
/* "Micro"weave: */
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 */
/*****************************************************************************/
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 microweave 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 */
/*****************************************************************************/
/* The stylus 480 and 580 have an unusual arrangement of
color jets that need special handling */
const int *head_offset;
int initial_vertical_offset;
int black_initial_vertical_offset;
/*****************************************************************************/
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 double *lum_adjustment;
const double *hue_adjustment;
const double *sat_adjustment;
const paperlist_t *paperlist;
} escp2_printer_t;</programlisting>
</informalexample>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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
<varname>min_nozzles</varname> and/or
<varname>min_black_nozzles</varname> to the same value as
<varname>nozzles</varname> and/or
<varname>black_nozzles</varname>.
</para>
<para>
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.
</para>
<para>
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 <varname>xres</varname>.
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.
</para>
<para>
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 <varname>enhanced_xres</varname> to specify the
resolution to be used in this enhanced mode, and
<varname>enhanced_resolution</varname> to specify the printing
resolution above which we use the
<varname>enhanced_xres</varname>.
</para>
<para>
The <varname>resolution_scale</varname> command is used to
specify scaling factors for the dot separation on newer
printers. It should always be 14400 with current printers.
</para>
<para>
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.
</para>
<para>
There is a convenient <function>INCH</function> macro defined
to make specification of the
<varname>max_paper_width</varname> and
<varname>max_paper_height</varname> more legible. It
multiplies <constant>72</constant> by the provided expression
to get the appropriate number of points. For example, to
specify 8.5", <literal>INCH(17/2)</literal> expands to
<literal>(72 * 17/2)</literal>, which is evaluated left to
right, and hence generates the correct value.
</para>
<para>
The fifth section specifies some miscellaneous values that are
required for certain printers. For most printers, the correct
values are <constant>1</constant> for
<varname>separation_rows</varname> and <constant>0</constant>
for the others. Very, very few printers require (or allow)
<varname>separation_rows</varname> to be anything but
<constant>1</constant> and
<varname>pseudo_separation_rows</varname> other than
<constant>0</constant>. The Stylus Color 1520, Stylus Color
800, Stylus Color 850, and (strangely enough to my mind, since
it's a newer printer) Stylus Color 660 seem to be the only
exceptions.
</para>
<para>
<varname>zero_margin_offset</varname> 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
<constant>100</constant> for 1440 DPI and
<constant>50</constant> for 2880 DPI printers. The goal is to
print to the edge of the page, but not over it.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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
<emphasis>Photograph</emphasis> and <emphasis>Solid
Colors</emphasis> 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.
</para>
<para>
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.
</para>
<para>
The lists of dot sizes and densities contain values for 13
printing modes: 120/180 DPI using printer weaving (single row;
incorrectly referred to as &ldquo;microweave&rdquo;) and
&ldquo;soft&rdquo; weaving (the driver determines the exact
pattern of dot layout), 360 DPI microweave and softweave,
720&times;360 DPI microweave and softweave, 720 DPI microweave
and softweave, 1440&times;720 microweave and softweave,
2880&times;720 microweave and softweave, and 2880&times;1440
softweave only. Printer weaving is referred to as
&ldquo;microweave&rdquo; for historical reasons.
</para>
<para>
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 <constant>16</constant>
(<constant>0x10</constant>), to indicate single dot size (each
dot is represented by 1 bit, and it's either printed or not),
and dot sizes of <constant>16</constant> 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.
</para>
<para>
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.
</para>
<para>
A dot size of <constant>-1</constant> 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 <constant>-2</constant> 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.
</para>
<para>
Most printers support a dot size of <constant>0</constant> as
a mode-specific default, but it's often a bigger dot than
necessary. Printers usually also support some dot sizes
between <constant>1</constant> and <constant>3</constant>.
Usually <constant>1</constant> is the right dot size for 720
and 1440 DPI printing, and <constant>3</constant> works best
at 360 DPI.
</para>
<para>
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: <constant>0x10</constant> for 4 pl base
drops, <constant>0x11</constant> for 6 pl base drops, and
<constant>0x12</constant> for special large drops. On these
printers, <constant>0x10</constant> usually works best at
1440&times;720 and <constant>0x11</constant> works best at
720&times;720. Unfortunately, <constant>0x10</constant>
doesn't seem to generate quite enough density at
720&times;720, because if it did the output would be very
smooth. Perhaps it's possible to tweak things&hellip;
</para>
<para>
The list of densities is a list of base density values for all
of the above listed modes. &ldquo;Density&rdquo; refers to
the amount of ink deposited when a solid color (or solid
black) is printed. So if the density is
<constant>0.5</constant>, solid black actually prints only
half the possible dots. &ldquo;Base density&rdquo; 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
<constant>1</constant>, as many paper types require lower
density than the base driver. The driver ensures that the
actual density never exceeds <constant>1</constant>.
</para>
<para>
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 1440&times;720, by 4 for 2880&times;720, and
by 8 for 2880&times;1440.
</para>
<para>
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 <constant>1</constant> 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.
</para>
<para>
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
&ldquo;value&rdquo; of ink for each available dot size, where
the largest dot size has a value of <constant>1</constant>.
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.
</para>
<para>
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.
</para>
<itemizedlist>
<listitem>
<para>
An <type>escp2_printer_t</type> contains a pointer
(essentially, a reference rather than a copy) to an
<type>escp2_variable_inklist_t</type>.
</para>
</listitem>
<listitem>
<para>
An <type>escp2_variable_inklist_t</type> contains pointers
to <type>escp2_variable_inkset_t</type> structures. There
is one such pointer for each combination of resolution,
dot type, and ink colors as described above. Yes, this is
rather inflexible.
</para>
</listitem>
<listitem>
<para>
An <type>escp2_variable_inkset_t</type> contains pointers
to <type>escp2_variable_ink_t</type> structures. There is
one such pointer for each of the four colors (C, M, Y, and
K).
</para>
</listitem>
<listitem>
<para>
An <type>escp2_variable_ink_t</type> contains a pointer to
the actual list of ink values
(<type>simple_dither_range_t</type>), 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
<constant>1</constant>, 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
<constant>.75</constant> for this purpose). A lower
density lowers the transition points, which results in
more ink being deposited.
</para>
</listitem>
<listitem>
<para>
A <type>simple_dither_range_t</type> is a structure containing four values:
<itemizedlist>
<listitem>
<para>
The value of the particular ink
</para>
</listitem>
<listitem>
<para>
The bit pattern used to represent the ink
</para>
</listitem>
<listitem>
<para>
Whether the ink is light (0) or dark (1), for inks
with light and dark variants
</para>
</listitem>
<listitem>
<para>
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).
</para>
</listitem>
</itemizedlist>
</para>
<para>
These things are interesting as arrays. From an array of
<type>simple_dither_range_t</type>'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.
</para>
</listitem>
</itemizedlist>
<para>
<emphasis>Really</emphasis> confused now? Yup. You'll
probably find it easier to simply read the code.
</para>
</sect2>
<sect2>
<title>Tuning the printer</title>
<para>
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.
</para>
<para>
There's a file named <filename>test/cyan-sweep.tif</filename>.
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
<type>simple_dither_range_t</type> (or create a whole new
<type>escp2_variable_inklist_t</type>) 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.
</para>
<para>
At this stage, you want to look for four things:
<orderedlist>
<listitem>
<para>
The black near the center of the line is solid, but not
more so than that.
</para>
</listitem>
<listitem>
<para>
The cyan immediately to the left of the black is
<emphasis>almost</emphasis> solid.
</para>
</listitem>
<listitem>
<para>
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.
</para>
</listitem>
<listitem>
<para>
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.
</para>
</listitem>
</orderedlist>
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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.
</para>
<para>
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
1440&times;720 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.
</para>
<para>
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.
</para>
<para>
There are other ways of tuning printers, but this one works
pretty well for me.
</para>
</sect2>
<sect2>
<title>Canon inkjet printers</title>
<para>
Basically, a new Canon printer can be added to
<filename>print-canon.c</filename> in a similar way as
described above for the epson inkjet printers. The main
differences are noted here.
</para>
<para>
In general, Canon printers have more &ldquo;built-in
intelligence&ldquo; 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.
</para>
<para>
<type>canon_cap_t</type> is a C struct defined as follows:
</para>
<informalexample>
<programlisting>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;</programlisting>
</informalexample>
<para>
Since there are Canon printers which print in resolutions of
2<superscript>n</superscript> &times; 150 DPI (e.g. 300, 600,
1200) and others which support resolutions of
2<superscript>n</superscript> &times; 180 DPI (e.g. 360, 720,
1440), there's a base resolution (150 or 180, respectively)
given in the <type>canon_cap_t</type>. The structs
<type>canon_dot_size_t</type>, <type>canon_densities_t</type>
and <type>canon_variable_inklist_t</type> refer to resolutions
being multiples of the base resolution.
</para>
<para>
For the Canon driver, the struct <type>canon_dot_size_t</type>
holds values for a model's capabilities at a given resolution,
or <constant>-1</constant> if the resolution is not supported.
<constant>0</constant> if it can be used and
<constant>1</constant> if the resolution can be used for
variable dot size printing.
</para>
<para>
In <type>canon_densities_t</type> the base densities for each
resolution can be specified like for an epson printer. The
same holds true for <type>canon_variable_inklist_t</type>.
See the descriptions above to learn about how to adjust your
model's output to yield nice results.
</para>
<para>
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:
</para>
<informalexample>
<programlisting>static const canon_variable_inklist_t canon_ink_myinks[] =
{
{
1,4, /* 1bit/pixel, 4 colors */
&amp;ci_CMYK_1, &amp;ci_CMYK_1, &amp;ci_CMYK_1,
&amp;ci_CMYK_1, &amp;ci_CMYK_1, &amp;ci_CMYK_1,
},
{
3,4, /* 3bit/pixel, 4 colors */
&amp;ci_CMYK_3, &amp;ci_CMYK_3, &amp;ci_CMYK_3,
&amp;ci_CMYK_3, &amp;ci_CMYK_3, &amp;ci_CMYK_3,
},
};</programlisting>
</informalexample>
<para>
where the <literal>&amp;ci_CMYK_1</literal> and
<literal>&amp;ci_CMYK_3</literal> entries are references to a
previously defined const of type
<type>canon_variable_inkset_t</type>.
</para>
</sect2>
</sect1>
</chapter>

View File

@ -1,22 +0,0 @@
<chapter>
<title>Reporting Bugs</title>
<para>
If you find a bug in Gutenprint or have any suggestions for
modification or improvement, please send electronic mail to the
Gutenprint bug reporting address,
<email>gimp-print-devel@lists.sourceforge.net</email>. Please
include the version number, which you can find at the bottom of
each manual page. 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.
</para>
<para>
If you have other questions, comments or suggestions about
Gutenprint, contact the developers via electronic mail to the
Gutenprint mailing list
<email>gimp-print-devel@lists.sourceforge.net</email>. They
will try to help you out, although they may not have time to fix
your problems.
</para>
</chapter>

View File

@ -1,18 +0,0 @@
book1.html
f14.html
c39.html
c48.html
x67.html
x79.html
c194.html
c200.html
x271.html
c464.html
x955.html
x1669.html
c1717.html
x1734.html
c1968.html
gpl.html
gpl-terms.html
ln10.html

View File

@ -1,453 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>The Developer's Guide to Gutenprint</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="NEXT"
TITLE="Preface"
HREF="f14.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="book"
><DIV
CLASS="BOOK"
><A
NAME="AEN1"
></A
><DIV
CLASS="TITLEPAGE"
><H1
CLASS="title"
><A
NAME="AEN2"
>The Developer's Guide to Gutenprint</A
></H1
><H3
CLASS="corpauthor"
>&#13; The Gutenprint Project
</H3
><P
CLASS="copyright"
><A
HREF="ln10.html"
>Copyright</A
> &copy; 2003 The Gutenprint Project</P
><HR></DIV
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
><A
HREF="f14.html"
>Preface</A
></DT
><DT
>1. <A
HREF="c39.html"
>Copying, modification and redistribution</A
></DT
><DT
>2. <A
HREF="c48.html"
>Using libgutenprint</A
></DT
><DD
><DL
><DT
><A
HREF="c48.html#AEN51"
>Code prerequisites</A
></DT
><DT
><A
HREF="x67.html"
>Linking with libgutenprint</A
></DT
><DT
><A
HREF="x79.html"
>Integrating libgutenprint</A
></DT
><DD
><DL
><DT
><A
HREF="x79.html#AEN86"
><B
CLASS="command"
>pkg-config</B
></A
></DT
><DT
><A
HREF="x79.html#AEN123"
><B
CLASS="command"
>make</B
></A
></DT
><DT
><A
HREF="x79.html#AEN133"
><B
CLASS="command"
>autoconf</B
></A
></DT
><DT
><A
HREF="x79.html#AEN150"
><B
CLASS="command"
>automake</B
></A
></DT
></DL
></DD
></DL
></DD
><DT
>3. <A
HREF="c194.html"
>Reporting Bugs</A
></DT
><DT
>4. <A
HREF="c200.html"
>Adding a new printer</A
></DT
><DD
><DL
><DT
><A
HREF="c200.html#AEN217"
><TT
CLASS="filename"
>printers.xml</TT
></A
></DT
><DT
><A
HREF="x271.html"
>The driver file</A
></DT
><DD
><DL
><DT
><A
HREF="x271.html#AEN281"
>Epson inkjet printers</A
></DT
><DT
><A
HREF="x271.html#AEN403"
>Tuning the printer</A
></DT
><DT
><A
HREF="x271.html#AEN433"
>Canon inkjet printers</A
></DT
></DL
></DD
></DL
></DD
><DT
>5. <A
HREF="c464.html"
>ESC/P2</A
></DT
><DD
><DL
><DT
><A
HREF="c464.html#AEN477"
>Standard commands</A
></DT
><DT
><A
HREF="x955.html"
>Remote Mode Commands</A
></DT
><DT
><A
HREF="x1669.html"
>Appropriate Remote Commands</A
></DT
></DL
></DD
><DT
>6. <A
HREF="c1717.html"
>Weaving for inkjet printers</A
></DT
><DD
><DL
><DT
><A
HREF="c1717.html#AEN1719"
>Introduction</A
></DT
><DT
><A
HREF="x1734.html"
>Weaving algorithms</A
></DT
><DD
><DL
><DT
><A
HREF="x1734.html#AEN1740"
>Simple weaving algorithms</A
></DT
><DT
><A
HREF="x1734.html#AEN1757"
>Perfect weaving</A
></DT
><DT
><A
HREF="x1734.html#AEN1791"
>Weaving collisions</A
></DT
><DT
><A
HREF="x1734.html#AEN1809"
>What makes a “perfect” weave?</A
></DT
><DT
><A
HREF="x1734.html#AEN1937"
>Oversampling</A
></DT
></DL
></DD
></DL
></DD
><DT
>7. <A
HREF="c1968.html"
>Dithering</A
></DT
><DT
>A. <A
HREF="gpl.html"
>GNU General Public License</A
></DT
><DD
><DL
><DT
><A
HREF="gpl.html#gpl-preamble"
>Preamble</A
></DT
><DT
><A
HREF="gpl-terms.html"
>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</A
></DT
><DD
><DL
><DT
><A
HREF="gpl-terms.html#gpl-sect0"
>Section 0</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect1"
>Section 1</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect2"
>Section 2</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect3"
>Section 3</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect4"
>Section 4</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect5"
>Section 5</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect6"
>Section 6</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect7"
>Section 7</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect8"
>Section 8</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect9"
>Section 9</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect10"
>Section 10</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect11"
>NO WARRANTY</A
></DT
><DT
><A
HREF="gpl-terms.html#gpl-sect12"
>Section 12</A
></DT
></DL
></DD
></DL
></DD
></DL
></DIV
><DIV
CLASS="LOT"
><DL
CLASS="LOT"
><DT
><B
>List of Tables</B
></DT
><DT
>5-1. <A
HREF="c464.html#AEN728"
>Colors</A
></DT
><DT
>5-2. <A
HREF="c464.html#AEN767"
>Compression modes</A
></DT
><DT
>5-3. <A
HREF="c464.html#AEN827"
>Extended Colors</A
></DT
><DT
>5-4. <A
HREF="c464.html#AEN876"
>Compression modes</A
></DT
><DT
>5-5. <A
HREF="x955.html#AEN1015"
>Head cleaning parameters</A
></DT
><DT
>5-6. <A
HREF="x955.html#AEN1139"
>Media types</A
></DT
><DT
>5-7. <A
HREF="x955.html#AEN1349"
>Printer status codes</A
></DT
><DT
>5-8. <A
HREF="x955.html#AEN1389"
>Printer error codes</A
></DT
><DT
>5-9. <A
HREF="x955.html#AEN1454"
>Printer additional ink codes</A
></DT
><DT
>5-10. <A
HREF="x955.html#AEN1482"
>Printer warning codes</A
></DT
><DT
>5-11. <A
HREF="x955.html#AEN1621"
>Paper cutting codes</A
></DT
><DT
>5-12. <A
HREF="x955.html#AEN1645"
>Paper cutting units</A
></DT
></DL
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="f14.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Preface</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,294 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Weaving for inkjet printers</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="PREVIOUS"
TITLE="Appropriate Remote Commands"
HREF="x1669.html"><LINK
REL="NEXT"
TITLE="Weaving algorithms"
HREF="x1734.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="chapter"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x1669.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x1734.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="chapter"
><H1
><A
NAME="AEN1717"
></A
>Chapter 6. Weaving for inkjet printers</H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
><A
HREF="c1717.html#AEN1719"
>Introduction</A
></DT
><DT
><A
HREF="x1734.html"
>Weaving algorithms</A
></DT
></DL
></DIV
><DIV
CLASS="sect1"
><H1
CLASS="sect1"
><A
NAME="AEN1719"
>Introduction</A
></H1
><P
>&#13; 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 ((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
>&#13; With the newer (740/750 and later) printers it's even worse,
since these printers support multiple dot sizes; of course, the
even newer 2880×720 printers don't help either.
</P
><P
>&#13; Older Epson printers had a mode called
MicroWeave<SUP
>™</SUP
>. 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.5×11" 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; So we have to do something to break up this patterning.
</P
><P
>&#13; Epson do 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
>&#13; 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 Gutenprint 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
>&#13; 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
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x1669.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x1734.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Appropriate Remote Commands</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Weaving algorithms</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,164 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Reporting Bugs</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="PREVIOUS"
TITLE="Integrating libgutenprint"
HREF="x79.html"><LINK
REL="NEXT"
TITLE="Adding a new printer"
HREF="c200.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="chapter"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x79.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="c200.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="chapter"
><H1
><A
NAME="AEN194"
></A
>Chapter 3. Reporting Bugs</H1
><P
>&#13; If you find a bug in Gutenprint or have any suggestions for
modification or improvement, please send electronic mail to the
Gutenprint bug reporting address,
<CODE
CLASS="email"
>&#60;<A
HREF="mailto:gimp-print-devel@lists.sourceforge.net"
>gimp-print-devel@lists.sourceforge.net</A
>&#62;</CODE
>. Please
include the version number, which you can find at the bottom of
each manual page. 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
>&#13; If you have other questions, comments or suggestions about
Gutenprint, contact the developers via electronic mail to the
Gutenprint mailing list
<CODE
CLASS="email"
>&#60;<A
HREF="mailto:gimp-print-devel@lists.sourceforge.net"
>gimp-print-devel@lists.sourceforge.net</A
>&#62;</CODE
>. They
will try to help you out, although they may not have time to fix
your problems.
</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x79.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="c200.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Integrating libgutenprint</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Adding a new printer</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,950 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Dithering</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="PREVIOUS"
TITLE="Weaving algorithms"
HREF="x1734.html"><LINK
REL="NEXT"
TITLE="GNU General Public License"
HREF="gpl.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="chapter"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x1734.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="gpl.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="chapter"
><H1
><A
NAME="AEN1968"
></A
>Chapter 7. Dithering</H1
><P
>&#13; The dithering code in
<TT
CLASS="filename"
>src/main/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
>&#13; 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
>&#13; We currently have three dithering functions:
</P
><P
></P
><DIV
CLASS="variablelist"
><DL
><DT
><TT
CLASS="literal"
>dither_fastblack</TT
></DT
><DD
><P
>&#13; This 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.
</P
></DD
><DT
><TT
CLASS="literal"
>dither_black</TT
></DT
><DD
><P
>&#13; This 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.
</P
></DD
><DT
><TT
CLASS="literal"
>dither_cmyk</TT
></DT
><DD
><P
>&#13; This 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.
</P
></DD
></DL
></DIV
><P
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
><P
></P
><UL
><LI
><P
>&#13; Bottom of the range.
</P
></LI
><LI
><P
>&#13; Top of the range.
</P
></LI
><LI
><P
>&#13; Value of the lighter ink.
</P
></LI
><LI
><P
>Value of the darker ink.
</P
></LI
></UL
><P
>&#13; In addition, the bit patterns and which type of ink are also
represented, but they don't affect the actual algorithm.
</P
><P
>&#13; 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
><P
></P
><OL
TYPE="1"
><LI
><P
>&#13; 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).
</P
></LI
><LI
><P
>&#13; Find the range containing this value.
</P
></LI
><LI
><P
>&#13; 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.
</P
></LI
><LI
><P
>&#13; 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.
</P
></LI
><LI
><P
>&#13; 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.
</P
></LI
></OL
><P
>&#13; The matrices were generated by Thomas Tonino
<CODE
CLASS="email"
>&#60;<A
HREF="mailto:ttonino@bio.vu.nl"
>ttonino@bio.vu.nl</A
>&#62;</CODE
> 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. 1440×720) than for 1:1 (e. g. 720×720). It is
essential with any of these matrices that every point be used.
Skipping points generates low-frequency noise.
</P
><P
>&#13; 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
>&#13; 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
>&#13; I stated earlier that I've tweaked the basic error diffusion
algorithm. Here's what I've done to improve it:
</P
><P
></P
><UL
><LI
><P
>&#13; 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.
</P
><P
>&#13; 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.
</P
><P
>&#13; 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.
</P
><P
>&#13; Excessive randomization leads to blobs at high densities.
Therefore, as the density increases, the degree of
randomization decreases.
</P
></LI
><LI
><P
>&#13; 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.
</P
></LI
><LI
><P
>&#13; Diffusing the error into more pixels. Instead of diffusing
the entire error into (X+1, Y) and (X, Y+1), we diffuse it
into (X+1, Y), (X+K, Y+1), (X, Y+1), (X-K, Y+1) where 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 <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>error</I
></SPAN
>
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).
</P
></LI
><LI
><P
>&#13; 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.
</P
></LI
><LI
><P
>&#13; Oversampling. This is how to print 1440×720 with Epson
Stylus printers. Printing full density at 1440×720 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 1440×1440 or
1440×2880 virtual resolution results in other problems.
However, at present 1440×1440 (which is more accurately
called "1440×720 enhanced", as the Epson printers cannot
print 1440 rows per inch) does quite well, although it's slow.
</P
></LI
></UL
><P
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; Before any dither routine is used,
<CODE
CLASS="function"
>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
<SPAN
CLASS="type"
>stp_vars_t</SPAN
> structure containing the parameters for
the print job.
</P
><P
>&#13; <CODE
CLASS="function"
>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
>&#13; After a page is fully dithered, <CODE
CLASS="function"
>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
>&#13; 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
CLASS="function"
>init_dither</CODE
>.
</P
><P
></P
><UL
><LI
><P
>&#13; <CODE
CLASS="function"
>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.
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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
CLASS="function"
>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.
</P
><P
>&#13; This is not used when printing in monochrome. When printing
monochrome, the base density
(<CODE
CLASS="function"
>dither_set_density</CODE
>) should be adjusted
appropriately.
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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
CLASS="function"
>dither_set_X_ranges</CODE
>. By default, there
is no limit.
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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.
</P
><P
>&#13; 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.
</P
><P
>&#13; This only applies to color mode.
</P
><P
>&#13; This value should be set lower for printers capable of
variable dot size, since more dots can be laid down close to
each other.
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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
<CODE
CLASS="function"
>dither_set_black_upper</CODE
> 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.
</P
><P
>&#13; This only applies to color mode.
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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.
</P
><P
>&#13; This only applies to color mode.
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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.
</P
><P
>&#13; 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.
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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.
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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.
</P
><P
>&#13; 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).
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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).
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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.
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>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.
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>dither_set_X_ranges_simple</CODE
>
(<TT
CLASS="literal"
>X</TT
> = <TT
CLASS="literal"
>c</TT
>,
<TT
CLASS="literal"
>m</TT
>, <TT
CLASS="literal"
>y</TT
> or
<TT
CLASS="literal"
>k</TT
>) 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
CLASS="function"
>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
CLASS="function"
>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).
</P
></LI
><LI
><P
>&#13; <CODE
CLASS="function"
>dither_set_X_ranges</CODE
>
(<TT
CLASS="literal"
>X</TT
> = <TT
CLASS="literal"
>c</TT
>,
<TT
CLASS="literal"
>m</TT
>, <TT
CLASS="literal"
>y</TT
> or
<TT
CLASS="literal"
>k</TT
>) 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.
</P
></LI
></UL
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x1734.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="gpl.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Weaving algorithms</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>GNU General Public License</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,424 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Adding a new printer</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="PREVIOUS"
TITLE="Reporting Bugs"
HREF="c194.html"><LINK
REL="NEXT"
TITLE="The driver file"
HREF="x271.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="chapter"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="c194.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x271.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="chapter"
><H1
><A
NAME="AEN200"
></A
>Chapter 4. Adding a new printer</H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
><A
HREF="c200.html#AEN217"
><TT
CLASS="filename"
>printers.xml</TT
></A
></DT
><DT
><A
HREF="x271.html"
>The driver file</A
></DT
></DL
></DIV
><P
>&#13; This chapter covers adding a new ESCP/2, PCL, or Canon printer.
Writing a new driver module is not covered.
</P
><P
>&#13; The three steps to adding a printer are:
<P
></P
><OL
TYPE="1"
><LI
><P
>&#13; Add an entry to <TT
CLASS="filename"
>printers.xml</TT
>.
</P
></LI
><LI
><P
>&#13; Add the appropriate code and data to the appropriate
driver module.
</P
></LI
><LI
><P
>&#13; Tune the printer.
</P
></LI
></OL
>
</P
><P
>&#13; Printer information is stored in two places: in
<TT
CLASS="filename"
>printers.xml</TT
> (which contains the list of
printer models available to the the upper-level application),
and in the appropriate driver file
(<TT
CLASS="filename"
>print-escp2.c</TT
>,
<TT
CLASS="filename"
>print-pcl.c</TT
>, or
<TT
CLASS="filename"
>print-canon.c</TT
>).
</P
><DIV
CLASS="sect1"
><H1
CLASS="sect1"
><A
NAME="AEN217"
><TT
CLASS="filename"
>printers.xml</TT
></A
></H1
><P
>&#13; <TT
CLASS="filename"
>printers.xml</TT
> is an XML file that contains
very simple printer definitions. A schema may be used to
validate the XML (<TT
CLASS="filename"
>src/main/gutenprint.xsd</TT
>).
This is an example definition:
</P
><DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN223"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="programlisting"
>&#60;printer name="EPSON Stylus Color 1500" driver="escp2-1500"&#62;
&#60;color value="true"/&#62;
&#60;model value="2"/&#62;
&#60;gamma value="0.597"/&#62;
&#60;density value="1.0"/&#62;
&#60;/printer&#62;</PRE
></TD
></TR
></TABLE
><P
></P
></DIV
><P
>&#13; There are other tags that may be present. The only ones that
are mandatory are <TT
CLASS="literal"
>&#60;printer&#62;</TT
>,
<TT
CLASS="literal"
>&#60;color&#62;</TT
> and
<TT
CLASS="literal"
>&#60;model&#62;</TT
>. The other optional parameters
(<TT
CLASS="literal"
>&#60;gamma&#62;</TT
> and
<TT
CLASS="literal"
>&#60;density&#62;</TT
> 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
>&#13; If you really are curious about what tags are permitted, please
see the schema. These are the definitions of the tags that do
matter:
</P
><P
></P
><DIV
CLASS="variablelist"
><P
><B
>printdef XML elements</B
></P
><DL
><DT
><TT
CLASS="literal"
>&#60;family&#62;</TT
></DT
><DD
><P
>&#13; This defines what driver module this printer uses. The
attribute <TT
CLASS="literal"
>name</TT
> is the name of the
family driver to associate the printers with, for example
<TT
CLASS="literal"
>escp2</TT
>, <TT
CLASS="literal"
>pcl</TT
>,
<TT
CLASS="literal"
>canon</TT
>, <TT
CLASS="literal"
>ps</TT
> or
<TT
CLASS="literal"
>raw</TT
>. This tag may only contain
<TT
CLASS="literal"
>&#60;printer&#62;</TT
> elements.
</P
></DD
><DT
><TT
CLASS="literal"
>&#60;printer&#62;</TT
></DT
><DD
><P
>&#13; This starts the definition of a printer. It must contain
the attributes <TT
CLASS="literal"
>name</TT
> and
<TT
CLASS="literal"
>driver</TT
>. <TT
CLASS="literal"
>name</TT
> should
be is the full name of the printer, and must be human
readable. <TT
CLASS="literal"
>driver</TT
> should consist of
alphanumerics and hyphens, and be fairly short.
<TT
CLASS="literal"
>name</TT
> is what will appear in the
user-visible listing of printers, and may be translated
into the user's language, while <TT
CLASS="literal"
>driver</TT
>
is what is actually used to key into the list of printers.
It is legal to have multiple printers with the same driver
name.
</P
></DD
><DT
><TT
CLASS="literal"
>&#60;color&#62;</TT
></DT
><DD
><P
>&#13; This tag may not contain any content, but the
<TT
CLASS="literal"
>value</TT
> attribute may be set to
<TT
CLASS="literal"
>true</TT
> or <TT
CLASS="literal"
>false</TT
>. This
indicates that this printer is capable of color, or is not
capable of color respectively.
</P
></DD
><DT
><TT
CLASS="literal"
>&#60;model&#62;</TT
></DT
><DD
><P
>&#13; This defines a model number. This tag may not contain any
content, but the <TT
CLASS="literal"
>value</TT
> attribute may be
set to a positive integer. 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.
</P
></DD
></DL
></DIV
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="c194.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x271.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Reporting Bugs</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>The driver file</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,179 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Copying, modification and redistribution</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="PREVIOUS"
TITLE="Preface"
HREF="f14.html"><LINK
REL="NEXT"
TITLE="Using libgutenprint"
HREF="c48.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="chapter"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="f14.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="c48.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="chapter"
><H1
><A
NAME="AEN39"
></A
>Chapter 1. Copying, modification and redistribution</H1
><P
>&#13; Gutenprint is <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>free</I
></SPAN
>; this means that everyone
is free to use it and free to redistribute it on a free basis.
Gutenprint 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 Gutenprint that they might get
from you.
</P
><P
>&#13; Specifically, we want to make sure that you have the right to give
away copies of Gutenprint, that you receive source code or else
can get it if you want it, that you can change Gutenprint or use
pieces of it in new free programs, and that you know you can do
these things.
</P
><P
>&#13; 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 Gutenprint, 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
>&#13; Also, for our own protection, we must make certain that everyone
finds out that there is no warranty for Gutenprint. If Gutenprint
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
><P
>&#13; Gutenprint is licensed under the terms of the GNU General Public
License (GPL), reproduced in <A
HREF="gpl.html"
>Appendix A</A
>.
</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="f14.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="c48.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Preface</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Using libgutenprint</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,252 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Using libgutenprint</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="PREVIOUS"
TITLE="Copying, modification and redistribution"
HREF="c39.html"><LINK
REL="NEXT"
TITLE="Linking with libgutenprint"
HREF="x67.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="chapter"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="c39.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x67.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="chapter"
><H1
><A
NAME="AEN48"
></A
>Chapter 2. Using libgutenprint</H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
><A
HREF="c48.html#AEN51"
>Code prerequisites</A
></DT
><DT
><A
HREF="x67.html"
>Linking with libgutenprint</A
></DT
><DT
><A
HREF="x79.html"
>Integrating libgutenprint</A
></DT
></DL
></DIV
><P
>&#13; This chapter describes how to write programs that use
libgutenprint.
</P
><DIV
CLASS="sect1"
><H1
CLASS="sect1"
><A
NAME="AEN51"
>Code prerequisites</A
></H1
><P
>&#13; To use libgutenprint with a program, several steps must be taken:
</P
><P
></P
><UL
><LI
><P
>&#13; Include the master libgutenprint header:
<DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN57"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="programlisting"
>&#60;gimp-print/gimp-print.h&#62;</PRE
></TD
></TR
></TABLE
><P
></P
></DIV
>
</P
></LI
><LI
><P
>&#13; Call <CODE
CLASS="function"
>stp_init</CODE
>.
</P
></LI
><LI
><P
>&#13; Link with the libgutenprint library.
</P
></LI
></UL
><P
>&#13; The following is a short example program. It does not do
anything useful, but it does everything required to link with
libgutenprint and call other functions from libgutenprint.
</P
><DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN65"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="programlisting"
>#include &#60;gimp-print/gimp-print.h&#62;
int
main (int argc, char *argv[])
{
stp_init();
return 0;
}
</PRE
></TD
></TR
></TABLE
><P
></P
></DIV
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="c39.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x67.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Copying, modification and redistribution</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Linking with libgutenprint</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,12 +0,0 @@
.NAVHEADER { display: none }
.NAVFOOTER { display: none }
.TOC { display: none }
.NAVTOC { margin-left: 15;
display: none }
.NAVBTN { font-size: 10pt }
.TOCTITLE { font-size: 10pt;
color: blue;
text-decoration: underline; }

View File

@ -1,226 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Preface</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="PREVIOUS"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="NEXT"
TITLE="Copying, modification and redistribution"
HREF="c39.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="preface"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="book1.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="c39.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="preface"
><H1
><A
NAME="AEN14"
></A
>Preface</H1
><P
>&#13; Gutenprint is the print facility of the GNU Image Manipulation
Program (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 Linux, MacOS X and UNIX
on a par with proprietary vendor-supplied drivers in many cases,
and can be used for many of the most demanding printing tasks,
especially for high quality printing on modern inkjets, including
“photographic quality” models which offer very high
resolutions and several inks. The core of Gutenprint is a shared
library (libgutenprint) which may be used by any program that
wishes to produce high-quality printed output.
</P
><P
>&#13; This manual documents the use of the
<SPAN
CLASS="application"
>Gutenprint</SPAN
> package, focusing mainly on
the libgutenprint library that is the core of
<SPAN
CLASS="application"
>Gutenprint</SPAN
>. Parts of the manual which
describe the use of libgutenprint 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.
</P
><P
>&#13; For the end-user, there is a separate manual documenting
programs that come with Gutenprint, including the
<SPAN
CLASS="application"
>GIMP</SPAN
> <B
CLASS="command"
>print</B
> plugin,
and the <SPAN
CLASS="application"
>CUPS</SPAN
> and
<SPAN
CLASS="application"
>Ghostscript</SPAN
> drivers.
</P
><P
>&#13; To learn how to use libgutenprint in your own programs is to look
at the source of the <B
CLASS="command"
>testpattern</B
>, located in
<TT
CLASS="filename"
>src/testpattern</TT
>, as well as
the source of the other programs that use libgutenprint, and
libgutenprint itself. Most importantly, please consult the API
reference and libgutenprint headers.
</P
><P
>&#13; The manual is split into several parts for the programmer. It
starts with a simple usage example of how to link a program with
libgutenprint, then how to integrate this into package build
scripts, using <B
CLASS="command"
>make</B
>,
<B
CLASS="command"
>autoconf</B
> and <B
CLASS="command"
>automake</B
>. The
appendices cover the detail of the inner workings of some parts of
libgutenprint.
</P
><P
>&#13; The following sections detail the dither and weave algorithms used
in libgutenprint, the ESC/P2 printer control language used in Epson
printers and how to add support for a new printer to libgutenprint.
</P
><P
>&#13; <P
CLASS="literallayout"
>We&nbsp;hope&nbsp;you&nbsp;enjoy&nbsp;using&nbsp;Gutenprint!<br>
—The&nbsp;Gutenprint&nbsp;project<br>
&nbsp;&nbsp;&nbsp;&nbsp;</P
>
</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="c39.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>The Developer's Guide to Gutenprint</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Copying, modification and redistribution</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,588 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="UP"
TITLE="GNU General Public License"
HREF="gpl.html"><LINK
REL="PREVIOUS"
TITLE="GNU General Public License"
HREF="gpl.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="sect1"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="gpl.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Appendix A. GNU General Public License</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
>&nbsp;</TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="sect1"
><H1
CLASS="sect1"
><A
NAME="gpl-terms"
>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</A
></H1
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect0"
>Section 0</A
></H2
><P
>&#13; 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 <SPAN
CLASS="QUOTE"
>"work based on the Program"</SPAN
> 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 <SPAN
CLASS="QUOTE"
>"modification"</SPAN
>.)
Each licensee is addressed as <SPAN
CLASS="QUOTE"
>"you"</SPAN
>.
</P
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect1"
>Section 1</A
></H2
><P
>&#13; 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.
</P
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect2"
>Section 2</A
></H2
><P
>&#13; 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 <A
HREF="gpl-terms.html#gpl-sect1"
>Section 1</A
> above, provided
that you also meet all of these conditions:
<P
></P
><OL
TYPE="a"
><LI
><P
>&#13; You must cause the modified files to carry prominent
notices stating that you changed the files and the date
of any change.
</P
></LI
><LI
><P
>&#13; 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.
</P
></LI
><LI
><P
>&#13; 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.
<DIV
CLASS="note"
><BLOCKQUOTE
CLASS="note"
><P
><B
>Exception:: </B
>
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.)
</P
></BLOCKQUOTE
></DIV
>
</P
></LI
></OL
>
</P
><P
>&#13; 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.
</P
><P
>&#13; 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.
</P
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect3"
>Section 3</A
></H2
><P
>&#13; You may copy and distribute the Program (or a work based on
it, under <A
HREF="gpl-terms.html#gpl-sect2"
>Section 2</A
> in object
code or executable form under the terms of <A
HREF="gpl-terms.html#gpl-sect1"
>Sections 1</A
> and <A
HREF="gpl-terms.html#gpl-sect2"
>2</A
> above provided that you also do
one of the following:
<P
></P
><OL
TYPE="a"
><LI
><P
>&#13; 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,
</P
></LI
><LI
><P
>&#13; 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,
</P
></LI
><LI
><P
>&#13; 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.)
</P
></LI
></OL
>
</P
><P
>&#13; 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.
</P
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect4"
>Section 4</A
></H2
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect5"
>Section 5</A
></H2
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect6"
>Section 6</A
></H2
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect7"
>Section 7</A
></H2
><P
>&#13; 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.
</P
><P
>&#13; 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.
</P
><P
>&#13; 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.
</P
><P
>&#13; This section is intended to make thoroughly clear what is
believed to be a consequence of the rest of this License.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect8"
>Section 8</A
></H2
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect9"
>Section 9</A
></H2
><P
>&#13; 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.
</P
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect10"
>Section 10</A
></H2
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect11"
>NO WARRANTY</A
></H2
><FONT
COLOR="RED"
>Section 11</FONT
><P
>&#13; 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.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="gpl-sect12"
>Section 12</A
></H2
><P
>&#13; 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.
</P
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="gpl.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>&nbsp;</TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>GNU General Public License</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="gpl.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>&nbsp;</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,236 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>GNU General Public License</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="PREVIOUS"
TITLE="Dithering"
HREF="c1968.html"><LINK
REL="NEXT"
TITLE="TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION"
HREF="gpl-terms.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="appendix"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="c1968.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="gpl-terms.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="appendix"
><H1
><A
NAME="gpl"
></A
>Appendix A. GNU General Public License</H1
><DIV
CLASS="TOC"
><DL
><DT
><B
>Table of Contents</B
></DT
><DT
><A
HREF="gpl.html#gpl-preamble"
>Preamble</A
></DT
><DT
><A
HREF="gpl-terms.html"
>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</A
></DT
></DL
></DIV
><DIV
CLASS="sect1"
><H1
CLASS="sect1"
><A
NAME="gpl-preamble"
>Preamble</A
></H1
><P
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; 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
>&#13; We protect your rights with two steps:
<P
></P
><OL
TYPE="1"
><LI
><P
>&#13; copyright the software, and
</P
></LI
><LI
><P
>&#13; offer you this license which gives you legal permission to
copy, distribute and/or modify the software.
</P
></LI
></OL
>
</P
><P
>&#13; 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
>&#13; 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
>&#13; The precise terms and conditions for copying, distribution and
modification follow.
</P
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="c1968.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="gpl-terms.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Dithering</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,97 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="NEXT"
TITLE="Preface"
HREF="f14.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="legalnotice"
><P
></P
><A
NAME="AEN10"
></A
><P
>&#13; 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.
</P
><P
>&#13; 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.
</P
><P
>&#13; 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., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA.
</P
><P
></P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>&nbsp;</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 995 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 964 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 944 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 95 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 843 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 846 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 922 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

View File

@ -1,372 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Appropriate Remote Commands</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="UP"
TITLE="ESC/P2"
HREF="c464.html"><LINK
REL="PREVIOUS"
TITLE="Remote Mode Commands"
HREF="x955.html"><LINK
REL="NEXT"
TITLE="Weaving for inkjet printers"
HREF="c1717.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="sect1"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x955.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 5. ESC/P2</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="c1717.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="sect1"
><H1
CLASS="sect1"
><A
NAME="AEN1669"
>Appropriate Remote Commands</A
></H1
><P
>&#13; All of the remote commands described above are wrapped up with
the usual boilerplate. The files always start with
<TT
CLASS="literal"
>00 00 00</TT
> and the “magic”
command described above, then two <TT
CLASS="literal"
>ESC @</TT
>s to
reset the printer. The remote command sequences come next; if
they print anything that is usually followed by a
<TT
CLASS="literal"
>FF</TT
> (<TT
CLASS="literal"
>0C</TT
> hex) character to
feed the page, then the file ends with another two
<TT
CLASS="literal"
>ESC @</TT
>s to get back to the ground state.
</P
><P
>&#13; An alignment sequence goes like this:
</P
><P
></P
><OL
TYPE="1"
><LI
><P
>&#13; Host uses <TT
CLASS="literal"
>DT</TT
> to print an alignment
sheet.
</P
></LI
><LI
><P
>&#13; User eyeballs the sheet to see which is the best aligned
pattern.
</P
></LI
><LI
><P
>&#13; Host sends a <TT
CLASS="literal"
>DA</TT
> command indicating
which pattern the user chose.
</P
></LI
><LI
><P
>&#13; If the user said “realign”, meaning he isn't
done yet, go to step 1.
</P
></LI
><LI
><P
>&#13; We are done: host sends a <TT
CLASS="literal"
>SV</TT
> command
and exits.
</P
></LI
></OL
><P
>&#13; The sequence used (by the STC 3000, at least) to print from
the roll feed is (with byte count omitted):
</P
><DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN1693"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="screen"
>PM 00 00
SN 00 00 00
EX 00 00 00 00 05 01
ST 00 01
SM 00 02</PRE
></TD
></TR
></TABLE
><P
></P
></DIV
><P
>&#13; The sequence used by the STP 870 to print on plain paper is
</P
><DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN1696"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="screen"
>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
></TD
></TR
></TABLE
><P
></P
></DIV
><P
>&#13; and the job finishes with
</P
><DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN1699"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="screen"
>IR 00 02
LD</PRE
></TD
></TR
></TABLE
><P
></P
></DIV
><P
>&#13; For different paper type settings on the STP 870, the
arguments to <TT
CLASS="literal"
>SN</TT
> vary. The arguments to the
first and third <TT
CLASS="literal"
>SN</TT
> commands are as outlined
in the description of the <TT
CLASS="literal"
>SN</TT
> command above;
the arguments to the second (“platen gap”) are
<TT
CLASS="literal"
>00 01 01</TT
> for thick papers (“matte
paper—heavyweight”, “photo paper” and
“premium glossy photo paper”) and <TT
CLASS="literal"
>00 01
00</TT
> for all others.
</P
><P
>&#13; For roll-mode printing, the STP 870's sequence changes as
follows. <TT
CLASS="literal"
>IR</TT
>'s arguments become <TT
CLASS="literal"
>00
01</TT
> in the header, and <TT
CLASS="literal"
>00 00</TT
> after
the job, and <TT
CLASS="literal"
>EX</TT
>'s last argument changes
from <CODE
CLASS="constant"
>00</CODE
> to <CODE
CLASS="constant"
>01</CODE
>.
</P
><P
>&#13; For zero-margin printing on the STP 870, the arguments to
<TT
CLASS="literal"
>FP</TT
> become <TT
CLASS="literal"
>00 0xb0 0xff</TT
>.
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
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x955.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="c1717.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Remote Mode Commands</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="c464.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Weaving for inkjet printers</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,188 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Linking with libgutenprint</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="UP"
TITLE="Using libgutenprint"
HREF="c48.html"><LINK
REL="PREVIOUS"
TITLE="Using libgutenprint"
HREF="c48.html"><LINK
REL="NEXT"
TITLE="Integrating libgutenprint"
HREF="x79.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="sect1"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="c48.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 2. Using libgutenprint</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="x79.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="sect1"
><H1
CLASS="sect1"
><A
NAME="AEN67"
>Linking with libgutenprint</A
></H1
><P
>&#13; To link a program with libgutenprint, the option
<CODE
CLASS="option"
>-lgutenprint</CODE
> needs to be passed to the compiler
when linking. For example, to compile and link
<TT
CLASS="filename"
>stpimage.c</TT
> the following commands would be
used:
</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="screen"
><SAMP
CLASS="prompt"
>$</SAMP
> <KBD
CLASS="userinput"
>gcc -c stpimage.c</KBD
>
<SAMP
CLASS="prompt"
>$</SAMP
> <KBD
CLASS="userinput"
>gcc -o stpimage -lgutenprint stpimage.o</KBD
></PRE
></TD
></TR
></TABLE
><P
>&#13; The compiler and linker flags needed may vary depending on the
options Gutenprint was configured with when it was built. The
<B
CLASS="command"
>pkg-config</B
> script will give the correct
parameters for the local installation.
</P
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="c48.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="x79.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Using libgutenprint</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="c48.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Integrating libgutenprint</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,669 +0,0 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<HTML
><HEAD
><TITLE
>Integrating libgutenprint</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
REL="HOME"
TITLE="The Developer's Guide to Gutenprint"
HREF="book1.html"><LINK
REL="UP"
TITLE="Using libgutenprint"
HREF="c48.html"><LINK
REL="PREVIOUS"
TITLE="Linking with libgutenprint"
HREF="x67.html"><LINK
REL="NEXT"
TITLE="Reporting Bugs"
HREF="c194.html"><META
http-equiv="Content-Type"
content="text/html; charset=@encoding@"></HEAD
><BODY
CLASS="sect1"
><DIV
CLASS="NAVHEADER"
><TABLE
SUMMARY="Header navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>The Developer's Guide to Gutenprint</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="x67.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
>Chapter 2. Using libgutenprint</TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="c194.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="sect1"
><H1
CLASS="sect1"
><A
NAME="AEN79"
>Integrating libgutenprint</A
></H1
><P
>&#13; This section describes how to integrate the compiling and
linking of programs using libgutenprint with build
scripts. Commonly used systems include <B
CLASS="command"
>make</B
>,
but often <TT
CLASS="filename"
>Makefile</TT
> files are generated by
using tools such as <B
CLASS="command"
>autoconf</B
> and
<B
CLASS="command"
>automake</B
>.
</P
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="AEN86"
><B
CLASS="command"
>pkg-config</B
></A
></H2
><P
>&#13; Depending on the nature of the computer system Gutenprint was
installed on, as well as the options passed to
<B
CLASS="command"
>configure</B
> when configuring the package when
it was built, the <CODE
CLASS="varname"
>CFLAGS</CODE
> and
<CODE
CLASS="varname"
>LIBS</CODE
> parameters needed to compile and link
programs with libgutenprint may vary. To make it simple to
determine what these are on any given system, a
<B
CLASS="command"
>pkg-config</B
> datafile was created when
Gutenprint was built. <B
CLASS="command"
>pkg-config</B
> will
output the correct parameters for the setup on your system.
See the
<SPAN
CLASS="citerefentry"
><SPAN
CLASS="refentrytitle"
>pkg-config(1)</SPAN
></SPAN
> manual page for a compete synopsis.
</P
><P
>&#13; The correct <CODE
CLASS="varname"
>CFLAGS</CODE
> to use can be obtained
with the <CODE
CLASS="option"
>--cflags</CODE
> option:
</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="screen"
><SAMP
CLASS="prompt"
>$</SAMP
> <KBD
CLASS="userinput"
>pkg-config --cflags gutenprint</KBD
>
-I/usr/local/include</PRE
></TD
></TR
></TABLE
><P
>&#13; The correct <CODE
CLASS="varname"
>LIBS</CODE
> to use can the obtained
with the <CODE
CLASS="option"
>--libs</CODE
> option:
</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="screen"
><SAMP
CLASS="prompt"
>$</SAMP
> <KBD
CLASS="userinput"
>pkg-config --libs gutenprint</KBD
>
-L/usr/local/lib -lgutenprint -lm -ldl</PRE
></TD
></TR
></TABLE
><P
>&#13; Lastly, the installed version of Gutenprint can be obtained with the
<CODE
CLASS="varname"
>--version</CODE
> option:
</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="screen"
><SAMP
CLASS="prompt"
>$</SAMP
> <KBD
CLASS="userinput"
>pkg-config --modversion gutenprint</KBD
>
4.3.23</PRE
></TD
></TR
></TABLE
><P
>&#13; The command can be used from the shell by enclosing it in
backquotes `:
</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="screen"
><SAMP
CLASS="prompt"
>$</SAMP
> <KBD
CLASS="userinput"
>gcc `pkg-config --cflags gutenprint` -c stpimage.c</KBD
>
<SAMP
CLASS="prompt"
>$</SAMP
> <KBD
CLASS="userinput"
>gcc `pkg-config --libs gutenprint` -o
stpimage stpimage.o</KBD
></PRE
></TD
></TR
></TABLE
><P
>&#13; However, this is not the way it it typically used. Normally
it is used in a <TT
CLASS="filename"
>Makefile</TT
> or by an m4
macro in a <B
CLASS="command"
>configure</B
> script.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="AEN123"
><B
CLASS="command"
>make</B
></A
></H2
><P
>&#13; If you use <B
CLASS="command"
>make</B
> with your own
<TT
CLASS="filename"
>Makefile</TT
> files, then you are on your
own. This manual offers no assistance with doing this. Only
the following suggestion is offered, for use with GNU
<B
CLASS="command"
>make</B
>:
</P
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="programlisting"
>GUTENPRINT_VERSION = $(shell pkg-config --version gutenprint)
GUTENPRINT_CFLAGS = $(shell pkg-config --cflags gutenprint)
GUTENPRINT_LIBS = $(shell pkg-config --libs gutenprint)</PRE
></TD
></TR
></TABLE
><P
>&#13; How you choose to use these variables is entirely up to
you. See the GNU <B
CLASS="command"
>make</B
> manual for more
information.
</P
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="AEN133"
><B
CLASS="command"
>autoconf</B
></A
></H2
><P
>&#13; The <B
CLASS="command"
>autoconf</B
> program produces a Bourne
shell script called <TT
CLASS="filename"
>configure</TT
> from a
template file called <TT
CLASS="filename"
>configure.ac</TT
>.
<TT
CLASS="filename"
>configure.ac</TT
> contains both Bourne shell
script, and m4 macros. <B
CLASS="command"
>autoconf</B
> expands
the m4 macros into real shell script. The
resulting <B
CLASS="command"
>configure</B
> script performs various
checks for installed programs, compiler characteristics and
other system information such as available headers and
libraries. See the GNU <B
CLASS="command"
>autoconf</B
> manual for
more information.
</P
><P
>&#13; <B
CLASS="command"
>pkg-config</B
> provides an m4 macro,
<CODE
CLASS="function"
>PKG_CHECK_MODULES</CODE
>, suitable for use in a
<TT
CLASS="filename"
>configure.ac</TT
> script. It defines the
environment variables required for building libgutenprint-based
programs. For example, to set GUTENPRINT_CFLAGS and
GUTENPRINT_LIBS:
</P
><DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN148"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="programlisting"
>PKG_CHECK_MODULES(GUTENPRINT, gutenprint)</PRE
></TD
></TR
></TABLE
><P
></P
></DIV
></DIV
><DIV
CLASS="sect2"
><H2
CLASS="sect2"
><A
NAME="AEN150"
><B
CLASS="command"
>automake</B
></A
></H2
><P
>&#13; The <B
CLASS="command"
>automake</B
> program can be used to
generate <TT
CLASS="filename"
>Makefile.in</TT
> files suitable for
use with a <TT
CLASS="filename"
>configure</TT
> script generated by
<B
CLASS="command"
>autoconf</B
>. As <B
CLASS="command"
>automake</B
>
<SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>requires</I
></SPAN
> <B
CLASS="command"
>autoconf</B
>,
this section will assume the use of a
<TT
CLASS="filename"
>configure.ac</TT
> script which uses the
<CODE
CLASS="function"
>PKG_CHECK_MODULES</CODE
> macro described above
(there is little point in <SPAN
CLASS="emphasis"
><I
CLASS="emphasis"
>not</I
></SPAN
> using it!).
</P
><P
>&#13; It is highly recommended that you use GNU
<B
CLASS="command"
>autoconf</B
> and
<B
CLASS="command"
>automake</B
>. They will allow you to make your
software build on most platforms with most compilers.
<B
CLASS="command"
>automake</B
> makes writing complex
<TT
CLASS="filename"
>Makefile</TT
>'s 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
CLASS="filename"
>Makefile</TT
>'s, 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
CLASS="filename"
>Makefile.in</TT
> files such as
<CODE
CLASS="option"
>dist</CODE
>, <CODE
CLASS="option"
>distcheck</CODE
>,
<CODE
CLASS="option"
>clean</CODE
>, <CODE
CLASS="option"
>distclean</CODE
>,
<CODE
CLASS="option"
>maintainer-clean</CODE
> and <CODE
CLASS="option"
>tags</CODE
>,
and there are many more more available. See the GNU
<B
CLASS="command"
>automake</B
> manual for more information.
</P
><P
>&#13; Because <CODE
CLASS="function"
>PKG_CHECK_MODULES</CODE
> calls
<CODE
CLASS="function"
>AC_SUBST</CODE
> to substitute
<CODE
CLASS="varname"
>GUTENPRINT_CFLAGS</CODE
> and
<CODE
CLASS="varname"
>GUTENPRINT_LIBS</CODE
>, <B
CLASS="command"
>automake</B
>
will automatically set these variables in the
<TT
CLASS="filename"
>Makefile.in</TT
> files it generates, requiring
no additional effort on your part!
</P
><P
>&#13; As in previous examples, we will make a program
<B
CLASS="command"
>stpimage</B
> from
<TT
CLASS="filename"
>stpimage.c</TT
>. This is how one might build
write a <TT
CLASS="filename"
>Makefile.am</TT
> to do this:
</P
><DIV
CLASS="informalexample"
><P
></P
><A
NAME="AEN189"
></A
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="programlisting"
>@SET_MAKE@
AM_CFLAGS = $(GUTENPRINT_CFLAGS)
bin_PROGRAMS = stpimage
stpimage_SOURCES = stpimage.c
stpimage_LDADD = $(GUTENPRINT_LIBS)
MAINTAINERCLEANFILES = Makefile.in</PRE
></TD
></TR
></TABLE
><P
></P
></DIV
><P
>&#13; That's all there is to it! Please note that this example also
requires the macro <CODE
CLASS="function"
>AC_PROG_MAKE_SET</CODE
> to be
used in <TT
CLASS="filename"
>configure.ac</TT
>.
</P
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
SUMMARY="Footer navigation table"
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="x67.html"
ACCESSKEY="P"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="book1.html"
ACCESSKEY="H"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="c194.html"
ACCESSKEY="N"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Linking with libgutenprint</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="c48.html"
ACCESSKEY="U"
>Up</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Reporting Bugs</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>

View File

@ -1,235 +0,0 @@
<chapter>
<title>Using libgutenprint</title>
<para>
This chapter describes how to write programs that use
libgutenprint.
</para>
<sect1>
<title>Code prerequisites</title>
<para>
To use libgutenprint with a program, several steps must be taken:
</para>
<itemizedlist>
<listitem>
<para>
Include the master libgutenprint header:
<informalexample>
<programlisting>&lt;gimp-print/gimp-print.h&gt;</programlisting>
</informalexample>
</para>
</listitem>
<listitem>
<para>
Call <function>stp_init</function>.
</para>
</listitem>
<listitem>
<para>
Link with the libgutenprint library.
</para>
</listitem>
</itemizedlist>
<para>
The following is a short example program. It does not do
anything useful, but it does everything required to link with
libgutenprint and call other functions from libgutenprint.
</para>
<informalexample>
<programlisting>#include &lt;gimp-print/gimp-print.h&gt;
int
main (int argc, char *argv[])
{
stp_init();
return 0;
}
</programlisting>
</informalexample>
</sect1>
<sect1>
<title>Linking with libgutenprint</title>
<para>
To link a program with libgutenprint, the option
<option>-lgutenprint</option> needs to be passed to the compiler
when linking. For example, to compile and link
<filename>stpimage.c</filename> the following commands would be
used:
</para>
<screen><prompt>$</prompt> <userinput>gcc -c stpimage.c</userinput>
<prompt>$</prompt> <userinput>gcc -o stpimage -lgutenprint stpimage.o</userinput></screen>
<para>
The compiler and linker flags needed may vary depending on the
options Gutenprint was configured with when it was built. The
<command>pkg-config</command> script will give the correct
parameters for the local installation.
</para>
</sect1>
<sect1>
<title>Integrating libgutenprint</title>
<para>
This section describes how to integrate the compiling and
linking of programs using libgutenprint with build
scripts. Commonly used systems include <command>make</command>,
but often <filename>Makefile</filename> files are generated by
using tools such as <command>autoconf</command> and
<command>automake</command>.
</para>
<sect2>
<title><command>pkg-config</command></title>
<para>
Depending on the nature of the computer system Gutenprint was
installed on, as well as the options passed to
<command>configure</command> when configuring the package when
it was built, the <varname>CFLAGS</varname> and
<varname>LIBS</varname> parameters needed to compile and link
programs with libgutenprint may vary. To make it simple to
determine what these are on any given system, a
<command>pkg-config</command> datafile was created when
Gutenprint was built. <command>pkg-config</command> will
output the correct parameters for the setup on your system.
See the
<citerefentry><refentrytitle>pkg-config(1)</refentrytitle>
</citerefentry> manual page for a compete synopsis.
</para>
<para>
The correct <varname>CFLAGS</varname> to use can be obtained
with the <option>--cflags</option> option:
</para>
<screen><prompt>$</prompt> <userinput>pkg-config --cflags gutenprint</userinput>
-I/usr/local/include</screen>
<para>
The correct <varname>LIBS</varname> to use can the obtained
with the <option>--libs</option> option:
</para>
<screen><prompt>$</prompt> <userinput>pkg-config --libs gutenprint</userinput>
-L/usr/local/lib -lgutenprint -lm -ldl</screen>
<para>
Lastly, the installed version of Gutenprint can be obtained with the
<varname>--version</varname> option:
</para>
<screen><prompt>$</prompt> <userinput>pkg-config --modversion gutenprint</userinput>
4.3.23</screen>
<para>
The command can be used from the shell by enclosing it in
backquotes &lsquo;`&rsquo;:
</para>
<screen><prompt>$</prompt> <userinput>gcc `pkg-config --cflags gutenprint` -c stpimage.c</userinput>
<prompt>$</prompt> <userinput>gcc `pkg-config --libs gutenprint` -o
stpimage stpimage.o</userinput></screen>
<para>
However, this is not the way it it typically used. Normally
it is used in a <filename>Makefile</filename> or by an m4
macro in a <command>configure</command> script.
</para>
</sect2>
<sect2>
<title><command>make</command></title>
<para>
If you use <command>make</command> with your own
<filename>Makefile</filename> files, then you are on your
own. This manual offers no assistance with doing this. Only
the following suggestion is offered, for use with GNU
<command>make</command>:
</para>
<programlisting>GUTENPRINT_VERSION = $(shell pkg-config --version gutenprint)
GUTENPRINT_CFLAGS = $(shell pkg-config --cflags gutenprint)
GUTENPRINT_LIBS = $(shell pkg-config --libs gutenprint)</programlisting>
<para>
How you choose to use these variables is entirely up to
you. See the GNU <command>make</command> manual for more
information.
</para>
</sect2>
<sect2>
<title><command>autoconf</command></title>
<para>
The <command>autoconf</command> program produces a Bourne
shell script called <filename>configure</filename> from a
template file called <filename>configure.ac</filename>.
<filename>configure.ac</filename> contains both Bourne shell
script, and m4 macros. <command>autoconf</command> expands
the m4 macros into &lsquo;real&rsquo; shell script. The
resulting <command>configure</command> script performs various
checks for installed programs, compiler characteristics and
other system information such as available headers and
libraries. See the GNU <command>autoconf</command> manual for
more information.
</para>
<para>
<command>pkg-config</command> provides an m4 macro,
<function>PKG_CHECK_MODULES</function>, suitable for use in a
<filename>configure.ac</filename> script. It defines the
environment variables required for building libgutenprint-based
programs. For example, to set GUTENPRINT_CFLAGS and
GUTENPRINT_LIBS:
</para>
<informalexample>
<programlisting>PKG_CHECK_MODULES(GUTENPRINT, gutenprint)</programlisting>
</informalexample>
</sect2>
<sect2>
<title><command>automake</command></title>
<para>
The <command>automake</command> program can be used to
generate <filename>Makefile.in</filename> files suitable for
use with a <filename>configure</filename> script generated by
<command>autoconf</command>. As <command>automake</command>
<emphasis>requires</emphasis> <command>autoconf</command>,
this section will assume the use of a
<filename>configure.ac</filename> script which uses the
<function>PKG_CHECK_MODULES</function> macro described above
(there is little point in <emphasis>not</emphasis> using it!).
</para>
<para>
It is highly recommended that you use GNU
<command>autoconf</command> and
<command>automake</command>. They will allow you to make your
software build on most platforms with most compilers.
<command>automake</command> makes writing complex
<filename>Makefile</filename>'s 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
<filename>Makefile</filename>'s, 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 <filename>Makefile.in</filename> files such as
<option>dist</option>, <option>distcheck</option>,
<option>clean</option>, <option>distclean</option>,
<option>maintainer-clean</option> and <option>tags</option>,
and there are many more more available. See the GNU
<command>automake</command> manual for more information.
</para>
<para>
Because <function>PKG_CHECK_MODULES</function> calls
<function>AC_SUBST</function> to substitute
<varname>GUTENPRINT_CFLAGS</varname> and
<varname>GUTENPRINT_LIBS</varname>, <command>automake</command>
will automatically set these variables in the
<filename>Makefile.in</filename> files it generates, requiring
no additional effort on your part!
</para>
<para>
As in previous examples, we will make a program
<command>stpimage</command> from
<filename>stpimage.c</filename>. This is how one might build
write a <filename>Makefile.am</filename> to do this:
</para>
<informalexample>
<programlisting>@SET_MAKE@
AM_CFLAGS = $(GUTENPRINT_CFLAGS)
bin_PROGRAMS = stpimage
stpimage_SOURCES = stpimage.c
stpimage_LDADD = $(GUTENPRINT_LIBS)
MAINTAINERCLEANFILES = Makefile.in</programlisting>
</informalexample>
<para>
That's all there is to it! Please note that this example also
requires the macro <function>AC_PROG_MAKE_SET</function> to be
used in <filename>configure.ac</filename>.
</para>
</sect2>
</sect1>
</chapter>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,85 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Data Structures</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="classes.html"><span>Data&#160;Structure&#160;Index</span></a></li>
<li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Data Structures</div> </div>
</div>
<div class="contents">
<div class="textblock">Here are the data structures with brief descriptions:</div><table>
<tr><td class="indexkey"><a class="el" href="structdither__matrix__impl.html">dither_matrix_impl</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__color.html">stp_color</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__colorfuncs__t.html">stp_colorfuncs_t</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__curve__point__t.html">stp_curve_point_t</a></td><td class="indexvalue">Point (x,y) for piecewise curve </td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__dither__matrix__generic.html">stp_dither_matrix_generic</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__dither__matrix__normal.html">stp_dither_matrix_normal</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__dither__matrix__short.html">stp_dither_matrix_short</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__dotsize.html">stp_dotsize</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__double__bound__t.html">stp_double_bound_t</a></td><td class="indexvalue">Double_bound (range) parameter </td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__family.html">stp_family</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__image.html">stp_image</a></td><td class="indexvalue">The image type is an abstract data type for interfacing with the image creation program </td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__int__bound__t.html">stp_int_bound_t</a></td><td class="indexvalue">Int_bound (range) parameter </td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__lineactive__t.html">stp_lineactive_t</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__linebounds__t.html">stp_linebounds_t</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__linebufs__t.html">stp_linebufs_t</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__linecount__t.html">stp_linecount_t</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__lineoff__t.html">stp_lineoff_t</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__module.html">stp_module</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__module__version.html">stp_module_version</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__mxml__attr__s.html">stp_mxml_attr_s</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__mxml__node__s.html">stp_mxml_node_s</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__mxml__text__s.html">stp_mxml_text_s</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__mxml__value__s.html">stp_mxml_value_s</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="unionstp__mxml__value__u.html">stp_mxml_value_u</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__papersize__t.html">stp_papersize_t</a></td><td class="indexvalue">The papersize data type </td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__param__string__t.html">stp_param_string_t</a></td><td class="indexvalue">String parameter </td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__parameter__t.html">stp_parameter_t</a></td><td class="indexvalue">Parameter description </td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__pass__t.html">stp_pass_t</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__printfuncs__t.html">stp_printfuncs_t</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__raw__t.html">stp_raw_t</a></td><td class="indexvalue">Raw parameter </td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__shade.html">stp_shade</a></td><td class="indexvalue"></td></tr>
<tr><td class="indexkey"><a class="el" href="structstp__weave__t.html">stp_weave_t</a></td><td class="indexvalue"></td></tr>
</table>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,88 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: include/gutenprint/array.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#typedef-members">Typedefs</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">include/gutenprint/array.h File Reference</div> </div>
</div>
<div class="contents">
<p>Array functions.
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;<a class="el" href="sequence_8h.html">gutenprint/sequence.h</a>&gt;</code><br/>
</div><table class="memberdecls">
<tr><td colspan="2"><h2><a name="typedef-members"></a>
Typedefs</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct stp_array&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The array opaque data type. <a href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#gaa3d385d3e2f248b1c1ac88d5f103e9a2">stp_array_create</a> (int x_size, int y_size)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a new array. <a href="group__array.html#gaa3d385d3e2f248b1c1ac88d5f103e9a2"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#gaafb2573df35220ef9be3f6ba4b8c871b">stp_array_destroy</a> (<a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *array)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroy an array. <a href="group__array.html#gaafb2573df35220ef9be3f6ba4b8c871b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#gaaa9bf798890e01b4bbce8cda45615021">stp_array_copy</a> (<a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *dest, const <a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *source)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy an array. <a href="group__array.html#gaaa9bf798890e01b4bbce8cda45615021"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#gad0b50228ca40df79196197f9c21f4b56">stp_array_create_copy</a> (const <a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *array)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy and allocate an array. <a href="group__array.html#gad0b50228ca40df79196197f9c21f4b56"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#gae6fb91b246ef5abd388927cb9674503e">stp_array_set_size</a> (<a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *array, int x_size, int y_size)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Resize an array. <a href="group__array.html#gae6fb91b246ef5abd388927cb9674503e"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#gafe61db801ab3b0326646178e536dd161">stp_array_get_size</a> (const <a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *array, int *x_size, int *y_size)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the size of an array. <a href="group__array.html#gafe61db801ab3b0326646178e536dd161"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#gaea0493f5bec9c5c185679adfde3edc9a">stp_array_set_data</a> (<a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *array, const double *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data in an array. <a href="group__array.html#gaea0493f5bec9c5c185679adfde3edc9a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#gae0d44ee80048189d244b16f231c54b80">stp_array_get_data</a> (const <a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *array, size_t *size, const double **data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the data in an array. <a href="group__array.html#gae0d44ee80048189d244b16f231c54b80"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#gad6b95b2efd500007b098594826f4467f">stp_array_set_point</a> (<a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *array, int x, int y, double data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data at a single point in the array. <a href="group__array.html#gad6b95b2efd500007b098594826f4467f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#ga9078af984a5e1ec80a6068bdb51c9a6d">stp_array_get_point</a> (const <a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *array, int x, int y, double *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the data at a single point in the array. <a href="group__array.html#ga9078af984a5e1ec80a6068bdb51c9a6d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__sequence.html#ga327a46aa1d782a4cd53abf306068e272">stp_sequence_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__array.html#gae05ba5cfe8c03e2435348d6c5488d87e">stp_array_get_sequence</a> (const <a class="el" href="group__array.html#ga26a474575a39c1c36ad520b95aa813b0">stp_array_t</a> *array)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the underlying stp_sequence_t. <a href="group__array.html#gae05ba5cfe8c03e2435348d6c5488d87e"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Array functions. </p>
</div></div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 677 B

View File

@ -1,806 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: include/gutenprint/bit-ops.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">include/gutenprint/bit-ops.h File Reference</div> </div>
</div>
<div class="contents">
<p>Bit operations.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#a1a36a9f23f967528df8fffbd71b5e96c">stp_fold</a> (const unsigned char *line, int single_length, unsigned char *outbuf)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Interleave a buffer consisting of two bit strings of length single_length into one string of packed two-bit ints. <a href="#a1a36a9f23f967528df8fffbd71b5e96c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#a0ee5e547d025f7113f275dbb4614230c">stp_fold_3bit</a> (const unsigned char *line, int single_length, unsigned char *outbuf)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Interleave a buffer consisting of three bit strings of length single_length into one string of packed three-bit ints. <a href="#a0ee5e547d025f7113f275dbb4614230c"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#afe47834318158a214ca693f1433996f1">stp_fold_3bit_323</a> (const unsigned char *line, int single_length, unsigned char *outbuf)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Interleave a buffer consisting of three bit strings of length single_length into one string of packed three-bit ints. <a href="#afe47834318158a214ca693f1433996f1"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#a62ac3ec2651afff5fbe6c63544a13c66">stp_fold_4bit</a> (const unsigned char *line, int single_length, unsigned char *outbuf)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Interleave a buffer consisting of four bit strings of length single_length into one string of packed four-bit ints. <a href="#a62ac3ec2651afff5fbe6c63544a13c66"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#a8509200fc0bff8d1f5928f04bf1edd2b">stp_split</a> (int height, int bits, int n, const unsigned char *in, int stride, unsigned char **outs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Split an input sequence of packed 1 or 2 bit integers into two or more outputs of equal length, distributing non-zero integers round robin into each output. <a href="#a8509200fc0bff8d1f5928f04bf1edd2b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#a260a00a6551c9e27e56ea1fab9444d80">stp_split_2</a> (int height, int bits, const unsigned char *in, unsigned char *outhi, unsigned char *outlo)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated -- use stp_split. <a href="#a260a00a6551c9e27e56ea1fab9444d80"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#a6d93a70fcc820df08fcf8d380b9743f5">stp_split_4</a> (int height, int bits, const unsigned char *in, unsigned char *out0, unsigned char *out1, unsigned char *out2, unsigned char *out3)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated -- use stp_split. <a href="#a6d93a70fcc820df08fcf8d380b9743f5"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#a6512fc112307407fa2f30468b80ef69d">stp_unpack</a> (int height, int bits, int n, const unsigned char *in, unsigned char **outs)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Unpack an input sequence of packed 1 or 2 bit integers into two or more outputs of equal length. <a href="#a6512fc112307407fa2f30468b80ef69d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#ae04e96586931b37257f4547eca77b116">stp_unpack_2</a> (int height, int bits, const unsigned char *in, unsigned char *outlo, unsigned char *outhi)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated -- use stp_unpack. <a href="#ae04e96586931b37257f4547eca77b116"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#ac5bb5a178b5c6275e7e7c2f6b5064342">stp_unpack_4</a> (int height, int bits, const unsigned char *in, unsigned char *out0, unsigned char *out1, unsigned char *out2, unsigned char *out3)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated -- use stp_unpack. <a href="#ac5bb5a178b5c6275e7e7c2f6b5064342"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#a958196e6b7349e883a450e52cae83d93">stp_unpack_8</a> (int height, int bits, const unsigned char *in, unsigned char *out0, unsigned char *out1, unsigned char *out2, unsigned char *out3, unsigned char *out4, unsigned char *out5, unsigned char *out6, unsigned char *out7)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated -- use stp_unpack. <a href="#a958196e6b7349e883a450e52cae83d93"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="bit-ops_8h.html#a8ddfbe4f60566d4111b4c4d88a956d1b">stp_unpack_16</a> (int height, int bits, const unsigned char *in, unsigned char *out0, unsigned char *out1, unsigned char *out2, unsigned char *out3, unsigned char *out4, unsigned char *out5, unsigned char *out6, unsigned char *out7, unsigned char *out8, unsigned char *out9, unsigned char *out10, unsigned char *out11, unsigned char *out12, unsigned char *out13, unsigned char *out14, unsigned char *out15)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Deprecated -- use stp_unpack. <a href="#a8ddfbe4f60566d4111b4c4d88a956d1b"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Bit operations. </p>
</div><hr/><h2>Function Documentation</h2>
<a class="anchor" id="a1a36a9f23f967528df8fffbd71b5e96c"></a><!-- doxytag: member="bit&#45;ops.h::stp_fold" ref="a1a36a9f23f967528df8fffbd71b5e96c" args="(const unsigned char *line, int single_length, unsigned char *outbuf)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_fold </td>
<td>(</td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>line</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>single_length</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>outbuf</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Interleave a buffer consisting of two bit strings of length single_length into one string of packed two-bit ints. </p>
<dl><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramname">line</td><td>the input bit string </td></tr>
<tr><td class="paramname">single_length</td><td>the length (in bytes) of the input </td></tr>
<tr><td class="paramname">outbuf</td><td>the output. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="a0ee5e547d025f7113f275dbb4614230c"></a><!-- doxytag: member="bit&#45;ops.h::stp_fold_3bit" ref="a0ee5e547d025f7113f275dbb4614230c" args="(const unsigned char *line, int single_length, unsigned char *outbuf)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_fold_3bit </td>
<td>(</td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>line</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>single_length</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>outbuf</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Interleave a buffer consisting of three bit strings of length single_length into one string of packed three-bit ints. </p>
<dl><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramname">line</td><td>the input bit string </td></tr>
<tr><td class="paramname">single_length</td><td>the length (in bytes) of the input </td></tr>
<tr><td class="paramname">outbuf</td><td>the output. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="afe47834318158a214ca693f1433996f1"></a><!-- doxytag: member="bit&#45;ops.h::stp_fold_3bit_323" ref="afe47834318158a214ca693f1433996f1" args="(const unsigned char *line, int single_length, unsigned char *outbuf)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_fold_3bit_323 </td>
<td>(</td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>line</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>single_length</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>outbuf</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Interleave a buffer consisting of three bit strings of length single_length into one string of packed three-bit ints. </p>
<dl><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramname">line</td><td>the input bit string </td></tr>
<tr><td class="paramname">single_length</td><td>the length (in bytes) of the input </td></tr>
<tr><td class="paramname">outbuf</td><td>the output. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="a62ac3ec2651afff5fbe6c63544a13c66"></a><!-- doxytag: member="bit&#45;ops.h::stp_fold_4bit" ref="a62ac3ec2651afff5fbe6c63544a13c66" args="(const unsigned char *line, int single_length, unsigned char *outbuf)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_fold_4bit </td>
<td>(</td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>line</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>single_length</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>outbuf</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Interleave a buffer consisting of four bit strings of length single_length into one string of packed four-bit ints. </p>
<dl><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramname">line</td><td>the input bit string </td></tr>
<tr><td class="paramname">single_length</td><td>the length (in bytes) of the input </td></tr>
<tr><td class="paramname">outbuf</td><td>the output. </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="a8509200fc0bff8d1f5928f04bf1edd2b"></a><!-- doxytag: member="bit&#45;ops.h::stp_split" ref="a8509200fc0bff8d1f5928f04bf1edd2b" args="(int height, int bits, int n, const unsigned char *in, int stride, unsigned char **outs)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_split </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>bits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>n</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>in</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>stride</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char **&#160;</td>
<td class="paramname"><em>outs</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Split an input sequence of packed 1 or 2 bit integers into two or more outputs of equal length, distributing non-zero integers round robin into each output. </p>
<p>Used in "high quality" modes when extra passes are made, to ensure that each pass gets an equal number of ink drops. Each output is as long as the input.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramname">height</td><td>the number of integers in the input divided by 8 </td></tr>
<tr><td class="paramname">bits</td><td>the bit depth (1 or 2) </td></tr>
<tr><td class="paramname">n</td><td>the number of outputs into which the input should be distributed </td></tr>
<tr><td class="paramname">in</td><td>the input bit string </td></tr>
<tr><td class="paramname">stride</td><td>the stride across the outputs (if it's necessary to distribute the input over non-contiguous members of the array of outputs) </td></tr>
<tr><td class="paramname">outs</td><td>the array of output bit strings </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="a260a00a6551c9e27e56ea1fab9444d80"></a><!-- doxytag: member="bit&#45;ops.h::stp_split_2" ref="a260a00a6551c9e27e56ea1fab9444d80" args="(int height, int bits, const unsigned char *in, unsigned char *outhi, unsigned char *outlo)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_split_2 </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>bits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>in</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>outhi</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>outlo</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Deprecated -- use stp_split. </p>
</div>
</div>
<a class="anchor" id="a6d93a70fcc820df08fcf8d380b9743f5"></a><!-- doxytag: member="bit&#45;ops.h::stp_split_4" ref="a6d93a70fcc820df08fcf8d380b9743f5" args="(int height, int bits, const unsigned char *in, unsigned char *out0, unsigned char *out1, unsigned char *out2, unsigned char *out3)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_split_4 </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>bits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>in</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out0</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out3</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Deprecated -- use stp_split. </p>
</div>
</div>
<a class="anchor" id="a6512fc112307407fa2f30468b80ef69d"></a><!-- doxytag: member="bit&#45;ops.h::stp_unpack" ref="a6512fc112307407fa2f30468b80ef69d" args="(int height, int bits, int n, const unsigned char *in, unsigned char **outs)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_unpack </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>bits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>n</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>in</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char **&#160;</td>
<td class="paramname"><em>outs</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Unpack an input sequence of packed 1 or 2 bit integers into two or more outputs of equal length. </p>
<p>The input is round robined into the outputs. Each output is 1/n as long as the input.</p>
<dl><dt><b>Parameters:</b></dt><dd>
<table class="params">
<tr><td class="paramname">height</td><td>the number of integers in the input divided by 8 </td></tr>
<tr><td class="paramname">bits</td><td>the bit depth (1 or 2) </td></tr>
<tr><td class="paramname">n</td><td>the number of outputs into which the input should be distributed </td></tr>
<tr><td class="paramname">in</td><td>the input bit string </td></tr>
<tr><td class="paramname">outs</td><td>the array of output bit strings </td></tr>
</table>
</dd>
</dl>
</div>
</div>
<a class="anchor" id="a8ddfbe4f60566d4111b4c4d88a956d1b"></a><!-- doxytag: member="bit&#45;ops.h::stp_unpack_16" ref="a8ddfbe4f60566d4111b4c4d88a956d1b" args="(int height, int bits, const unsigned char *in, unsigned char *out0, unsigned char *out1, unsigned char *out2, unsigned char *out3, unsigned char *out4, unsigned char *out5, unsigned char *out6, unsigned char *out7, unsigned char *out8, unsigned char *out9, unsigned char *out10, unsigned char *out11, unsigned char *out12, unsigned char *out13, unsigned char *out14, unsigned char *out15)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_unpack_16 </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>bits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>in</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out0</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out4</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out5</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out6</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out7</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out8</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out9</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out10</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out11</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out12</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out13</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out14</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out15</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Deprecated -- use stp_unpack. </p>
</div>
</div>
<a class="anchor" id="ae04e96586931b37257f4547eca77b116"></a><!-- doxytag: member="bit&#45;ops.h::stp_unpack_2" ref="ae04e96586931b37257f4547eca77b116" args="(int height, int bits, const unsigned char *in, unsigned char *outlo, unsigned char *outhi)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_unpack_2 </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>bits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>in</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>outlo</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>outhi</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Deprecated -- use stp_unpack. </p>
</div>
</div>
<a class="anchor" id="ac5bb5a178b5c6275e7e7c2f6b5064342"></a><!-- doxytag: member="bit&#45;ops.h::stp_unpack_4" ref="ac5bb5a178b5c6275e7e7c2f6b5064342" args="(int height, int bits, const unsigned char *in, unsigned char *out0, unsigned char *out1, unsigned char *out2, unsigned char *out3)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_unpack_4 </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>bits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>in</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out0</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out3</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Deprecated -- use stp_unpack. </p>
</div>
</div>
<a class="anchor" id="a958196e6b7349e883a450e52cae83d93"></a><!-- doxytag: member="bit&#45;ops.h::stp_unpack_8" ref="a958196e6b7349e883a450e52cae83d93" args="(int height, int bits, const unsigned char *in, unsigned char *out0, unsigned char *out1, unsigned char *out2, unsigned char *out3, unsigned char *out4, unsigned char *out5, unsigned char *out6, unsigned char *out7)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_unpack_8 </td>
<td>(</td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>height</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>bits</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const unsigned char *&#160;</td>
<td class="paramname"><em>in</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out0</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out1</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out2</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out3</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out4</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out5</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out6</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned char *&#160;</td>
<td class="paramname"><em>out7</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
<p>Deprecated -- use stp_unpack. </p>
</div>
</div>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,719 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: include/gutenprint/channel.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">include/gutenprint/channel.h File Reference</div> </div>
</div>
<div class="contents">
<p>Channel functions.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a90026b1db4586b08df148db41a676b50">stp_channel_reset</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#ab4b4591b1709146874c0218bc0591255">stp_channel_reset_channel</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, int channel)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#af03151796a167ec708b5412a31ddced5">stp_channel_add</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, unsigned channel, unsigned subchannel, double value)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a748f1fc90c60e70016998953b1adcde2">stp_channel_get_value</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, unsigned channel, unsigned subchannel)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#ae7bd4572fb2ac86694555d0b827a2db9">stp_channel_set_density_adjustment</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, int color, int subchannel, double adjustment)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a43188fd2c70d894e1e050277c1e4da35">stp_channel_get_density_adjustment</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, int color, int subchannel)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a68afca52a3f3c0c72c1ff0329ef245c7">stp_channel_set_ink_limit</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, double limit)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#afe8ad41148d568cb1d662064ec721ac1">stp_channel_get_ink_limit</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a59a4810ca297444fb16a5a1a1db319ed">stp_channel_set_cutoff_adjustment</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, int color, int subchannel, double adjustment)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#af903f5318c045567f6aa3b6f1496b5ba">stp_channel_get_cutoff_adjustment</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, int color, int subchannel)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a1c1101b3f21368b26241a0db2877364e">stp_channel_set_black_channel</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, int channel)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a8a3cf94dfe1461bd0c8fb7464d5c99a6">stp_channel_get_black_channel</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#ab09858181233a7777b2d49ca50a327c6">stp_channel_set_gloss_channel</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, int channel)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a7771fa6878d414b4cd3b08743aadc3fc">stp_channel_get_gloss_channel</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a774df9fbabb8fcd9241976cc50c9501d">stp_channel_set_gloss_limit</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, double limit)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a9231b8d3be7ec55dc657da2e6a5c406e">stp_channel_get_gloss_limit</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a9e2107aa3cc118db2b6540f939064fed">stp_channel_set_curve</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, int channel, const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a36feed643e8768ff93308980203a92be">stp_channel_get_curve</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, int channel)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a4f0863196d55416aa58ea9815eb33312">stp_channel_set_gcr_curve</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#ac5c6578307d574f53c8f9110053fe9c5">stp_channel_get_gcr_curve</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a35b64c052b8dcfd4f1576b10d999e022">stp_channel_initialize</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, <a class="el" href="structstp__image.html">stp_image_t</a> *image, int input_channel_count)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a4559ad54f7de2403438baab1c97789f7">stp_channel_convert</a> (const <a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, unsigned *zero_mask)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">unsigned short *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#ac73acbaeb300c75912529c5064ea507a">stp_channel_get_input</a> (const <a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">unsigned short *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="channel_8h.html#a3ad58abee1208b328da69e49d230a54f">stp_channel_get_output</a> (const <a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v)</td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Channel functions. </p>
</div><hr/><h2>Function Documentation</h2>
<a class="anchor" id="af03151796a167ec708b5412a31ddced5"></a><!-- doxytag: member="channel.h::stp_channel_add" ref="af03151796a167ec708b5412a31ddced5" args="(stp_vars_t *v, unsigned channel, unsigned subchannel, double value)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_add </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned&#160;</td>
<td class="paramname"><em>channel</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned&#160;</td>
<td class="paramname"><em>subchannel</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>value</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a4559ad54f7de2403438baab1c97789f7"></a><!-- doxytag: member="channel.h::stp_channel_convert" ref="a4559ad54f7de2403438baab1c97789f7" args="(const stp_vars_t *v, unsigned *zero_mask)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_convert </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned *&#160;</td>
<td class="paramname"><em>zero_mask</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a8a3cf94dfe1461bd0c8fb7464d5c99a6"></a><!-- doxytag: member="channel.h::stp_channel_get_black_channel" ref="a8a3cf94dfe1461bd0c8fb7464d5c99a6" args="(stp_vars_t *v)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int stp_channel_get_black_channel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a36feed643e8768ff93308980203a92be"></a><!-- doxytag: member="channel.h::stp_channel_get_curve" ref="a36feed643e8768ff93308980203a92be" args="(stp_vars_t *v, int channel)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a>* stp_channel_get_curve </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>channel</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="af903f5318c045567f6aa3b6f1496b5ba"></a><!-- doxytag: member="channel.h::stp_channel_get_cutoff_adjustment" ref="af903f5318c045567f6aa3b6f1496b5ba" args="(stp_vars_t *v, int color, int subchannel)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double stp_channel_get_cutoff_adjustment </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>color</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subchannel</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a43188fd2c70d894e1e050277c1e4da35"></a><!-- doxytag: member="channel.h::stp_channel_get_density_adjustment" ref="a43188fd2c70d894e1e050277c1e4da35" args="(stp_vars_t *v, int color, int subchannel)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double stp_channel_get_density_adjustment </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>color</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subchannel</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="ac5c6578307d574f53c8f9110053fe9c5"></a><!-- doxytag: member="channel.h::stp_channel_get_gcr_curve" ref="ac5c6578307d574f53c8f9110053fe9c5" args="(stp_vars_t *v)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a>* stp_channel_get_gcr_curve </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a7771fa6878d414b4cd3b08743aadc3fc"></a><!-- doxytag: member="channel.h::stp_channel_get_gloss_channel" ref="a7771fa6878d414b4cd3b08743aadc3fc" args="(stp_vars_t *v)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">int stp_channel_get_gloss_channel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a9231b8d3be7ec55dc657da2e6a5c406e"></a><!-- doxytag: member="channel.h::stp_channel_get_gloss_limit" ref="a9231b8d3be7ec55dc657da2e6a5c406e" args="(stp_vars_t *v)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double stp_channel_get_gloss_limit </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="afe8ad41148d568cb1d662064ec721ac1"></a><!-- doxytag: member="channel.h::stp_channel_get_ink_limit" ref="afe8ad41148d568cb1d662064ec721ac1" args="(stp_vars_t *v)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double stp_channel_get_ink_limit </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="ac73acbaeb300c75912529c5064ea507a"></a><!-- doxytag: member="channel.h::stp_channel_get_input" ref="ac73acbaeb300c75912529c5064ea507a" args="(const stp_vars_t *v)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">unsigned short* stp_channel_get_input </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a3ad58abee1208b328da69e49d230a54f"></a><!-- doxytag: member="channel.h::stp_channel_get_output" ref="a3ad58abee1208b328da69e49d230a54f" args="(const stp_vars_t *v)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">unsigned short* stp_channel_get_output </td>
<td>(</td>
<td class="paramtype">const <a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a748f1fc90c60e70016998953b1adcde2"></a><!-- doxytag: member="channel.h::stp_channel_get_value" ref="a748f1fc90c60e70016998953b1adcde2" args="(stp_vars_t *v, unsigned channel, unsigned subchannel)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">double stp_channel_get_value </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned&#160;</td>
<td class="paramname"><em>channel</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">unsigned&#160;</td>
<td class="paramname"><em>subchannel</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a35b64c052b8dcfd4f1576b10d999e022"></a><!-- doxytag: member="channel.h::stp_channel_initialize" ref="a35b64c052b8dcfd4f1576b10d999e022" args="(stp_vars_t *v, stp_image_t *image, int input_channel_count)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_initialize </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="structstp__image.html">stp_image_t</a> *&#160;</td>
<td class="paramname"><em>image</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>input_channel_count</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a90026b1db4586b08df148db41a676b50"></a><!-- doxytag: member="channel.h::stp_channel_reset" ref="a90026b1db4586b08df148db41a676b50" args="(stp_vars_t *v)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_reset </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="ab4b4591b1709146874c0218bc0591255"></a><!-- doxytag: member="channel.h::stp_channel_reset_channel" ref="ab4b4591b1709146874c0218bc0591255" args="(stp_vars_t *v, int channel)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_reset_channel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>channel</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a1c1101b3f21368b26241a0db2877364e"></a><!-- doxytag: member="channel.h::stp_channel_set_black_channel" ref="a1c1101b3f21368b26241a0db2877364e" args="(stp_vars_t *v, int channel)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_set_black_channel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>channel</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a9e2107aa3cc118db2b6540f939064fed"></a><!-- doxytag: member="channel.h::stp_channel_set_curve" ref="a9e2107aa3cc118db2b6540f939064fed" args="(stp_vars_t *v, int channel, const stp_curve_t *curve)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_set_curve </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>channel</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td>
<td class="paramname"><em>curve</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a59a4810ca297444fb16a5a1a1db319ed"></a><!-- doxytag: member="channel.h::stp_channel_set_cutoff_adjustment" ref="a59a4810ca297444fb16a5a1a1db319ed" args="(stp_vars_t *v, int color, int subchannel, double adjustment)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_set_cutoff_adjustment </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>color</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subchannel</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>adjustment</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="ae7bd4572fb2ac86694555d0b827a2db9"></a><!-- doxytag: member="channel.h::stp_channel_set_density_adjustment" ref="ae7bd4572fb2ac86694555d0b827a2db9" args="(stp_vars_t *v, int color, int subchannel, double adjustment)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_set_density_adjustment </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>color</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>subchannel</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>adjustment</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a4f0863196d55416aa58ea9815eb33312"></a><!-- doxytag: member="channel.h::stp_channel_set_gcr_curve" ref="a4f0863196d55416aa58ea9815eb33312" args="(stp_vars_t *v, const stp_curve_t *curve)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_set_gcr_curve </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td>
<td class="paramname"><em>curve</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="ab09858181233a7777b2d49ca50a327c6"></a><!-- doxytag: member="channel.h::stp_channel_set_gloss_channel" ref="ab09858181233a7777b2d49ca50a327c6" args="(stp_vars_t *v, int channel)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_set_gloss_channel </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">int&#160;</td>
<td class="paramname"><em>channel</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a774df9fbabb8fcd9241976cc50c9501d"></a><!-- doxytag: member="channel.h::stp_channel_set_gloss_limit" ref="a774df9fbabb8fcd9241976cc50c9501d" args="(stp_vars_t *v, double limit)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_set_gloss_limit </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>limit</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a68afca52a3f3c0c72c1ff0329ef245c7"></a><!-- doxytag: member="channel.h::stp_channel_set_ink_limit" ref="a68afca52a3f3c0c72c1ff0329ef245c7" args="(stp_vars_t *v, double limit)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_channel_set_ink_limit </td>
<td>(</td>
<td class="paramtype"><a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *&#160;</td>
<td class="paramname"><em>v</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">double&#160;</td>
<td class="paramname"><em>limit</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,55 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Data Structure Index</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="classes.html"><span>Data&#160;Structure&#160;Index</span></a></li>
<li><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Data Structure Index</div> </div>
</div>
<div class="contents">
<div class="qindex"><a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a></div>
<table align="center" width="95%" border="0" cellspacing="0" cellpadding="0">
<tr><td><a name="letter_D"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;D&#160;&#160;</div></td></tr></table>
</td><td><a class="el" href="structstp__dither__matrix__generic.html">stp_dither_matrix_generic</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__int__bound__t.html">stp_int_bound_t</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__module__version.html">stp_module_version</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__param__string__t.html">stp_param_string_t</a>&#160;&#160;&#160;</td></tr><tr><td><a class="el" href="structdither__matrix__impl.html">dither_matrix_impl</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__dither__matrix__normal.html">stp_dither_matrix_normal</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__lineactive__t.html">stp_lineactive_t</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__mxml__attr__s.html">stp_mxml_attr_s</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__parameter__t.html">stp_parameter_t</a>&#160;&#160;&#160;</td></tr><tr><td><a name="letter_S"></a><table border="0" cellspacing="0" cellpadding="0"><tr><td><div class="ah">&#160;&#160;S&#160;&#160;</div></td></tr></table>
</td><td><a class="el" href="structstp__dither__matrix__short.html">stp_dither_matrix_short</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__linebounds__t.html">stp_linebounds_t</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__mxml__node__s.html">stp_mxml_node_s</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__pass__t.html">stp_pass_t</a>&#160;&#160;&#160;</td></tr><tr><td><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__dotsize.html">stp_dotsize</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__linebufs__t.html">stp_linebufs_t</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__mxml__text__s.html">stp_mxml_text_s</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__printfuncs__t.html">stp_printfuncs_t</a>&#160;&#160;&#160;</td></tr><tr><td><a class="el" href="structstp__color.html">stp_color</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__double__bound__t.html">stp_double_bound_t</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__linecount__t.html">stp_linecount_t</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__mxml__value__s.html">stp_mxml_value_s</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__raw__t.html">stp_raw_t</a>&#160;&#160;&#160;</td></tr><tr><td><a class="el" href="structstp__colorfuncs__t.html">stp_colorfuncs_t</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__family.html">stp_family</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__lineoff__t.html">stp_lineoff_t</a>&#160;&#160;&#160;</td><td><a class="el" href="unionstp__mxml__value__u.html">stp_mxml_value_u</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__shade.html">stp_shade</a>&#160;&#160;&#160;</td></tr><tr><td><a class="el" href="structstp__curve__point__t.html">stp_curve_point_t</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__image.html">stp_image</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__module.html">stp_module</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__papersize__t.html">stp_papersize_t</a>&#160;&#160;&#160;</td><td><a class="el" href="structstp__weave__t.html">stp_weave_t</a>&#160;&#160;&#160;</td></tr></table><div class="qindex"><a class="qindex" href="#letter_D">D</a>&#160;|&#160;<a class="qindex" href="#letter_S">S</a></div>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 126 B

View File

@ -1,86 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: include/gutenprint/color.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#typedef-members">Typedefs</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">include/gutenprint/color.h File Reference</div> </div>
</div>
<div class="contents">
<p>Color functions.
<a href="#details">More...</a></p>
<table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstp__colorfuncs__t.html">stp_colorfuncs_t</a></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstp__color.html">stp_color</a></td></tr>
<tr><td colspan="2"><h2><a name="typedef-members"></a>
Typedefs</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="structstp__color.html">stp_color</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#gad1408f9835b72f266ec7c7e1e1202a74">stp_color_t</a></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga23392fc53078d51fcd14d6d565d56423">stp_color_init</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, <a class="el" href="structstp__image.html">stp_image_t</a> *image, size_t steps)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga0cf28c3c9638987df4b1740deadba0cb">stp_color_get_row</a> (<a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, <a class="el" href="structstp__image.html">stp_image_t</a> *image, int row, unsigned *zero_mask)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__vars.html#ga40c1035f88ac38d77eddb65195b28595">stp_parameter_list_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#gaa282220724877a57738b047140835141">stp_color_list_parameters</a> (const <a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga83bc80c9fd84d741099bc20285a1b655">stp_color_describe_parameter</a> (const <a class="el" href="group__vars.html#ga2d49c94847d18d8b62a214995b14680f">stp_vars_t</a> *v, const char *name, <a class="el" href="structstp__parameter__t.html">stp_parameter_t</a> *description)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga47d6a8163ef21a6e700b1371228b851d">stp_color_register</a> (const <a class="el" href="structstp__color.html">stp_color_t</a> *color)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga2b62ec8e0afe1b6297bc71466f8a334c">stp_color_unregister</a> (const <a class="el" href="structstp__color.html">stp_color_t</a> *color)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga68c13c36d723e5604507bf33fe629f8b">stp_color_count</a> (void)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the number of available color modules. <a href="group__color.html#ga68c13c36d723e5604507bf33fe629f8b"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="structstp__color.html">stp_color_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga3b8f62108f3604480e7b89b253527f4a">stp_get_color_by_name</a> (const char *name)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a color module by its name. <a href="group__color.html#ga3b8f62108f3604480e7b89b253527f4a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="structstp__color.html">stp_color_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga68ba525119da39ae854645ae649557d3">stp_get_color_by_index</a> (int idx)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a color module by its index number. <a href="group__color.html#ga68ba525119da39ae854645ae649557d3"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="structstp__color.html">stp_color_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga578f80b2bc3937df38ce7e803f5f472c">stp_get_color_by_colorfuncs</a> (<a class="el" href="structstp__colorfuncs__t.html">stp_colorfuncs_t</a> *colorfuncs)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga5a4a4da67cb5c3f1c0a2a9618e46ed50">stp_color_get_name</a> (const <a class="el" href="structstp__color.html">stp_color_t</a> *c)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the short (untranslated) name of a color module. <a href="group__color.html#ga5a4a4da67cb5c3f1c0a2a9618e46ed50"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__color.html#ga612389b45f09358f6bad0e376c91b057">stp_color_get_long_name</a> (const <a class="el" href="structstp__color.html">stp_color_t</a> *c)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the long (translated) name of a color module. <a href="group__color.html#ga612389b45f09358f6bad0e376c91b057"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Color functions. </p>
</div></div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,334 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: include/gutenprint/curve-cache.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#define-members">Defines</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">include/gutenprint/curve-cache.h File Reference</div> </div>
</div>
<div class="contents">
<p>Curve caching functions.
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;<a class="el" href="curve_8h.html">gutenprint/curve.h</a>&gt;</code><br/>
</div><table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a></td></tr>
<tr><td colspan="2"><h2><a name="define-members"></a>
Defines</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#a4b278e86a2f914893307fb20cf218e7c">CURVE_CACHE_FAST_USHORT</a>(cache)&#160;&#160;&#160;((cache)-&gt;s_cache)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#af79c26492d6e6fd726498df18cae11fe">CURVE_CACHE_FAST_DOUBLE</a>(cache)&#160;&#160;&#160;((cache)-&gt;d_cache)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#a70b70d0328c61f17925402a4b1bb9a90">CURVE_CACHE_FAST_COUNT</a>(cache)&#160;&#160;&#160;((cache)-&gt;count)</td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#a80cb29d2d12707901ca9261df5f3cd1c">stp_curve_free_curve_cache</a> (<a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *cache)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#af3e398d179e00c2e7d8b7c2e5dcbfd5c">stp_curve_cache_curve_data</a> (<a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *cache)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#a26161d0b2b6c8b97e0de2dc12619cc6c">stp_curve_cache_get_curve</a> (<a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *cache)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#a8d9c7b9a9aca371b6d2e72dcfc367f88">stp_curve_cache_curve_invalidate</a> (<a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *cache)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#a8469e7bd7d80cfb01fc470a42e6ac805">stp_curve_cache_set_curve</a> (<a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *cache, <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#acd8bbfbdb0b60d079b6615cc4a19ee56">stp_curve_cache_set_curve_copy</a> (<a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *cache, const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#aaefb6ef535ba108e0fdba1db4b58bd34">stp_curve_cache_get_count</a> (<a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *cache)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const unsigned short *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#a204df5bd2ecc318cccf6e2541d8b4830">stp_curve_cache_get_ushort_data</a> (<a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *cache)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const double *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#a45415b5aa0600b60b65880803aea84b4">stp_curve_cache_get_double_data</a> (<a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *cache)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="curve-cache_8h.html#af5642e9d4e265b8d16db6075e1309a20">stp_curve_cache_copy</a> (<a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *dest, const <a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *src)</td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Curve caching functions. </p>
</div><hr/><h2>Define Documentation</h2>
<a class="anchor" id="a70b70d0328c61f17925402a4b1bb9a90"></a><!-- doxytag: member="curve&#45;cache.h::CURVE_CACHE_FAST_COUNT" ref="a70b70d0328c61f17925402a4b1bb9a90" args="(cache)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define CURVE_CACHE_FAST_COUNT</td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">cache</td><td>)</td>
<td>&#160;&#160;&#160;((cache)-&gt;count)</td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="af79c26492d6e6fd726498df18cae11fe"></a><!-- doxytag: member="curve&#45;cache.h::CURVE_CACHE_FAST_DOUBLE" ref="af79c26492d6e6fd726498df18cae11fe" args="(cache)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define CURVE_CACHE_FAST_DOUBLE</td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">cache</td><td>)</td>
<td>&#160;&#160;&#160;((cache)-&gt;d_cache)</td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a4b278e86a2f914893307fb20cf218e7c"></a><!-- doxytag: member="curve&#45;cache.h::CURVE_CACHE_FAST_USHORT" ref="a4b278e86a2f914893307fb20cf218e7c" args="(cache)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">#define CURVE_CACHE_FAST_USHORT</td>
<td>(</td>
<td class="paramtype">&#160;</td>
<td class="paramname">cache</td><td>)</td>
<td>&#160;&#160;&#160;((cache)-&gt;s_cache)</td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<hr/><h2>Function Documentation</h2>
<a class="anchor" id="af5642e9d4e265b8d16db6075e1309a20"></a><!-- doxytag: member="curve&#45;cache.h::stp_curve_cache_copy" ref="af5642e9d4e265b8d16db6075e1309a20" args="(stp_cached_curve_t *dest, const stp_cached_curve_t *src)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_curve_cache_copy </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>dest</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>src</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="af3e398d179e00c2e7d8b7c2e5dcbfd5c"></a><!-- doxytag: member="curve&#45;cache.h::stp_curve_cache_curve_data" ref="af3e398d179e00c2e7d8b7c2e5dcbfd5c" args="(stp_cached_curve_t *cache)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_curve_cache_curve_data </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>cache</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a8d9c7b9a9aca371b6d2e72dcfc367f88"></a><!-- doxytag: member="curve&#45;cache.h::stp_curve_cache_curve_invalidate" ref="a8d9c7b9a9aca371b6d2e72dcfc367f88" args="(stp_cached_curve_t *cache)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_curve_cache_curve_invalidate </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>cache</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="aaefb6ef535ba108e0fdba1db4b58bd34"></a><!-- doxytag: member="curve&#45;cache.h::stp_curve_cache_get_count" ref="aaefb6ef535ba108e0fdba1db4b58bd34" args="(stp_cached_curve_t *cache)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">size_t stp_curve_cache_get_count </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>cache</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a26161d0b2b6c8b97e0de2dc12619cc6c"></a><!-- doxytag: member="curve&#45;cache.h::stp_curve_cache_get_curve" ref="a26161d0b2b6c8b97e0de2dc12619cc6c" args="(stp_cached_curve_t *cache)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a>* stp_curve_cache_get_curve </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>cache</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a45415b5aa0600b60b65880803aea84b4"></a><!-- doxytag: member="curve&#45;cache.h::stp_curve_cache_get_double_data" ref="a45415b5aa0600b60b65880803aea84b4" args="(stp_cached_curve_t *cache)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const double* stp_curve_cache_get_double_data </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>cache</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a204df5bd2ecc318cccf6e2541d8b4830"></a><!-- doxytag: member="curve&#45;cache.h::stp_curve_cache_get_ushort_data" ref="a204df5bd2ecc318cccf6e2541d8b4830" args="(stp_cached_curve_t *cache)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">const unsigned short* stp_curve_cache_get_ushort_data </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>cache</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a8469e7bd7d80cfb01fc470a42e6ac805"></a><!-- doxytag: member="curve&#45;cache.h::stp_curve_cache_set_curve" ref="a8469e7bd7d80cfb01fc470a42e6ac805" args="(stp_cached_curve_t *cache, stp_curve_t *curve)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_curve_cache_set_curve </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>cache</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td>
<td class="paramname"><em>curve</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="acd8bbfbdb0b60d079b6615cc4a19ee56"></a><!-- doxytag: member="curve&#45;cache.h::stp_curve_cache_set_curve_copy" ref="acd8bbfbdb0b60d079b6615cc4a19ee56" args="(stp_cached_curve_t *cache, const stp_curve_t *curve)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_curve_cache_set_curve_copy </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>cache</em>, </td>
</tr>
<tr>
<td class="paramkey"></td>
<td></td>
<td class="paramtype">const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td>
<td class="paramname"><em>curve</em>&#160;</td>
</tr>
<tr>
<td></td>
<td>)</td>
<td></td><td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
<a class="anchor" id="a80cb29d2d12707901ca9261df5f3cd1c"></a><!-- doxytag: member="curve&#45;cache.h::stp_curve_free_curve_cache" ref="a80cb29d2d12707901ca9261df5f3cd1c" args="(stp_cached_curve_t *cache)" -->
<div class="memitem">
<div class="memproto">
<table class="memname">
<tr>
<td class="memname">void stp_curve_free_curve_cache </td>
<td>(</td>
<td class="paramtype"><a class="el" href="structstp__cached__curve__t.html">stp_cached_curve_t</a> *&#160;</td>
<td class="paramname"><em>cache</em></td><td>)</td>
<td></td>
</tr>
</table>
</div>
<div class="memdoc">
</div>
</div>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,188 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: include/gutenprint/curve.h File Reference</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="summary">
<a href="#nested-classes">Data Structures</a> &#124;
<a href="#typedef-members">Typedefs</a> &#124;
<a href="#enum-members">Enumerations</a> &#124;
<a href="#func-members">Functions</a> </div>
<div class="headertitle">
<div class="title">include/gutenprint/curve.h File Reference</div> </div>
</div>
<div class="contents">
<p>Curve functions.
<a href="#details">More...</a></p>
<div class="textblock"><code>#include &lt;stdio.h&gt;</code><br/>
<code>#include &lt;stdlib.h&gt;</code><br/>
<code>#include &lt;<a class="el" href="sequence_8h.html">gutenprint/sequence.h</a>&gt;</code><br/>
</div><table class="memberdecls">
<tr><td colspan="2"><h2><a name="nested-classes"></a>
Data Structures</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="structstp__curve__point__t.html">stp_curve_point_t</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Point (x,y) for piecewise curve. <a href="structstp__curve__point__t.html#details">More...</a><br/></td></tr>
<tr><td colspan="2"><h2><a name="typedef-members"></a>
Typedefs</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">typedef struct stp_curve&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a></td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">The curve opaque data type. <a href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524"></a><br/></td></tr>
<tr><td colspan="2"><h2><a name="enum-members"></a>
Enumerations</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga982f8191c84b049cc3ad3cee1558fc23">stp_curve_type_t</a> { <a class="el" href="group__curve.html#gga982f8191c84b049cc3ad3cee1558fc23a46228ddaa2d52a85ccd79c4dc0f76ad3">STP_CURVE_TYPE_LINEAR</a>,
<a class="el" href="group__curve.html#gga982f8191c84b049cc3ad3cee1558fc23afb1ffdc3754f428d8e3a2124e014ff77">STP_CURVE_TYPE_SPLINE</a>
}</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Curve types. <a href="group__curve.html#ga982f8191c84b049cc3ad3cee1558fc23">More...</a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga3ae3af552b490b0ca8b02e442ac9547a">stp_curve_wrap_mode_t</a> { <a class="el" href="group__curve.html#gga3ae3af552b490b0ca8b02e442ac9547aad840485ad7df768a06ee4be02d93b97a">STP_CURVE_WRAP_NONE</a>,
<a class="el" href="group__curve.html#gga3ae3af552b490b0ca8b02e442ac9547aac0361aebddfabfb263dc0205a61f6fbd">STP_CURVE_WRAP_AROUND</a>
}</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Wrapping mode. <a href="group__curve.html#ga3ae3af552b490b0ca8b02e442ac9547a">More...</a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga7eddbee28cb1f3c76a19408b86ea142e">stp_curve_compose_t</a> { <a class="el" href="group__curve.html#gga7eddbee28cb1f3c76a19408b86ea142eac38b0bf09e93edb67c3e5c53035295f3">STP_CURVE_COMPOSE_ADD</a>,
<a class="el" href="group__curve.html#gga7eddbee28cb1f3c76a19408b86ea142ead3bd2cdb63498d5d22686e79e2c0ed95">STP_CURVE_COMPOSE_MULTIPLY</a>,
<a class="el" href="group__curve.html#gga7eddbee28cb1f3c76a19408b86ea142ea8de151149fdfd4fcca78826e6352246a">STP_CURVE_COMPOSE_EXPONENTIATE</a>
}</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Composition types. <a href="group__curve.html#ga7eddbee28cb1f3c76a19408b86ea142e">More...</a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">enum &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga86d146e483ca1902f973d574f542b85f">stp_curve_bounds_t</a> { <a class="el" href="group__curve.html#gga86d146e483ca1902f973d574f542b85fa118d303bf7bdf4f00bda71cc6eac49c3">STP_CURVE_BOUNDS_RESCALE</a>,
<a class="el" href="group__curve.html#gga86d146e483ca1902f973d574f542b85faec9e6673edac9d34e3aad376fa711aa5">STP_CURVE_BOUNDS_CLIP</a>,
<a class="el" href="group__curve.html#gga86d146e483ca1902f973d574f542b85fad699d675d5df223055388cd83d0b362b">STP_CURVE_BOUNDS_ERROR</a>
}</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Behaviour when curve exceeds bounds. <a href="group__curve.html#ga86d146e483ca1902f973d574f542b85f">More...</a><br/></td></tr>
<tr><td colspan="2"><h2><a name="func-members"></a>
Functions</h2></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga6b3640f0e25bd9d38e46bdc1b2ee58a4">stp_curve_create</a> (<a class="el" href="group__curve.html#ga3ae3af552b490b0ca8b02e442ac9547a">stp_curve_wrap_mode_t</a> wrap)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a new curve. <a href="group__curve.html#ga6b3640f0e25bd9d38e46bdc1b2ee58a4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga972ed591394396e0c66e928a0695b3bf">stp_curve_create_copy</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy and allocate a curve. <a href="group__curve.html#ga972ed591394396e0c66e928a0695b3bf"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gacd7861bf1c9d61ac4ec87844a15ab9d3">stp_curve_copy</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *dest, const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *source)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Copy a curve. <a href="group__curve.html#gacd7861bf1c9d61ac4ec87844a15ab9d3"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga8c2aed234d3e4ddc4c239801be17bb73">stp_curve_create_reverse</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reverse and allocate a curve. <a href="group__curve.html#ga8c2aed234d3e4ddc4c239801be17bb73"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga3416157017287eae136fb928802be234">stp_curve_reverse</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *dest, const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *source)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Reverse a curve. <a href="group__curve.html#ga3416157017287eae136fb928802be234"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga4294b85e848fe421496469e2406ef380">stp_curve_destroy</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Destroy an curve. <a href="group__curve.html#ga4294b85e848fe421496469e2406ef380"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gae32fb850963b8694d3739c0ed8475f75">stp_curve_set_bounds</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, double low, double high)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the lower and upper bounds on a curve. <a href="group__curve.html#gae32fb850963b8694d3739c0ed8475f75"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga63c3386fbfd75da9fe985673bf7b1ca3">stp_curve_get_bounds</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, double *low, double *high)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the lower and upper bounds on a curve. <a href="group__curve.html#ga63c3386fbfd75da9fe985673bf7b1ca3"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__curve.html#ga3ae3af552b490b0ca8b02e442ac9547a">stp_curve_wrap_mode_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga859020827897bac0f4671322ec027dc4">stp_curve_get_wrap</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the wrapping mode. <a href="group__curve.html#ga859020827897bac0f4671322ec027dc4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga29b022a3055afe0b48d1f2736ff2f4da">stp_curve_is_piecewise</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Determine whether the curve is piecewise. <a href="group__curve.html#ga29b022a3055afe0b48d1f2736ff2f4da"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">void&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gacb8e51731b9385556747744a0d4f43fb">stp_curve_get_range</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, double *low, double *high)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">size_t&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga766ff02b29b976372779f719076ad017">stp_curve_count_points</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the number of allocated points in the curve. <a href="group__curve.html#ga766ff02b29b976372779f719076ad017"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga82890cef78f5861a88c5789c33693423">stp_curve_set_interpolation_type</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, <a class="el" href="group__curve.html#ga982f8191c84b049cc3ad3cee1558fc23">stp_curve_type_t</a> itype)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the curve interpolation type. <a href="group__curve.html#ga82890cef78f5861a88c5789c33693423"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__curve.html#ga982f8191c84b049cc3ad3cee1558fc23">stp_curve_type_t</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga42c98a6a6d2512516738b6df9367510e">stp_curve_get_interpolation_type</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the curve interpolation type. <a href="group__curve.html#ga42c98a6a6d2512516738b6df9367510e"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga81bceb4cb991cef1cda2298cf7bb9f15">stp_curve_set_data</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t count, const double *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set all data points of the curve. <a href="group__curve.html#ga81bceb4cb991cef1cda2298cf7bb9f15"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gace09cab4e6ae3d55f75aacae3689e8e6">stp_curve_set_data_points</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t count, const <a class="el" href="structstp__curve__point__t.html">stp_curve_point_t</a> *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set all data points of the curve. <a href="group__curve.html#gace09cab4e6ae3d55f75aacae3689e8e6"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gabd7a39289471607311141c7fc3bbb415">stp_curve_set_float_data</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t count, const float *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data points in a curve from float values. <a href="group__curve.html#gabd7a39289471607311141c7fc3bbb415"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gae6a435a21a5c4b5e582d42095a7b06fc">stp_curve_set_long_data</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t count, const long *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data points in a curve from long values. <a href="group__curve.html#gae6a435a21a5c4b5e582d42095a7b06fc"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga723173297f5b67af937205c7d74ac353">stp_curve_set_ulong_data</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t count, const unsigned long *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data points in a curve from unsigned long values. <a href="group__curve.html#ga723173297f5b67af937205c7d74ac353"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga31e76843f4d2f207701755b58766a670">stp_curve_set_int_data</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t count, const int *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data points in a curve from integer values. <a href="group__curve.html#ga31e76843f4d2f207701755b58766a670"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga3ee80f8e4f33691a78b3ad8c3fd7c34f">stp_curve_set_uint_data</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t count, const unsigned int *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data points in a curve from unsigned integer values. <a href="group__curve.html#ga3ee80f8e4f33691a78b3ad8c3fd7c34f"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga2fa5222aab07e85f215e389734b6dbea">stp_curve_set_short_data</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t count, const short *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data points in a curve from short values. <a href="group__curve.html#ga2fa5222aab07e85f215e389734b6dbea"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga0af395eefa7bfe0d19acc1acbaeefe48">stp_curve_set_ushort_data</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t count, const unsigned short *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the data points in a curve from unsigned short values. <a href="group__curve.html#ga0af395eefa7bfe0d19acc1acbaeefe48"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga5cbf7c4b6ad96ecb35fc06f46c0319f0">stp_curve_get_subrange</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t start, size_t count)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a curve containing a subrange of data. <a href="group__curve.html#ga5cbf7c4b6ad96ecb35fc06f46c0319f0"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga73dfcc4c95734449965227e21deb3037">stp_curve_set_subrange</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *range, size_t start)</td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const double *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gab2208f56694e47e4300d10e057f59ee8">stp_curve_get_data</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t *count)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a pointer to the curve's raw data. <a href="group__curve.html#gab2208f56694e47e4300d10e057f59ee8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="structstp__curve__point__t.html">stp_curve_point_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga79e0d6afa3573917c756af64b56a0d82">stp_curve_get_data_points</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t *count)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a pointer to the curve's raw data as points. <a href="group__curve.html#ga79e0d6afa3573917c756af64b56a0d82"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const float *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga251f105cb5f2b126ea02b7908f717c18">stp_curve_get_float_data</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t *count)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get pointer to the curve's raw data as floats. <a href="group__curve.html#ga251f105cb5f2b126ea02b7908f717c18"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const long *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gaf59bd38c9dfc7beb08a283dc9e400bf2">stp_curve_get_long_data</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t *count)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get pointer to the curve's raw data as longs. <a href="group__curve.html#gaf59bd38c9dfc7beb08a283dc9e400bf2"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const unsigned long *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga24a862eda4cdbb626f51aeb7d8ae9a50">stp_curve_get_ulong_data</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t *count)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get pointer to the curve's raw data as unsigned longs. <a href="group__curve.html#ga24a862eda4cdbb626f51aeb7d8ae9a50"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const int *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga6de80e81b64262e0051441f697ae4de4">stp_curve_get_int_data</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t *count)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get pointer to the curve's raw data as integers. <a href="group__curve.html#ga6de80e81b64262e0051441f697ae4de4"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const unsigned int *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga19b3160a57dc6959fe08c631c7206a8a">stp_curve_get_uint_data</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t *count)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get pointer to the curve's raw data as unsigned integers. <a href="group__curve.html#ga19b3160a57dc6959fe08c631c7206a8a"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const short *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga87c5d1904efa58be8a21ab6b2c41d0b9">stp_curve_get_short_data</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t *count)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get pointer to the curve's raw data as shorts. <a href="group__curve.html#ga87c5d1904efa58be8a21ab6b2c41d0b9"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const unsigned short *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gaa02125af6b9c192e34985851370391b8">stp_curve_get_ushort_data</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t *count)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get pointer to the curve's raw data as unsigned shorts. <a href="group__curve.html#gaa02125af6b9c192e34985851370391b8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">const <a class="el" href="group__sequence.html#ga327a46aa1d782a4cd53abf306068e272">stp_sequence_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gade323594e84d4380c88ecf122a5a4da8">stp_curve_get_sequence</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the underlying stp_sequence_t data structure which stp_curve_t is derived from. <a href="group__curve.html#gade323594e84d4380c88ecf122a5a4da8"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gacb8a2b9b21f97f32faacb99a6125e152">stp_curve_set_gamma</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, double f_gamma)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set the gamma of a curve. <a href="group__curve.html#gacb8a2b9b21f97f32faacb99a6125e152"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">double&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga0420a6cfa87aa96e5c9a56142aa0178d">stp_curve_get_gamma</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get the gamma value of the curve. <a href="group__curve.html#ga0420a6cfa87aa96e5c9a56142aa0178d"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga2d3b8372bde3fce699a3b7bb3c9d8582">stp_curve_set_point</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t where, double data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Set a point along the curve. <a href="group__curve.html#ga2d3b8372bde3fce699a3b7bb3c9d8582"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga569aae57147ed7681f23e0e60bd8af35">stp_curve_get_point</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t where, double *data)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Get a point along the curve. <a href="group__curve.html#ga569aae57147ed7681f23e0e60bd8af35"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gab33642ee6c49334f379a4dc185ecd355">stp_curve_interpolate_value</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, double where, double *result)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Interpolate a point along the curve. <a href="group__curve.html#gab33642ee6c49334f379a4dc185ecd355"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga87298cf562468cbcf2c1f76a0ab80b62">stp_curve_resample</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, size_t points)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Resample a curve (change the number of points). <a href="group__curve.html#ga87298cf562468cbcf2c1f76a0ab80b62"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gaad611b3ddbd667ec204fa7b42f8d7546">stp_curve_rescale</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve, double scale, <a class="el" href="group__curve.html#ga7eddbee28cb1f3c76a19408b86ea142e">stp_curve_compose_t</a> mode, <a class="el" href="group__curve.html#ga86d146e483ca1902f973d574f542b85f">stp_curve_bounds_t</a> bounds_mode)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Rescale a curve (multiply all points by a scaling constant). <a href="group__curve.html#gaad611b3ddbd667ec204fa7b42f8d7546"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gac12af55cf0eb2f76db967886f8996313">stp_curve_write</a> (FILE *file, const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a curve to a file. <a href="group__curve.html#gac12af55cf0eb2f76db967886f8996313"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">char *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gaf2f0da590278ff74af1eccb0aa0c7169">stp_curve_write_string</a> (const <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *curve)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Write a curve to a string. <a href="group__curve.html#gaf2f0da590278ff74af1eccb0aa0c7169"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga478a24e44a3ce345f7207cf7ded12e37">stp_curve_create_from_stream</a> (FILE *fp)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a curve from a stream. <a href="group__curve.html#ga478a24e44a3ce345f7207cf7ded12e37"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gad96d7d1cda5f037f7d6a9b651ebbbb46">stp_curve_create_from_file</a> (const char *file)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a curve from a stream. <a href="group__curve.html#gad96d7d1cda5f037f7d6a9b651ebbbb46"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top"><a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#gab8c0df217306a6e0597f058efbfaca82">stp_curve_create_from_string</a> (const char *string)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Create a curve from a string. <a href="group__curve.html#gab8c0df217306a6e0597f058efbfaca82"></a><br/></td></tr>
<tr><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="group__curve.html#ga55c83a9139fc1b06b90e983d7c1ceff7">stp_curve_compose</a> (<a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> **retval, <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *a, <a class="el" href="group__curve.html#ga375a2b23705fb0698ae1d823243c8524">stp_curve_t</a> *b, <a class="el" href="group__curve.html#ga7eddbee28cb1f3c76a19408b86ea142e">stp_curve_compose_t</a> mode, int points)</td></tr>
<tr><td class="mdescLeft">&#160;</td><td class="mdescRight">Compose two curves, creating a third curve. <a href="group__curve.html#ga55c83a9139fc1b06b90e983d7c1ceff7"></a><br/></td></tr>
</table>
<hr/><a name="details" id="details"></a><h2>Detailed Description</h2>
<div class="textblock"><p>Curve functions. </p>
</div></div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,53 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Deprecated List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li class="current"><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">Deprecated List </div> </div>
</div>
<div class="contents">
<div class="textblock"><p><a class="anchor" id="_deprecated000001"></a> </p>
<dl>
<dt>Global <a class="el" href="group__printer.html#ga41094e69b71eb930e770bd2cf8bbf795">stp_get_printer_index_by_driver</a> (const char *driver) </dt>
<dd>There should never be any need to use this function. </dd>
</dl>
<p><a class="anchor" id="_deprecated000002"></a> </p>
<dl>
<dt>Global <a class="el" href="group__vars.html#ga086303d36b835d539e75f16187e99e8f">stp_merge_printvars</a> (stp_vars_t *user, const stp_vars_t *print) </dt>
<dd>This is likely to go away. </dd>
</dl>
</div></div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

File diff suppressed because it is too large Load Diff

View File

@ -1,835 +0,0 @@
/* The standard CSS for doxygen */
body, table, div, p, dl {
font-family: Lucida Grande, Verdana, Geneva, Arial, sans-serif;
font-size: 12px;
}
/* @group Heading Levels */
h1 {
font-size: 150%;
}
.title {
font-size: 150%;
font-weight: bold;
margin: 10px 2px;
}
h2 {
font-size: 120%;
}
h3 {
font-size: 100%;
}
dt {
font-weight: bold;
}
div.multicol {
-moz-column-gap: 1em;
-webkit-column-gap: 1em;
-moz-column-count: 3;
-webkit-column-count: 3;
}
p.startli, p.startdd, p.starttd {
margin-top: 2px;
}
p.endli {
margin-bottom: 0px;
}
p.enddd {
margin-bottom: 4px;
}
p.endtd {
margin-bottom: 2px;
}
/* @end */
caption {
font-weight: bold;
}
span.legend {
font-size: 70%;
text-align: center;
}
h3.version {
font-size: 90%;
text-align: center;
}
div.qindex, div.navtab{
background-color: #EBEFF6;
border: 1px solid #A3B4D7;
text-align: center;
margin: 2px;
padding: 2px;
}
div.qindex, div.navpath {
width: 100%;
line-height: 140%;
}
div.navtab {
margin-right: 15px;
}
/* @group Link Styling */
a {
color: #3D578C;
font-weight: normal;
text-decoration: none;
}
.contents a:visited {
color: #4665A2;
}
a:hover {
text-decoration: underline;
}
a.qindex {
font-weight: bold;
}
a.qindexHL {
font-weight: bold;
background-color: #9CAFD4;
color: #ffffff;
border: 1px double #869DCA;
}
.contents a.qindexHL:visited {
color: #ffffff;
}
a.el {
font-weight: bold;
}
a.elRef {
}
a.code {
color: #4665A2;
}
a.codeRef {
color: #4665A2;
}
/* @end */
dl.el {
margin-left: -1cm;
}
.fragment {
font-family: monospace, fixed;
font-size: 105%;
}
pre.fragment {
border: 1px solid #C4CFE5;
background-color: #FBFCFD;
padding: 4px 6px;
margin: 4px 8px 4px 2px;
overflow: auto;
word-wrap: break-word;
font-size: 9pt;
line-height: 125%;
}
div.ah {
background-color: black;
font-weight: bold;
color: #ffffff;
margin-bottom: 3px;
margin-top: 3px;
padding: 0.2em;
border: solid thin #333;
border-radius: 0.5em;
-webkit-border-radius: .5em;
-moz-border-radius: .5em;
box-shadow: 2px 2px 3px #999;
-webkit-box-shadow: 2px 2px 3px #999;
-moz-box-shadow: rgba(0, 0, 0, 0.15) 2px 2px 2px;
background-image: -webkit-gradient(linear, left top, left bottom, from(#eee), to(#000),color-stop(0.3, #444));
background-image: -moz-linear-gradient(center top, #eee 0%, #444 40%, #000);
}
div.groupHeader {
margin-left: 16px;
margin-top: 12px;
font-weight: bold;
}
div.groupText {
margin-left: 16px;
font-style: italic;
}
body {
background: white;
color: black;
margin: 0;
}
div.contents {
margin-top: 10px;
margin-left: 10px;
margin-right: 5px;
}
td.indexkey {
background-color: #EBEFF6;
font-weight: bold;
border: 1px solid #C4CFE5;
margin: 2px 0px 2px 0;
padding: 2px 10px;
}
td.indexvalue {
background-color: #EBEFF6;
border: 1px solid #C4CFE5;
padding: 2px 10px;
margin: 2px 0px;
}
tr.memlist {
background-color: #EEF1F7;
}
p.formulaDsp {
text-align: center;
}
img.formulaDsp {
}
img.formulaInl {
vertical-align: middle;
}
div.center {
text-align: center;
margin-top: 0px;
margin-bottom: 0px;
padding: 0px;
}
div.center img {
border: 0px;
}
address.footer {
text-align: right;
padding-right: 12px;
}
img.footer {
border: 0px;
vertical-align: middle;
}
/* @group Code Colorization */
span.keyword {
color: #008000
}
span.keywordtype {
color: #604020
}
span.keywordflow {
color: #e08000
}
span.comment {
color: #800000
}
span.preprocessor {
color: #806020
}
span.stringliteral {
color: #002080
}
span.charliteral {
color: #008080
}
span.vhdldigit {
color: #ff00ff
}
span.vhdlchar {
color: #000000
}
span.vhdlkeyword {
color: #700070
}
span.vhdllogic {
color: #ff0000
}
/* @end */
/*
.search {
color: #003399;
font-weight: bold;
}
form.search {
margin-bottom: 0px;
margin-top: 0px;
}
input.search {
font-size: 75%;
color: #000080;
font-weight: normal;
background-color: #e8eef2;
}
*/
td.tiny {
font-size: 75%;
}
.dirtab {
padding: 4px;
border-collapse: collapse;
border: 1px solid #A3B4D7;
}
th.dirtab {
background: #EBEFF6;
font-weight: bold;
}
hr {
height: 0px;
border: none;
border-top: 1px solid #4A6AAA;
}
hr.footer {
height: 1px;
}
/* @group Member Descriptions */
table.memberdecls {
border-spacing: 0px;
padding: 0px;
}
.mdescLeft, .mdescRight,
.memItemLeft, .memItemRight,
.memTemplItemLeft, .memTemplItemRight, .memTemplParams {
background-color: #F9FAFC;
border: none;
margin: 4px;
padding: 1px 0 0 8px;
}
.mdescLeft, .mdescRight {
padding: 0px 8px 4px 8px;
color: #555;
}
.memItemLeft, .memItemRight, .memTemplParams {
border-top: 1px solid #C4CFE5;
}
.memItemLeft, .memTemplItemLeft {
white-space: nowrap;
}
.memItemRight {
width: 100%;
}
.memTemplParams {
color: #4665A2;
white-space: nowrap;
}
/* @end */
/* @group Member Details */
/* Styles for detailed member documentation */
.memtemplate {
font-size: 80%;
color: #4665A2;
font-weight: normal;
margin-left: 9px;
}
.memnav {
background-color: #EBEFF6;
border: 1px solid #A3B4D7;
text-align: center;
margin: 2px;
margin-right: 15px;
padding: 2px;
}
.mempage {
width: 100%;
}
.memitem {
padding: 0;
margin-bottom: 10px;
margin-right: 5px;
}
.memname {
white-space: nowrap;
font-weight: bold;
margin-left: 6px;
}
.memproto {
border-top: 1px solid #A8B8D9;
border-left: 1px solid #A8B8D9;
border-right: 1px solid #A8B8D9;
padding: 6px 0px 6px 0px;
color: #253555;
font-weight: bold;
text-shadow: 0px 1px 1px rgba(255, 255, 255, 0.9);
/* opera specific markup */
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
border-top-right-radius: 8px;
border-top-left-radius: 8px;
/* firefox specific markup */
-moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
-moz-border-radius-topright: 8px;
-moz-border-radius-topleft: 8px;
/* webkit specific markup */
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
-webkit-border-top-right-radius: 8px;
-webkit-border-top-left-radius: 8px;
background-image:url('nav_f.png');
background-repeat:repeat-x;
background-color: #E2E8F2;
}
.memdoc {
border-bottom: 1px solid #A8B8D9;
border-left: 1px solid #A8B8D9;
border-right: 1px solid #A8B8D9;
padding: 2px 5px;
background-color: #FBFCFD;
border-top-width: 0;
/* opera specific markup */
border-bottom-left-radius: 8px;
border-bottom-right-radius: 8px;
box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
/* firefox specific markup */
-moz-border-radius-bottomleft: 8px;
-moz-border-radius-bottomright: 8px;
-moz-box-shadow: rgba(0, 0, 0, 0.15) 5px 5px 5px;
background-image: -moz-linear-gradient(center top, #FFFFFF 0%, #FFFFFF 60%, #F7F8FB 95%, #EEF1F7);
/* webkit specific markup */
-webkit-border-bottom-left-radius: 8px;
-webkit-border-bottom-right-radius: 8px;
-webkit-box-shadow: 5px 5px 5px rgba(0, 0, 0, 0.15);
background-image: -webkit-gradient(linear,center top,center bottom,from(#FFFFFF), color-stop(0.6,#FFFFFF), color-stop(0.60,#FFFFFF), color-stop(0.95,#F7F8FB), to(#EEF1F7));
}
.paramkey {
text-align: right;
}
.paramtype {
white-space: nowrap;
}
.paramname {
color: #602020;
white-space: nowrap;
}
.paramname em {
font-style: normal;
}
.params, .retval, .exception, .tparams {
border-spacing: 6px 2px;
}
.params .paramname, .retval .paramname {
font-weight: bold;
vertical-align: top;
}
.params .paramtype {
font-style: italic;
vertical-align: top;
}
.params .paramdir {
font-family: "courier new",courier,monospace;
vertical-align: top;
}
/* @end */
/* @group Directory (tree) */
/* for the tree view */
.ftvtree {
font-family: sans-serif;
margin: 0px;
}
/* these are for tree view when used as main index */
.directory {
font-size: 9pt;
font-weight: bold;
margin: 5px;
}
.directory h3 {
margin: 0px;
margin-top: 1em;
font-size: 11pt;
}
/*
The following two styles can be used to replace the root node title
with an image of your choice. Simply uncomment the next two styles,
specify the name of your image and be sure to set 'height' to the
proper pixel height of your image.
*/
/*
.directory h3.swap {
height: 61px;
background-repeat: no-repeat;
background-image: url("yourimage.gif");
}
.directory h3.swap span {
display: none;
}
*/
.directory > h3 {
margin-top: 0;
}
.directory p {
margin: 0px;
white-space: nowrap;
}
.directory div {
display: none;
margin: 0px;
}
.directory img {
vertical-align: -30%;
}
/* these are for tree view when not used as main index */
.directory-alt {
font-size: 100%;
font-weight: bold;
}
.directory-alt h3 {
margin: 0px;
margin-top: 1em;
font-size: 11pt;
}
.directory-alt > h3 {
margin-top: 0;
}
.directory-alt p {
margin: 0px;
white-space: nowrap;
}
.directory-alt div {
display: none;
margin: 0px;
}
.directory-alt img {
vertical-align: -30%;
}
/* @end */
div.dynheader {
margin-top: 8px;
}
address {
font-style: normal;
color: #2A3D61;
}
table.doxtable {
border-collapse:collapse;
}
table.doxtable td, table.doxtable th {
border: 1px solid #2D4068;
padding: 3px 7px 2px;
}
table.doxtable th {
background-color: #374F7F;
color: #FFFFFF;
font-size: 110%;
padding-bottom: 4px;
padding-top: 5px;
text-align:left;
}
.tabsearch {
top: 0px;
left: 10px;
height: 36px;
background-image: url('tab_b.png');
z-index: 101;
overflow: hidden;
font-size: 13px;
}
.navpath ul
{
font-size: 11px;
background-image:url('tab_b.png');
background-repeat:repeat-x;
height:30px;
line-height:30px;
color:#8AA0CC;
border:solid 1px #C2CDE4;
overflow:hidden;
margin:0px;
padding:0px;
}
.navpath li
{
list-style-type:none;
float:left;
padding-left:10px;
padding-right:15px;
background-image:url('bc_s.png');
background-repeat:no-repeat;
background-position:right;
color:#364D7C;
}
.navpath li.navelem a
{
height:32px;
display:block;
text-decoration: none;
outline: none;
}
.navpath li.navelem a:hover
{
color:#6884BD;
}
.navpath li.footer
{
list-style-type:none;
float:right;
padding-left:10px;
padding-right:15px;
background-image:none;
background-repeat:no-repeat;
background-position:right;
color:#364D7C;
font-size: 8pt;
}
div.summary
{
float: right;
font-size: 8pt;
padding-right: 5px;
width: 50%;
text-align: right;
}
div.summary a
{
white-space: nowrap;
}
div.ingroups
{
font-size: 8pt;
padding-left: 5px;
width: 50%;
text-align: left;
}
div.ingroups a
{
white-space: nowrap;
}
div.header
{
background-image:url('nav_h.png');
background-repeat:repeat-x;
background-color: #F9FAFC;
margin: 0px;
border-bottom: 1px solid #C4CFE5;
}
div.headertitle
{
padding: 5px 5px 5px 10px;
}
dl
{
padding: 0 0 0 10px;
}
dl.note, dl.warning, dl.attention, dl.pre, dl.post, dl.invariant, dl.deprecated, dl.todo, dl.test, dl.bug
{
border-left:4px solid;
padding: 0 0 0 6px;
}
dl.note
{
border-color: #D0C000;
}
dl.warning, dl.attention
{
border-color: #FF0000;
}
dl.pre, dl.post, dl.invariant
{
border-color: #00D000;
}
dl.deprecated
{
border-color: #505050;
}
dl.todo
{
border-color: #00C0E0;
}
dl.test
{
border-color: #3030E0;
}
dl.bug
{
border-color: #C08050;
}
#projectlogo
{
text-align: center;
vertical-align: bottom;
border-collapse: separate;
}
#projectlogo img
{
border: 0px none;
}
#projectname
{
font: 300% Tahoma, Arial,sans-serif;
margin: 0px;
padding: 2px 0px;
}
#projectbrief
{
font: 120% Tahoma, Arial,sans-serif;
margin: 0px;
padding: 0px;
}
#projectnumber
{
font: 50% Tahoma, Arial,sans-serif;
margin: 0px;
padding: 0px;
}
#titlearea
{
padding: 0px;
margin: 0px;
width: 100%;
border-bottom: 1px solid #5373B4;
}
.image
{
text-align: center;
}
.dotgraph
{
text-align: center;
}
.mscgraph
{
text-align: center;
}
.caption
{
font-weight: bold;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -1,76 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: File List</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li class="current"><a href="files.html"><span>File&#160;List</span></a></li>
<li><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
</div>
<div class="header">
<div class="headertitle">
<div class="title">File List</div> </div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all files with brief descriptions:</div><table>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="array_8h.html">array.h</a></td><td class="indexvalue">Array functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="bit-ops_8h.html">bit-ops.h</a></td><td class="indexvalue">Bit operations </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="channel_8h.html">channel.h</a></td><td class="indexvalue">Channel functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="color_8h.html">color.h</a></td><td class="indexvalue">Color functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="curve-cache_8h.html">curve-cache.h</a></td><td class="indexvalue">Curve caching functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="curve_8h.html">curve.h</a></td><td class="indexvalue">Curve functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="dither_8h.html">dither.h</a></td><td class="indexvalue">Dither functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="gutenprint-intl-internal_8h.html">gutenprint-intl-internal.h</a></td><td class="indexvalue">Internationalisation functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="gutenprint-intl_8h.html">gutenprint-intl.h</a></td><td class="indexvalue">Internationalisation functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="gutenprint-module_8h.html">gutenprint-module.h</a></td><td class="indexvalue">Gutenprint module header </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="gutenprint-version_8h.html">gutenprint-version.h</a></td><td class="indexvalue">Version functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="gutenprint_8h.html">gutenprint.h</a></td><td class="indexvalue">Gutenprint master header </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="image_8h.html">image.h</a></td><td class="indexvalue">Image functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="list_8h.html">list.h</a></td><td class="indexvalue">Generic list functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="module_8h.html">module.h</a></td><td class="indexvalue">Module functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="mxml_8h.html">mxml.h</a></td><td class="indexvalue">Mini-XML XML parsing functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="paper_8h.html">paper.h</a></td><td class="indexvalue">Paper size functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="path_8h.html">path.h</a></td><td class="indexvalue">Simple directory path functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="printers_8h.html">printers.h</a></td><td class="indexvalue">Printer functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="sequence_8h.html">sequence.h</a></td><td class="indexvalue">Sequence functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="string-list_8h.html">string-list.h</a></td><td class="indexvalue">String list functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="util_8h.html">util.h</a></td><td class="indexvalue">Utility functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="vars_8h.html">vars.h</a></td><td class="indexvalue">Print job functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="weave_8h.html">weave.h</a></td><td class="indexvalue">Softweave functions </td></tr>
<tr><td class="indexkey">include/gutenprint/<a class="el" href="xml_8h.html">xml.h</a></td><td class="indexvalue">XML tree functions </td></tr>
</table>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,567 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Data Fields</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="classes.html"><span>Data&#160;Structure&#160;Index</span></a></li>
<li class="current"><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li class="current"><a href="functions.html"><span>All</span></a></li>
<li><a href="functions_vars.html"><span>Variables</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="#index_a"><span>a</span></a></li>
<li><a href="#index_b"><span>b</span></a></li>
<li><a href="#index_c"><span>c</span></a></li>
<li><a href="#index_d"><span>d</span></a></li>
<li><a href="#index_e"><span>e</span></a></li>
<li><a href="#index_f"><span>f</span></a></li>
<li><a href="#index_g"><span>g</span></a></li>
<li><a href="#index_h"><span>h</span></a></li>
<li><a href="#index_i"><span>i</span></a></li>
<li><a href="#index_j"><span>j</span></a></li>
<li><a href="#index_l"><span>l</span></a></li>
<li><a href="#index_m"><span>m</span></a></li>
<li><a href="#index_n"><span>n</span></a></li>
<li><a href="#index_o"><span>o</span></a></li>
<li><a href="#index_p"><span>p</span></a></li>
<li><a href="#index_r"><span>r</span></a></li>
<li><a href="#index_s"><span>s</span></a></li>
<li><a href="#index_t"><span>t</span></a></li>
<li><a href="#index_u"><span>u</span></a></li>
<li><a href="#index_v"><span>v</span></a></li>
<li><a href="#index_w"><span>w</span></a></li>
<li><a href="#index_x"><span>x</span></a></li>
<li><a href="#index_y"><span>y</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all struct and union fields with links to the structures/unions they belong to:</div>
<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
<li>array
: <a class="el" href="structstp__parameter__t.html#a28aef58241d3a500968ca65df099ee3a">stp_parameter_t</a>
</li>
<li>attrs
: <a class="el" href="structstp__mxml__value__s.html#a69974b612f59fd3ef1d5db85db2d1a07">stp_mxml_value_s</a>
</li>
</ul>
<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
<li>base
: <a class="el" href="structdither__matrix__impl.html#a331debb887e076f8b52952ba6cc2b50b">dither_matrix_impl</a>
</li>
<li>bit_pattern
: <a class="el" href="structstp__dotsize.html#a8d5273395d0e27004f779de0ea81ff23">stp_dotsize</a>
</li>
<li>boolean
: <a class="el" href="structstp__parameter__t.html#a74aaa2515728660657133ca3191e422c">stp_parameter_t</a>
</li>
<li>bottom
: <a class="el" href="structstp__papersize__t.html#a9c7fcf4d0bac23817b6f56996fed4043">stp_papersize_t</a>
</li>
<li>bounds
: <a class="el" href="structstp__parameter__t.html#abb297424036e868212f5086d5c5235fe">stp_parameter_t</a>
</li>
<li>bytes
: <a class="el" href="structstp__dither__matrix__normal.html#ad72d088edfe3223c2df8fd4fb6178b98">stp_dither_matrix_normal</a>
, <a class="el" href="structstp__raw__t.html#a5e4620104d47e7e593d75d1ebc977407">stp_raw_t</a>
, <a class="el" href="structstp__dither__matrix__generic.html#ab963ddf7c0826bd3cc316c2375f1205b">stp_dither_matrix_generic</a>
, <a class="el" href="structstp__dither__matrix__short.html#ad4d85727401505eab74e3e667f4a38f4">stp_dither_matrix_short</a>
</li>
</ul>
<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
<li>category
: <a class="el" href="structstp__parameter__t.html#a2cb67e4324a017746ca9bfda772aa50f">stp_parameter_t</a>
</li>
<li>channel
: <a class="el" href="structstp__parameter__t.html#a79bc0b76d5d5e238ddd205aa4a97ebad">stp_parameter_t</a>
</li>
<li>child
: <a class="el" href="structstp__mxml__node__s.html#a44550ea8d68a483ccc130c58b66ddd33">stp_mxml_node_s</a>
</li>
<li>class
: <a class="el" href="structstp__module.html#a4ebc727be1ec8edaaa1b25415a3932e3">stp_module</a>
</li>
<li>colorfuncs
: <a class="el" href="structstp__color.html#a4442d36d0bcf746130f82ffe6f90147f">stp_color</a>
</li>
<li>comment
: <a class="el" href="structstp__papersize__t.html#a5cdc973122b8cc2e612d2dee306cbf1d">stp_papersize_t</a>
, <a class="el" href="structstp__module.html#ab60ac536d9ec7b3a306cddf4c06e18bb">stp_module</a>
</li>
<li>conclude
: <a class="el" href="structstp__image.html#a5d2385711b303e055258c28f42ab7f4c">stp_image</a>
</li>
<li>count
: <a class="el" href="structstp__cached__curve__t.html#a99b772c3f4db71d58a4ee2315e712f04">stp_cached_curve_t</a>
</li>
<li>curve
: <a class="el" href="structstp__cached__curve__t.html#ae9b4170bfafe7d85b36689cbd8eea41e">stp_cached_curve_t</a>
, <a class="el" href="structstp__parameter__t.html#ad64f0c31d200d3d413725621b3ef9133">stp_parameter_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
<li>d_cache
: <a class="el" href="structstp__cached__curve__t.html#a59c26647178724471f383dea6e85f8ae">stp_cached_curve_t</a>
</li>
<li>data
: <a class="el" href="structstp__dither__matrix__short.html#af4f6b5634ea79cf694782e35a8d7607d">stp_dither_matrix_short</a>
, <a class="el" href="structstp__dither__matrix__generic.html#a52acbda296a57a6087852eab62bc62db">stp_dither_matrix_generic</a>
, <a class="el" href="structstp__raw__t.html#a36151f67569592aeac5c549a2a0daa2a">stp_raw_t</a>
, <a class="el" href="structstp__dither__matrix__normal.html#ae67cb37136c5e9d9c4b1a44cd2dab87b">stp_dither_matrix_normal</a>
</li>
<li>dbl
: <a class="el" href="structstp__parameter__t.html#a12fc8869d3056687e576af63c6fbd675">stp_parameter_t</a>
</li>
<li>deflt
: <a class="el" href="structstp__parameter__t.html#a79042d88fa0ab284a8e3e4ad7b969f90">stp_parameter_t</a>
</li>
<li>describe_output
: <a class="el" href="structstp__printfuncs__t.html#a444ec86f3fe02ac479cbf2fc152d3423">stp_printfuncs_t</a>
</li>
<li>describe_parameter
: <a class="el" href="structstp__colorfuncs__t.html#abf691142b608f4f02f33283dd3e67bae">stp_colorfuncs_t</a>
</li>
<li>describe_resolution
: <a class="el" href="structstp__printfuncs__t.html#a18e0da9638360173e0d75d839ce72b92">stp_printfuncs_t</a>
</li>
<li>dimension
: <a class="el" href="structstp__parameter__t.html#a29505a2b48cd755e10cedf01f3683d61">stp_parameter_t</a>
</li>
<li>dot_sizes
: <a class="el" href="structstp__shade.html#a5057a856d4a6f7095af66b8cefc3cdc3">stp_shade</a>
</li>
</ul>
<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
<li>element
: <a class="el" href="unionstp__mxml__value__u.html#ad4d8442bb433ac3da208e22ff0eaccf7">stp_mxml_value_u</a>
</li>
<li>end_job
: <a class="el" href="structstp__printfuncs__t.html#a81fa6b507a316a8d6d7404b29920936e">stp_printfuncs_t</a>
</li>
<li>end_pos
: <a class="el" href="structstp__linebounds__t.html#a9bc2a60779ccf4ac3d90d47441e883ab">stp_linebounds_t</a>
</li>
<li>exp
: <a class="el" href="structdither__matrix__impl.html#adb0e7fb4b5e5149f0815af448676df8b">dither_matrix_impl</a>
</li>
</ul>
<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
<li>fast_mask
: <a class="el" href="structdither__matrix__impl.html#a8c7141e2e35f6cc14896d23d15a81914">dither_matrix_impl</a>
</li>
<li>fini
: <a class="el" href="structstp__module.html#ae04ff0565f8ebd56b383917b602ffc4a">stp_module</a>
</li>
</ul>
<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
<li>get_appname
: <a class="el" href="structstp__image.html#a56636ad7c0dbf0a82284241f796d95cd">stp_image</a>
</li>
<li>get_external_options
: <a class="el" href="structstp__printfuncs__t.html#a1aee9299429a813e60c7c131ccf93c74">stp_printfuncs_t</a>
</li>
<li>get_row
: <a class="el" href="structstp__colorfuncs__t.html#af00aab442da969ffa5c6c1e592bad7cd">stp_colorfuncs_t</a>
, <a class="el" href="structstp__image.html#a8f7f8fb5826f52b8bd820f422c583350">stp_image</a>
</li>
</ul>
<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
<li>handle
: <a class="el" href="structstp__module.html#a1a96aa2db220972e124717cc6dd03c8e">stp_module</a>
</li>
<li>height
: <a class="el" href="structstp__image.html#a4977ad211581999a3f3290983929cce9">stp_image</a>
, <a class="el" href="structstp__papersize__t.html#a040d59e39abdef9b12c929734fb7a08c">stp_papersize_t</a>
</li>
<li>help
: <a class="el" href="structstp__parameter__t.html#a9f0637d6b97f0daa3122840eb2bd13db">stp_parameter_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
<li>i_own
: <a class="el" href="structdither__matrix__impl.html#a78152fe120c430f6400b731e5c722bd3">dither_matrix_impl</a>
</li>
<li>imageable_area
: <a class="el" href="structstp__printfuncs__t.html#a68c9339cc1b74382ec07eed78c2bd501">stp_printfuncs_t</a>
</li>
<li>index
: <a class="el" href="structdither__matrix__impl.html#ab744f40c883acc93ad0afbf5f048f27a">dither_matrix_impl</a>
</li>
<li>init
: <a class="el" href="structstp__colorfuncs__t.html#aa10cf47dc6db374ef209d0d96592b1fe">stp_colorfuncs_t</a>
, <a class="el" href="structstp__image.html#ace69bf25344a814cabea38afa4527086">stp_image</a>
, <a class="el" href="structstp__module.html#afa7d4259940b8d42a36f14108f504944">stp_module</a>
</li>
<li>integer
: <a class="el" href="structstp__parameter__t.html#a32ee2ba322a0b7d16520f52ded591cc5">stp_parameter_t</a>
, <a class="el" href="unionstp__mxml__value__u.html#a9540870864c06f2bf901024b7cc9048d">stp_mxml_value_u</a>
</li>
<li>is_active
: <a class="el" href="structstp__parameter__t.html#a8b1af01f0874c79b6dbc4d0eca432952">stp_parameter_t</a>
</li>
<li>is_mandatory
: <a class="el" href="structstp__parameter__t.html#ace4d02e3665f9cdfe83ed7dd559e1c1a">stp_parameter_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
<li>jet
: <a class="el" href="structstp__weave__t.html#a31163b246a77f7959161edb6dd9ff61e">stp_weave_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
<li>last_child
: <a class="el" href="structstp__mxml__node__s.html#a5fb356e73f91b24211882f42cbbe7a08">stp_mxml_node_s</a>
</li>
<li>last_x
: <a class="el" href="structdither__matrix__impl.html#af0728348e6da1cf904204ef88e0a5853">dither_matrix_impl</a>
</li>
<li>last_x_mod
: <a class="el" href="structdither__matrix__impl.html#a16f516218f0c5a31a1eac49e5c57add5">dither_matrix_impl</a>
</li>
<li>last_y
: <a class="el" href="structdither__matrix__impl.html#ac1a83c82c364098dce631ec7174574be">dither_matrix_impl</a>
</li>
<li>last_y_mod
: <a class="el" href="structdither__matrix__impl.html#ad03881dd78211b5bcb1a62453c060d2e">dither_matrix_impl</a>
</li>
<li>left
: <a class="el" href="structstp__papersize__t.html#a9ceb7ef01ea56c990eddbef4140b34a0">stp_papersize_t</a>
</li>
<li>limit
: <a class="el" href="structstp__printfuncs__t.html#a36e471ee24b92cfd67390a025cbc427e">stp_printfuncs_t</a>
</li>
<li>list_parameters
: <a class="el" href="structstp__colorfuncs__t.html#a14c6ae1a87ba1ba33f88fa71038f9ec9">stp_colorfuncs_t</a>
, <a class="el" href="structstp__printfuncs__t.html#a19dc0ba4351a154cf9450ac4fce1ca1a">stp_printfuncs_t</a>
</li>
<li>logicalpassstart
: <a class="el" href="structstp__weave__t.html#a1e50ffa910d33a365572ceb93f0197c6">stp_weave_t</a>
, <a class="el" href="structstp__pass__t.html#ae93d9d32f282f62426160626ff6c5ca3">stp_pass_t</a>
</li>
<li>long_name
: <a class="el" href="structstp__color.html#ab7c0a627b31ebfb97fd1db2677032479">stp_color</a>
</li>
<li>lower
: <a class="el" href="structstp__double__bound__t.html#aa00903ee6e04e01b6b2bb7033e3c76ce">stp_double_bound_t</a>
, <a class="el" href="structstp__int__bound__t.html#ac5ae98fad865ad6d4816016e233f5a53">stp_int_bound_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
<li>major
: <a class="el" href="structstp__module__version.html#a15add43e03d0e1624f40c083fa958692">stp_module_version</a>
</li>
<li>matrix
: <a class="el" href="structdither__matrix__impl.html#ae28102f9e3d3cfb8eb48d9e69e807f96">dither_matrix_impl</a>
</li>
<li>maximum_imageable_area
: <a class="el" href="structstp__printfuncs__t.html#a3661a4612e62e8e5aef31eaab345675c">stp_printfuncs_t</a>
</li>
<li>media_size
: <a class="el" href="structstp__printfuncs__t.html#a102e995ff1ce583f84e38409852bf95f">stp_printfuncs_t</a>
</li>
<li>minor
: <a class="el" href="structstp__module__version.html#aeced49a93c5e461fa95f809ad077fced">stp_module_version</a>
</li>
<li>missingstartrows
: <a class="el" href="structstp__weave__t.html#af60b909adb3f9efb541be500c08cf87e">stp_weave_t</a>
, <a class="el" href="structstp__pass__t.html#a462d1714bab638212fcae32b869c11d2">stp_pass_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
<li>name
: <a class="el" href="structstp__module.html#a32e2db7046f281afd6748afe111aee76">stp_module</a>
, <a class="el" href="structstp__mxml__attr__s.html#a4ea32ac1f797cf7722bf3e8638b21dee">stp_mxml_attr_s</a>
, <a class="el" href="structstp__papersize__t.html#a660431e579bf100782f7164b45597982">stp_papersize_t</a>
, <a class="el" href="structstp__param__string__t.html#ac4ccea0dded827b9acdb2d22aa25857b">stp_param_string_t</a>
, <a class="el" href="structstp__mxml__value__s.html#a959d5315fd98119aa5d23d2b8d307c58">stp_mxml_value_s</a>
, <a class="el" href="structstp__parameter__t.html#a092430e582e7560fb532f546f78ca70c">stp_parameter_t</a>
</li>
<li>ncolors
: <a class="el" href="structstp__lineactive__t.html#a266bdeb14e62fb5b17a31746ad511761">stp_lineactive_t</a>
, <a class="el" href="structstp__linecount__t.html#a69275ad8687438976d07950fa65a1728">stp_linecount_t</a>
, <a class="el" href="structstp__lineoff__t.html#a97c5a2281b3cddb9c546e8299ea4e2b0">stp_lineoff_t</a>
, <a class="el" href="structstp__linebufs__t.html#a5ad1c52050c8d71da5609d2526854696">stp_linebufs_t</a>
, <a class="el" href="structstp__linebounds__t.html#adc4641abb41a9204c258a380aa00b7f4">stp_linebounds_t</a>
</li>
<li>next
: <a class="el" href="structstp__mxml__node__s.html#a8831071db5a4b4df95ea3c5c2e95476b">stp_mxml_node_s</a>
</li>
<li>num_attrs
: <a class="el" href="structstp__mxml__value__s.html#af29b9bbc769c278dad18ff2cb098ef6a">stp_mxml_value_s</a>
</li>
<li>numsizes
: <a class="el" href="structstp__shade.html#a8e68774d99e3eecb76f06f7704f1eb90">stp_shade</a>
</li>
</ul>
<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
<li>opaque
: <a class="el" href="unionstp__mxml__value__u.html#aca8f6bf03f29248dee0b8d364454d051">stp_mxml_value_u</a>
</li>
</ul>
<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
<li>p_class
: <a class="el" href="structstp__parameter__t.html#a410388e541bdb14fbd0af2984e229217">stp_parameter_t</a>
</li>
<li>p_level
: <a class="el" href="structstp__parameter__t.html#a2a4a1195c06243e08acb03475fb1e7cc">stp_parameter_t</a>
</li>
<li>p_type
: <a class="el" href="structstp__parameter__t.html#aebe5dea02843240fe03461abf007f154">stp_parameter_t</a>
</li>
<li>paper_size_type
: <a class="el" href="structstp__papersize__t.html#a35412f4b1f65ab4697a6b2fb640d4576">stp_papersize_t</a>
</li>
<li>paper_unit
: <a class="el" href="structstp__papersize__t.html#a5692b27332297abca9e4715e3e9e3ce8">stp_papersize_t</a>
</li>
<li>parameters
: <a class="el" href="structstp__printfuncs__t.html#ac4eab991ca917968e0f264b7105faaa4">stp_printfuncs_t</a>
</li>
<li>parent
: <a class="el" href="structstp__mxml__node__s.html#a353df68e26a33380dcacda213a741487">stp_mxml_node_s</a>
</li>
<li>pass
: <a class="el" href="structstp__weave__t.html#a2536ce303e27f679c4afd6c33eea8d07">stp_weave_t</a>
, <a class="el" href="structstp__pass__t.html#afdb7d267dad9bfc69e8deb86da07ee7b">stp_pass_t</a>
</li>
<li>physpassend
: <a class="el" href="structstp__weave__t.html#a3041aa5f7a90d0d7d82d1b2406044bb3">stp_weave_t</a>
, <a class="el" href="structstp__pass__t.html#a4d75f7e07ebbffb75c2a7f36f43b3c9e">stp_pass_t</a>
</li>
<li>physpassstart
: <a class="el" href="structstp__weave__t.html#aaec693e98c7587da452ac604b675be3c">stp_weave_t</a>
, <a class="el" href="structstp__pass__t.html#a0da3d73932d6c07aceaf4bce93cf6163">stp_pass_t</a>
</li>
<li>prescaled
: <a class="el" href="structstp__dither__matrix__generic.html#a478d54ddf9ba50e783ddec1532a0eff6">stp_dither_matrix_generic</a>
, <a class="el" href="structstp__dither__matrix__normal.html#a042561ad856d67506fe81b1bbbffd966">stp_dither_matrix_normal</a>
, <a class="el" href="structstp__dither__matrix__short.html#a755361acae80fa4cba01a1cc71638274">stp_dither_matrix_short</a>
</li>
<li>prev
: <a class="el" href="structstp__mxml__node__s.html#a2174125dc205e7c760e4e8c9c9048ddf">stp_mxml_node_s</a>
</li>
<li>print
: <a class="el" href="structstp__printfuncs__t.html#a7704d7a1e997039deedfdf76a353c35d">stp_printfuncs_t</a>
</li>
<li>printer_list
: <a class="el" href="structstp__family.html#a6e4f0c216f5ced14a819fbacdb26547d">stp_family</a>
</li>
<li>printfuncs
: <a class="el" href="structstp__family.html#ad29f00ba3565e93c138b00e4a48cde77">stp_family</a>
</li>
</ul>
<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
<li>read_only
: <a class="el" href="structstp__parameter__t.html#a4421135f9985be49d156cbc9aa74c710">stp_parameter_t</a>
</li>
<li>real
: <a class="el" href="unionstp__mxml__value__u.html#a3f253397958ad919a1fc97c42a58bc67">stp_mxml_value_u</a>
</li>
<li>rep
: <a class="el" href="structstp__image.html#ab18e6ee35037589bf485213022e2d871">stp_image</a>
</li>
<li>reset
: <a class="el" href="structstp__image.html#a7bb2244368c6b1e07d27afb3dd249ffd">stp_image</a>
</li>
<li>right
: <a class="el" href="structstp__papersize__t.html#a6899599f2f940e95e03545ff71e2b4c5">stp_papersize_t</a>
</li>
<li>row
: <a class="el" href="structstp__weave__t.html#a708ad2c7d2f76b864fe92b9e0582eece">stp_weave_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
<li>s_cache
: <a class="el" href="structstp__cached__curve__t.html#ac55d549f6d2f567ba84ecb9e0417f074">stp_cached_curve_t</a>
</li>
<li>short_name
: <a class="el" href="structstp__color.html#a23ed4d11629625e2ad24b124c36c7fab">stp_color</a>
</li>
<li>start_job
: <a class="el" href="structstp__printfuncs__t.html#a5c99986ad02cbcc4dce313bc7f5293fc">stp_printfuncs_t</a>
</li>
<li>start_pos
: <a class="el" href="structstp__linebounds__t.html#ab46a1a4ec130dd043009fb96b0115467">stp_linebounds_t</a>
</li>
<li>str
: <a class="el" href="structstp__parameter__t.html#abfe1adab94129fefdafe9e64be135fb6">stp_parameter_t</a>
</li>
<li>string
: <a class="el" href="structstp__mxml__text__s.html#aef1865e8cab7d5ab175c6e67f122be15">stp_mxml_text_s</a>
</li>
<li>subpass
: <a class="el" href="structstp__pass__t.html#aa4a3363d8de9121ba3d8bf28076b1c89">stp_pass_t</a>
</li>
<li>syms
: <a class="el" href="structstp__module.html#a0e7297a93920d8f6849718d0a32fa2ba">stp_module</a>
</li>
</ul>
<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
<li>text
: <a class="el" href="unionstp__mxml__value__u.html#a82c76c9aca350baca3b72723d0a4e99d">stp_mxml_value_u</a>
, <a class="el" href="structstp__papersize__t.html#a26e8b5d0ce282614f128dd9d4aeaf9f6">stp_papersize_t</a>
, <a class="el" href="structstp__parameter__t.html#a396e4980926c200e9ce4454f19e7311a">stp_parameter_t</a>
, <a class="el" href="structstp__param__string__t.html#adb032e80e118c233adb9f27544920bd1">stp_param_string_t</a>
</li>
<li>top
: <a class="el" href="structstp__papersize__t.html#a7fc8acdb1d905d6ca4a0b9b247a6c48e">stp_papersize_t</a>
</li>
<li>total_size
: <a class="el" href="structdither__matrix__impl.html#a54645c1c4edad222cf3f5aba03cdfae5">dither_matrix_impl</a>
</li>
<li>type
: <a class="el" href="structstp__mxml__node__s.html#ae1bff9adee67699067516eee014a7510">stp_mxml_node_s</a>
</li>
</ul>
<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
<li>upper
: <a class="el" href="structstp__double__bound__t.html#a07d734f8f82f059460cee55927b0216c">stp_double_bound_t</a>
, <a class="el" href="structstp__int__bound__t.html#aa71bcebaae24712ee7a66955b345de19">stp_int_bound_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
<li>v
: <a class="el" href="structstp__lineoff__t.html#a88bbe86454fbda432487952640948328">stp_lineoff_t</a>
, <a class="el" href="structstp__lineactive__t.html#a5bb5843aa2a4817ef84fb83714b200f3">stp_lineactive_t</a>
, <a class="el" href="structstp__linebufs__t.html#a485ecae7a892476331d31079d33b9891">stp_linebufs_t</a>
, <a class="el" href="structstp__linecount__t.html#a2164f4045d892c45105f5780c80489a4">stp_linecount_t</a>
</li>
<li>value
: <a class="el" href="structstp__mxml__node__s.html#aad44d6b2fe0842de0bbf1312035372cd">stp_mxml_node_s</a>
, <a class="el" href="structstp__mxml__attr__s.html#a25554324bd8ccf8e9558e4705eda0daa">stp_mxml_attr_s</a>
, <a class="el" href="structstp__dotsize.html#ad259e8d169a7d140e4964b80790c7ddd">stp_dotsize</a>
, <a class="el" href="structstp__shade.html#a07a72426c7bcbf22f1cc253a97a453d4">stp_shade</a>
</li>
<li>verify
: <a class="el" href="structstp__printfuncs__t.html#a948b6d7219dbb30f47a93eef2f85fde2">stp_printfuncs_t</a>
</li>
<li>verify_this_parameter
: <a class="el" href="structstp__parameter__t.html#a56100203c262c60d4cb18c7a49cde27d">stp_parameter_t</a>
</li>
<li>version
: <a class="el" href="structstp__module.html#ae2038239913d3ddbece919082501c8d0">stp_module</a>
</li>
</ul>
<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
<li>whitespace
: <a class="el" href="structstp__mxml__text__s.html#a76bcfbb8c3de4e1c597468d51ef47184">stp_mxml_text_s</a>
</li>
<li>width
: <a class="el" href="structstp__papersize__t.html#aedcca3776ddeb5ed815df3aa112147dd">stp_papersize_t</a>
, <a class="el" href="structstp__image.html#a890033525988e15f4f4a0b4132e5f19b">stp_image</a>
</li>
</ul>
<h3><a class="anchor" id="index_x"></a>- x -</h3><ul>
<li>x
: <a class="el" href="structstp__curve__point__t.html#a92b13b94109b1270563a1116dc19b926">stp_curve_point_t</a>
, <a class="el" href="structstp__dither__matrix__short.html#a81e0b20e763080b79faa837a00cac832">stp_dither_matrix_short</a>
, <a class="el" href="structstp__dither__matrix__generic.html#a6b8bd1cc589c2195f055e5a57a05e03a">stp_dither_matrix_generic</a>
, <a class="el" href="structstp__dither__matrix__normal.html#ab9564690be42859d88ea264a29321af3">stp_dither_matrix_normal</a>
</li>
<li>x_offset
: <a class="el" href="structdither__matrix__impl.html#a665c02056a2d046a15aab462492d9dbc">dither_matrix_impl</a>
</li>
<li>x_size
: <a class="el" href="structdither__matrix__impl.html#a063e3b3617c3a9b4883f3b01cd7dfb48">dither_matrix_impl</a>
</li>
</ul>
<h3><a class="anchor" id="index_y"></a>- y -</h3><ul>
<li>y
: <a class="el" href="structstp__curve__point__t.html#a132b1e8be20525667ece971d02f60b9d">stp_curve_point_t</a>
, <a class="el" href="structstp__dither__matrix__short.html#a2bbc6c72006541250ba23b48bcab60e8">stp_dither_matrix_short</a>
, <a class="el" href="structstp__dither__matrix__generic.html#aaaddcac2ca33a3e822ded567bbbecfb9">stp_dither_matrix_generic</a>
, <a class="el" href="structstp__dither__matrix__normal.html#a410560f5186761cb7430f5b0a804b09c">stp_dither_matrix_normal</a>
</li>
<li>y_offset
: <a class="el" href="structdither__matrix__impl.html#a844cb19ea61f035bc2a21536f6f392c4">dither_matrix_impl</a>
</li>
<li>y_size
: <a class="el" href="structdither__matrix__impl.html#a33370af30d4c6cb0e441744c8d1c3686">dither_matrix_impl</a>
</li>
</ul>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,567 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Data Fields - Variables</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li class="current"><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li><a href="classes.html"><span>Data&#160;Structure&#160;Index</span></a></li>
<li class="current"><a href="functions.html"><span>Data&#160;Fields</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li><a href="functions.html"><span>All</span></a></li>
<li class="current"><a href="functions_vars.html"><span>Variables</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="#index_a"><span>a</span></a></li>
<li><a href="#index_b"><span>b</span></a></li>
<li><a href="#index_c"><span>c</span></a></li>
<li><a href="#index_d"><span>d</span></a></li>
<li><a href="#index_e"><span>e</span></a></li>
<li><a href="#index_f"><span>f</span></a></li>
<li><a href="#index_g"><span>g</span></a></li>
<li><a href="#index_h"><span>h</span></a></li>
<li><a href="#index_i"><span>i</span></a></li>
<li><a href="#index_j"><span>j</span></a></li>
<li><a href="#index_l"><span>l</span></a></li>
<li><a href="#index_m"><span>m</span></a></li>
<li><a href="#index_n"><span>n</span></a></li>
<li><a href="#index_o"><span>o</span></a></li>
<li><a href="#index_p"><span>p</span></a></li>
<li><a href="#index_r"><span>r</span></a></li>
<li><a href="#index_s"><span>s</span></a></li>
<li><a href="#index_t"><span>t</span></a></li>
<li><a href="#index_u"><span>u</span></a></li>
<li><a href="#index_v"><span>v</span></a></li>
<li><a href="#index_w"><span>w</span></a></li>
<li><a href="#index_x"><span>x</span></a></li>
<li><a href="#index_y"><span>y</span></a></li>
</ul>
</div>
</div>
<div class="contents">
&#160;
<h3><a class="anchor" id="index_a"></a>- a -</h3><ul>
<li>array
: <a class="el" href="structstp__parameter__t.html#a28aef58241d3a500968ca65df099ee3a">stp_parameter_t</a>
</li>
<li>attrs
: <a class="el" href="structstp__mxml__value__s.html#a69974b612f59fd3ef1d5db85db2d1a07">stp_mxml_value_s</a>
</li>
</ul>
<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
<li>base
: <a class="el" href="structdither__matrix__impl.html#a331debb887e076f8b52952ba6cc2b50b">dither_matrix_impl</a>
</li>
<li>bit_pattern
: <a class="el" href="structstp__dotsize.html#a8d5273395d0e27004f779de0ea81ff23">stp_dotsize</a>
</li>
<li>boolean
: <a class="el" href="structstp__parameter__t.html#a74aaa2515728660657133ca3191e422c">stp_parameter_t</a>
</li>
<li>bottom
: <a class="el" href="structstp__papersize__t.html#a9c7fcf4d0bac23817b6f56996fed4043">stp_papersize_t</a>
</li>
<li>bounds
: <a class="el" href="structstp__parameter__t.html#abb297424036e868212f5086d5c5235fe">stp_parameter_t</a>
</li>
<li>bytes
: <a class="el" href="structstp__dither__matrix__normal.html#ad72d088edfe3223c2df8fd4fb6178b98">stp_dither_matrix_normal</a>
, <a class="el" href="structstp__raw__t.html#a5e4620104d47e7e593d75d1ebc977407">stp_raw_t</a>
, <a class="el" href="structstp__dither__matrix__generic.html#ab963ddf7c0826bd3cc316c2375f1205b">stp_dither_matrix_generic</a>
, <a class="el" href="structstp__dither__matrix__short.html#ad4d85727401505eab74e3e667f4a38f4">stp_dither_matrix_short</a>
</li>
</ul>
<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
<li>category
: <a class="el" href="structstp__parameter__t.html#a2cb67e4324a017746ca9bfda772aa50f">stp_parameter_t</a>
</li>
<li>channel
: <a class="el" href="structstp__parameter__t.html#a79bc0b76d5d5e238ddd205aa4a97ebad">stp_parameter_t</a>
</li>
<li>child
: <a class="el" href="structstp__mxml__node__s.html#a44550ea8d68a483ccc130c58b66ddd33">stp_mxml_node_s</a>
</li>
<li>class
: <a class="el" href="structstp__module.html#a4ebc727be1ec8edaaa1b25415a3932e3">stp_module</a>
</li>
<li>colorfuncs
: <a class="el" href="structstp__color.html#a4442d36d0bcf746130f82ffe6f90147f">stp_color</a>
</li>
<li>comment
: <a class="el" href="structstp__papersize__t.html#a5cdc973122b8cc2e612d2dee306cbf1d">stp_papersize_t</a>
, <a class="el" href="structstp__module.html#ab60ac536d9ec7b3a306cddf4c06e18bb">stp_module</a>
</li>
<li>conclude
: <a class="el" href="structstp__image.html#a5d2385711b303e055258c28f42ab7f4c">stp_image</a>
</li>
<li>count
: <a class="el" href="structstp__cached__curve__t.html#a99b772c3f4db71d58a4ee2315e712f04">stp_cached_curve_t</a>
</li>
<li>curve
: <a class="el" href="structstp__cached__curve__t.html#ae9b4170bfafe7d85b36689cbd8eea41e">stp_cached_curve_t</a>
, <a class="el" href="structstp__parameter__t.html#ad64f0c31d200d3d413725621b3ef9133">stp_parameter_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
<li>d_cache
: <a class="el" href="structstp__cached__curve__t.html#a59c26647178724471f383dea6e85f8ae">stp_cached_curve_t</a>
</li>
<li>data
: <a class="el" href="structstp__dither__matrix__short.html#af4f6b5634ea79cf694782e35a8d7607d">stp_dither_matrix_short</a>
, <a class="el" href="structstp__dither__matrix__generic.html#a52acbda296a57a6087852eab62bc62db">stp_dither_matrix_generic</a>
, <a class="el" href="structstp__raw__t.html#a36151f67569592aeac5c549a2a0daa2a">stp_raw_t</a>
, <a class="el" href="structstp__dither__matrix__normal.html#ae67cb37136c5e9d9c4b1a44cd2dab87b">stp_dither_matrix_normal</a>
</li>
<li>dbl
: <a class="el" href="structstp__parameter__t.html#a12fc8869d3056687e576af63c6fbd675">stp_parameter_t</a>
</li>
<li>deflt
: <a class="el" href="structstp__parameter__t.html#a79042d88fa0ab284a8e3e4ad7b969f90">stp_parameter_t</a>
</li>
<li>describe_output
: <a class="el" href="structstp__printfuncs__t.html#a444ec86f3fe02ac479cbf2fc152d3423">stp_printfuncs_t</a>
</li>
<li>describe_parameter
: <a class="el" href="structstp__colorfuncs__t.html#abf691142b608f4f02f33283dd3e67bae">stp_colorfuncs_t</a>
</li>
<li>describe_resolution
: <a class="el" href="structstp__printfuncs__t.html#a18e0da9638360173e0d75d839ce72b92">stp_printfuncs_t</a>
</li>
<li>dimension
: <a class="el" href="structstp__parameter__t.html#a29505a2b48cd755e10cedf01f3683d61">stp_parameter_t</a>
</li>
<li>dot_sizes
: <a class="el" href="structstp__shade.html#a5057a856d4a6f7095af66b8cefc3cdc3">stp_shade</a>
</li>
</ul>
<h3><a class="anchor" id="index_e"></a>- e -</h3><ul>
<li>element
: <a class="el" href="unionstp__mxml__value__u.html#ad4d8442bb433ac3da208e22ff0eaccf7">stp_mxml_value_u</a>
</li>
<li>end_job
: <a class="el" href="structstp__printfuncs__t.html#a81fa6b507a316a8d6d7404b29920936e">stp_printfuncs_t</a>
</li>
<li>end_pos
: <a class="el" href="structstp__linebounds__t.html#a9bc2a60779ccf4ac3d90d47441e883ab">stp_linebounds_t</a>
</li>
<li>exp
: <a class="el" href="structdither__matrix__impl.html#adb0e7fb4b5e5149f0815af448676df8b">dither_matrix_impl</a>
</li>
</ul>
<h3><a class="anchor" id="index_f"></a>- f -</h3><ul>
<li>fast_mask
: <a class="el" href="structdither__matrix__impl.html#a8c7141e2e35f6cc14896d23d15a81914">dither_matrix_impl</a>
</li>
<li>fini
: <a class="el" href="structstp__module.html#ae04ff0565f8ebd56b383917b602ffc4a">stp_module</a>
</li>
</ul>
<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
<li>get_appname
: <a class="el" href="structstp__image.html#a56636ad7c0dbf0a82284241f796d95cd">stp_image</a>
</li>
<li>get_external_options
: <a class="el" href="structstp__printfuncs__t.html#a1aee9299429a813e60c7c131ccf93c74">stp_printfuncs_t</a>
</li>
<li>get_row
: <a class="el" href="structstp__colorfuncs__t.html#af00aab442da969ffa5c6c1e592bad7cd">stp_colorfuncs_t</a>
, <a class="el" href="structstp__image.html#a8f7f8fb5826f52b8bd820f422c583350">stp_image</a>
</li>
</ul>
<h3><a class="anchor" id="index_h"></a>- h -</h3><ul>
<li>handle
: <a class="el" href="structstp__module.html#a1a96aa2db220972e124717cc6dd03c8e">stp_module</a>
</li>
<li>height
: <a class="el" href="structstp__image.html#a4977ad211581999a3f3290983929cce9">stp_image</a>
, <a class="el" href="structstp__papersize__t.html#a040d59e39abdef9b12c929734fb7a08c">stp_papersize_t</a>
</li>
<li>help
: <a class="el" href="structstp__parameter__t.html#a9f0637d6b97f0daa3122840eb2bd13db">stp_parameter_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_i"></a>- i -</h3><ul>
<li>i_own
: <a class="el" href="structdither__matrix__impl.html#a78152fe120c430f6400b731e5c722bd3">dither_matrix_impl</a>
</li>
<li>imageable_area
: <a class="el" href="structstp__printfuncs__t.html#a68c9339cc1b74382ec07eed78c2bd501">stp_printfuncs_t</a>
</li>
<li>index
: <a class="el" href="structdither__matrix__impl.html#ab744f40c883acc93ad0afbf5f048f27a">dither_matrix_impl</a>
</li>
<li>init
: <a class="el" href="structstp__colorfuncs__t.html#aa10cf47dc6db374ef209d0d96592b1fe">stp_colorfuncs_t</a>
, <a class="el" href="structstp__image.html#ace69bf25344a814cabea38afa4527086">stp_image</a>
, <a class="el" href="structstp__module.html#afa7d4259940b8d42a36f14108f504944">stp_module</a>
</li>
<li>integer
: <a class="el" href="structstp__parameter__t.html#a32ee2ba322a0b7d16520f52ded591cc5">stp_parameter_t</a>
, <a class="el" href="unionstp__mxml__value__u.html#a9540870864c06f2bf901024b7cc9048d">stp_mxml_value_u</a>
</li>
<li>is_active
: <a class="el" href="structstp__parameter__t.html#a8b1af01f0874c79b6dbc4d0eca432952">stp_parameter_t</a>
</li>
<li>is_mandatory
: <a class="el" href="structstp__parameter__t.html#ace4d02e3665f9cdfe83ed7dd559e1c1a">stp_parameter_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_j"></a>- j -</h3><ul>
<li>jet
: <a class="el" href="structstp__weave__t.html#a31163b246a77f7959161edb6dd9ff61e">stp_weave_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_l"></a>- l -</h3><ul>
<li>last_child
: <a class="el" href="structstp__mxml__node__s.html#a5fb356e73f91b24211882f42cbbe7a08">stp_mxml_node_s</a>
</li>
<li>last_x
: <a class="el" href="structdither__matrix__impl.html#af0728348e6da1cf904204ef88e0a5853">dither_matrix_impl</a>
</li>
<li>last_x_mod
: <a class="el" href="structdither__matrix__impl.html#a16f516218f0c5a31a1eac49e5c57add5">dither_matrix_impl</a>
</li>
<li>last_y
: <a class="el" href="structdither__matrix__impl.html#ac1a83c82c364098dce631ec7174574be">dither_matrix_impl</a>
</li>
<li>last_y_mod
: <a class="el" href="structdither__matrix__impl.html#ad03881dd78211b5bcb1a62453c060d2e">dither_matrix_impl</a>
</li>
<li>left
: <a class="el" href="structstp__papersize__t.html#a9ceb7ef01ea56c990eddbef4140b34a0">stp_papersize_t</a>
</li>
<li>limit
: <a class="el" href="structstp__printfuncs__t.html#a36e471ee24b92cfd67390a025cbc427e">stp_printfuncs_t</a>
</li>
<li>list_parameters
: <a class="el" href="structstp__colorfuncs__t.html#a14c6ae1a87ba1ba33f88fa71038f9ec9">stp_colorfuncs_t</a>
, <a class="el" href="structstp__printfuncs__t.html#a19dc0ba4351a154cf9450ac4fce1ca1a">stp_printfuncs_t</a>
</li>
<li>logicalpassstart
: <a class="el" href="structstp__weave__t.html#a1e50ffa910d33a365572ceb93f0197c6">stp_weave_t</a>
, <a class="el" href="structstp__pass__t.html#ae93d9d32f282f62426160626ff6c5ca3">stp_pass_t</a>
</li>
<li>long_name
: <a class="el" href="structstp__color.html#ab7c0a627b31ebfb97fd1db2677032479">stp_color</a>
</li>
<li>lower
: <a class="el" href="structstp__double__bound__t.html#aa00903ee6e04e01b6b2bb7033e3c76ce">stp_double_bound_t</a>
, <a class="el" href="structstp__int__bound__t.html#ac5ae98fad865ad6d4816016e233f5a53">stp_int_bound_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_m"></a>- m -</h3><ul>
<li>major
: <a class="el" href="structstp__module__version.html#a15add43e03d0e1624f40c083fa958692">stp_module_version</a>
</li>
<li>matrix
: <a class="el" href="structdither__matrix__impl.html#ae28102f9e3d3cfb8eb48d9e69e807f96">dither_matrix_impl</a>
</li>
<li>maximum_imageable_area
: <a class="el" href="structstp__printfuncs__t.html#a3661a4612e62e8e5aef31eaab345675c">stp_printfuncs_t</a>
</li>
<li>media_size
: <a class="el" href="structstp__printfuncs__t.html#a102e995ff1ce583f84e38409852bf95f">stp_printfuncs_t</a>
</li>
<li>minor
: <a class="el" href="structstp__module__version.html#aeced49a93c5e461fa95f809ad077fced">stp_module_version</a>
</li>
<li>missingstartrows
: <a class="el" href="structstp__weave__t.html#af60b909adb3f9efb541be500c08cf87e">stp_weave_t</a>
, <a class="el" href="structstp__pass__t.html#a462d1714bab638212fcae32b869c11d2">stp_pass_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
<li>name
: <a class="el" href="structstp__module.html#a32e2db7046f281afd6748afe111aee76">stp_module</a>
, <a class="el" href="structstp__mxml__attr__s.html#a4ea32ac1f797cf7722bf3e8638b21dee">stp_mxml_attr_s</a>
, <a class="el" href="structstp__papersize__t.html#a660431e579bf100782f7164b45597982">stp_papersize_t</a>
, <a class="el" href="structstp__param__string__t.html#ac4ccea0dded827b9acdb2d22aa25857b">stp_param_string_t</a>
, <a class="el" href="structstp__mxml__value__s.html#a959d5315fd98119aa5d23d2b8d307c58">stp_mxml_value_s</a>
, <a class="el" href="structstp__parameter__t.html#a092430e582e7560fb532f546f78ca70c">stp_parameter_t</a>
</li>
<li>ncolors
: <a class="el" href="structstp__lineactive__t.html#a266bdeb14e62fb5b17a31746ad511761">stp_lineactive_t</a>
, <a class="el" href="structstp__linecount__t.html#a69275ad8687438976d07950fa65a1728">stp_linecount_t</a>
, <a class="el" href="structstp__lineoff__t.html#a97c5a2281b3cddb9c546e8299ea4e2b0">stp_lineoff_t</a>
, <a class="el" href="structstp__linebufs__t.html#a5ad1c52050c8d71da5609d2526854696">stp_linebufs_t</a>
, <a class="el" href="structstp__linebounds__t.html#adc4641abb41a9204c258a380aa00b7f4">stp_linebounds_t</a>
</li>
<li>next
: <a class="el" href="structstp__mxml__node__s.html#a8831071db5a4b4df95ea3c5c2e95476b">stp_mxml_node_s</a>
</li>
<li>num_attrs
: <a class="el" href="structstp__mxml__value__s.html#af29b9bbc769c278dad18ff2cb098ef6a">stp_mxml_value_s</a>
</li>
<li>numsizes
: <a class="el" href="structstp__shade.html#a8e68774d99e3eecb76f06f7704f1eb90">stp_shade</a>
</li>
</ul>
<h3><a class="anchor" id="index_o"></a>- o -</h3><ul>
<li>opaque
: <a class="el" href="unionstp__mxml__value__u.html#aca8f6bf03f29248dee0b8d364454d051">stp_mxml_value_u</a>
</li>
</ul>
<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
<li>p_class
: <a class="el" href="structstp__parameter__t.html#a410388e541bdb14fbd0af2984e229217">stp_parameter_t</a>
</li>
<li>p_level
: <a class="el" href="structstp__parameter__t.html#a2a4a1195c06243e08acb03475fb1e7cc">stp_parameter_t</a>
</li>
<li>p_type
: <a class="el" href="structstp__parameter__t.html#aebe5dea02843240fe03461abf007f154">stp_parameter_t</a>
</li>
<li>paper_size_type
: <a class="el" href="structstp__papersize__t.html#a35412f4b1f65ab4697a6b2fb640d4576">stp_papersize_t</a>
</li>
<li>paper_unit
: <a class="el" href="structstp__papersize__t.html#a5692b27332297abca9e4715e3e9e3ce8">stp_papersize_t</a>
</li>
<li>parameters
: <a class="el" href="structstp__printfuncs__t.html#ac4eab991ca917968e0f264b7105faaa4">stp_printfuncs_t</a>
</li>
<li>parent
: <a class="el" href="structstp__mxml__node__s.html#a353df68e26a33380dcacda213a741487">stp_mxml_node_s</a>
</li>
<li>pass
: <a class="el" href="structstp__weave__t.html#a2536ce303e27f679c4afd6c33eea8d07">stp_weave_t</a>
, <a class="el" href="structstp__pass__t.html#afdb7d267dad9bfc69e8deb86da07ee7b">stp_pass_t</a>
</li>
<li>physpassend
: <a class="el" href="structstp__weave__t.html#a3041aa5f7a90d0d7d82d1b2406044bb3">stp_weave_t</a>
, <a class="el" href="structstp__pass__t.html#a4d75f7e07ebbffb75c2a7f36f43b3c9e">stp_pass_t</a>
</li>
<li>physpassstart
: <a class="el" href="structstp__weave__t.html#aaec693e98c7587da452ac604b675be3c">stp_weave_t</a>
, <a class="el" href="structstp__pass__t.html#a0da3d73932d6c07aceaf4bce93cf6163">stp_pass_t</a>
</li>
<li>prescaled
: <a class="el" href="structstp__dither__matrix__generic.html#a478d54ddf9ba50e783ddec1532a0eff6">stp_dither_matrix_generic</a>
, <a class="el" href="structstp__dither__matrix__normal.html#a042561ad856d67506fe81b1bbbffd966">stp_dither_matrix_normal</a>
, <a class="el" href="structstp__dither__matrix__short.html#a755361acae80fa4cba01a1cc71638274">stp_dither_matrix_short</a>
</li>
<li>prev
: <a class="el" href="structstp__mxml__node__s.html#a2174125dc205e7c760e4e8c9c9048ddf">stp_mxml_node_s</a>
</li>
<li>print
: <a class="el" href="structstp__printfuncs__t.html#a7704d7a1e997039deedfdf76a353c35d">stp_printfuncs_t</a>
</li>
<li>printer_list
: <a class="el" href="structstp__family.html#a6e4f0c216f5ced14a819fbacdb26547d">stp_family</a>
</li>
<li>printfuncs
: <a class="el" href="structstp__family.html#ad29f00ba3565e93c138b00e4a48cde77">stp_family</a>
</li>
</ul>
<h3><a class="anchor" id="index_r"></a>- r -</h3><ul>
<li>read_only
: <a class="el" href="structstp__parameter__t.html#a4421135f9985be49d156cbc9aa74c710">stp_parameter_t</a>
</li>
<li>real
: <a class="el" href="unionstp__mxml__value__u.html#a3f253397958ad919a1fc97c42a58bc67">stp_mxml_value_u</a>
</li>
<li>rep
: <a class="el" href="structstp__image.html#ab18e6ee35037589bf485213022e2d871">stp_image</a>
</li>
<li>reset
: <a class="el" href="structstp__image.html#a7bb2244368c6b1e07d27afb3dd249ffd">stp_image</a>
</li>
<li>right
: <a class="el" href="structstp__papersize__t.html#a6899599f2f940e95e03545ff71e2b4c5">stp_papersize_t</a>
</li>
<li>row
: <a class="el" href="structstp__weave__t.html#a708ad2c7d2f76b864fe92b9e0582eece">stp_weave_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_s"></a>- s -</h3><ul>
<li>s_cache
: <a class="el" href="structstp__cached__curve__t.html#ac55d549f6d2f567ba84ecb9e0417f074">stp_cached_curve_t</a>
</li>
<li>short_name
: <a class="el" href="structstp__color.html#a23ed4d11629625e2ad24b124c36c7fab">stp_color</a>
</li>
<li>start_job
: <a class="el" href="structstp__printfuncs__t.html#a5c99986ad02cbcc4dce313bc7f5293fc">stp_printfuncs_t</a>
</li>
<li>start_pos
: <a class="el" href="structstp__linebounds__t.html#ab46a1a4ec130dd043009fb96b0115467">stp_linebounds_t</a>
</li>
<li>str
: <a class="el" href="structstp__parameter__t.html#abfe1adab94129fefdafe9e64be135fb6">stp_parameter_t</a>
</li>
<li>string
: <a class="el" href="structstp__mxml__text__s.html#aef1865e8cab7d5ab175c6e67f122be15">stp_mxml_text_s</a>
</li>
<li>subpass
: <a class="el" href="structstp__pass__t.html#aa4a3363d8de9121ba3d8bf28076b1c89">stp_pass_t</a>
</li>
<li>syms
: <a class="el" href="structstp__module.html#a0e7297a93920d8f6849718d0a32fa2ba">stp_module</a>
</li>
</ul>
<h3><a class="anchor" id="index_t"></a>- t -</h3><ul>
<li>text
: <a class="el" href="unionstp__mxml__value__u.html#a82c76c9aca350baca3b72723d0a4e99d">stp_mxml_value_u</a>
, <a class="el" href="structstp__papersize__t.html#a26e8b5d0ce282614f128dd9d4aeaf9f6">stp_papersize_t</a>
, <a class="el" href="structstp__parameter__t.html#a396e4980926c200e9ce4454f19e7311a">stp_parameter_t</a>
, <a class="el" href="structstp__param__string__t.html#adb032e80e118c233adb9f27544920bd1">stp_param_string_t</a>
</li>
<li>top
: <a class="el" href="structstp__papersize__t.html#a7fc8acdb1d905d6ca4a0b9b247a6c48e">stp_papersize_t</a>
</li>
<li>total_size
: <a class="el" href="structdither__matrix__impl.html#a54645c1c4edad222cf3f5aba03cdfae5">dither_matrix_impl</a>
</li>
<li>type
: <a class="el" href="structstp__mxml__node__s.html#ae1bff9adee67699067516eee014a7510">stp_mxml_node_s</a>
</li>
</ul>
<h3><a class="anchor" id="index_u"></a>- u -</h3><ul>
<li>upper
: <a class="el" href="structstp__double__bound__t.html#a07d734f8f82f059460cee55927b0216c">stp_double_bound_t</a>
, <a class="el" href="structstp__int__bound__t.html#aa71bcebaae24712ee7a66955b345de19">stp_int_bound_t</a>
</li>
</ul>
<h3><a class="anchor" id="index_v"></a>- v -</h3><ul>
<li>v
: <a class="el" href="structstp__lineoff__t.html#a88bbe86454fbda432487952640948328">stp_lineoff_t</a>
, <a class="el" href="structstp__lineactive__t.html#a5bb5843aa2a4817ef84fb83714b200f3">stp_lineactive_t</a>
, <a class="el" href="structstp__linebufs__t.html#a485ecae7a892476331d31079d33b9891">stp_linebufs_t</a>
, <a class="el" href="structstp__linecount__t.html#a2164f4045d892c45105f5780c80489a4">stp_linecount_t</a>
</li>
<li>value
: <a class="el" href="structstp__mxml__node__s.html#aad44d6b2fe0842de0bbf1312035372cd">stp_mxml_node_s</a>
, <a class="el" href="structstp__mxml__attr__s.html#a25554324bd8ccf8e9558e4705eda0daa">stp_mxml_attr_s</a>
, <a class="el" href="structstp__dotsize.html#ad259e8d169a7d140e4964b80790c7ddd">stp_dotsize</a>
, <a class="el" href="structstp__shade.html#a07a72426c7bcbf22f1cc253a97a453d4">stp_shade</a>
</li>
<li>verify
: <a class="el" href="structstp__printfuncs__t.html#a948b6d7219dbb30f47a93eef2f85fde2">stp_printfuncs_t</a>
</li>
<li>verify_this_parameter
: <a class="el" href="structstp__parameter__t.html#a56100203c262c60d4cb18c7a49cde27d">stp_parameter_t</a>
</li>
<li>version
: <a class="el" href="structstp__module.html#ae2038239913d3ddbece919082501c8d0">stp_module</a>
</li>
</ul>
<h3><a class="anchor" id="index_w"></a>- w -</h3><ul>
<li>whitespace
: <a class="el" href="structstp__mxml__text__s.html#a76bcfbb8c3de4e1c597468d51ef47184">stp_mxml_text_s</a>
</li>
<li>width
: <a class="el" href="structstp__papersize__t.html#aedcca3776ddeb5ed815df3aa112147dd">stp_papersize_t</a>
, <a class="el" href="structstp__image.html#a890033525988e15f4f4a0b4132e5f19b">stp_image</a>
</li>
</ul>
<h3><a class="anchor" id="index_x"></a>- x -</h3><ul>
<li>x
: <a class="el" href="structstp__curve__point__t.html#a92b13b94109b1270563a1116dc19b926">stp_curve_point_t</a>
, <a class="el" href="structstp__dither__matrix__short.html#a81e0b20e763080b79faa837a00cac832">stp_dither_matrix_short</a>
, <a class="el" href="structstp__dither__matrix__generic.html#a6b8bd1cc589c2195f055e5a57a05e03a">stp_dither_matrix_generic</a>
, <a class="el" href="structstp__dither__matrix__normal.html#ab9564690be42859d88ea264a29321af3">stp_dither_matrix_normal</a>
</li>
<li>x_offset
: <a class="el" href="structdither__matrix__impl.html#a665c02056a2d046a15aab462492d9dbc">dither_matrix_impl</a>
</li>
<li>x_size
: <a class="el" href="structdither__matrix__impl.html#a063e3b3617c3a9b4883f3b01cd7dfb48">dither_matrix_impl</a>
</li>
</ul>
<h3><a class="anchor" id="index_y"></a>- y -</h3><ul>
<li>y
: <a class="el" href="structstp__curve__point__t.html#a132b1e8be20525667ece971d02f60b9d">stp_curve_point_t</a>
, <a class="el" href="structstp__dither__matrix__short.html#a2bbc6c72006541250ba23b48bcab60e8">stp_dither_matrix_short</a>
, <a class="el" href="structstp__dither__matrix__generic.html#aaaddcac2ca33a3e822ded567bbbecfb9">stp_dither_matrix_generic</a>
, <a class="el" href="structstp__dither__matrix__normal.html#a410560f5186761cb7430f5b0a804b09c">stp_dither_matrix_normal</a>
</li>
<li>y_offset
: <a class="el" href="structdither__matrix__impl.html#a844cb19ea61f035bc2a21536f6f392c4">dither_matrix_impl</a>
</li>
<li>y_size
: <a class="el" href="structdither__matrix__impl.html#a33370af30d4c6cb0e441744c8d1c3686">dither_matrix_impl</a>
</li>
</ul>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,80 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li class="current"><a href="globals.html"><span>All</span></a></li>
<li><a href="globals_func.html"><span>Functions</span></a></li>
<li><a href="globals_vars.html"><span>Variables</span></a></li>
<li><a href="globals_type.html"><span>Typedefs</span></a></li>
<li><a href="globals_enum.html"><span>Enumerations</span></a></li>
<li><a href="globals_eval.html"><span>Enumerator</span></a></li>
<li><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li class="current"><a href="globals.html#index__"><span>_</span></a></li>
<li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
<li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
<li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
<li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
<li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
<li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
<li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
<li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
<h3><a class="anchor" id="index__"></a>- _ -</h3><ul>
<li>_
: <a class="el" href="group__intl__internal.html#ga32a3cf3d9dd914f5aeeca5423c157934">gutenprint-intl-internal.h</a>
, <a class="el" href="group__intl.html#ga32a3cf3d9dd914f5aeeca5423c157934">gutenprint-intl.h</a>
</li>
<li>__attribute__
: <a class="el" href="util_8h.html#a9d373a9b65ff25b2db84c07394e1c212">util.h</a>
</li>
</ul>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,77 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li class="current"><a href="globals.html"><span>All</span></a></li>
<li><a href="globals_func.html"><span>Functions</span></a></li>
<li><a href="globals_vars.html"><span>Variables</span></a></li>
<li><a href="globals_type.html"><span>Typedefs</span></a></li>
<li><a href="globals_enum.html"><span>Enumerations</span></a></li>
<li><a href="globals_eval.html"><span>Enumerator</span></a></li>
<li><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="globals.html#index__"><span>_</span></a></li>
<li class="current"><a href="globals_0x62.html#index_b"><span>b</span></a></li>
<li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
<li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
<li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
<li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
<li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
<li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
<li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
<h3><a class="anchor" id="index_b"></a>- b -</h3><ul>
<li>bindtextdomain
: <a class="el" href="group__intl__internal.html#gadd6dfc1077058ff26d79cdb18099d58a">gutenprint-intl-internal.h</a>
, <a class="el" href="group__intl.html#gadd6dfc1077058ff26d79cdb18099d58a">gutenprint-intl.h</a>
</li>
</ul>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,85 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li class="current"><a href="globals.html"><span>All</span></a></li>
<li><a href="globals_func.html"><span>Functions</span></a></li>
<li><a href="globals_vars.html"><span>Variables</span></a></li>
<li><a href="globals_type.html"><span>Typedefs</span></a></li>
<li><a href="globals_enum.html"><span>Enumerations</span></a></li>
<li><a href="globals_eval.html"><span>Enumerator</span></a></li>
<li><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="globals.html#index__"><span>_</span></a></li>
<li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
<li class="current"><a href="globals_0x63.html#index_c"><span>c</span></a></li>
<li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
<li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
<li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
<li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
<li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
<li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
<h3><a class="anchor" id="index_c"></a>- c -</h3><ul>
<li>compdata_t
: <a class="el" href="group__vars.html#ga4d45b95baae036143e14adfc0014f562">vars.h</a>
</li>
<li>CURVE_CACHE_FAST_COUNT
: <a class="el" href="curve-cache_8h.html#a70b70d0328c61f17925402a4b1bb9a90">curve-cache.h</a>
</li>
<li>CURVE_CACHE_FAST_DOUBLE
: <a class="el" href="curve-cache_8h.html#af79c26492d6e6fd726498df18cae11fe">curve-cache.h</a>
</li>
<li>CURVE_CACHE_FAST_USHORT
: <a class="el" href="curve-cache_8h.html#a4b278e86a2f914893307fb20cf218e7c">curve-cache.h</a>
</li>
</ul>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,81 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li class="current"><a href="globals.html"><span>All</span></a></li>
<li><a href="globals_func.html"><span>Functions</span></a></li>
<li><a href="globals_vars.html"><span>Variables</span></a></li>
<li><a href="globals_type.html"><span>Typedefs</span></a></li>
<li><a href="globals_enum.html"><span>Enumerations</span></a></li>
<li><a href="globals_eval.html"><span>Enumerator</span></a></li>
<li><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="globals.html#index__"><span>_</span></a></li>
<li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
<li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
<li class="current"><a href="globals_0x64.html#index_d"><span>d</span></a></li>
<li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
<li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
<li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
<li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
<li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
<h3><a class="anchor" id="index_d"></a>- d -</h3><ul>
<li>dcgettext
: <a class="el" href="group__intl__internal.html#ga115dd6a6dd9d7a249f6374a7c06deef5">gutenprint-intl-internal.h</a>
, <a class="el" href="group__intl.html#ga115dd6a6dd9d7a249f6374a7c06deef5">gutenprint-intl.h</a>
</li>
<li>dgettext
: <a class="el" href="group__intl__internal.html#gad24abc7110e1bdf384dc2ef2b63e5d07">gutenprint-intl-internal.h</a>
, <a class="el" href="group__intl.html#gad24abc7110e1bdf384dc2ef2b63e5d07">gutenprint-intl.h</a>
</li>
</ul>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,77 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li class="current"><a href="globals.html"><span>All</span></a></li>
<li><a href="globals_func.html"><span>Functions</span></a></li>
<li><a href="globals_vars.html"><span>Variables</span></a></li>
<li><a href="globals_type.html"><span>Typedefs</span></a></li>
<li><a href="globals_enum.html"><span>Enumerations</span></a></li>
<li><a href="globals_eval.html"><span>Enumerator</span></a></li>
<li><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="globals.html#index__"><span>_</span></a></li>
<li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
<li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
<li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
<li class="current"><a href="globals_0x67.html#index_g"><span>g</span></a></li>
<li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
<li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
<li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
<li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
<h3><a class="anchor" id="index_g"></a>- g -</h3><ul>
<li>gettext
: <a class="el" href="group__intl__internal.html#ga83b8be0887dede025766d25e2bb884c6">gutenprint-intl-internal.h</a>
, <a class="el" href="group__intl.html#ga83b8be0887dede025766d25e2bb884c6">gutenprint-intl.h</a>
</li>
</ul>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,77 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li class="current"><a href="globals.html"><span>All</span></a></li>
<li><a href="globals_func.html"><span>Functions</span></a></li>
<li><a href="globals_vars.html"><span>Variables</span></a></li>
<li><a href="globals_type.html"><span>Typedefs</span></a></li>
<li><a href="globals_enum.html"><span>Enumerations</span></a></li>
<li><a href="globals_eval.html"><span>Enumerator</span></a></li>
<li><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="globals.html#index__"><span>_</span></a></li>
<li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
<li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
<li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
<li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
<li class="current"><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
<li><a href="globals_0x70.html#index_p"><span>p</span></a></li>
<li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
<li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
<h3><a class="anchor" id="index_n"></a>- n -</h3><ul>
<li>N_
: <a class="el" href="group__intl__internal.html#ga75278405e7f034d2b1af80bfd94675fe">gutenprint-intl-internal.h</a>
, <a class="el" href="group__intl.html#ga75278405e7f034d2b1af80bfd94675fe">gutenprint-intl.h</a>
</li>
</ul>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

View File

@ -1,100 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<title>libgutenprint API Reference: Globals</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<link href="doxygen.css" rel="stylesheet" type="text/css"/>
</head>
<body>
<!-- Generated by Doxygen 1.7.4 -->
<div id="top">
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
<tbody>
<tr style="height: 56px;">
<td style="padding-left: 0.5em;">
<div id="projectname">libgutenprint API Reference&#160;<span id="projectnumber">5.2.7</span></div>
</td>
</tr>
</tbody>
</table>
</div>
<div id="navrow1" class="tabs">
<ul class="tablist">
<li><a href="index.html"><span>Main&#160;Page</span></a></li>
<li><a href="pages.html"><span>Related&#160;Pages</span></a></li>
<li><a href="modules.html"><span>Modules</span></a></li>
<li><a href="annotated.html"><span>Data&#160;Structures</span></a></li>
<li class="current"><a href="files.html"><span>Files</span></a></li>
</ul>
</div>
<div id="navrow2" class="tabs2">
<ul class="tablist">
<li><a href="files.html"><span>File&#160;List</span></a></li>
<li class="current"><a href="globals.html"><span>Globals</span></a></li>
</ul>
</div>
<div id="navrow3" class="tabs2">
<ul class="tablist">
<li class="current"><a href="globals.html"><span>All</span></a></li>
<li><a href="globals_func.html"><span>Functions</span></a></li>
<li><a href="globals_vars.html"><span>Variables</span></a></li>
<li><a href="globals_type.html"><span>Typedefs</span></a></li>
<li><a href="globals_enum.html"><span>Enumerations</span></a></li>
<li><a href="globals_eval.html"><span>Enumerator</span></a></li>
<li><a href="globals_defs.html"><span>Defines</span></a></li>
</ul>
</div>
<div id="navrow4" class="tabs3">
<ul class="tablist">
<li><a href="globals.html#index__"><span>_</span></a></li>
<li><a href="globals_0x62.html#index_b"><span>b</span></a></li>
<li><a href="globals_0x63.html#index_c"><span>c</span></a></li>
<li><a href="globals_0x64.html#index_d"><span>d</span></a></li>
<li><a href="globals_0x67.html#index_g"><span>g</span></a></li>
<li><a href="globals_0x6e.html#index_n"><span>n</span></a></li>
<li class="current"><a href="globals_0x70.html#index_p"><span>p</span></a></li>
<li><a href="globals_0x73.html#index_s"><span>s</span></a></li>
<li><a href="globals_0x74.html#index_t"><span>t</span></a></li>
</ul>
</div>
</div>
<div class="contents">
<div class="textblock">Here is a list of all functions, variables, defines, enums, and typedefs with links to the files they belong to:</div>
<h3><a class="anchor" id="index_p"></a>- p -</h3><ul>
<li>PAPERSIZE_ENGLISH_EXTENDED
: <a class="el" href="group__papersize.html#gga72e4619e373e38dc02dc452813b7b958a00b7e9a18afc172872861b26dbcc8cb8">paper.h</a>
</li>
<li>PAPERSIZE_ENGLISH_STANDARD
: <a class="el" href="group__papersize.html#gga72e4619e373e38dc02dc452813b7b958adb394159413ade42022509cd3280fef3">paper.h</a>
</li>
<li>PAPERSIZE_METRIC_EXTENDED
: <a class="el" href="group__papersize.html#gga72e4619e373e38dc02dc452813b7b958a62e2906a87fa4bcf32913943fd5b225a">paper.h</a>
</li>
<li>PAPERSIZE_METRIC_STANDARD
: <a class="el" href="group__papersize.html#gga72e4619e373e38dc02dc452813b7b958a6d5868bc6707f8801ce4d584428c2ae8">paper.h</a>
</li>
<li>PAPERSIZE_TYPE_ENVELOPE
: <a class="el" href="group__papersize.html#gga31255c4eebfaaf5cd319e5638a6a3069a660290248a563e7590202afd3ba68fb4">paper.h</a>
</li>
<li>PAPERSIZE_TYPE_STANDARD
: <a class="el" href="group__papersize.html#gga31255c4eebfaaf5cd319e5638a6a3069a99d27f84f91d583c3e465e56c83fff2f">paper.h</a>
</li>
<li>PARAMETER_BAD
: <a class="el" href="group__vars.html#ggac061852de3627383cd415cd80a979e02a326a171221148779ec7df761b3eee967">vars.h</a>
</li>
<li>PARAMETER_INACTIVE
: <a class="el" href="group__vars.html#ggac061852de3627383cd415cd80a979e02a5cb96da6c2e3ae7187e85a1ef6e41fc6">vars.h</a>
</li>
<li>PARAMETER_OK
: <a class="el" href="group__vars.html#ggac061852de3627383cd415cd80a979e02a2df363618282a9164433c0f212b18616">vars.h</a>
</li>
</ul>
</div>
<hr class="footer"/><address class="footer"><small>Generated by&#160;
<a href="http://www.doxygen.org/index.html">
<img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.7.4 </small></address>
</body>
</html>

Some files were not shown because too many files have changed in this diff Show More