Comparar commits

..

1 Commits

Autor SHA1 Mensagem Data
msweet 357c466e44 Import cups.org releases
git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/tags/release-1.0@4306 a1ca3aef-8c08-0410-bb20-df032aa958be
2013-05-10 18:56:23 +00:00
176 arquivos alterados com 46747 adições e 4159 exclusões
+25
Ver Arquivo
@@ -0,0 +1,25 @@
CREDITS.txt - 10/01/1999
------------------------
Few projects are completed by one person, and CUPS is no exception. We'd
like to thank the following individuals for their contributions:
Nathaniel Barbour - Lots of testing and feedback.
N. Becker - setsid().
Jean-Eric Cuendet - GhostScript filters for CUPS.
Van Dang - HTTP and IPP policeman.
Dr. ZP Han - setgid()/setuid().
Guy Harris - *BSD shared libraries and lots of other fixes.
Wang Jian - CUPS RPM corrections.
Roderick Johnstone - Beta tester of the millenium.
Sergey V. Kovalyov - ESP Print Pro and CUPS beta tester.
Mark Lawrence - Microsoft interoperability testing.
Jason McMullan - Original CUPS RPM distributions.
Wes Morgan - *BSD fixes.
Ulrich Oldendorf - German locale.
Petter Reinholdtsen - HP-UX compiler stuff.
Stuart Stevens - HP JetDirect IPP information.
Kiko - Bug fixes.
If I've missed someone, please let me know by sending an email to
"mike@easysw.com".
+1
Ver Arquivo
@@ -37,6 +37,7 @@ DSO = @DSO@
HTMLDOC = @HTMLDOC@
LN = /bin/ln -sf
MKDIR = @MKDIR@ -p
MV = @MV@
NROFF = @NROFF@
PACK = @PACK@
RANLIB = @RANLIB@
+10 -21
Ver Arquivo
@@ -1,15 +1,5 @@
README - CUPS v1.0b6 - 07/30/1999
---------------------------------
BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE
WARNING - This is a BETA release of CUPS, which means that it may
contain "bugs" that could prevent you from printing. If
you are concerned that this may cause you lost time or
money, please STOP and do not install this software!
BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE BETA SOFTWARE
README - CUPS v1.0 - 10/01/1999
-------------------------------
INTRODUCTION
@@ -20,9 +10,8 @@ and users. CUPS provides the System V and Berkeley command-line
interfaces.
CUPS uses the Internet Printing Protocol (IETF-IPP) as the basis for
managing print jobs and queues. The Line Printer Daemon (LPD,
RFC1179), Server Message Block (SMB), and AppSocket protocols are also
supported with reduced functionality.
managing print jobs and queues. The Line Printer Daemon (LPD, RFC1179)
and AppSocket protocols are also supported with reduced functionality.
CUPS adds network printer browsing and PostScript Printer Description
("PPD")-based printing options to support real world applications under
@@ -57,7 +46,7 @@ the binary distributions from Easy Software Products:
- Digital UNIX (aka OSF1 aka Compaq Tru64 UNIX) 4.0 or higher
- HP-UX 10.20 or higher
- IRIX 5.3 or higher
- Linux 2.0.36 with glibc2 or higher (tested with RedHat 5.2)
- Linux 2.0 with glibc2 or higher (tested with RedHat 5.2)
- Solaris 2.5 or higher (SPARC or Intel)
@@ -124,6 +113,11 @@ Similarly, for the sample LaserJet driver you can use "LaserJet" and
For other printers and interfaces see the CUPS System Administator's
Manual included with this software.
If you're interested in a complete, commercial printing solution for
UNIX, check out our ESP Print Pro software at:
http://www.easysw.com/printpro
PRINTING FILES
@@ -188,8 +182,3 @@ licensing information, please contact:
Voice: +1.301.373.9603
Email: cups-info@cups.org
WWW: http://www.cups.org
If you're interested in a complete, commercial printing solution for
UNIX, check out our ESP Print Pro software at:
http://www.easysw.com/printpro
+1 -14
Ver Arquivo
@@ -24,7 +24,7 @@
include ../Makedefs
TARGETS = ipp lpd parallel serial smb socket
TARGETS = ipp lpd parallel serial socket
OBJS = ipp.o lpd.o parallel.o serial.o socket.o
#
@@ -91,19 +91,6 @@ serial: serial.o ../cups/$(LIBCUPS)
serial.o: ../cups/cups.h ../Makedefs
#
# smb
#
# Note: reading through these commands is a good way to get a headache... :)
#
smb: smb.sh ../Makedefs
echo Generating $@...
$(RM) smb
sedcmd="1,\$$s/^SMBCLIENT=.\*/SMBCLIENT=`echo $(SMBCLIENT) | sed -e '1,$$s/\\//\\\\\\//g'`/" ;\
$(SED) -e "$$sedcmd" <smb.sh >smb
$(CHMOD) +x smb
#
# socket
#
+13 -7
Ver Arquivo
@@ -294,12 +294,12 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
*/
if (httpPost(http, resource))
if (httpPost(http, resource))
{
fputs("INFO: Unable to POST print request; retrying...\n", stderr);
sleep(10);
continue;
}
{
fputs("INFO: Unable to POST print request; retrying...\n", stderr);
sleep(10);
httpReconnect(http);
continue;
}
fputs("INFO: POST successful, sending IPP request...\n", stderr);
@@ -336,7 +336,13 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
}
}
httpWrite(http, buffer, 0);
/*
* If we are chunking the output from stdin, make sure we end up with
* a 0-length chunk at the end...
*/
if (fp == stdin)
httpWrite(http, buffer, 0);
fputs("INFO: Print file sent; checking status...\n", stderr);
+1 -1
Ver Arquivo
@@ -107,7 +107,7 @@ main(int argc, /* I - Number of command-line arguments (6 or 7) */
int bytes; /* Number of bytes read */
if ((fp = fopen(tmpnam(filename), "w")) == NULL)
if ((fp = fopen(cupsTempFile(filename, sizeof(filename)), "w")) == NULL)
{
perror("ERROR: unable to create temporary file");
return (1);
-88
Ver Arquivo
@@ -1,88 +0,0 @@
#!/bin/sh
#
# "$Id$"
#
# SMB printing script for the Common UNIX Printing System (CUPS).
#
# Copyright 1993-1999 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
# copyright law. Distribution and use rights are outlined in the file
# "LICENSE.txt" which should have been included with this file. If this
# file is missing or damaged please contact Easy Software Products
# at:
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44145 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
SMBCLIENT=/usr/local/samba/bin/smbclient
#
# Usage:
#
# printer job user title copies options [filename]
#
if [ $# -lt 5 -o $# -gt 6 ]; then
# Too few or too many arguments
echo 'Usage: smb job-id user title copies options [file]' >&2
exit 1
fi
#
# If "filename" is not on the command-line, then we read the print
# data from stdin and write it to a temporary file.
#
if [ $# = 5 ]; then
# Collect all print data and put it in a temporary file...
if [ "$TMPDIR" = "" ]; then
TMPDIR=/var/tmp
fi
filename="$TMPDIR/$$.smb"
cat >$filename
else
# Use the file on the command-line...
filename="$6"
fi
#
# Take apart the URI in $0...
#
uri="$0"
host=`echo $uri | awk -F/ '{print substr($3, index($3, "@") + 1)}'`
user=`echo $uri | awk -F/ '{print substr($3, 0, index($3, "@") - 1)}'`
if [ "$user" != "" ]; then
user="-U $user"
fi
printer=`echo $uri | awk -F/ '{print $4}'`
#
# Send the file to the remote system...
#
$SMBCLIENT //$host/$printer $user -P -N <<EOF
print $filename
EOF
#
# Lastly, remove the temporary file as needed...
#
if [ $# = 5 ]; then
rm -f $filename
fi
#
# End of "$Id$".
#
+8
Ver Arquivo
@@ -433,7 +433,15 @@ show_status(http_t *http, /* I - HTTP connection to server */
if (strncmp(device, "file:", 5) == 0)
printf("\tprinter is on device \'%s\' speed -1\n", device + 5);
else
{
/*
* Just show the method...
*/
*strchr(device, ':') = '\0';
printf("\tprinter is on device \'%s\' speed -1\n", device);
}
printf("\tqueuing is %sabled\n", accepting ? "en" : "dis");
printf("\tprinting is %sabled\n",
pstate == IPP_PRINTER_STOPPED ? "dis" : "en");
+3 -1
Ver Arquivo
@@ -209,7 +209,7 @@ main(int argc, /* I - Number of command-line arguments */
return (1);
}
temp = fopen(tmpnam(tempfile), "w");
temp = fopen(cupsTempFile(tempfile, sizeof(tempfile)), "w");
if (temp == NULL)
{
@@ -234,6 +234,8 @@ main(int argc, /* I - Number of command-line arguments */
else
job_id = cupsPrintFile(dest, tempfile, "(stdin)", num_options, options);
unlink(tempfile);
if (job_id < 1)
{
fputs("lpr: unable to print standard input.\n", stderr);
+11 -1
Ver Arquivo
@@ -38,6 +38,7 @@
#include <cups/cups.h>
#include <cups/language.h>
#include <cups/debug.h>
#include <config.h>
/*
@@ -99,15 +100,24 @@ main(int argc, /* I - Number of command-line arguments */
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"10\">");
else
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"30\">");
printf("<TITLE>%s on %s - Common UNIX Printing System</TITLE>\n",
printf("<TITLE>%s on %s - " CUPS_SVERSION "</TITLE>\n",
name == NULL ? "Classes" : name, getenv("SERVER_NAME"));
puts("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"/cups.css\">");
puts("<MAP NAME=\"navbar\">");
#ifdef ESPPRINTPRO
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,76,30\" HREF=\"printers\" ALT=\"Current Printer Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"88,10,158,30\" HREF=\"classes\" ALT=\"Current Printer Classes Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"170,10,210,30\" HREF=\"jobs\" ALT=\"Current Jobs Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"222,10,354,30\" HREF=\"documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"366,10,442,30\" HREF=\"http://www.easysw.com/printpro/software.html\" ALT=\"Download the Current ESP Print Pro Software\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"454,10,530,30\" HREF=\"http://www.easysw.com/printpro/support.html\" ALT=\"Get Tech Support for Current ESP Print Pro\">");
#else
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,85,30\" HREF=\"/printers\" ALT=\"Current Printer Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"95,10,175,30\" HREF=\"/classes\" ALT=\"Current Printer Classes Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"185,10,235,30\" HREF=\"/jobs\" ALT=\"Current Jobs Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"245,10,395,30\" HREF=\"/documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"405,10,490,30\" HREF=\"http://www.cups.org\" ALT=\"Download the Current CUPS Software\">");
#endif /* ESPPRINTPRO */
puts("</MAP>");
puts("</HEAD>");
puts("<BODY>");
+11 -3
Ver Arquivo
@@ -38,6 +38,7 @@
#include <cups/cups.h>
#include <cups/language.h>
#include <cups/debug.h>
#include <config.h>
/*
@@ -62,8 +63,6 @@ main(int argc, /* I - Number of command-line arguments */
http_t *http; /* Connection to the server */
setbuf(stdout, NULL);
/*
* Get the request language...
*/
@@ -101,15 +100,24 @@ main(int argc, /* I - Number of command-line arguments */
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"10\">");
else
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"30\">");
printf("<TITLE>%s on %s - Common UNIX Printing System</TITLE>\n",
printf("<TITLE>%s on %s - " CUPS_SVERSION "</TITLE>\n",
job == NULL ? "Jobs" : job, getenv("SERVER_NAME"));
puts("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"/cups.css\">");
puts("<MAP NAME=\"navbar\">");
#ifdef ESPPRINTPRO
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,76,30\" HREF=\"printers\" ALT=\"Current Printer Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"88,10,158,30\" HREF=\"classes\" ALT=\"Current Printer Classes Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"170,10,210,30\" HREF=\"jobs\" ALT=\"Current Jobs Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"222,10,354,30\" HREF=\"documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"366,10,442,30\" HREF=\"http://www.easysw.com/printpro/software.html\" ALT=\"Download the Current ESP Print Pro Software\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"454,10,530,30\" HREF=\"http://www.easysw.com/printpro/support.html\" ALT=\"Get Tech Support for Current ESP Print Pro\">");
#else
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,85,30\" HREF=\"/printers\" ALT=\"Current Printer Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"95,10,175,30\" HREF=\"/classes\" ALT=\"Current Printer Classes Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"185,10,235,30\" HREF=\"/jobs\" ALT=\"Current Jobs Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"245,10,395,30\" HREF=\"/documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"405,10,490,30\" HREF=\"http://www.cups.org\" ALT=\"Download the Current CUPS Software\">");
#endif /* ESPPRINTPRO */
puts("</MAP>");
puts("</HEAD>");
puts("<BODY>");
+11 -1
Ver Arquivo
@@ -38,6 +38,7 @@
#include <cups/cups.h>
#include <cups/language.h>
#include <cups/debug.h>
#include <config.h>
/*
@@ -99,15 +100,24 @@ main(int argc, /* I - Number of command-line arguments */
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"10\">");
else
puts("<META HTTP-EQUIV=\"Refresh\" CONTENT=\"30\">");
printf("<TITLE>%s on %s - Common UNIX Printing System</TITLE>\n",
printf("<TITLE>%s on %s - " CUPS_SVERSION "</TITLE>\n",
printer == NULL ? "Printers" : printer, getenv("SERVER_NAME"));
puts("<LINK REL=STYLESHEET TYPE=\"text/css\" HREF=\"/cups.css\">");
puts("<MAP NAME=\"navbar\">");
#ifdef ESPPRINTPRO
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,76,30\" HREF=\"printers\" ALT=\"Current Printer Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"88,10,158,30\" HREF=\"classes\" ALT=\"Current Printer Classes Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"170,10,210,30\" HREF=\"jobs\" ALT=\"Current Jobs Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"222,10,354,30\" HREF=\"documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"366,10,442,30\" HREF=\"http://www.easysw.com/printpro/software.html\" ALT=\"Download the Current ESP Print Pro Software\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"454,10,530,30\" HREF=\"http://www.easysw.com/printpro/support.html\" ALT=\"Get Tech Support for Current ESP Print Pro\">");
#else
puts("<AREA SHAPE=\"RECT\" COORDS=\"10,10,85,30\" HREF=\"/printers\" ALT=\"Current Printer Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"95,10,175,30\" HREF=\"/classes\" ALT=\"Current Printer Classes Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"185,10,235,30\" HREF=\"/jobs\" ALT=\"Current Jobs Status\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"245,10,395,30\" HREF=\"/documentation.html\" ALT=\"Read CUPS Documentation On-Line\">");
puts("<AREA SHAPE=\"RECT\" COORDS=\"405,10,490,30\" HREF=\"http://www.cups.org\" ALT=\"Download the Current CUPS Software\">");
#endif /* ESPPRINTPRO */
puts("</MAP>");
puts("</HEAD>");
puts("<BODY>");
+9 -2
Ver Arquivo
@@ -1,5 +1,5 @@
#
# "$Id: classes.conf 333 1999-05-17 18:03:40Z mike $"
# "$Id: classes.conf 678 1999-09-22 18:10:55Z mike $"
#
# Sample class configuration file for the Common UNIX Printing System
# (CUPS) scheduler.
@@ -59,6 +59,13 @@
#Location Room 101 in the activities building
#
# Accepting: is the class accepting jobs?
#
#Accepting Yes
#Accepting No
#
#
# Printer: adds a printer to the class.
#
@@ -68,5 +75,5 @@
#</Class>
#
# End of "$Id: classes.conf 333 1999-05-17 18:03:40Z mike $".
# End of "$Id: classes.conf 678 1999-09-22 18:10:55Z mike $".
#
+30 -8
Ver Arquivo
@@ -1,5 +1,5 @@
#
# "$Id: cupsd.conf 510 1999-07-09 14:20:15Z mike $"
# "$Id: cupsd.conf 628 1999-08-23 15:24:48Z mike $"
#
# Sample configuration file for the Common UNIX Printing System (CUPS)
# scheduler.
@@ -70,20 +70,25 @@ Port 631
# program is run...
#
User lp
Group sys
#User lp
#Group sys
#
# SystemGroup: the group name for "System" (printer administration)
# access.
# access. The default varies depending on the operating system, but
# will be "sys", "system", or "root" (checked for in that order.)
#
SystemGroup sys
#SystemGroup sys
#
# ServerName: the hostname of your server, as advertised to the world.
# By default CUPS will use the hostname of the system.
#
# This is also the name used by clients when connecting to the local
# server, so you can use this to configure a client machine without
# a local server running.
#
#ServerName myhost.domain.com
@@ -305,6 +310,23 @@ LogLevel info
# Deny: denies access from the specified hostname, domain, IP address, or
# network.
#
# Both "Allow" and "Deny" accept the following notations for addresses:
#
# All
# None
# *.domain.com
# .domain.com
# host.domain.com
# nnn.*
# nnn.nnn.*
# nnn.nnn.nnn.*
# nnn.nnn.nnn.nnn
# nnn.nnn.nnn.nnn/mm
# nnn.nnn.nnn.nnn/mmm.mmm.mmm.mmm
#
# The host and domain address require that you enable hostname lookups
# with "HostNameLookups On" above.
#
<Location />
</Location>
@@ -329,8 +351,8 @@ LogLevel info
#
# You definitely will want to limit access to the administration tools.
# The default configuration requires a local connection from a user who
# is a member of group "sys" to do any admin tasks. You can change the
# group name using the SystemGroup directive.
# is a member of the system group to do any admin tasks. You can change
# the group name using the SystemGroup directive.
#
AuthType Basic
@@ -343,5 +365,5 @@ Allow From 127.0.0.1
</Location>
#
# End of "$Id: cupsd.conf 510 1999-07-09 14:20:15Z mike $".
# End of "$Id: cupsd.conf 628 1999-08-23 15:24:48Z mike $".
#
+2
Ver Arquivo
@@ -0,0 +1,2 @@
# This is a dummy printcap file that is automatically generated by the
# CUPS software for old applications that rely on it.
+10 -3
Ver Arquivo
@@ -1,5 +1,5 @@
#
# "$Id: printers.conf 334 1999-05-17 18:11:26Z mike $"
# "$Id: printers.conf 678 1999-09-22 18:10:55Z mike $"
#
# Sample printer configuration file for the Common UNIX Printing System
# (CUPS) scheduler.
@@ -77,13 +77,20 @@
# State: sets the initial state of the printer. Can be one of the
# following:
#
# Idle - Printer is available to accept new jobs.
# Idle - Printer is available to print new jobs.
# Stopped - Printer is disabled but accepting new jobs.
#
#State Idle
#
# Accepting: is the printer accepting jobs?
#
#Accepting Yes
#Accepting No
#</Printer>
#
# End of "$Id: printers.conf 334 1999-05-17 18:11:26Z mike $".
# End of "$Id: printers.conf 678 1999-09-22 18:10:55Z mike $".
#
+1 -1
Ver Arquivo
@@ -28,7 +28,7 @@
* Version of software...
*/
#define CUPS_SVERSION "CUPS v1.0"
#define CUPS_SVERSION "CUPS v1.0b9"
/*
* Where are files stored?
+13 -11
Ver Arquivo
@@ -46,12 +46,7 @@ AC_ARG_ENABLE(debug, [ --enable-debug turn on debugging [default=no]],
OPTIM="-g "
fi])
AC_ARG_ENABLE(shared, [ --disable-shared turn off shared libraries [default=no]])
if eval "test x$disable_shared = xyes"; then
PICFLAG=0
LIBCUPS="libcups.a"
LIBCUPSIMAGE="libcupsimage.a"
DSO=":"
else
if test "$disable_shared" != "yes"; then
case "$uname" in
SunOS* | UNIX_S*)
LIBCUPS="libcups.so.1"
@@ -63,7 +58,7 @@ else
LIBCUPSIMAGE="libcupsimage.sl.1"
DSO="ld -b -z +h \$@ -o"
;;
OSF1* | Linux*)
OSF1* | Linux* | FreeBSD*)
LIBCUPS="libcups.so.1"
LIBCUPSIMAGE="libcupsimage.so.1"
DSO="\$(CC) -Wl,-soname,\$@ -shared \$(OPTIM) -o"
@@ -81,6 +76,11 @@ else
DSO="\$(CC) -Wl,-soname,\$@ -shared \$(OPTIM) -o"
;;
esac
else
PICFLAG=0
LIBCUPS="libcups.a"
LIBCUPSIMAGE="libcupsimage.a"
DSO=":"
fi
dnl Checks for programs...
@@ -91,13 +91,14 @@ AC_PROG_RANLIB
AC_PATH_PROG(AR,ar)
AC_PATH_PROG(CHMOD,chmod)
AC_PATH_PROG(CP,cp)
AC_PATH_PROG(MV,mv)
AC_PATH_PROG(NROFF,nroff)
if test "$NROFF" = ""; then
AC_PATH_PROG(NROFF,groff)
if test "$NROFF" = ""; then
AC_PATH_PROG(GROFF,groff)
if test "$GROFF" = ""; then
NROFF="echo"
else
NROFF="$NROFF -T ascii"
NROFF="$GROFF -T ascii"
fi
fi
AC_PATH_PROG(HTMLDOC,htmldoc)
@@ -212,6 +213,7 @@ else
if test -z "$OPTIM"; then
OPTIM="+O2"
fi
OPTIM="-Ae $OPTIM"
;;
SunOS*)
# Solaris
@@ -271,7 +273,7 @@ if test "$prefix" = "NONE"; then
fi
dnl Fix "libdir" variable for IRIX 6.x...
if test "$uname" = "IRIX" -a $uversion -ge 62; then
if test "$uname" = "IRIX" -a $uversion -ge 65; then
libdir="/usr/lib32"
fi
+309
Ver Arquivo
@@ -0,0 +1,309 @@
#
# "$Id: cups.spec 714 1999-10-01 14:40:53Z mike $"
#
# RPM "spec" file for the Common UNIX Printing System (CUPS).
#
# Original version by Jason McMullan <jmcc@ontv.com>.
#
# Copyright 1999 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
# copyright law. Distribution and use rights are outlined in the file
# "LICENSE.txt" which should have been included with this file. If this
# file is missing or damaged please contact Easy Software Products
# at:
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
Summary: Common Unix Printing System
Name: cups
Version: 1.0
Release: 0
Copyright: GPL
Group: System Environment/Daemons
Source: ftp://ftp.easysw.com/pub/cups/beta/cups-1.0-source.tar.gz
Url: http://www.cups.org
Packager: Michael Sweet <mike@easysw.com>
Vendor: Easy Software Products
# use buildroot so as not to disturb the version already installed
BuildRoot: /tmp/rpmbuild
Conflicts: lpr
%package devel
Summary: Common Unix Printing System - development environment
Group: Development/Libraries
%description
The Common UNIX Printing System provides a portable printing layer for
UNIX® operating systems. It has been developed by Easy Software Products
to promote a standard printing solution for all UNIX vendors and users.
CUPS provides the System V and Berkeley command-line interfaces.
%description devel
The Common UNIX Printing System provides a portable printing layer for
UNIX® operating systems. This is the development package for creating
additional printer drivers, and other CUPS services.
%prep
%setup
%build
./configure
# If we got this far, all prerequisite libraries must be here.
make
%install
# these lines just make sure the directory structure in the
# RPM_BUILD_ROOT exists
rm -rf $RPM_BUILD_ROOT
mkdir -p $RPM_BUILD_ROOT/etc
mkdir -p $RPM_BUILD_ROOT/etc/rc.d
mkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d
mkdir -p $RPM_BUILD_ROOT/usr
mkdir -p $RPM_BUILD_ROOT/usr/bin
mkdir -p $RPM_BUILD_ROOT/usr/lib
mkdir -p $RPM_BUILD_ROOT/usr/man
mkdir -p $RPM_BUILD_ROOT/usr/man/man1
mkdir -p $RPM_BUILD_ROOT/usr/man/man5
mkdir -p $RPM_BUILD_ROOT/usr/man/man8
mkdir -p $RPM_BUILD_ROOT/usr/share/locale
mkdir -p $RPM_BUILD_ROOT/var/cups
mkdir -p $RPM_BUILD_ROOT/var/cups/conf
mkdir -p $RPM_BUILD_ROOT/var/cups/logs
mkdir -p $RPM_BUILD_ROOT/var/logs
ln -sf /var/cups/logs $RPM_BUILD_ROOT/var/logs/cups
ln -sf /var/cups/conf $RPM_BUILD_ROOT/etc/cups
make prefix=$RPM_BUILD_ROOT/usr DATADIR=$RPM_BUILD_ROOT/usr/share/cups LOCALEDIR=$RPM_BUILD_ROOT/usr/share/locale SERVERROOT=$RPM_BUILD_ROOT/var/cups install
$RPM_BUILD_ROOT/etc/rc.d/init.d/cups
install -m 755 -o root -g root cups.sh $RPM_BUILD_ROOT/etc/rc.d/init.d/cups
%post
/sbin/chkconfig --add cups
%preun
/sbin/chkconfig --del cups
%clean
rm -rf $RPM_BUILD_ROOT
%files
/etc/rc.d/init.d/cups
%config /var/cups/conf/classes.conf
%config /var/cups/conf/cupsd.conf
%config /var/cups/conf/mime.convs
%config /var/cups/conf/mime.types
%config /var/cups/conf/printers.conf
/usr/bin/lpr
/usr/bin/lprm
/usr/bin/disable
/usr/bin/enable
/usr/bin/cancel
/usr/bin/lp
/usr/bin/lpstat
/usr/lib/accept
/usr/lib/libcups.so.1
/usr/lib/libcupsimage.so.1
/usr/lib/lpadmin
/usr/lib/reject
/usr/man/man1/backend.1
/usr/man/man1/filter.1
/usr/man/man1/lprm.1
/usr/man/man1/lpr.1
/usr/man/man1/lpstat.1
/usr/man/man1/lp.1
/usr/man/man1/cancel.1
/usr/man/man5/classes.conf.5
/usr/man/man5/cupsd.conf.5
/usr/man/man5/mime.convs.5
/usr/man/man5/mime.types.5
/usr/man/man5/printers.conf.5
/usr/man/man8/accept.8
/usr/man/man8/cupsd.8
/usr/man/man8/enable.8
/usr/man/man8/lpadmin.8
/usr/man/man8/lpc.8
/usr/man/man8/reject.8
/usr/man/man8/disable.8
/usr/sbin/accept
/usr/sbin/cupsd
/usr/sbin/lpadmin
/usr/sbin/lpc
/usr/sbin/reject
%dir /usr/share/cups
/usr/share/cups/data/8859-1
/usr/share/cups/data/8859-14
/usr/share/cups/data/8859-15
/usr/share/cups/data/8859-2
/usr/share/cups/data/8859-3
/usr/share/cups/data/8859-4
/usr/share/cups/data/8859-5
/usr/share/cups/data/8859-6
/usr/share/cups/data/8859-7
/usr/share/cups/data/8859-8
/usr/share/cups/data/8859-9
/usr/share/cups/data/HPGLprolog
/usr/share/cups/data/psglyphs
/usr/share/cups/doc/cmp.html
/usr/share/cups/doc/cmp.pdf
/usr/share/cups/doc/cups.css
/usr/share/cups/doc/cupsdoc.css
/usr/share/cups/doc/documentation.html
/usr/share/cups/doc/idd.html
/usr/share/cups/doc/idd.pdf
/usr/share/cups/doc/images/classes.gif
/usr/share/cups/doc/images/cups-block-diagram.gif
/usr/share/cups/doc/images/cups-large.gif
/usr/share/cups/doc/images/cups-medium.gif
/usr/share/cups/doc/images/cups-small.gif
/usr/share/cups/doc/images/logo.gif
/usr/share/cups/doc/images/navbar.gif
/usr/share/cups/doc/images/printer-idle.gif
/usr/share/cups/doc/images/printer-processing.gif
/usr/share/cups/doc/images/printer-stopped.gif
/usr/share/cups/doc/index.html
/usr/share/cups/doc/overview.html
/usr/share/cups/doc/overview.pdf
/usr/share/cups/doc/sam.html
/usr/share/cups/doc/sam.pdf
/usr/share/cups/doc/sdd.html
/usr/share/cups/doc/sdd.pdf
/usr/share/cups/doc/ssr.html
/usr/share/cups/doc/ssr.pdf
/usr/share/cups/doc/stp.html
/usr/share/cups/doc/stp.pdf
/usr/share/cups/doc/sum.html
/usr/share/cups/doc/sum.pdf
/usr/share/cups/doc/svd.html
/usr/share/cups/doc/svd.pdf
/usr/share/cups/fonts/AvantGarde-Book
/usr/share/cups/fonts/AvantGarde-BookOblique
/usr/share/cups/fonts/AvantGarde-Demi
/usr/share/cups/fonts/AvantGarde-DemiOblique
/usr/share/cups/fonts/Bookman-Demi
/usr/share/cups/fonts/Bookman-DemiItalic
/usr/share/cups/fonts/Bookman-Light
/usr/share/cups/fonts/Bookman-LightItalic
/usr/share/cups/fonts/Courier
/usr/share/cups/fonts/Courier-Bold
/usr/share/cups/fonts/Courier-BoldOblique
/usr/share/cups/fonts/Courier-Oblique
/usr/share/cups/fonts/Helvetica
/usr/share/cups/fonts/Helvetica-Bold
/usr/share/cups/fonts/Helvetica-BoldOblique
/usr/share/cups/fonts/Helvetica-Narrow
/usr/share/cups/fonts/Helvetica-Narrow-Bold
/usr/share/cups/fonts/Helvetica-Narrow-BoldOblique
/usr/share/cups/fonts/Helvetica-Narrow-Oblique
/usr/share/cups/fonts/Helvetica-Oblique
/usr/share/cups/fonts/NewCenturySchlbk-Bold
/usr/share/cups/fonts/NewCenturySchlbk-BoldItalic
/usr/share/cups/fonts/NewCenturySchlbk-Italic
/usr/share/cups/fonts/NewCenturySchlbk-Roman
/usr/share/cups/fonts/Palatino-Bold
/usr/share/cups/fonts/Palatino-BoldItalic
/usr/share/cups/fonts/Palatino-Italic
/usr/share/cups/fonts/Palatino-Roman
/usr/share/cups/fonts/Symbol
/usr/share/cups/fonts/Times-Bold
/usr/share/cups/fonts/Times-BoldItalic
/usr/share/cups/fonts/Times-Italic
/usr/share/cups/fonts/Times-Roman
/usr/share/cups/fonts/Utopia-Bold
/usr/share/cups/fonts/Utopia-BoldItalic
/usr/share/cups/fonts/Utopia-Italic
/usr/share/cups/fonts/Utopia-Regular
/usr/share/cups/fonts/ZapfChancery-MediumItalic
/usr/share/cups/fonts/ZapfDingbats
/usr/share/cups/model/deskjet.ppd
/usr/share/cups/model/laserjet.ppd
/usr/share/cups/pstoraster/Fontmap
/usr/share/cups/pstoraster/gs_btokn.ps
/usr/share/cups/pstoraster/gs_ccfnt.ps
/usr/share/cups/pstoraster/gs_cidfn.ps
/usr/share/cups/pstoraster/gs_cmap.ps
/usr/share/cups/pstoraster/gs_cmdl.ps
/usr/share/cups/pstoraster/gs_dbt_e.ps
/usr/share/cups/pstoraster/gs_diskf.ps
/usr/share/cups/pstoraster/gs_dps1.ps
/usr/share/cups/pstoraster/gs_fform.ps
/usr/share/cups/pstoraster/gs_fonts.ps
/usr/share/cups/pstoraster/gs_init.ps
/usr/share/cups/pstoraster/gs_iso_e.ps
/usr/share/cups/pstoraster/gs_kanji.ps
/usr/share/cups/pstoraster/gs_ksb_e.ps
/usr/share/cups/pstoraster/gs_l2img.ps
/usr/share/cups/pstoraster/gs_lev2.ps
/usr/share/cups/pstoraster/gs_mex_e.ps
/usr/share/cups/pstoraster/gs_mro_e.ps
/usr/share/cups/pstoraster/gs_pdf.ps
/usr/share/cups/pstoraster/gs_pdf_e.ps
/usr/share/cups/pstoraster/gs_pdfwr.ps
/usr/share/cups/pstoraster/gs_pfile.ps
/usr/share/cups/pstoraster/gs_res.ps
/usr/share/cups/pstoraster/gs_setpd.ps
/usr/share/cups/pstoraster/gs_statd.ps
/usr/share/cups/pstoraster/gs_std_e.ps
/usr/share/cups/pstoraster/gs_sym_e.ps
/usr/share/cups/pstoraster/gs_ttf.ps
/usr/share/cups/pstoraster/gs_typ42.ps
/usr/share/cups/pstoraster/gs_type1.ps
/usr/share/cups/pstoraster/gs_wan_e.ps
/usr/share/cups/pstoraster/gs_wl1_e.ps
/usr/share/cups/pstoraster/gs_wl2_e.ps
/usr/share/cups/pstoraster/gs_wl5_e.ps
/usr/share/cups/pstoraster/pdf_2ps.ps
/usr/share/cups/pstoraster/pdf_base.ps
/usr/share/cups/pstoraster/pdf_draw.ps
/usr/share/cups/pstoraster/pdf_font.ps
/usr/share/cups/pstoraster/pdf_main.ps
/usr/share/cups/pstoraster/pdf_sec.ps
/usr/share/cups/pstoraster/pfbtogs.ps
%dir /var/cups
/var/cups/backend/http
/var/cups/backend/ipp
/var/cups/backend/lpd
/var/cups/backend/parallel
/var/cups/backend/serial
/var/cups/backend/socket
/var/cups/cgi-bin/classes.cgi
/var/cups/cgi-bin/jobs.cgi
/var/cups/cgi-bin/printers.cgi
/var/cups/conf
/var/cups/filter/hpgltops
/var/cups/filter/imagetops
/var/cups/filter/imagetoraster
/var/cups/filter/pstops
/var/cups/filter/pstoraster
/var/cups/filter/rastertohp
/var/cups/filter/texttops
%dir /var/cups/interfaces
%dir /var/cups/logs
%dir /var/cups/ppd
%dir /var/cups/requests
%files devel
%dir /usr/include/cups
/usr/include/cups/cups.h
/usr/include/cups/http.h
/usr/include/cups/ipp.h
/usr/include/cups/language.h
/usr/include/cups/mime.h
/usr/include/cups/ppd.h
/usr/include/cups/raster.h
#
# End of "$Id: cups.spec 714 1999-10-01 14:40:53Z mike $".
#
+150
Ver Arquivo
@@ -0,0 +1,150 @@
#
# "$Id$"
#
# Support library Makefile for the Common UNIX Printing System (CUPS).
#
# Copyright 1997-1999 by Easy Software Products, all rights reserved.
#
# These coded instructions, statements, and computer programs are the
# property of Easy Software Products and are protected by Federal
# copyright law. Distribution and use rights are outlined in the file
# "LICENSE.txt" which should have been included with this file. If this
# file is missing or damaged please contact Easy Software Products
# at:
#
# Attn: CUPS Licensing Information
# Easy Software Products
# 44141 Airport View Drive, Suite 204
# Hollywood, Maryland 20636-3111 USA
#
# Voice: (301) 373-9603
# EMail: cups-info@cups.org
# WWW: http://www.cups.org
#
include ../Makedefs
#
# Object files...
#
LIBOBJS = emit.o filter.o http.o ipp.o language.o mark.o mime.o \
options.o page.o ppd.o raster.o string.o type.o usersys.o \
util.o
OBJS = $(LIBOBJS) testhttp.o testmime.o testppd.o
#
# Header files to install...
#
HEADERS = cups.h http.h ipp.h language.h mime.h ppd.h raster.h
#
# Targets in this directory...
#
TARGETS = $(LIBCUPS) testhttp testmime testppd
#
# Make all targets...
#
all: $(TARGETS)
#
# Remove object and target files...
#
clean:
rm -f $(OBJS) $(TARGETS)
#
# Install object and target files...
#
install: all
-$(MKDIR) $(INCLUDEDIR)/cups
$(CP) $(HEADERS) $(INCLUDEDIR)/cups
-$(MKDIR) $(LIBDIR)
$(CP) $(LIBCUPS) $(LIBDIR)
if test $(LIBCUPS) != "libcups.a"; then \
$(LN) $(LIBCUPS) `basename $(LIBCUPS) .1`; \
fi
#
# libcups.so.1, libcups.sl.1
#
libcups.so.1 libcups.sl.1: $(LIBOBJS) ../Makedefs
echo Linking $@...
$(DSO) $@ $(LIBOBJS)
-$(LN) $@ `basename $@ .1`
#
# libcups.a
#
libcups.a: $(LIBOBJS)
echo Archiving $@...
$(RM) $@
$(AR) $(ARFLAGS) $@ $(LIBOBJS)
$(RANLIB) $@
#
# cups_C.h - the default POSIX locale that is compiled in.
#
cups_C.h: ../locale/C/cups_C
echo Generating $@...
$(RM) cups_C.h
$(AWK) '{print "\"" $$0 "\","}' < ../locale/C/cups_C > cups_C.h
emit.o: ppd.h ../config.h ../Makedefs
filter.o: mime.h ../config.h ../Makedefs
http.o: http.h ipp.h string.h ../config.h ../Makedefs
ipp.o: http.h ipp.h ../config.h ../Makedefs
language.o: cups_C.h language.h string.h ../config.h ../Makedefs
mark.o: ppd.h ../config.h ../Makedefs
mime.o: mime.h ../config.h ../Makedefs
options.o: cups.h ../config.h ../Makedefs
page.o: ppd.h ../config.h ../Makedefs
ppd.o: language.h ppd.h ../config.h ../Makedefs
raster.o: raster.h ../config.h ../Makedefs
string.o: string.h ../config.h ../Makedefs
type.o: mime.h ../config.h ../Makedefs
usersys.o: cups.h ../config.h ../Makedefs
util.o: cups.h http.h ipp.h ../config.h ../Makedefs
#
# testhttp (dependency on static CUPS library is intentional)
#
testhttp: testhttp.o libcups.a
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ testhttp.o libcups.a $(NETLIBS)
testhttp.o: http.h ../Makedefs
#
# testmime (dependency on static CUPS library is intentional)
#
testmime: testmime.o libcups.a
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ testmime.o libcups.a
testmime.o: mime.h ../Makedefs
#
# testppd (dependency on static CUPS library is intentional)
#
testppd: testppd.o libcups.a
echo Linking $@...
$(CC) $(LDFLAGS) -o $@ testppd.o libcups.a $(NETLIBS)
testppd.o: ppd.h ../Makedefs
#
# End of "$Id$".
#
+176
Ver Arquivo
@@ -0,0 +1,176 @@
# Microsoft Developer Studio Project File - Name="cups" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Static Library" 0x0104
CFG=cups - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "cups.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "cups.mak" CFG="cups - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "cups - Win32 Release" (based on "Win32 (x86) Static Library")
!MESSAGE "cups - Win32 Debug" (based on "Win32 (x86) Static Library")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "cups - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I "..\visualc" /I ".." /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"cups.lib"
!ELSEIF "$(CFG)" == "cups - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "Debug"
# PROP BASE Intermediate_Dir "Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I "..\visualc" /I ".." /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LIB32=link.exe -lib
# ADD BASE LIB32 /nologo
# ADD LIB32 /nologo /out:"cupsd.lib"
!ENDIF
# Begin Target
# Name "cups - Win32 Release"
# Name "cups - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\emit.c
# End Source File
# Begin Source File
SOURCE=.\filter.c
# End Source File
# Begin Source File
SOURCE=.\http.c
# End Source File
# Begin Source File
SOURCE=.\ipp.c
# End Source File
# Begin Source File
SOURCE=.\language.c
# End Source File
# Begin Source File
SOURCE=.\mark.c
# End Source File
# Begin Source File
SOURCE=.\mime.c
# End Source File
# Begin Source File
SOURCE=.\options.c
# End Source File
# Begin Source File
SOURCE=.\page.c
# End Source File
# Begin Source File
SOURCE=.\ppd.c
# End Source File
# Begin Source File
SOURCE=.\raster.c
# End Source File
# Begin Source File
SOURCE=.\string.c
# End Source File
# Begin Source File
SOURCE=.\type.c
# End Source File
# Begin Source File
SOURCE=.\util.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\cups.h
# End Source File
# Begin Source File
SOURCE=.\http.h
# End Source File
# Begin Source File
SOURCE=.\ipp.h
# End Source File
# Begin Source File
SOURCE=.\language.h
# End Source File
# Begin Source File
SOURCE=.\mime.h
# End Source File
# Begin Source File
SOURCE=.\ppd.h
# End Source File
# Begin Source File
SOURCE=.\raster.h
# End Source File
# End Group
# End Target
# End Project
+143
Ver Arquivo
@@ -0,0 +1,143 @@
/*
* "$Id$"
*
* API definitions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
#ifndef _CUPS_CUPS_H_
# define _CUPS_CUPS_H_
/*
* Include necessary headers...
*/
# include <cups/ipp.h>
# include <cups/mime.h>
# include <cups/ppd.h>
/*
* C++ magic...
*/
# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */
/*
* Constants...
*/
# define CUPS_VERSION 1.0
# define CUPS_DATE_ANY -1
/*
* Types and structures...
*/
typedef unsigned cups_ptype_t; /**** Printer Type/Capability Bits ****/
enum /* Not a typedef'd enum so we can OR */
{
CUPS_PRINTER_LOCAL = 0x0000, /* Local printer or class */
CUPS_PRINTER_CLASS = 0x0001, /* Printer class */
CUPS_PRINTER_REMOTE = 0x0002, /* Remote printer or class */
CUPS_PRINTER_BW = 0x0004, /* Can do B&W printing */
CUPS_PRINTER_COLOR = 0x0008, /* Can do color printing */
CUPS_PRINTER_DUPLEX = 0x0010, /* Can do duplexing */
CUPS_PRINTER_STAPLE = 0x0020, /* Can staple output */
CUPS_PRINTER_COPIES = 0x0040, /* Can do copies */
CUPS_PRINTER_COLLATE = 0x0080, /* Can collage copies */
CUPS_PRINTER_PUNCH = 0x0100, /* Can punch output */
CUPS_PRINTER_COVER = 0x0200, /* Can cover output */
CUPS_PRINTER_BIND = 0x0400, /* Can bind output */
CUPS_PRINTER_SORT = 0x0800, /* Can sort output */
CUPS_PRINTER_SMALL = 0x1000, /* Can do Letter/Legal/A4 */
CUPS_PRINTER_MEDIUM = 0x2000, /* Can do Tabloid/B/C/A3/A2 */
CUPS_PRINTER_LARGE = 0x4000, /* Can do D/E/A1/A0 */
CUPS_PRINTER_VARIABLE = 0x8000, /* Can do variable sizes */
CUPS_PRINTER_IMPLICIT = 0x10000, /* Implicit class */
CUPS_PRINTER_OPTIONS = 0xfffc /* ~(CLASS | REMOTE | IMPLICIT) */
};
/*
* Types & structures...
*/
typedef struct /**** Printer Information ****/
{
char name[IPP_MAX_NAME], /* Printer or class name */
uri[HTTP_MAX_URI]; /* Universal resource identifier */
unsigned char info[IPP_MAX_NAME], /* Printer or class info/description */
location[IPP_MAX_NAME]; /* Location text */
ipp_pstate_t state; /* Printer state */
unsigned char message[IPP_MAX_NAME]; /* State text */
cups_ptype_t type; /* Printer type/capability codes */
} cups_browse_t;
typedef struct /**** Printer Options ****/
{
char *name; /* Name of option */
char *value; /* Value of option */
} cups_option_t;
/*
* Functions...
*/
extern int cupsCancelJob(const char *printer, int job);
#define cupsDoRequest(http,request,resource) cupsDoFileRequest((http),(request),(resource),NULL)
extern ipp_t *cupsDoFileRequest(http_t *http, ipp_t *request,
const char *resource, const char *filename);
extern int cupsGetClasses(char ***classes);
extern const char *cupsGetDefault(void);
extern const char *cupsGetPPD(const char *printer);
extern int cupsGetPrinters(char ***printers);
extern int cupsPrintFile(const char *printer, const char *filename,
const char *title, int num_options,
cups_option_t *options);
extern char *cupsTempFile(char *filename, int len);
extern int cupsAddOption(const char *name, const char *value,
int num_options, cups_option_t **options);
extern void cupsFreeOptions(int num_options, cups_option_t *options);
extern const char *cupsGetOption(const char *name, int num_options,
cups_option_t *options);
extern int cupsParseOptions(const char *arg, int num_options,
cups_option_t **options);
extern int cupsMarkOptions(ppd_file_t *ppd, int num_options,
cups_option_t *options);
extern const char *cupsGetPassword(const char *prompt);
extern const char *cupsServer(void);
extern const char *cupsUser(void);
# ifdef __cplusplus
}
# endif /* __cplusplus */
#endif /* !_CUPS_CUPS_H_ */
/*
* End of "$Id$".
*/
+123
Ver Arquivo
@@ -0,0 +1,123 @@
"us-ascii",
"OK",
"Cancel",
"Help",
"Quit",
"Close",
"Yes",
"No",
"On",
"Off",
"Save",
"Discard",
"Default",
"Options",
"More Info",
"Black",
"Color",
"Cyan",
"Magenta",
"Yellow",
"Copyright 1993-1999 by Easy Software Products, All Rights Reserved.",
"General",
"Printer",
"Image Options",
"HP-GL/2 Options",
"Extra",
"Document",
"Other",
"Print Pages: ",
"Entire Document",
"Page Range:",
"Reverse Order: ",
"Page Format: ",
" 1-Up",
" 2-Up",
" 4-Up",
"Image Scaling: ",
"Use Natural Image Size",
"Zoom by Percent",
"Zoom by PPI",
"Mirror Image: ",
"Color Saturation: ",
"Color Hue: ",
"Fit to Page: ",
"Shading: ",
"Pen Width: ",
"Gamma Correction: ",
"Brightness: ",
"Add",
"Delete",
"Modify",
"Printer URI",
"Printer Name",
"Printer Location",
"Printer Info",
"Printer Make and Model",
"Device URI",
"Formatting Page",
"Printing Page",
"Initializing Printer",
"Printer State",
"Accepting Jobs",
"Not Accepting Jobs",
"Print Jobs",
"Class",
"Local",
"Remote",
"Duplexing",
"Stapling",
"Fast Copies",
"Collated Copies",
"Hole Punching",
"Covering",
"Binding",
"Sorting",
"Small (up to 9.5x14in)",
"Medium (9.5x14in to 13x19in)",
"Large (13x19in and larger)",
"Custom Size",
"Idle",
"Processing",
"Stopped",
"All",
"Odd",
"Even Pages",
"Darker Lighter",
"Media Size",
"Media Type",
"Media Source",
"Orientation: ",
"Portrait",
"Landscape",
"Job State",
"Job Name",
"User Name",
"Priority",
"Copies",
"File Size",
"Pending",
"Output Mode",
"Resolution",
"400 Your browser sent a request that this server could not understand.",
"This server could not verify that you are authorized to access the resource.",
"You must pay to access this server.",
"You don't have permission to access the resource on this server.",
"The requested resource was not found on this server.",
"The requested method is not allowed with the resource.",
"An appropriate representation for the resource was not found on this server.",
"You don't have permission to use this server as a proxy host.",
"The request has taken too long to complete and has been aborted.",
"The requested resource has more than one value.",
"The requested resource is gone and has not been replaced.",
"The requested method requires a valid Content-Length.",
"The precondition on the request evaluated to false.",
"The request is too large for this server to process.",
"The request URI is too large for this server to process.",
"The request format is not understood by this server.",
"500 The server has detected an unrecoverable error and cannot process your request.",
"The requested method is not implemented by this server.",
"The proxy server received an invalid response from an upstream server.",
"The requested resource is currently unavailable on this server.",
"The proxy server has taken too long to respond to this server.",
"This server does not support the HTTP version required by your browser.",
+57
Ver Arquivo
@@ -0,0 +1,57 @@
/*
* "$Id$"
*
* Debugging macros for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
#ifndef _CUPS_DEBUG_H_
# define _CUPS_DEBUG_H_
/*
* Include necessary headers...
*/
# include <stdio.h>
/*
* The debug macros are used if you compile with DEBUG defined.
*
* Usage:
*
* DEBUG_puts("string")
* DEBUG_printf(("format string", arg, arg, ...));
*
* Note the extra parenthesis around the DEBUG_printf macro...
*/
# ifdef DEBUG
# define DEBUG_puts(x) puts(x)
# define DEBUG_printf(x) printf x
# else
# define DEBUG_puts(x)
# define DEBUG_printf(x)
# endif /* DEBUG */
#endif /* !_CUPS_DEBUG_H_ */
/*
* End of "$Id$".
*/
+301
Ver Arquivo
@@ -0,0 +1,301 @@
/*
* "$Id$"
*
* PPD code emission routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* PostScript is a trademark of Adobe Systems, Inc.
*
* Contents:
*
* ppdEmit() - Emit code for marked options to a file.
* ppdEmitFd() - Emit code for marked options to a file.
*/
/*
* Include necessary headers...
*/
#include "ppd.h"
#include <stdlib.h>
#include "string.h"
#if defined(WIN32) || defined(__EMX__)
# include <io.h>
#else
# include <unistd.h>
#endif /* WIN32 || __EMX__ */
/*
* Local functions...
*/
static int ppd_sort(ppd_choice_t **c1, ppd_choice_t **c2);
static int ppd_collect(ppd_file_t *ppd, ppd_section_t section,
ppd_choice_t ***choices);
/*
* 'ppdEmit()' - Emit code for marked options to a file.
*/
int /* O - 0 on success, -1 on failure */
ppdEmit(ppd_file_t *ppd, /* I - PPD file record */
FILE *fp, /* I - File to write to */
ppd_section_t section) /* I - Section to write */
{
int i, /* Looping var */
count; /* Number of choices */
ppd_choice_t **choices; /* Choices */
ppd_size_t *size; /* Custom page size */
if ((count = ppd_collect(ppd, section, &choices)) == 0)
return (0);
for (i = 0; i < count; i ++)
if (section != PPD_ORDER_EXIT && section != PPD_ORDER_JCL)
{
/*
* Send DSC comments with option...
*/
if (fprintf(fp, "%%%%BeginFeature: %s %s\n",
((ppd_option_t *)choices[i]->option)->keyword,
choices[i]->choice) < 0)
{
free(choices);
return (-1);
}
if (strcmp(((ppd_option_t *)choices[i]->option)->keyword, "PageSize") == 0 &&
strcmp(choices[i]->choice, "Custom") == 0)
{
/*
* Variable size; write out standard size options (this should
* eventually be changed to use the parameter positions defined
* in the PPD file...)
*/
size = ppdPageSize(ppd, "Custom");
fprintf(fp, "%.0f %.0f 0 0 0\n", size->width, size->length);
if (choices[i]->code == NULL)
{
/*
* This can happen with certain buggy PPD files that don't include
* a CustomPageSize command sequence... We just use a generic
* Level 2 command sequence...
*/
fputs("pop pop pop\n", fp);
fputs("<</PageSize[5 -2 roll]/ImagingBBox null>>setpagedevice\n", fp);
}
}
if (choices[i]->code != NULL && choices[i]->code[0] != '\0')
{
if (fputs(choices[i]->code, fp) < 0)
{
free(choices);
return (-1);
}
if (choices[i]->code[strlen(choices[i]->code) - 1] != '\n')
putc('\n', fp);
}
if (fputs("%%EndFeature\n", fp) < 0)
{
free(choices);
return (-1);
}
}
else if (fputs(choices[i]->code, fp) < 0)
{
free(choices);
return (-1);
}
free(choices);
return (0);
}
/*
* 'ppdEmitFd()' - Emit code for marked options to a file.
*/
int /* O - 0 on success, -1 on failure */
ppdEmitFd(ppd_file_t *ppd, /* I - PPD file record */
int fd, /* I - File to write to */
ppd_section_t section) /* I - Section to write */
{
int i, /* Looping var */
count; /* Number of choices */
ppd_choice_t **choices; /* Choices */
char buf[1024]; /* Output buffer for feature */
if ((count = ppd_collect(ppd, section, &choices)) == 0)
return (0);
for (i = 0; i < count; i ++)
if (section != PPD_ORDER_EXIT && section != PPD_ORDER_JCL)
{
/*
* Send DSC comments with option...
*/
sprintf(buf, "%%%%BeginFeature: %s %s\n",
((ppd_option_t *)choices[i]->option)->keyword, choices[i]->choice);
if (write(fd, buf, strlen(buf)) < 1)
{
free(choices);
return (-1);
}
if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
{
free(choices);
return (-1);
}
if (write(fd, "%%EndFeature\n", 13) < 1)
{
free(choices);
return (-1);
}
}
else if (write(fd, choices[i]->code, strlen(choices[i]->code)) < 1)
{
free(choices);
return (-1);
}
free(choices);
return (0);
}
/*
* 'ppd_sort()' - Sort options by ordering numbers...
*/
static int /* O - -1 if c1 < c2, 0 if equal, 1 otherwise */
ppd_sort(ppd_choice_t **c1, /* I - First choice */
ppd_choice_t **c2) /* I - Second choice */
{
if (((ppd_option_t *)(*c1)->option)->order < ((ppd_option_t *)(*c2)->option)->order)
return (-1);
else if (((ppd_option_t *)(*c1)->option)->order > ((ppd_option_t *)(*c2)->option)->order)
return (1);
else
return (0);
}
/*
* 'ppd_collect()' - Collect all marked options that reside in the specified
* section.
*/
static int /* O - Number of options marked */
ppd_collect(ppd_file_t *ppd, /* I - PPD file data */
ppd_section_t section, /* I - Section to collect */
ppd_choice_t ***choices) /* O - Pointers to choices */
{
int i, j, k, m; /* Looping vars */
ppd_group_t *g, /* Current group */
*sg; /* Current sub-group */
ppd_option_t *o; /* Current option */
ppd_choice_t *c; /* Current choice */
int count; /* Number of choices collected */
ppd_choice_t **collect; /* Collected choices */
if (ppd == NULL)
return (0);
/*
* Allocate memory for up to 1000 selected choices...
*/
count = 0;
collect = calloc(sizeof(ppd_choice_t *), 1000);
/*
* Loop through all options and add choices as needed...
*/
for (i = ppd->num_groups, g = ppd->groups; i > 0; i --, g ++)
{
for (j = g->num_options, o = g->options; j > 0; j --, o ++)
if (o->section == section)
for (k = o->num_choices, c = o->choices; k > 0; k --, c ++)
if (c->marked && count < 1000)
{
collect[count] = c;
count ++;
}
for (j = g->num_subgroups, sg = g->subgroups; j > 0; j --, sg ++)
for (k = sg->num_options, o = sg->options; k > 0; k --, o ++)
if (o->section == section)
for (m = o->num_choices, c = o->choices; m > 0; m --, c ++)
if (c->marked && count < 1000)
{
collect[count] = c;
count ++;
}
}
/*
* If we have more than 1 marked choice, sort them...
*/
if (count > 1)
qsort(collect, count, sizeof(ppd_choice_t *),
(int (*)(const void *, const void *))ppd_sort);
/*
* Return the array and number of choices; if 0, free the array since
* it isn't needed.
*/
if (count > 0)
{
*choices = collect;
return (count);
}
else
{
*choices = NULL;
free(collect);
return (0);
}
}
/*
* End of "$Id$".
*/
+297
Ver Arquivo
@@ -0,0 +1,297 @@
/*
* "$Id$"
*
* File type conversion routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* mimeAddFilter() - Add a filter to the current MIME database.
* mimeFilter() - Find the fastest way to convert from one type to another.
* compare() - Compare two filter types...
* lookup() - Lookup a filter...
*/
/*
* Include necessary headers...
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "string.h"
#include "mime.h"
/*
* Local functions...
*/
static int compare(mime_filter_t *, mime_filter_t *);
static mime_filter_t *lookup(mime_t *, mime_type_t *, mime_type_t *);
/*
* 'mimeAddFilter()' - Add a filter to the current MIME database.
*/
mime_filter_t * /* O - New filter */
mimeAddFilter(mime_t *mime, /* I - MIME database */
mime_type_t *src, /* I - Source type */
mime_type_t *dst, /* I - Destination type */
int cost, /* I - Relative time/resource cost */
const char *filter) /* I - Filter program to run */
{
mime_filter_t *temp; /* New filter */
/*
* Range-check the input...
*/
if (mime == NULL || src == NULL || dst == NULL || filter == NULL)
return (NULL);
if (strlen(filter) > (MIME_MAX_FILTER - 1))
return (NULL);
/*
* See if we already have an existing filter for the given source and
* destination...
*/
if ((temp = lookup(mime, src, dst)) != NULL)
{
/*
* Yup, does the existing filter have a higher cost? If so, copy the
* filter and cost to the existing filter entry and return it...
*/
if (temp->cost > cost)
{
temp->cost = cost;
strcpy(temp->filter, filter);
}
}
else
{
/*
* Nope, add a new one...
*/
if (mime->num_filters == 0)
temp = malloc(sizeof(mime_filter_t));
else
temp = realloc(mime->filters, sizeof(mime_filter_t) * (mime->num_filters + 1));
if (temp == NULL)
return (NULL);
mime->filters = temp;
temp += mime->num_filters;
mime->num_filters ++;
/*
* Copy the information over and sort if necessary...
*/
temp->src = src;
temp->dst = dst;
temp->cost = cost;
strcpy(temp->filter, filter);
if (mime->num_filters > 1)
qsort(mime->filters, mime->num_filters, sizeof(mime_filter_t),
(int (*)(const void *, const void *))compare);
}
/*
* Return the new/updated filter...
*/
return (temp);
}
/*
* 'mimeFilter()' - Find the fastest way to convert from one type to another.
*/
mime_filter_t * /* O - Array of filters to run */
mimeFilter(mime_t *mime, /* I - MIME database */
mime_type_t *src, /* I - Source file type */
mime_type_t *dst, /* I - Destination file type */
int *num_filters) /* O - Number of filters to run */
{
int i, j, /* Looping vars */
num_temp, /* Number of temporary filters */
num_mintemp, /* Number of filters in the minimum */
cost, /* Current cost */
mincost; /* Current minimum */
mime_filter_t *temp, /* Temporary filter */
*mintemp, /* Current minimum */
*mincurrent, /* Current filter for minimum */
*current, /* Current filter */
*filters; /* Filters to use */
/*
* Range-check the input...
*/
if (mime == NULL || src == NULL || dst == NULL || num_filters == NULL)
return (NULL);
*num_filters = 0;
/*
* See if there is a filter that can convert the files directly...
*/
if ((temp = lookup(mime, src, dst)) != NULL)
{
/*
* Got a direct filter!
*/
if ((filters = (mime_filter_t *)malloc(sizeof(mime_filter_t))) == NULL)
return (NULL);
memcpy(filters, temp, sizeof(mime_filter_t));
*num_filters = 1;
return (filters);
}
/*
* OK, now look for filters from the source type to any other type...
*/
mincost = 9999999;
mintemp = NULL;
for (i = mime->num_filters, current = mime->filters; i > 0; i --, current ++)
if (current->src == src)
{
/*
* See if we have any filters that can convert from the destination type
* of this filter to the final type...
*/
if ((temp = mimeFilter(mime, current->dst, dst, &num_temp)) == NULL)
continue;
/*
* Found a match; see if this one is less costly than the last (if
* any...)
*/
for (j = 0, cost = 0; j < num_temp; j ++)
cost += temp->cost;
if (cost < mincost)
{
if (mintemp != NULL)
free(mintemp);
mincost = cost;
mintemp = temp;
num_mintemp = num_temp;
mincurrent = current;
}
else
free(temp);
}
if (mintemp != NULL)
{
/*
* Hey, we got a match! Add the current filter to the beginning of the
* filter list...
*/
filters = (mime_filter_t *)realloc(mintemp, sizeof(mime_filter_t) *
(num_mintemp + 1));
if (filters == NULL)
{
*num_filters = 0;
return (NULL);
}
memmove(filters + 1, filters, num_mintemp * sizeof(mime_filter_t));
memcpy(filters, mincurrent, sizeof(mime_filter_t));
*num_filters = num_mintemp + 1;
return (filters);
}
return (NULL);
}
/*
* 'compare()' - Compare two filter types...
*/
static int /* O - Comparison result */
compare(mime_filter_t *f0, /* I - First filter */
mime_filter_t *f1) /* I - Second filter */
{
int i; /* Result of comparison */
if ((i = strcmp(f0->src->super, f1->src->super)) == 0)
if ((i = strcmp(f0->src->type, f1->src->type)) == 0)
if ((i = strcmp(f0->dst->super, f1->dst->super)) == 0)
i = strcmp(f0->dst->type, f1->dst->type);
return (i);
}
/*
* 'lookup()' - Lookup a filter...
*/
static mime_filter_t * /* O - Filter for src->dst */
lookup(mime_t *mime, /* I - MIME database */
mime_type_t *src, /* I - Source type */
mime_type_t *dst) /* I - Destination type */
{
mime_filter_t key; /* Key record for filter search */
if (mime->num_filters == 0)
return (NULL);
key.src = src;
key.dst = dst;
return ((mime_filter_t *)bsearch(&key, mime->filters, mime->num_filters,
sizeof(mime_filter_t),
(int (*)(const void *, const void *))compare));
}
/*
* End of "$Id$".
*/
+1483
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+293
Ver Arquivo
@@ -0,0 +1,293 @@
/*
* "$Id$"
*
* Hyper-Text Transport Protocol definitions for the Common UNIX Printing
* System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
#ifndef _CUPS_HTTP_H_
# define _CUPS_HTTP_H_
/*
* Include necessary headers...
*/
# include <string.h>
# include <time.h>
# if defined(WIN32) || defined(__EMX__)
# include <winsock.h>
# else
# include <unistd.h>
# include <sys/time.h>
# include <sys/types.h>
# include <sys/socket.h>
# include <netdb.h>
# include <netinet/in.h>
# include <arpa/inet.h>
# include <netinet/in_systm.h>
# include <netinet/ip.h>
# include <netinet/tcp.h>
# endif /* WIN32 || __EMX__ */
/*
* C++ magic...
*/
# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */
/*
* Limits...
*/
# define HTTP_MAX_URI 1024 /* Max length of URI string */
# define HTTP_MAX_HOST 256 /* Max length of hostname string */
# define HTTP_MAX_BUFFER 2048 /* Max length of data buffer */
# define HTTP_MAX_VALUE 256 /* Max header field value length */
/*
* HTTP state values...
*/
typedef enum /* States are server-oriented */
{
HTTP_WAITING, /* Waiting for command */
HTTP_OPTIONS, /* OPTIONS command, waiting for blank line */
HTTP_GET, /* GET command, waiting for blank line */
HTTP_GET_SEND, /* GET command, sending data */
HTTP_HEAD, /* HEAD command, waiting for blank line */
HTTP_POST, /* POST command, waiting for blank line */
HTTP_POST_RECV, /* POST command, receiving data */
HTTP_POST_SEND, /* POST command, sending data */
HTTP_PUT, /* PUT command, waiting for blank line */
HTTP_PUT_RECV, /* PUT command, receiving data */
HTTP_DELETE, /* DELETE command, waiting for blank line */
HTTP_TRACE, /* TRACE command, waiting for blank line */
HTTP_CLOSE, /* CLOSE command, waiting for blank line */
HTTP_STATUS /* Command complete, sending status */
} http_state_t;
/*
* HTTP version numbers...
*/
typedef enum
{
HTTP_0_9 = 9, /* HTTP/0.9 */
HTTP_1_0 = 100, /* HTTP/1.0 */
HTTP_1_1 = 101 /* HTTP/1.1 */
} http_version_t;
/*
* HTTP keep-alive values...
*/
typedef enum
{
HTTP_KEEPALIVE_OFF = 0,
HTTP_KEEPALIVE_ON
} http_keepalive_t;
/*
* HTTP transfer encoding values...
*/
typedef enum
{
HTTP_ENCODE_LENGTH, /* Data is sent with Content-Length */
HTTP_ENCODE_CHUNKED /* Data is chunked */
} http_encoding_t;
/*
* HTTP status codes...
*/
typedef enum
{
HTTP_ERROR = -1, /* An error response from httpXxxx() */
HTTP_CONTINUE = 100, /* Everything OK, keep going... */
HTTP_OK = 200, /* OPTIONS/GET/HEAD/POST/TRACE command was successful */
HTTP_CREATED, /* PUT command was successful */
HTTP_ACCEPTED, /* DELETE command was successful */
HTTP_NOT_AUTHORITATIVE, /* Information isn't authoritative */
HTTP_NO_CONTENT, /* Successful command, no new data */
HTTP_RESET_CONTENT, /* Content was reset/recreated */
HTTP_PARTIAL_CONTENT, /* Only a partial file was recieved/sent */
HTTP_MULTIPLE_CHOICES = 300, /* Multiple files match request */
HTTP_MOVED_PERMANENTLY, /* Document has moved permanently */
HTTP_MOVED_TEMPORARILY, /* Document has moved temporarily */
HTTP_SEE_OTHER, /* See this other link... */
HTTP_NOT_MODIFIED, /* File not modified */
HTTP_USE_PROXY, /* Must use a proxy to access this URI */
HTTP_BAD_REQUEST = 400, /* Bad request */
HTTP_UNAUTHORIZED, /* Unauthorized to access host */
HTTP_PAYMENT_REQUIRED, /* Payment required */
HTTP_FORBIDDEN, /* Forbidden to access this URI */
HTTP_NOT_FOUND, /* URI was not found */
HTTP_METHOD_NOT_ALLOWED, /* Method is not allowed */
HTTP_NOT_ACCEPTABLE, /* Not Acceptable */
HTTP_PROXY_AUTHENTICATION, /* Proxy Authentication is Required */
HTTP_REQUEST_TIMEOUT, /* Request timed out */
HTTP_CONFLICT, /* Request is self-conflicting */
HTTP_GONE, /* Server has gone away */
HTTP_LENGTH_REQUIRED, /* A content length or encoding is required */
HTTP_PRECONDITION, /* Precondition failed */
HTTP_REQUEST_TOO_LARGE, /* Request entity too large */
HTTP_URI_TOO_LONG, /* URI too long */
HTTP_UNSUPPORTED_MEDIATYPE, /* The requested media type is unsupported */
HTTP_SERVER_ERROR = 500, /* Internal server error */
HTTP_NOT_IMPLEMENTED, /* Feature not implemented */
HTTP_BAD_GATEWAY, /* Bad gateway */
HTTP_SERVICE_UNAVAILABLE, /* Service is unavailable */
HTTP_GATEWAY_TIMEOUT, /* Gateway connection timed out */
HTTP_NOT_SUPPORTED /* HTTP version not supported */
} http_status_t;
/*
* HTTP field names...
*/
typedef enum
{
HTTP_FIELD_UNKNOWN = -1,
HTTP_FIELD_ACCEPT_LANGUAGE,
HTTP_FIELD_ACCEPT_RANGES,
HTTP_FIELD_AUTHORIZATION,
HTTP_FIELD_CONNECTION,
HTTP_FIELD_CONTENT_ENCODING,
HTTP_FIELD_CONTENT_LANGUAGE,
HTTP_FIELD_CONTENT_LENGTH,
HTTP_FIELD_CONTENT_LOCATION,
HTTP_FIELD_CONTENT_MD5,
HTTP_FIELD_CONTENT_RANGE,
HTTP_FIELD_CONTENT_TYPE,
HTTP_FIELD_CONTENT_VERSION,
HTTP_FIELD_DATE,
HTTP_FIELD_HOST,
HTTP_FIELD_IF_MODIFIED_SINCE,
HTTP_FIELD_IF_UNMODIFIED_SINCE,
HTTP_FIELD_KEEP_ALIVE,
HTTP_FIELD_LAST_MODIFIED,
HTTP_FIELD_LINK,
HTTP_FIELD_LOCATION,
HTTP_FIELD_RANGE,
HTTP_FIELD_REFERER,
HTTP_FIELD_RETRY_AFTER,
HTTP_FIELD_TRANSFER_ENCODING,
HTTP_FIELD_UPGRADE,
HTTP_FIELD_USER_AGENT,
HTTP_FIELD_WWW_AUTHENTICATE,
HTTP_FIELD_MAX
} http_field_t;
/*
* HTTP connection structure...
*/
typedef struct
{
int fd; /* File descriptor for this socket */
int blocking; /* To block or not to block */
int error; /* Last error on read */
time_t activity; /* Time since last read/write */
http_state_t state; /* State of client */
http_status_t status; /* Status of last request */
http_version_t version; /* Protocol version */
http_keepalive_t keep_alive; /* Keep-alive supported? */
struct sockaddr_in hostaddr; /* Address of connected host */
char hostname[HTTP_MAX_HOST],
/* Name of connected host */
fields[HTTP_FIELD_MAX][HTTP_MAX_VALUE];
/* Field values */
char *data; /* Pointer to data buffer */
http_encoding_t data_encoding; /* Chunked or not */
int data_remaining; /* Number of bytes left */
int used; /* Number of bytes used in buffer */
char buffer[HTTP_MAX_BUFFER];
/* Buffer for messages */
} http_t;
/*
* Prototypes...
*/
# define httpBlocking(http,b) (http)->blocking = (b)
extern int httpCheck(http_t *http);
# define httpClearFields(http) memset((http)->fields, 0, sizeof((http)->fields)),\
httpSetField((http), HTTP_FIELD_HOST, (http)->hostname)
extern void httpClose(http_t *http);
extern http_t *httpConnect(const char *host, int port);
extern int httpDelete(http_t *http, const char *uri);
# define httpError(http) ((http)->error)
extern void httpFlush(http_t *http);
extern int httpGet(http_t *http, const char *uri);
extern char *httpGets(char *line, int length, http_t *http);
extern const char *httpGetDateString(time_t t);
extern time_t httpGetDateTime(const char *s);
# define httpGetField(http,field) (http)->fields[field]
extern int httpHead(http_t *http, const char *uri);
extern void httpInitialize(void);
extern int httpOptions(http_t *http, const char *uri);
extern int httpPost(http_t *http, const char *uri);
extern int httpPrintf(http_t *http, const char *format, ...);
extern int httpPut(http_t *http, const char *uri);
extern int httpRead(http_t *http, char *buffer, int length);
extern int httpReconnect(http_t *http);
extern void httpSeparate(const char *uri, char *method, char *username,
char *host, int *port, char *resource);
extern void httpSetField(http_t *http, http_field_t field, const char *value);
extern const char *httpStatus(http_status_t status);
extern int httpTrace(http_t *http, const char *uri);
extern http_status_t httpUpdate(http_t *http);
extern int httpWrite(http_t *http, const char *buffer, int length);
extern char *httpEncode64(char *out, const char *in);
extern char *httpDecode64(char *out, const char *in);
extern int httpGetLength(http_t *http);
/*
* C++ magic...
*/
# ifdef __cplusplus
}
# endif /* __cplusplus */
#endif /* !_CUPS_HTTP_H_ */
/*
* End of "$Id$".
*/
+1457
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+343
Ver Arquivo
@@ -0,0 +1,343 @@
/*
* "$Id$"
*
* Internet Printing Protocol definitions for the Common UNIX Printing
* System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
#ifndef _CUPS_IPP_H_
# define _CUPS_IPP_H_
/*
* Include necessary headers...
*/
# include <cups/http.h>
/*
* C++ magic...
*/
# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */
/*
* IPP version string...
*/
# define IPP_VERSION "\001\000"
/*
* IPP registered port number... This is the default value - applications
* should use the ippPort() function so that you can customize things in
* /etc/services if needed!
*/
# define IPP_PORT 631
/*
* Common limits...
*/
# define IPP_MAX_NAME 256
# define IPP_MAX_VALUES 100
/*
* Types and structures...
*/
typedef enum /**** Format tags for attribute formats... ****/
{
IPP_TAG_ZERO = 0x00,
IPP_TAG_OPERATION,
IPP_TAG_JOB,
IPP_TAG_END,
IPP_TAG_PRINTER,
IPP_TAG_EXTENSION,
IPP_TAG_UNSUPPORTED = 0x10,
IPP_TAG_DEFAULT,
IPP_TAG_UNKNOWN,
IPP_TAG_NOVALUE,
IPP_TAG_INTEGER = 0x21,
IPP_TAG_BOOLEAN,
IPP_TAG_ENUM,
IPP_TAG_STRING = 0x30,
IPP_TAG_DATE,
IPP_TAG_RESOLUTION,
IPP_TAG_RANGE,
IPP_TAG_COLLECTION,
IPP_TAG_TEXTLANG,
IPP_TAG_NAMELANG,
IPP_TAG_TEXT = 0x41,
IPP_TAG_NAME,
IPP_TAG_KEYWORD = 0x44,
IPP_TAG_URI,
IPP_TAG_URISCHEME,
IPP_TAG_CHARSET,
IPP_TAG_LANGUAGE,
IPP_TAG_MIMETYPE
} ipp_tag_t;
typedef enum /**** Resolution units... ****/
{
IPP_RES_PER_INCH = 3,
IPP_RES_PER_CM
} ipp_res_t;
typedef enum /**** Multiple Document Handling ****/
{
IPP_DOC_SINGLE,
IPP_DOC_UNCOLLATED,
IPP_DOC_COLLATED,
IPP_DOC_SEPARATE
} ipp_doc_t;
typedef enum /**** Finishings... ****/
{
IPP_FINISH_NONE = 3,
IPP_FINISH_STAPLE,
IPP_FINISH_PUNCH,
IPP_FINISH_COVER,
IPP_FINISH_BIND
} ipp_finish_t;
typedef enum /**** Orientation... ****/
{
IPP_PORTRAIT = 3, /* No rotation */
IPP_LANDSCAPE, /* 90 degrees counter-clockwise */
IPP_REVERSE_LANDSCAPE, /* 90 degrees clockwise */
IPP_REVERSE_PORTRAIT /* 180 degrees */
} ipp_orient_t;
typedef enum /**** Qualities... ****/
{
IPP_QUALITY_DRAFT = 3,
IPP_QUALITY_NORMAL,
IPP_QUALITY_HIGH
} ipp_quality_t;
typedef enum /**** Job States.... */
{
IPP_JOB_PENDING = 3,
IPP_JOB_HELD,
IPP_JOB_PROCESSING,
IPP_JOB_STOPPED,
IPP_JOB_CANCELED,
IPP_JOB_ABORTED,
IPP_JOB_COMPLETED
} ipp_jstate_t;
typedef enum /**** Printer States.... */
{
IPP_PRINTER_IDLE = 3,
IPP_PRINTER_PROCESSING,
IPP_PRINTER_STOPPED
} ipp_pstate_t;
typedef enum /**** IPP states... ****/
{
IPP_ERROR = -1, /* An error occurred */
IPP_IDLE, /* Nothing is happening/request completed */
IPP_HEADER, /* The request header needs to be sent/received */
IPP_ATTRIBUTE, /* One or more attributes need to be sent/received */
IPP_DATA /* IPP request data needs to be sent/received */
} ipp_state_t;
typedef enum /**** IPP operations... ****/
{
IPP_PRINT_JOB = 0x0002,
IPP_PRINT_URI,
IPP_VALIDATE_JOB,
IPP_CREATE_JOB,
IPP_SEND_DOCUMENT,
IPP_SEND_URI,
IPP_CANCEL_JOB,
IPP_GET_JOB_ATTRIBUTES,
IPP_GET_JOBS,
IPP_GET_PRINTER_ATTRIBUTES,
IPP_HOLD_JOB = 0x000c,
IPP_RELEASE_JOB,
IPP_RESTART_JOB,
IPP_PAUSE_PRINTER = 0x0010,
IPP_RESUME_PRINTER,
IPP_PURGE_JOBS,
IPP_PRIVATE = 0x4000,
CUPS_GET_DEFAULT,
CUPS_GET_PRINTERS,
CUPS_ADD_PRINTER,
CUPS_DELETE_PRINTER,
CUPS_GET_CLASSES,
CUPS_ADD_CLASS,
CUPS_DELETE_CLASS,
CUPS_ACCEPT_JOBS,
CUPS_REJECT_JOBS,
CUPS_SET_DEFAULT
} ipp_op_t;
typedef enum /**** IPP status codes... ****/
{
IPP_OK = 0x0000,
IPP_OK_SUBST,
IPP_OK_CONFLICT,
IPP_BAD_REQUEST = 0x0400,
IPP_FORBIDDEN,
IPP_NOT_AUTHENTICATED,
IPP_NOT_AUTHORIZED,
IPP_NOT_POSSIBLE,
IPP_TIMEOUT,
IPP_NOT_FOUND,
IPP_GONE,
IPP_REQUEST_ENTITY,
IPP_REQUEST_VALUE,
IPP_DOCUMENT_FORMAT,
IPP_ATTRIBUTES,
IPP_URI_SCHEME,
IPP_CHARSET,
IPP_CONFLICT,
IPP_INTERNAL_ERROR = 0x0500,
IPP_OPERATION_NOT_SUPPORTED,
IPP_SERVICE_UNAVAILABLE,
IPP_VERSION_NOT_SUPPORTED,
IPP_DEVICE_UNAVAILABLE,
IPP_TEMPORARY_ERROR,
IPP_NOT_ACCEPTING,
IPP_PRINTER_BUSY
} ipp_status_t;
typedef unsigned char ipp_uchar_t;/**** Unsigned 8-bit integer/character ****/
typedef union /**** Request Header ****/
{
struct /* Any Header */
{
ipp_uchar_t version[2]; /* Protocol version number */
int op_status; /* Operation ID or status code*/
int request_id; /* Request ID */
} any;
struct /* Operation Header */
{
ipp_uchar_t version[2]; /* Protocol version number */
ipp_op_t operation_id; /* Operation ID */
int request_id; /* Request ID */
} op;
struct /* Status Header */
{
ipp_uchar_t version[2]; /* Protocol version number */
ipp_status_t status_code; /* Status code */
int request_id; /* Request ID */
} status;
} ipp_request_t;
typedef union /**** Attribute Value ****/
{
int integer; /* Integer/enumerated value */
char boolean; /* Boolean value */
ipp_uchar_t date[11]; /* Date/time value */
struct
{
int xres, /* Horizontal resolution */
yres; /* Vertical resolution */
ipp_res_t units; /* Resolution units */
} resolution; /* Resolution value */
struct
{
int lower, /* Lower value */
upper; /* Upper value */
} range; /* Range of integers value */
struct
{
char *charset; /* Character set */
char *text; /* String */
} string; /* String with language value */
} ipp_value_t;
typedef struct ipp_attribute_s /**** Attribute ****/
{
struct ipp_attribute_s *next;
/* Next atrtribute in list */
ipp_tag_t group_tag, /* Job/Printer/Operation group tag */
value_tag; /* What type of value is it? */
char *name; /* Name of attribute */
int num_values; /* Number of values */
ipp_value_t values[1]; /* Values */
} ipp_attribute_t;
typedef struct /**** Request State ****/
{
ipp_state_t state; /* State of request */
ipp_request_t request; /* Request header */
ipp_attribute_t *attrs, /* Attributes */
*last, /* Last attribute in list */
*current; /* Current attribute (for read/write) */
ipp_tag_t curtag; /* Current attribute group tag */
} ipp_t;
/*
* Prototypes...
*/
extern time_t ippDateToTime(const ipp_uchar_t *date);
extern ipp_attribute_t *ippAddBoolean(ipp_t *ipp, ipp_tag_t group, const char *name, char value);
extern ipp_attribute_t *ippAddBooleans(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const char *values);
extern ipp_attribute_t *ippAddDate(ipp_t *ipp, ipp_tag_t group, const char *name, const ipp_uchar_t *value);
extern ipp_attribute_t *ippAddInteger(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, int value);
extern ipp_attribute_t *ippAddIntegers(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, int num_values, const int *values);
extern ipp_attribute_t *ippAddRange(ipp_t *ipp, ipp_tag_t group, const char *name, int lower, int upper);
extern ipp_attribute_t *ippAddRanges(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, const int *lower, const int *upper);
extern ipp_attribute_t *ippAddResolution(ipp_t *ipp, ipp_tag_t group, const char *name, ipp_res_t units, int xres, int yres);
extern ipp_attribute_t *ippAddResolutions(ipp_t *ipp, ipp_tag_t group, const char *name, int num_values, ipp_res_t units, const int *xres, const int *yres);
extern ipp_attribute_t *ippAddSeparator(ipp_t *ipp);
extern ipp_attribute_t *ippAddString(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, const char *charset, const char *value);
extern ipp_attribute_t *ippAddStrings(ipp_t *ipp, ipp_tag_t group, ipp_tag_t type, const char *name, int num_values, const char *charset, const char **values);
extern void ippDelete(ipp_t *ipp);
extern ipp_attribute_t *ippFindAttribute(ipp_t *ipp, const char *name, ipp_tag_t type);
extern size_t ippLength(ipp_t *ipp);
extern ipp_t *ippNew(void);
extern ipp_state_t ippRead(http_t *http, ipp_t *ipp);
extern const ipp_uchar_t *ippTimeToDate(time_t t);
extern ipp_state_t ippWrite(http_t *http, ipp_t *ipp);
extern int ippPort(void);
/*
* C++ magic...
*/
# ifdef __cplusplus
}
# endif /* __cplusplus */
#endif /* !_CUPS_IPP_H_ */
/*
* End of "$Id$".
*/
+374
Ver Arquivo
@@ -0,0 +1,374 @@
/*
* "$Id$"
*
* I18N/language support for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* cupsLangEncoding() - Return the character encoding (us-ascii, etc.)
* for the given language.
* cupsLangFlush() - Flush all language data out of the cache.
* cupsLangFree() - Free language data.
* cupsLangGet() - Get a language.
*/
/*
* Include necessary headers...
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "string.h"
#include "language.h"
/*
* Local globals...
*/
static cups_lang_t *lang_cache = NULL; /* Language string cache */
static char *lang_blank = ""; /* Blank constant string */
static char *lang_encodings[] = /* Encoding strings */
{
"us-ascii",
"iso8859-1",
"iso8859-2",
"iso8859-3",
"iso8859-4",
"iso8859-5",
"iso8859-6",
"iso8859-7",
"iso8859-8",
"iso8859-9",
"iso8859-10",
"utf8"
};
static char *lang_default[] = /* Default POSIX locale */
{
#include "cups_C.h"
NULL
};
/*
* 'cupsLangEncoding()' - Return the character encoding (us-ascii, etc.)
* for the given language.
*/
char * /* O - Character encoding */
cupsLangEncoding(cups_lang_t *lang) /* I - Language data */
{
if (lang == NULL)
return (lang_encodings[0]);
else
return (lang_encodings[lang->encoding]);
}
/*
* 'cupsLangFlush()' - Flush all language data out of the cache.
*/
void
cupsLangFlush(void)
{
int i; /* Looping var */
cups_lang_t *lang, /* Current language */
*next; /* Next language */
for (lang = lang_cache; lang != NULL; lang = next)
{
for (i = 0; i < CUPS_MSG_MAX; i ++)
if (lang->messages[i] != NULL && lang->messages[i] != lang_blank)
free(lang->messages[i]);
next = lang->next;
free(lang);
}
}
/*
* 'cupsLangFree()' - Free language data.
*
* This does not actually free anything; use cupsLangFlush() for that.
*/
void
cupsLangFree(cups_lang_t *lang) /* I - Language to free */
{
if (lang != NULL && lang->used > 0)
lang->used --;
}
/*
* 'cupsLangGet()' - Get a language.
*/
cups_lang_t * /* O - Language data */
cupsLangGet(const char *language) /* I - Language or locale */
{
int i, count; /* Looping vars */
char langname[16], /* Requested language name */
real[16], /* Real language name */
filename[1024], /* Filename for language locale file */
*localedir; /* Directory for locale files */
FILE *fp; /* Language locale file pointer */
char line[1024]; /* Line from file */
cups_msg_t msg; /* Message number */
char *text; /* Message text */
cups_lang_t *lang; /* Current language... */
/*
* Convert the language string passed in to a locale string. "C" is the
* standard POSIX locale and is copied unchanged. Otherwise the
* language string is converted from ll-cc (language-country) to ll_CC
* to match the file naming convention used by all POSIX-compliant
* operating systems.
*/
if (language == NULL || language[0] == '\0' ||
strcmp(language, "POSIX") == 0)
strcpy(langname, "C");
else
strcpy(langname, language);
if (strlen(langname) < 2)
strcpy(real, "C");
else
{
real[0] = tolower(langname[0]);
real[1] = tolower(langname[1]);
if (langname[2] == '_' || langname[2] == '-')
{
real[2] = '_';
real[3] = toupper(langname[3]);
real[4] = toupper(langname[4]);
real[5] = '\0';
langname[5] = '\0';
}
else
{
langname[2] = '\0';
real[2] = '\0';
}
}
/*
* Next try to open a locale file; we will try the country-localized file
* first, and then look for generic language file. If all else fails we
* will use the POSIX locale.
*/
if ((localedir = getenv("LOCALEDIR")) == NULL)
localedir = CUPS_LOCALEDIR;
sprintf(filename, "%s/%s/cups_%s", localedir, real, real);
if ((fp = fopen(filename, "r")) == NULL)
if (strlen(real) > 2)
{
/*
* Nope, see if we can open a generic language file...
*/
real[2] = '\0';
sprintf(filename, "%s/%s/cups_%s", localedir, real, real);
fp = fopen(filename, "r");
}
/*
* Then see if we already have this language loaded...
*/
for (lang = lang_cache; lang != NULL; lang = lang->next)
if (strcmp(lang->language, langname) == 0)
{
lang->used ++;
if (fp != NULL)
fclose(fp);
return (lang);
}
/*
* OK, we have an open messages file; the first line will contain the
* language encoding (us-ascii, iso-8859-1, etc.), and the rest will
* be messages consisting of:
*
* #### SP message text
*
* or:
*
* message text
*
* If the line starts with a number, then message processing picks up
* where the number indicates. Otherwise the last message number is
* incremented.
*
* All leading whitespace is deleted.
*/
if (fp == NULL)
strcpy(line, lang_default[0]);
else if (fgets(line, sizeof(line), fp) == NULL)
{
/*
* Can't read encoding!
*/
fclose(fp);
return (NULL);
}
i = strlen(line) - 1;
if (line[i] == '\n')
line[i] = '\0'; /* Strip LF */
/*
* See if there is a free language available; if so, use that
* record...
*/
for (lang = lang_cache; lang != NULL; lang = lang->next)
if (lang->used == 0)
break;
if (lang == NULL)
{
/*
* Allocate memory for the language and add it to the cache.
*/
if ((lang = calloc(sizeof(cups_lang_t), 1)) == NULL)
{
fclose(fp);
return (NULL);
}
lang->next = lang_cache;
lang_cache = lang;
}
/*
* Free all old strings as needed...
*/
for (i = 0; i < CUPS_MSG_MAX; i ++)
{
if (lang->messages[i] != NULL && lang->messages[i] != lang_blank)
free(lang->messages[i]);
lang->messages[i] = lang_blank;
}
/*
* Then assign the language and encoding fields...
*/
lang->used ++;
strcpy(lang->language, langname);
for (i = 0; i < (sizeof(lang_encodings) / sizeof(lang_encodings[0])); i ++)
if (strcmp(lang_encodings[i], line) == 0)
{
lang->encoding = (cups_encoding_t)i;
break;
}
/*
* Read the strings from the file...
*/
msg = (cups_msg_t)-1;
count = 1;
for (;;)
{
/*
* Read a line from memory or from a file...
*/
if (fp == NULL)
{
if (lang_default[count] == NULL)
break;
strcpy(line, lang_default[count]);
}
else if (fgets(line, sizeof(line), fp) == NULL)
break;
count ++;
/*
* Ignore blank lines...
*/
i = strlen(line) - 1;
if (line[i] == '\n')
line[i] = '\0'; /* Strip LF */
if (line[0] == '\0')
continue;
/*
* Grab the message number and text...
*/
if (isdigit(line[0]))
msg = (cups_msg_t)atoi(line);
else
msg ++;
if (msg < 0 || msg >= CUPS_MSG_MAX)
continue;
text = line;
while (isdigit(*text))
text ++;
while (isspace(*text))
text ++;
lang->messages[msg] = strdup(text);
}
/*
* Close the file and return...
*/
if (fp != NULL)
fclose(fp);
return (lang);
}
/*
* End of "$Id$".
*/
+200
Ver Arquivo
@@ -0,0 +1,200 @@
/*
* "$Id$"
*
* Multi-language support for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
#ifndef _CUPS_LANGUAGE_H_
# define _CUPS_LANGUAGE_H_
/*
* Include necessary headers...
*/
# include <locale.h>
# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */
/*
* Messages...
*/
typedef enum /**** Message Indices ****/
{
CUPS_MSG_OK,
CUPS_MSG_CANCEL,
CUPS_MSG_HELP,
CUPS_MSG_QUIT,
CUPS_MSG_CLOSE,
CUPS_MSG_YES,
CUPS_MSG_NO,
CUPS_MSG_ON,
CUPS_MSG_OFF,
CUPS_MSG_SAVE,
CUPS_MSG_DISCARD,
CUPS_MSG_DEFAULT,
CUPS_MSG_OPTIONS,
CUPS_MSG_MORE_INFO,
CUPS_MSG_BLACK,
CUPS_MSG_COLOR,
CUPS_MSG_CYAN,
CUPS_MSG_MAGENTA,
CUPS_MSG_YELLOW,
CUPS_MSG_COPYRIGHT,
CUPS_MSG_GENERAL,
CUPS_MSG_PRINTER,
CUPS_MSG_IMAGE,
CUPS_MSG_HPGL2,
CUPS_MSG_EXTRA,
CUPS_MSG_DOCUMENT,
CUPS_MSG_OTHER,
CUPS_MSG_PRINT_PAGES,
CUPS_MSG_ENTIRE_DOCUMENT,
CUPS_MSG_PAGE_RANGE,
CUPS_MSG_REVERSE_ORDER,
CUPS_MSG_PAGE_FORMAT,
CUPS_MSG_1_UP,
CUPS_MSG_2_UP,
CUPS_MSG_4_UP,
CUPS_MSG_IMAGE_SCALING,
CUPS_MSG_USE_NATURAL_IMAGE_SIZE,
CUPS_MSG_ZOOM_BY_PERCENT,
CUPS_MSG_ZOOM_BY_PPI,
CUPS_MSG_MIRROR_IMAGE,
CUPS_MSG_COLOR_SATURATION,
CUPS_MSG_COLOR_HUE,
CUPS_MSG_FIT_TO_PAGE,
CUPS_MSG_SHADING,
CUPS_MSG_DEFAULT_PEN_WIDTH,
CUPS_MSG_GAMMA_CORRECTION,
CUPS_MSG_BRIGHTNESS,
CUPS_MSG_ADD,
CUPS_MSG_DELETE,
CUPS_MSG_MODIFY,
CUPS_MSG_PRINTER_URI,
CUPS_MSG_PRINTER_NAME,
CUPS_MSG_PRINTER_LOCATION,
CUPS_MSG_PRINTER_INFO,
CUPS_MSG_PRINTER_MAKE_AND_MODEL,
CUPS_MSG_DEVICE_URI,
CUPS_MSG_FORMATTING_PAGE,
CUPS_MSG_PRINTING_PAGE,
CUPS_MSG_INITIALIZING_PRINTER,
CUPS_MSG_PRINTER_STATE,
CUPS_MSG_ACCEPTING_JOBS,
CUPS_MSG_NOT_ACCEPTING_JOBS,
CUPS_MSG_PRINT_JOBS,
CUPS_MSG_CLASS,
CUPS_MSG_LOCAL,
CUPS_MSG_REMOTE,
CUPS_MSG_DUPLEXING,
CUPS_MSG_STAPLING,
CUPS_MSG_FAST_COPIES,
CUPS_MSG_COLLATED_COPIES,
CUPS_MSG_PUNCHING,
CUPS_MSG_COVERING,
CUPS_MSG_BINDING,
CUPS_MSG_SORTING,
CUPS_MSG_SMALL,
CUPS_MSG_MEDIUM,
CUPS_MSG_LARGE,
CUPS_MSG_VARIABLE,
CUPS_MSG_IDLE,
CUPS_MSG_PROCESSING,
CUPS_MSG_STOPPED,
CUPS_MSG_ALL,
CUPS_MSG_ODD,
CUPS_MSG_EVEN_PAGES,
CUPS_MSG_DARKER_LIGHTER,
CUPS_MSG_MEDIA_SIZE,
CUPS_MSG_MEDIA_TYPE,
CUPS_MSG_MEDIA_SOURCE,
CUPS_MSG_ORIENTATION,
CUPS_MSG_PORTRAIT,
CUPS_MSG_LANDSCAPE,
CUPS_MSG_JOB_STATE,
CUPS_MSG_JOB_NAME,
CUPS_MSG_USER_NAME,
CUPS_MSG_PRIORITY,
CUPS_MSG_COPIES,
CUPS_MSG_FILE_SIZE,
CUPS_MSG_PENDING,
CUPS_MSG_OUTPUT_MODE,
CUPS_MSG_RESOLUTION,
CUPS_MSG_HTTP_BASE = 200,
CUPS_MSG_HTTP_END = 505,
CUPS_MSG_MAX
} cups_msg_t;
typedef enum /**** Language Encodings ****/
{
CUPS_US_ASCII,
CUPS_ISO8859_1,
CUPS_ISO8859_2,
CUPS_ISO8859_3,
CUPS_ISO8859_4,
CUPS_ISO8859_5,
CUPS_ISO8859_6,
CUPS_ISO8859_7,
CUPS_ISO8859_8,
CUPS_ISO8859_9,
CUPS_ISO8859_10,
CUPS_UTF8
} cups_encoding_t;
typedef struct cups_lang_str /**** Language Cache Structure ****/
{
struct cups_lang_str *next; /* Next language in cache */
int used; /* Number of times this entry has been used. */
cups_encoding_t encoding; /* Text encoding */
char language[16]; /* Language/locale name */
char *messages[CUPS_MSG_MAX];
/* Message array */
} cups_lang_t;
/*
* Prototypes...
*/
# ifdef WIN32
# define cupsLangDefault() cupsLangGet(setlocale(LC_ALL, ""))
# else /* This fix works around bugs in the Linux and HP-UX setlocale() */
# define cupsLangDefault() cupsLangGet(getenv("LANG"))
# endif /* WIN32 */
extern char *cupsLangEncoding(cups_lang_t *lang);
extern void cupsLangFlush(void);
extern void cupsLangFree(cups_lang_t *lang);
extern cups_lang_t *cupsLangGet(const char *language);
# define cupsLangString(lang,msg) (lang)->messages[(msg)]
# ifdef __cplusplus
}
# endif /* __cplusplus */
#endif /* !_CUPS_LANGUAGE_H_ */
/*
* End of "$Id$".
*/
+412
Ver Arquivo
@@ -0,0 +1,412 @@
/*
* "$Id$"
*
* Option marking routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* PostScript is a trademark of Adobe Systems, Inc.
*
* Contents:
*
* ppdConflicts() - Check to see if there are any conflicts.
* ppdFindChoice() - Return a pointer to an option choice.
* ppdFindMarkedChoice() - Return the marked choice for the specified option.
* ppdFindOption() - Return a pointer to the specified option.
* ppdIsMarked() - Check to see if an option is marked...
* ppdMarkDefaults() - Mark all default options in the PPD file.
* ppdMarkOption() - Mark an option in a PPD file.
* ppd_defaults() - Set the defaults for this group and all sub-groups.
*/
/*
* Include necessary headers...
*/
#include "ppd.h"
#include "string.h"
/*
* Local functions...
*/
static void ppd_defaults(ppd_file_t *ppd, ppd_group_t *g);
/*
* 'ppdConflicts()' - Check to see if there are any conflicts.
*/
int /* O - Number of conflicts found */
ppdConflicts(ppd_file_t *ppd) /* I - PPD to check */
{
int i, j, k, /* Looping variables */
conflicts; /* Number of conflicts */
ppd_const_t *c; /* Current constraint */
ppd_group_t *g, *sg; /* Groups */
ppd_option_t *o1, *o2; /* Options */
ppd_choice_t *c1, *c2; /* Choices */
if (ppd == NULL)
return (0);
/*
* Clear all conflicts...
*/
conflicts = 0;
for (i = ppd->num_groups, g = ppd->groups; i > 0; i --, g ++)
{
for (j = g->num_options, o1 = g->options; j > 0; j --, o1 ++)
o1->conflicted = 0;
for (j = g->num_subgroups, sg = g->subgroups; j > 0; j --, sg ++)
for (k = sg->num_options, o1 = sg->options; k > 0; k --, o1 ++)
o1->conflicted = 0;
}
/*
* Loop through all of the UI constraints and flag any options
* that conflict...
*/
for (i = ppd->num_consts, c = ppd->consts; i > 0; i --, c ++)
{
/*
* Grab pointers to the first option...
*/
o1 = ppdFindOption(ppd, c->option1);
if (o1 == NULL)
continue;
else if (c->choice1[0] != '\0')
{
/*
* This constraint maps to a specific choice.
*/
c1 = ppdFindChoice(o1, c->choice1);
}
else
{
/*
* This constraint applies to any choice for this option.
*/
for (j = o1->num_choices, c1 = o1->choices; j > 0; j --, c1 ++)
if (c1->marked)
break;
if (j == 0)
c1 = NULL;
}
/*
* Grab pointers to the second option...
*/
o2 = ppdFindOption(ppd, c->option2);
if (o2 == NULL)
continue;
else if (c->choice2[0] != '\0')
{
/*
* This constraint maps to a specific choice.
*/
c2 = ppdFindChoice(o2, c->choice2);
}
else
{
/*
* This constraint applies to any choice for this option.
*/
for (j = o2->num_choices, c2 = o2->choices; j > 0; j --, c2 ++)
if (c2->marked)
break;
if (j == 0)
c2 = NULL;
}
/*
* If both options are marked then there is a conflict...
*/
if (c1 != NULL && c1->marked &&
c2 != NULL && c2->marked)
{
conflicts ++;
o1->conflicted = 1;
o2->conflicted = 1;
}
}
/*
* Return the number of conflicts found...
*/
return (conflicts);
}
/*
* 'ppdFindChoice()' - Return a pointer to an option choice.
*/
ppd_choice_t * /* O - Choice pointer or NULL */
ppdFindChoice(ppd_option_t *o, /* I - Pointer to option */
const char *choice) /* I - Name of choice */
{
int i; /* Looping var */
ppd_choice_t *c; /* Current choice */
if (o == NULL || choice == NULL)
return (NULL);
for (i = o->num_choices, c = o->choices; i > 0; i --, c ++)
if (strcmp(c->choice, choice) == 0)
return (c);
return (NULL);
}
/*
* 'ppdFindMarkedChoice()' - Return the marked choice for the specified option.
*/
ppd_choice_t * /* O - Pointer to choice or NULL */
ppdFindMarkedChoice(ppd_file_t *ppd, /* I - PPD file */
const char *option) /* I - Keyword/option name */
{
int i; /* Looping var */
ppd_option_t *o; /* Pointer to option */
ppd_choice_t *c; /* Pointer to choice */
if ((o = ppdFindOption(ppd, option)) == NULL)
return (NULL);
for (i = o->num_choices, c = o->choices; i > 0; i --, c ++)
if (c->marked)
return (c);
return (NULL);
}
/*
* 'ppdFindOption()' - Return a pointer to the specified option.
*/
ppd_option_t * /* O - Pointer to option or NULL */
ppdFindOption(ppd_file_t *ppd, /* I - PPD file data */
const char *option) /* I - Option/Keyword name */
{
int i, j, k; /* Looping vars */
ppd_option_t *o; /* Pointer to option */
ppd_group_t *g, /* Pointer to group */
*sg; /* Pointer to subgroup */
if (ppd == NULL || option == NULL)
return (NULL);
for (i = ppd->num_groups, g = ppd->groups; i > 0; i --, g ++)
{
for (j = g->num_options, o = g->options; j > 0; j --, o ++)
if (strcmp(o->keyword, option) == 0)
return (o);
for (j = g->num_subgroups, sg = g->subgroups; j > 0; j --, sg ++)
for (k = sg->num_options, o = sg->options; k > 0; k --, o ++)
if (strcmp(o->keyword, option) == 0)
return (o);
}
return (NULL);
}
/*
* 'ppdIsMarked()' - Check to see if an option is marked...
*/
int /* O - Non-zero if option is marked */
ppdIsMarked(ppd_file_t *ppd, /* I - PPD file data */
const char *option, /* I - Option/Keyword name */
const char *choice) /* I - Choice name */
{
ppd_option_t *o; /* Option pointer */
ppd_choice_t *c; /* Choice pointer */
if (ppd == NULL)
return (0);
if ((o = ppdFindOption(ppd, option)) == NULL)
return (0);
if ((c = ppdFindChoice(o, choice)) == NULL)
return (0);
return (c->marked);
}
/*
* 'ppdMarkDefaults()' - Mark all default options in the PPD file.
*/
void
ppdMarkDefaults(ppd_file_t *ppd)/* I - PPD file record */
{
int i; /* Looping variables */
ppd_group_t *g; /* Current group */
ppd_option_t *o; /* PageSize option */
if (ppd == NULL)
return;
for (i = ppd->num_groups, g = ppd->groups; i > 0; i --, g ++)
ppd_defaults(ppd, g);
}
/*
* 'ppdMarkOption()' - Mark an option in a PPD file.
*
* Notes:
*
* -1 is returned if the given option would conflict with any currently
* selected option.
*/
int /* O - Number of conflicts */
ppdMarkOption(ppd_file_t *ppd, /* I - PPD file record */
const char *option, /* I - Keyword */
const char *choice) /* I - Option name */
{
int i; /* Looping var */
ppd_option_t *o; /* Option pointer */
ppd_choice_t *c; /* Choice pointer */
if (ppd == NULL)
return (0);
if (strcmp(option, "PageSize") == 0 && strncmp(choice, "Custom.", 7) == 0)
{
/*
* Handle variable page sizes...
*/
ppdPageSize(ppd, choice);
choice = "Custom";
}
if ((o = ppdFindOption(ppd, option)) == NULL)
return (0);
for (i = o->num_choices, c = o->choices; i > 0; i --, c ++)
if (strcmp(c->choice, choice) == 0)
break;
if (i)
{
/*
* Option found; mark it and then handle unmarking any other options.
*/
c->marked = 1;
if (o->ui != PPD_UI_PICKMANY)
for (i = o->num_choices, c = o->choices; i > 0; i --, c ++)
if (strcmp(c->choice, choice) != 0)
c->marked = 0;
if (strcmp(option, "PageSize") == 0 || strcmp(option, "PageRegion") == 0)
{
/*
* Mark current page size...
*/
for (i = 0; i < ppd->num_sizes; i ++)
ppd->sizes[i].marked = strcmp(ppd->sizes[i].name, choice) == 0;
/*
* Unmark the current PageSize or PageRegion setting, as appropriate...
*/
if (strcmp(option, "PageSize") == 0)
{
if ((o = ppdFindOption(ppd, "PageRegion")) != NULL)
for (i = 0; i < o->num_choices; i ++)
o->choices[i].marked = 0;
}
else
{
if ((o = ppdFindOption(ppd, "PageSize")) != NULL)
for (i = 0; i < o->num_choices; i ++)
o->choices[i].marked = 0;
}
}
}
return (ppdConflicts(ppd));
}
/*
* 'ppd_defaults()' - Set the defaults for this group and all sub-groups.
*/
static void
ppd_defaults(ppd_file_t *ppd, /* I - PPD file */
ppd_group_t *g) /* I - Group to default */
{
int i; /* Looping var */
ppd_option_t *o; /* Current option */
ppd_group_t *sg; /* Current sub-group */
if (g == NULL)
return;
for (i = g->num_options, o = g->options; i > 0; i --, o ++)
if (strcmp(o->keyword, "PageRegion") != 0)
ppdMarkOption(ppd, o->keyword, o->defchoice);
for (i = g->num_subgroups, sg = g->subgroups; i > 0; i --, sg ++)
ppd_defaults(ppd, sg);
}
/*
* End of "$Id$".
*/
+617
Ver Arquivo
@@ -0,0 +1,617 @@
/*
* "$Id$"
*
* MIME database file routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* mimeDelete() - Delete (free) a MIME database.
* mimeMerge() - Merge a MIME database from disk with the current one.
* mimeNew() - Create a new, empty MIME database.
* load_types() - Load a xyz.types file...
* delete_rules() - Free all memory for the given rule tree.
* load_convs() - Load a xyz.convs file...
*
* Revision History:
*
* $Log: mime.c,v $
* Revision 1.14 1999/07/12 16:09:38 mike
* Fixed all constant arrays to use "const" modifier.
*
* Revision 1.13 1999/06/18 18:36:10 mike
* Fixed address to 44141 Airport View Drive...
*
* Revision 1.12 1999/04/21 21:19:33 mike
* Changes for HP-UX.
*
* Revision 1.11 1999/04/21 19:31:29 mike
* Changed the directory header stuff to use the autoconf-recommended
* sequence of #ifdef's.
*
* Changed the language routines to look for the LOCALEDIR environment
* variable, and if it is not defined to use the LOCALEDIR string defined
* in config.h.
*
* Revision 1.10 1999/03/01 20:51:53 mike
* Code cleanup - removed extraneous semi-colons...
*
* Revision 1.9 1999/02/26 22:00:51 mike
* Added more debug statements.
*
* Fixed bugs in cupsPrintFile() - wasn't setting the IPP_TAG_MIMETYPE
* value tag for the file type.
*
* Updated conversion filter code to handle wildcards for super-type.
*
* Revision 1.8 1999/02/20 16:04:38 mike
* Updated mime.c to scan directories under WIN32.
*
* Fixed some compiler warnings under WIN32.
*
* Updated VC++ project files.
*
* Updated mime.types and mime.convs files for actual registered
* MIME type names.
*
* Revision 1.7 1999/02/05 17:40:53 mike
* Added IPP client read/write code.
*
* Added string functions missing from some UNIXs.
*
* Added option parsing functions.
*
* Added IPP convenience functions (not implemented yet).
*
* Updated source files to use local string.h as needed (for
* missing string functions)
*
* Revision 1.6 1999/02/01 22:08:39 mike
* Restored original directory-scanning functionality of mimeLoad().
*
* Revision 1.4 1999/01/27 18:31:56 mike
* Updated PPD routines to handle emulations and patch files.
*
* Added DSC comments to emit output as appropriate.
*
* Revision 1.3 1999/01/24 14:18:43 mike
* Check-in prior to CVS use.
*
* Revision 1.2 1998/08/06 14:38:38 mike
* Finished coding and testing for CUPS 1.0.
*
* Revision 1.1 1998/06/11 20:50:53 mike
* Initial revision
*/
/*
* Include necessary headers...
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "string.h"
#include "mime.h"
#if defined(WIN32) || defined(__EMX__)
# include <windows.h>
#elif HAVE_DIRENT_H
# include <dirent.h>
typedef struct dirent DIRENT;
# define NAMLEN(dirent) strlen((dirent)->d_name)
#else
# if HAVE_SYS_NDIR_H
# include <sys/ndir.h>
# endif
# if HAVE_SYS_DIR_H
# include <sys/dir.h>
# endif
# if HAVE_NDIR_H
# include <ndir.h>
# endif
typedef struct direct DIRENT;
# define NAMLEN(dirent) (dirent)->d_namlen
#endif
/*
* Local functions...
*/
static void load_types(mime_t *mime, char *filename);
static void load_convs(mime_t *mime, char *filename);
static void delete_rules(mime_magic_t *rules);
/*
* 'mimeDelete()' - Delete (free) a MIME database.
*/
void
mimeDelete(mime_t *mime) /* I - MIME database */
{
int i; /* Looping var */
if (mime == NULL)
return;
/*
* Loop through the file types and delete any rules...
*/
for (i = 0; i < mime->num_types; i ++)
{
delete_rules(mime->types[i]->rules);
free(mime->types[i]);
}
/*
* Free the types and filters arrays, and then the MIME database structure.
*/
free(mime->types);
free(mime->filters);
free(mime);
}
/*
* 'mimeMerge()' - Merge a MIME database from disk with the current one.
*/
mime_t * /* O - Updated MIME database */
mimeMerge(mime_t *mime, /* I - MIME database to add to */
const char *pathname) /* I - Directory to load */
{
#if defined(WIN32) || defined(__EMX__)
HANDLE dir; /* Directory handle */
WIN32_FIND_DATA dent; /* Directory entry */
char filename[1024], /* Full filename of types/converts file */
*pathsep; /* Last character in path */
/*
* First open the directory specified by pathname... Return NULL if nothing
* was read or if the pathname is NULL...
*/
if (pathname == NULL)
return (NULL);
strcpy(filename, pathname);
pathsep = filename + strlen(filename);
if (pathsep == filename ||
(pathsep[-1] != '/' && pathsep[-1] != '\\'))
{
strcpy(pathsep, "/");
pathsep ++;
}
strcpy(pathsep, "*.types");
if ((dir = FindFirstFile(filename, &dent)) == 0)
return (NULL);
/*
* If "mime" is NULL, make a new, blank database...
*/
if (mime == NULL)
if ((mime = mimeNew()) == NULL)
return (NULL);
/*
* Read all the .types files...
*/
do
{
/*
* Load a mime.types file...
*/
strcpy(pathsep, dent.cFileName);
load_types(mime, filename);
}
while (FindNextFile(dir, &dent));
FindClose(dir);
/*
* Read all the .convs files...
*/
strcpy(pathsep, "*.convs");
if ((dir = FindFirstFile(filename, &dent)) == 0)
return (mime);
do
{
/*
* Load a mime.convs file...
*/
strcpy(pathsep, dent.cFileName);
load_convs(mime, filename);
}
while (FindNextFile(dir, &dent));
FindClose(dir);
return (mime);
#else
DIR *dir; /* Directory */
DIRENT *dent; /* Directory entry */
char filename[1024]; /* Full filename of types/converts file */
/*
* First open the directory specified by pathname... Return NULL if nothing
* was read or if the pathname is NULL...
*/
if (pathname == NULL)
return (NULL);
if ((dir = opendir(pathname)) == NULL)
return (NULL);
/*
* If "mime" is NULL, make a new, blank database...
*/
if (mime == NULL)
if ((mime = mimeNew()) == NULL)
return (NULL);
/*
* Read all the .types files...
*/
while ((dent = readdir(dir)) != NULL)
{
if (NAMLEN(dent) > 6 &&
strcmp(dent->d_name + NAMLEN(dent) - 6, ".types") == 0)
{
/*
* Load a mime.types file...
*/
sprintf(filename, "%s/%s", pathname, dent->d_name);
load_types(mime, filename);
}
}
rewinddir(dir);
/*
* Read all the .convs files...
*/
while ((dent = readdir(dir)) != NULL)
{
if (NAMLEN(dent) > 6 &&
strcmp(dent->d_name + NAMLEN(dent) - 6, ".convs") == 0)
{
/*
* Load a mime.convs file...
*/
sprintf(filename, "%s/%s", pathname, dent->d_name);
load_convs(mime, filename);
}
}
closedir(dir);
return (mime);
#endif /* WIN32 || __EMX__ */
}
/*
* 'mimeNew()' - Create a new, empty MIME database.
*/
mime_t * /* O - MIME database */
mimeNew(void)
{
return ((mime_t *)calloc(1, sizeof(mime_t)));
}
/*
* 'load_types()' - Load a xyz.types file...
*/
static void
load_types(mime_t *mime, /* I - MIME database */
char *filename) /* I - Types file to load */
{
FILE *fp; /* Types file */
int linelen; /* Length of line */
char line[65536], /* Input line from file */
*lineptr, /* Current position in line */
super[MIME_MAX_SUPER], /* Super-type name */
type[MIME_MAX_TYPE], /* Type name */
*temp; /* Temporary pointer */
mime_type_t *typeptr; /* New MIME type */
/*
* First try to open the file...
*/
if ((fp = fopen(filename, "r")) == NULL)
return;
/*
* Then read each line from the file, skipping any comments in the file...
*/
while (fgets(line, sizeof(line), fp) != NULL)
{
linelen = strlen(line);
/*
* While the last character in the line is a backslash, continue on to the
* next line (and the next, etc.)
*/
if (line[linelen - 1] == '\n')
{
line[linelen - 1] = '\0';
linelen --;
}
while (line[linelen - 1] == '\\')
{
linelen --;
if (fgets(line + linelen, sizeof(line) - linelen, fp) == NULL)
line[linelen] = '\0';
else
{
linelen += strlen(line + linelen);
if (line[linelen - 1] == '\n')
{
line[linelen - 1] = '\0';
linelen --;
}
}
}
/*
* Skip blank lines and lines starting with a #...
*/
if (line[0] == '\n' || line[0] == '#')
continue;
/*
* Extract the super-type and type names from the beginning of the line.
*/
lineptr = line;
temp = super;
while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' &&
(temp - super + 1) < MIME_MAX_SUPER)
*temp++ = tolower(*lineptr++);
*temp = '\0';
if (*lineptr != '/')
continue;
lineptr ++;
temp = type;
while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' &&
*lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE)
*temp++ = tolower(*lineptr++);
*temp = '\0';
/*
* Add the type and rules to the MIME database...
*/
typeptr = mimeAddType(mime, super, type);
mimeAddTypeRule(typeptr, lineptr);
}
}
/*
* 'load_convs()' - Load a xyz.convs file...
*/
static void
load_convs(mime_t *mime, /* I - MIME database */
char *filename) /* I - Convs file to load */
{
int i; /* Looping var */
FILE *fp; /* Convs file */
char line[1024], /* Input line from file */
*lineptr, /* Current position in line */
super[MIME_MAX_SUPER], /* Super-type name */
type[MIME_MAX_TYPE], /* Type name */
*temp, /* Temporary pointer */
*filter; /* Filter program */
mime_type_t **temptype, /* MIME type looping var */
*dsttype; /* Destination MIME type */
int cost; /* Cost of filter */
/*
* First try to open the file...
*/
if ((fp = fopen(filename, "r")) == NULL)
return;
/*
* Then read each line from the file, skipping any comments in the file...
*/
while (fgets(line, sizeof(line), fp) != NULL)
{
/*
* Skip blank lines and lines starting with a #...
*/
if (line[0] == '\n' || line[0] == '#')
continue;
/*
* Extract the destination super-type and type names from the middle of
* the line.
*/
lineptr = line;
while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\0')
lineptr ++;
while (*lineptr == ' ' || *lineptr == '\t')
lineptr ++;
temp = super;
while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' &&
(temp - super + 1) < MIME_MAX_SUPER)
*temp++ = tolower(*lineptr++);
*temp = '\0';
if (*lineptr != '/')
continue;
lineptr ++;
temp = type;
while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' &&
*lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE)
*temp++ = tolower(*lineptr++);
*temp = '\0';
if (*lineptr == '\0' || *lineptr == '\n')
continue;
if ((dsttype = mimeType(mime, super, type)) == NULL)
continue;
/*
* Then get the cost and filter program...
*/
while (*lineptr == ' ' || *lineptr == '\t')
lineptr ++;
if (*lineptr < '0' || *lineptr > '9')
continue;
cost = atoi(lineptr);
while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\0')
lineptr ++;
while (*lineptr == ' ' || *lineptr == '\t')
lineptr ++;
if (*lineptr == '\0' || *lineptr == '\n')
continue;
filter = lineptr;
if (filter[strlen(filter) - 1] == '\n')
filter[strlen(filter) - 1] = '\0';
/*
* Finally, get the source super-type and type names from the beginning of
* the line. We do it here so we can support wildcards...
*/
lineptr = line;
temp = super;
while (*lineptr != '/' && *lineptr != '\n' && *lineptr != '\0' &&
(temp - super + 1) < MIME_MAX_SUPER)
*temp++ = tolower(*lineptr++);
*temp = '\0';
if (*lineptr != '/')
continue;
lineptr ++;
temp = type;
while (*lineptr != ' ' && *lineptr != '\t' && *lineptr != '\n' &&
*lineptr != '\0' && (temp - type + 1) < MIME_MAX_TYPE)
*temp++ = tolower(*lineptr++);
*temp = '\0';
/*
* Add the filter to the MIME database, supporting wildcards as needed...
*/
for (temptype = mime->types, i = 0; i < mime->num_types; i ++, temptype ++)
if ((super[0] == '*' || strcmp((*temptype)->super, super) == 0) &&
(type[0] == '*' || strcmp((*temptype)->type, type) == 0))
mimeAddFilter(mime, *temptype, dsttype, cost, filter);
}
}
/*
* 'delete_rules()' - Free all memory for the given rule tree.
*/
static void
delete_rules(mime_magic_t *rules) /* I - Rules to free */
{
mime_magic_t *next; /* Next rule to free */
/*
* Free the rules list, descending recursively to free any child rules.
*/
while (rules != NULL)
{
next = rules->next;
if (rules->child != NULL)
delete_rules(rules->child);
free(rules);
rules = next;
}
}
/*
* End of "$Id$".
*/
+137
Ver Arquivo
@@ -0,0 +1,137 @@
/*
* "$Id$"
*
* MIME type/conversion database definitions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
#ifndef _MIME_H_
# define _MIME_H_
/*
* C++ magic...
*/
# ifdef _cplusplus
extern "C" {
# endif /* _cplusplus */
/*
* Constants...
*/
# define MIME_MAX_SUPER 16 /* Maximum size of supertype name */
# define MIME_MAX_TYPE 32 /* Maximum size of type name */
# define MIME_MAX_FILTER 256 /* Maximum size of filter pathname */
# define MIME_MAX_BUFFER 8192 /* Maximum size of file buffer */
/*
* Types/structures...
*/
typedef enum
{
MIME_MAGIC_NOP, /* No operation */
MIME_MAGIC_AND, /* Logical AND of all children */
MIME_MAGIC_OR, /* Logical OR of all children */
MIME_MAGIC_MATCH, /* Filename match */
MIME_MAGIC_ASCII, /* ASCII characters in range */
MIME_MAGIC_PRINTABLE, /* Printable characters (32-255) in range */
MIME_MAGIC_STRING, /* String matches */
MIME_MAGIC_CHAR, /* Character/byte matches */
MIME_MAGIC_SHORT, /* Short/16-bit word matches */
MIME_MAGIC_INT, /* Integer/32-bit word matches */
MIME_MAGIC_LOCALE /* Current locale matches string */
} mime_op_t;
typedef struct mime_magic_str /**** MIME Magic Data ****/
{
struct mime_magic_str *prev, /* Previous rule */
*next, /* Next rule */
*parent, /* Parent rules */
*child; /* Child rules */
short op, /* Operation code (see above) */
invert; /* Invert the result */
int offset, /* Offset in file */
length; /* Length of data */
union
{
char matchv[64]; /* Match value */
char localev[64]; /* Locale value */
char stringv[64]; /* String value */
char charv; /* Byte value */
short shortv; /* Short value */
int intv; /* Integer value */
} value;
} mime_magic_t;
typedef struct /**** MIME Type Data ****/
{
char super[MIME_MAX_SUPER], /* Super-type name ("image", "application", etc.) */
type[MIME_MAX_TYPE]; /* Type name ("png", "postscript", etc.) */
mime_magic_t *rules; /* Rules used to detect this type */
} mime_type_t;
typedef struct /**** MIME Conversion Filter Data ****/
{
mime_type_t *src, /* Source type */
*dst; /* Destination type */
int cost; /* Relative cost */
char filter[MIME_MAX_FILTER];/* Filter program to use */
} mime_filter_t;
typedef struct /**** MIME Database ****/
{
int num_types; /* Number of file types */
mime_type_t **types; /* File types */
int num_filters; /* Number of type conversion filters */
mime_filter_t *filters; /* Type conversion filters */
} mime_t;
/*
* Functions...
*/
extern void mimeDelete(mime_t *mime);
#define mimeLoad(pathname) mimeMerge((mime_t *)0, (pathname));
extern mime_t *mimeMerge(mime_t *mime, const char *pathname);
extern mime_t *mimeNew(void);
extern mime_type_t *mimeAddType(mime_t *mime, const char *super, const char *type);
extern int mimeAddTypeRule(mime_type_t *mt, const char *rule);
extern mime_type_t *mimeFileType(mime_t *mime, const char *pathname);
extern mime_type_t *mimeType(mime_t *mime, const char *super, const char *type);
extern mime_filter_t *mimeAddFilter(mime_t *mime, mime_type_t *src, mime_type_t *dst,
int cost, const char *filter);
extern mime_filter_t *mimeFilter(mime_t *mime, mime_type_t *src, mime_type_t *dst,
int *num_filters);
# ifdef _cplusplus
}
# endif /* _cplusplus */
#endif /* !_MIME_H_ */
/*
* End of "$Id$".
*/
+378
Ver Arquivo
@@ -0,0 +1,378 @@
/*
* "$Id$"
*
* Option routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* cupsAddOption() - Add an option to an option array.
* cupsFreeOptions() - Free all memory used by options.
* cupsGetOption() - Get an option value.
* cupsParseOptions() - Parse options from a command-line argument.
* cupsMarkOptions() - Mark command-line options in a PPD file.
*/
/*
* Include necessary headers...
*/
#include "cups.h"
#include <stdlib.h>
#include <ctype.h>
#include "string.h"
/*
* 'cupsAddOption()' - Add an option to an option array.
*/
int /* O - Number of options */
cupsAddOption(const char *name, /* I - Name of option */
const char *value, /* I - Value of option */
int num_options, /* I - Number of options */
cups_option_t **options) /* IO - Pointer to options */
{
int i; /* Looping var */
cups_option_t *temp; /* Pointer to new option */
if (name == NULL || value == NULL || options == NULL)
return (0);
/*
* Look for an existing option with the same name...
*/
for (i = 0, temp = *options; i < num_options; i ++, temp ++)
if (strcmp(temp->name, name) == 0)
break;
if (i >= num_options)
{
/*
* No matching option name...
*/
if (num_options == 0)
temp = (cups_option_t *)malloc(sizeof(cups_option_t));
else
temp = (cups_option_t *)realloc(*options, sizeof(cups_option_t) *
(num_options + 1));
if (temp == NULL)
return (0);
*options = temp;
temp += num_options;
temp->name = strdup(name);
num_options ++;
}
else
{
/*
* Match found; free the old value...
*/
free(temp->value);
}
temp->value = strdup(value);
return (num_options);
}
/*
* 'cupsFreeOptions()' - Free all memory used by options.
*/
void
cupsFreeOptions(int num_options, /* I - Number of options */
cups_option_t *options) /* I - Pointer to options */
{
int i; /* Looping var */
if (num_options == 0 || options == NULL)
return;
for (i = 0; i < num_options; i ++)
{
free(options[i].name);
free(options[i].value);
}
free(options);
}
/*
* 'cupsGetOption()' - Get an option value.
*/
const char * /* O - Option value or NULL */
cupsGetOption(const char *name, /* I - Name of option */
int num_options,/* I - Number of options */
cups_option_t *options) /* I - Options */
{
int i; /* Looping var */
if (name == NULL || num_options == 0 || options == NULL)
return (NULL);
for (i = 0; i < num_options; i ++)
if (strcmp(options[i].name, name) == 0)
return (options[i].value);
return (NULL);
}
/*
* 'cupsParseOptions()' - Parse options from a command-line argument.
*/
int /* O - Number of options found */
cupsParseOptions(const char *arg, /* I - Argument to parse */
int num_options, /* I - Number of options */
cups_option_t **options) /* O - Options found */
{
char *copyarg, /* Copy of input string */
*ptr, /* Pointer into string */
*name, /* Pointer to name */
*value; /* Pointer to value */
if (arg == NULL || options == NULL)
return (0);
/*
* Make a copy of the argument string and then divide it up...
*/
copyarg = strdup(arg);
ptr = copyarg;
while (*ptr != '\0')
{
/*
* Get the name up to a SPACE, =, or end-of-string...
*/
name = ptr;
while (!isspace(*ptr) && *ptr != '=' && *ptr != '\0')
ptr ++;
/*
* Skip trailing spaces...
*/
while (isspace(*ptr))
*ptr++ = '\0';
if (*ptr != '=')
{
/*
* Start of another option...
*/
num_options = cupsAddOption(name, "", num_options, options);
continue;
}
/*
* Remove = and parse the value...
*/
*ptr++ = '\0';
if (*ptr == '\'')
{
/*
* Quoted string constant...
*/
ptr ++;
value = ptr;
while (*ptr != '\'' && *ptr != '\0')
ptr ++;
if (*ptr != '\0')
*ptr++ = '\0';
}
else if (*ptr == '\"')
{
/*
* Double-quoted string constant...
*/
ptr ++;
value = ptr;
while (*ptr != '\"' && *ptr != '\0')
ptr ++;
if (*ptr != '\0')
*ptr++ = '\0';
}
else
{
/*
* Normal space-delimited string...
*/
value = ptr;
while (!isspace(*ptr) && *ptr != '\0')
ptr ++;
while (isspace(*ptr))
*ptr++ = '\0';
}
/*
* Add the string value...
*/
num_options = cupsAddOption(name, value, num_options, options);
}
/*
* Free the copy of the argument we made and return the number of options
* found.
*/
free(copyarg);
return (num_options);
}
/*
* 'cupsMarkOptions()' - Mark command-line options in a PPD file.
*/
int /* O - 1 if conflicting */
cupsMarkOptions(ppd_file_t *ppd, /* I - PPD file */
int num_options, /* I - Number of options */
cups_option_t *options) /* I - Options */
{
int i; /* Looping var */
int conflict; /* Option conflicts */
char *val, /* Pointer into value */
*ptr, /* Pointer into string */
s[255]; /* Temporary string */
conflict = 0;
for (i = num_options; i > 0; i --, options ++)
if (strcmp(options->name, "media") == 0)
{
/*
* Loop through the option string, separating it at commas and
* marking each individual option.
*/
for (val = options->value; *val;)
{
/*
* Extract the sub-option from the string...
*/
for (ptr = s; *val && *val != ',' && (ptr - s) < (sizeof(s) - 1);)
*ptr++ = *val++;
*ptr++ = '\0';
if (*val == ',')
val ++;
/*
* Mark it...
*/
if (ppdMarkOption(ppd, "PageSize", s))
conflict = 1;
if (ppdMarkOption(ppd, "InputSlot", s))
conflict = 1;
if (ppdMarkOption(ppd, "MediaType", s))
conflict = 1;
if (ppdMarkOption(ppd, "EFMediaQualityMode", s)) /* EFI */
conflict = 1;
if (strcasecmp(s, "manual") == 0)
if (ppdMarkOption(ppd, "ManualFeed", "True"))
conflict = 1;
}
}
else if (strcmp(options->name, "sides") == 0)
{
if (strcmp(options->value, "one-sided") == 0)
{
if (ppdMarkOption(ppd, "Duplex", "None"))
conflict = 1;
if (ppdMarkOption(ppd, "EFDuplex", "None")) /* EFI */
conflict = 1;
if (ppdMarkOption(ppd, "KD03Duplex", "None")) /* Kodak */
conflict = 1;
}
else if (strcmp(options->value, "two-sided-long-edge") == 0)
{
if (ppdMarkOption(ppd, "Duplex", "DuplexNoTumble"))
conflict = 1;
if (ppdMarkOption(ppd, "EFDuplex", "DuplexNoTumble")) /* EFI */
conflict = 1;
if (ppdMarkOption(ppd, "KD03Duplex", "DuplexNoTumble")) /* Kodak */
conflict = 1;
}
else if (strcmp(options->value, "two-sided-short-edge") == 0)
{
if (ppdMarkOption(ppd, "Duplex", "DuplexTumble"))
conflict = 1;
if (ppdMarkOption(ppd, "EFDuplex", "DuplexTumble")) /* EFI */
conflict = 1;
if (ppdMarkOption(ppd, "KD03Duplex", "DuplexTumble")) /* Kodak */
conflict = 1;
}
}
else if (strcmp(options->name, "resolution") == 0)
{
if (ppdMarkOption(ppd, "Resolution", options->value))
conflict = 1;
if (ppdMarkOption(ppd, "SetResolution", options->value))
/* Calcomp, Linotype, QMS, Summagraphics, Tektronix, Varityper */
conflict = 1;
if (ppdMarkOption(ppd, "JCLResolution", options->value)) /* HP */
conflict = 1;
if (ppdMarkOption(ppd, "CNRes_PGP", options->value)) /* Canon */
conflict = 1;
}
else if (ppdMarkOption(ppd, options->name, options->value))
conflict = 1;
return (conflict);
}
/*
* End of "$Id$".
*/
+189
Ver Arquivo
@@ -0,0 +1,189 @@
/*
* "$Id$"
*
* Page size functions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* PostScript is a trademark of Adobe Systems, Inc.
*
* Contents:
*
* ppdPageSize() - Get the page size record for the given size.
* ppdPageWidth() - Get the page width for the given size.
* ppdPageLength() - Get the page length for the given size.
*/
/*
* Include necessary headers...
*/
#include "ppd.h"
#include "string.h"
#include <ctype.h>
/*
* 'ppdPageSize()' - Get the page size record for the given size.
*/
ppd_size_t * /* O - Size record for page or NULL */
ppdPageSize(ppd_file_t *ppd, /* I - PPD file record */
const char *name) /* I - Size name */
{
int i; /* Looping var */
float w, l; /* Width and length of page */
char units[255]; /* Page size units... */
if (ppd == NULL)
return (NULL);
if (name != NULL)
{
if (strncmp(name, "Custom.", 7) == 0 && ppd->variable_sizes)
{
/*
* Find the custom page size...
*/
for (i = 0; i < ppd->num_sizes; i ++)
if (strcmp("Custom", ppd->sizes[i].name) == 0)
break;
if (i == ppd->num_sizes)
return (NULL);
/*
* Variable size; size name can be one of the following:
*
* Custom.WIDTHxLENGTHin - Size in inches
* Custom.WIDTHxLENGTHcm - Size in centimeters
* Custom.WIDTHxLENGTHmm - Size in millimeters
* Custom.WIDTHxLENGTH[pt] - Size in points
*/
units[0] = '\0';
if (sscanf(name + 7, "%fx%f%s", &w, &l, units) < 2)
return (NULL);
if (strcasecmp(units, "in") == 0)
{
ppd->sizes[i].width = w * 72.0;
ppd->sizes[i].length = l * 72.0;
ppd->sizes[i].left = ppd->custom_margins[0];
ppd->sizes[i].bottom = ppd->custom_margins[1];
ppd->sizes[i].right = w * 72.0 - ppd->custom_margins[2];
ppd->sizes[i].top = l * 72.0 - ppd->custom_margins[3];
}
else if (strcasecmp(units, "cm") == 0)
{
ppd->sizes[i].width = w * 2.54 * 72.0;
ppd->sizes[i].length = l * 2.54 * 72.0;
ppd->sizes[i].left = ppd->custom_margins[0];
ppd->sizes[i].bottom = ppd->custom_margins[1];
ppd->sizes[i].right = w * 2.54 * 72.0 - ppd->custom_margins[2];
ppd->sizes[i].top = l * 2.54 * 72.0 - ppd->custom_margins[3];
}
else if (strcasecmp(units, "mm") == 0)
{
ppd->sizes[i].width = w * 25.4 * 72.0;
ppd->sizes[i].length = l * 25.4 * 72.0;
ppd->sizes[i].left = ppd->custom_margins[0];
ppd->sizes[i].bottom = ppd->custom_margins[1];
ppd->sizes[i].right = w * 25.4 * 72.0 - ppd->custom_margins[2];
ppd->sizes[i].top = l * 25.4 * 72.0 - ppd->custom_margins[3];
}
else
{
ppd->sizes[i].width = w;
ppd->sizes[i].length = l;
ppd->sizes[i].left = ppd->custom_margins[0];
ppd->sizes[i].bottom = ppd->custom_margins[1];
ppd->sizes[i].right = w - ppd->custom_margins[2];
ppd->sizes[i].top = l - ppd->custom_margins[3];
}
return (ppd->sizes + i);
}
else
{
/*
* Lookup by name...
*/
for (i = 0; i < ppd->num_sizes; i ++)
if (strcmp(name, ppd->sizes[i].name) == 0)
return (ppd->sizes + i);
}
}
else
{
/*
* Find default...
*/
for (i = 0; i < ppd->num_sizes; i ++)
if (ppd->sizes[i].marked)
return (ppd->sizes + i);
}
return (NULL);
}
/*
* 'ppdPageWidth()' - Get the page width for the given size.
*/
float /* O - Width of page in points or 0.0 */
ppdPageWidth(ppd_file_t *ppd, /* I - PPD file record */
const char *name) /* I - Size name */
{
ppd_size_t *size; /* Page size */
if ((size = ppdPageSize(ppd, name)) == NULL)
return (0.0);
else
return (size->width);
}
/*
* 'ppdPageLength()' - Get the page length for the given size.
*/
float /* O - Length of page in points or 0.0 */
ppdPageLength(ppd_file_t *ppd, /* I - PPD file */
const char *name) /* I - Size name */
{
ppd_size_t *size; /* Page size */
if ((size = ppdPageSize(ppd, name)) == NULL)
return (0.0);
else
return (size->length);
}
/*
* End of "$Id$".
*/
+1814
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+239
Ver Arquivo
@@ -0,0 +1,239 @@
/*
* "$Id$"
*
* PostScript Printer Description definitions for the Common UNIX Printing
* System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* PostScript is a trademark of Adobe Systems, Inc.
*
* This code and any derivative of it may be used and distributed
* freely under the terms of the GNU General Public License when
* used with GNU Ghostscript or its derivatives. Use of the code
* (or any derivative of it) with software other than GNU
* GhostScript (or its derivatives) is governed by the CUPS license
* agreement.
*/
#ifndef _CUPS_PPD_H_
# define _CUPS_PPD_H_
/*
* Include necessary headers...
*/
# include <stdio.h>
/*
* C++ magic...
*/
# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */
/*
* PPD version...
*/
# define PPD_VERSION 4.3 /* Kept in sync with Adobe version number */
/*
* Types and structures...
*/
typedef enum /**** UI types ****/
{
PPD_UI_BOOLEAN, /* True or False option */
PPD_UI_PICKONE, /* Pick one from a list */
PPD_UI_PICKMANY /* Pick zero or more from a list */
} ppd_ui_t;
typedef enum /**** Order dependency sections ****/
{
PPD_ORDER_ANY, /* Option code can be anywhere in the file */
PPD_ORDER_DOCUMENT, /* ... must be in the DocumentSetup section */
PPD_ORDER_EXIT, /* ... must be sent prior to the document */
PPD_ORDER_JCL, /* ... must be sent as a JCL command */
PPD_ORDER_PAGE, /* ... must be in the PageSetup section */
PPD_ORDER_PROLOG /* ... must be in the Prolog section */
} ppd_section_t;
typedef enum /**** Colorspaces ****/
{
PPD_CS_CMYK = -4, /* CMYK colorspace */
PPD_CS_CMY, /* CMY colorspace */
PPD_CS_GRAY = 1, /* Grayscale colorspace */
PPD_CS_RGB = 3, /* RGB colorspace */
PPD_CS_RGBK, /* RGBK (K = gray) colorspace */
PPD_CS_N /* DeviceN colorspace */
} ppd_cs_t;
typedef struct /**** Option choices ****/
{
char marked, /* 0 if not selected, 1 otherwise */
choice[41], /* Computer-readable option name */
text[81], /* Human-readable option name */
*code; /* Code to send for this option */
void *option; /* Pointer to parent option structure */
} ppd_choice_t;
typedef struct /**** Options ****/
{
char conflicted, /* 0 if no conflicts exist, 1 otherwise */
keyword[41], /* Option keyword name ("PageSize", etc.) */
defchoice[41], /* Default option choice */
text[81]; /* Human-readable text */
ppd_ui_t ui; /* Type of UI option */
ppd_section_t section; /* Section for command */
float order; /* Order number */
int num_choices; /* Number of option choices */
ppd_choice_t *choices; /* Option choices */
} ppd_option_t;
typedef struct ppd_group_str /**** Groups ****/
{
char text[81]; /* Human-readable group name */
int num_options; /* Number of options */
ppd_option_t *options; /* Options */
int num_subgroups; /* Number of sub-groups */
struct ppd_group_str *subgroups;
/* Sub-groups (max depth = 1) */
} ppd_group_t;
typedef struct /**** Constraints ****/
{
char option1[41], /* First keyword */
choice1[41], /* First option/choice (blank for all) */
option2[41], /* Second keyword */
choice2[41]; /* Second option/choice (blank for all) */
} ppd_const_t;
typedef struct /**** Page Sizes ****/
{
int marked; /* Page size selected? */
char name[41]; /* Media size option */
float width, /* Width of media in points */
length, /* Length of media in points */
left, /* Left printable margin in points */
bottom, /* Bottom printable margin in points */
right, /* Right printable margin in points */
top; /* Top printable margin in points */
} ppd_size_t;
typedef struct /**** Emulators ****/
{
char name[41], /* Emulator name */
*start, /* Code to switch to this emulation */
*stop; /* Code to stop this emulation */
} ppd_emul_t;
typedef struct /**** sRGB Color Profiles ****/
{
char resolution[41], /* Resolution or "-" */
media_type[41]; /* Media type of "-" */
float density, /* Ink density to use */
gamma, /* Gamma correction to use */
matrix[3][3]; /* Transform matrix */
} ppd_profile_t;
typedef struct /**** Files ****/
{
int language_level, /* Language level of device */
color_device, /* 1 = color device, 0 = grayscale */
variable_sizes, /* 1 = supports variable sizes, 0 = doesn't */
accurate_screens,/* 1 = supports accurate screens, 0 = not */
contone_only, /* 1 = continuous tone only, 0 = not */
landscape, /* -90 or 90 */
model_number, /* Device-specific model number */
manual_copies; /* 1 = Copies done manually, 0 = hardware */
ppd_cs_t colorspace; /* Default colorspace */
char *patches; /* Patch commands to be sent to printer */
int num_emulations; /* Number of emulations supported */
ppd_emul_t *emulations; /* Emulations and the code to invoke them */
char *jcl_begin, /* Start JCL commands */
*jcl_ps, /* Enter PostScript interpreter */
*jcl_end, /* End JCL commands */
*lang_encoding, /* Language encoding */
*lang_version, /* Language version (English, Spanish, etc.) */
*modelname, /* Model name (general) */
*ttrasterizer, /* Truetype rasterizer */
*manufacturer, /* Manufacturer name */
*product, /* Product name (from PS RIP/interpreter) */
*nickname, /* Nickname (specific) */
*shortnickname; /* Short version of nickname */
int num_groups; /* Number of UI groups */
ppd_group_t *groups; /* UI groups */
int num_sizes; /* Number of page sizes */
ppd_size_t *sizes; /* Page sizes */
float custom_min[2], /* Minimum variable page size */
custom_max[2], /* Maximum variable page size */
custom_margins[4];/* Margins around page */
int num_consts; /* Number of UI/Non-UI constraints */
ppd_const_t *consts; /* UI/Non-UI constraints */
int num_fonts; /* Number of pre-loaded fonts */
char **fonts; /* Pre-loaded fonts */
int num_profiles; /* Number of sRGB color profiles */
ppd_profile_t *profiles; /* sRGB color profiles */
int num_filters; /* Number of filters */
char **filters; /* Filter strings... */
} ppd_file_t;
/*
* Prototypes...
*/
extern void ppdClose(ppd_file_t *ppd);
extern int ppdConflicts(ppd_file_t *ppd);
extern int ppdEmit(ppd_file_t *ppd, FILE *fp,
ppd_section_t section);
extern int ppdEmitFd(ppd_file_t *ppd, int fd,
ppd_section_t section);
extern int ppdIsMarked(ppd_file_t *ppd, const char *keyword,
const char *option);
extern void ppdMarkDefaults(ppd_file_t *ppd);
extern int ppdMarkOption(ppd_file_t *ppd, const char *keyword,
const char *option);
extern ppd_choice_t *ppdFindChoice(ppd_option_t *o, const char *option);
extern ppd_choice_t *ppdFindMarkedChoice(ppd_file_t *ppd, const char *keyword);
extern ppd_option_t *ppdFindOption(ppd_file_t *ppd, const char *keyword);
extern ppd_file_t *ppdOpen(FILE *fp);
extern ppd_file_t *ppdOpenFd(int fd);
extern ppd_file_t *ppdOpenFile(const char *filename);
extern float ppdPageLength(ppd_file_t *ppd, const char *name);
extern ppd_size_t *ppdPageSize(ppd_file_t *ppd, const char *name);
extern float ppdPageWidth(ppd_file_t *ppd, const char *name);
/*
* C++ magic...
*/
# ifdef __cplusplus
}
# endif /* __cplusplus */
#endif /* !_CUPS_PPD_H_ */
/*
* End of "$Id$".
*/
+252
Ver Arquivo
@@ -0,0 +1,252 @@
/*
* "$Id$"
*
* Raster file routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights for the CUPS Raster source
* files are outlined in the GNU Library General Public License, located
* in the "pstoraster" directory. If this file is missing or damaged
* please contact Easy Software Products at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This code and any derivative of it may be used and distributed
* freely under the terms of the GNU General Public License when
* used with GNU Ghostscript or its derivatives. Use of the code
* (or any derivative of it) with software other than GNU
* GhostScript (or its derivatives) is governed by the CUPS license
* agreement.
*
* Contents:
*
* cupsRasterClose() - Close a raster stream.
* cupsRasterOpen() - Open a raster stream.
* cupsRasterReadHeader() - Read a raster page header.
* cupsRasterReadPixels() - Read raster pixels.
* cupsRasterWriteHeader() - Write a raster page header.
* cupsRasterWritePixels() - Write raster pixels.
*/
/*
* Include necessary headers...
*/
#include "raster.h"
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#if defined(WIN32) || defined(__EMX__)
# include <io.h>
#else
# include <unistd.h>
#endif /* WIN32 || __EMX__ */
/*
* 'cupsRasterClose()' - Close a raster stream.
*/
void
cupsRasterClose(cups_raster_t *r) /* I - Stream to close */
{
if (r != NULL)
free(r);
}
/*
* 'cupsRasterOpen()' - Open a raster stream.
*/
cups_raster_t * /* O - New stream */
cupsRasterOpen(int fd, /* I - File descriptor */
cups_mode_t mode) /* I - Mode */
{
cups_raster_t *r; /* New stream */
if ((r = calloc(sizeof(cups_raster_t), 1)) == NULL)
return (NULL);
r->fd = fd;
r->mode = mode;
if (mode == CUPS_RASTER_READ)
{
/*
* Open for read - get sync word...
*/
if (read(fd, &(r->sync), sizeof(r->sync)) < sizeof(r->sync))
{
free(r);
return (NULL);
}
if (r->sync != CUPS_RASTER_SYNC &&
r->sync != CUPS_RASTER_REVSYNC)
{
free(r);
return (NULL);
}
}
else
{
/*
* Open for write - put sync word...
*/
r->sync = CUPS_RASTER_SYNC;
if (write(fd, &(r->sync), sizeof(r->sync)) < sizeof(r->sync))
{
free(r);
return (NULL);
}
}
return (r);
}
/*
* 'cupsRasterReadHeader()' - Read a raster page header.
*/
unsigned /* O - 1 on success, 0 on fail */
cupsRasterReadHeader(cups_raster_t *r, /* I - Raster stream */
cups_page_header_t *h) /* I - Pointer to header data */
{
int len; /* Number of words to swap */
union swap_s /* Swapping structure */
{
unsigned char b[4];
unsigned v;
} *s;
if (r == NULL || r->mode != CUPS_RASTER_READ)
return (0);
if (cupsRasterReadPixels(r, (unsigned char *)h, sizeof(cups_page_header_t)) <
sizeof(cups_page_header_t))
return (0);
if (r->sync == CUPS_RASTER_REVSYNC)
for (len = (sizeof(cups_page_header_t) - 256) / 4,
s = (union swap_s *)&(h->AdvanceDistance);
len > 0;
len --, s ++)
s->v = (((((s->b[3] << 8) | s->b[2]) << 8) | s->b[1]) << 8) | s->b[0];
return (1);
}
/*
* 'cupsRasterReadPixels()' - Read raster pixels.
*/
unsigned /* O - Number of bytes read */
cupsRasterReadPixels(cups_raster_t *r, /* I - Raster stream */
unsigned char *p, /* I - Pointer to pixel buffer */
unsigned len) /* I - Number of bytes to read */
{
int bytes; /* Bytes read */
unsigned remaining; /* Bytes remaining */
if (r == NULL || r->mode != CUPS_RASTER_READ)
return (0);
remaining = len;
while (remaining > 0)
{
bytes = read(r->fd, p, remaining);
if (bytes <= 0)
{
if (errno != EAGAIN && errno != EINTR)
return (0);
else
continue;
}
remaining -= bytes;
p += bytes;
}
return (len);
}
/*
* 'cupsRasterWriteHeader()' - Write a raster page header.
*/
unsigned
cupsRasterWriteHeader(cups_raster_t *r,
cups_page_header_t *h)
{
if (r == NULL || r->mode != CUPS_RASTER_WRITE)
return (0);
return (cupsRasterWritePixels(r, (unsigned char *)h,
sizeof(cups_page_header_t)) ==
sizeof(cups_page_header_t));
}
/*
* 'cupsRasterWritePixels()' - Write raster pixels.
*/
unsigned /* O - Number of bytes written */
cupsRasterWritePixels(cups_raster_t *r, /* I - Raster stream */
unsigned char *p, /* I - Bytes to write */
unsigned len)/* I - Number of bytes to write */
{
int bytes; /* Bytes read */
unsigned remaining; /* Bytes remaining */
if (r == NULL || r->mode != CUPS_RASTER_WRITE)
return (0);
remaining = len;
while (remaining > 0)
{
bytes = write(r->fd, p, remaining);
if (bytes <= 0)
{
if (errno != EAGAIN && errno != EINTR)
return (0);
else
continue;
}
remaining -= bytes;
p += bytes;
}
return (len);
}
/*
* End of "$Id$".
*/
+233
Ver Arquivo
@@ -0,0 +1,233 @@
/*
* "$Id$"
*
* Raster file definitions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights for the CUPS Raster source
* files are outlined in the GNU Library General Public License, located
* in the "pstoraster" directory. If this file is missing or damaged
* please contact Easy Software Products at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* This code and any derivative of it may be used and distributed
* freely under the terms of the GNU General Public License when
* used with GNU Ghostscript or its derivatives. Use of the code
* (or any derivative of it) with software other than GNU
* GhostScript (or its derivatives) is governed by the CUPS license
* agreement.
*/
#ifndef _CUPS_RASTER_H_
# define _CUPS_RASTER_H_
# ifdef __cplusplus
extern "C" {
# endif /* __cplusplus */
/*
* Every non-PostScript printer driver that supports raster images should
* use the application/vnd.cups-raster image file format. Since both the
* PostScript RIP (pstoraster, based on GNU Ghostscript 4.03) and Image RIP
* (imagetoraster, located in the filter directory) use it, using this format
* saves you a lot of work. Also, the PostScript RIP passes any printer
* options that are in a PS file to your driver this way as well...
*/
/*
* Constants...
*/
# define CUPS_RASTER_SYNC 0x52615374 /* RaSt */
# define CUPS_RASTER_REVSYNC 0x74536152 /* tSaR */
/*
* Types...
*/
typedef enum
{
CUPS_RASTER_READ, /* Open stream for reading */
CUPS_RASTER_WRITE /* Open stream for writing */
} cups_mode_t;
typedef enum
{
CUPS_FALSE, /* Logical false */
CUPS_TRUE /* Logical true */
} cups_bool_t;
typedef enum
{
CUPS_JOG_NONE, /* Never move pages */
CUPS_JOG_FILE, /* Move pages after this file */
CUPS_JOG_JOB, /* Move pages after this job */
CUPS_JOG_SET /* Move pages after this set */
} cups_jog_t;
typedef enum
{
CUPS_ORIENT_0, /* Don't rotate the page */
CUPS_ORIENT_90, /* Rotate the page counter-clockwise */
CUPS_ORIENT_180, /* Turn the page upside down */
CUPS_ORIENT_270 /* Rotate the page clockwise */
} cups_orient_t;
typedef enum
{
CUPS_CUT_NONE, /* Never cut the roll */
CUPS_CUT_FILE, /* Cut the roll after this file */
CUPS_CUT_JOB, /* Cut the roll after this job */
CUPS_CUT_SET, /* Cut the roll after this set */
CUPS_CUT_PAGE /* Cut the roll after this page */
} cups_cut_t;
typedef enum
{
CUPS_ADVANCE_NONE, /* Never advance the roll */
CUPS_ADVANCE_FILE, /* Advance the roll after this file */
CUPS_ADVANCE_JOB, /* Advance the roll after this job */
CUPS_ADVANCE_SET, /* Advance the roll after this set */
CUPS_ADVANCE_PAGE /* Advance the roll after this page */
} cups_adv_t;
typedef enum
{
CUPS_EDGE_TOP, /* Leading edge is the top of the page */
CUPS_EDGE_RIGHT, /* Leading edge is the right of the page */
CUPS_EDGE_BOTTOM, /* Leading edge is the bottom of the page */
CUPS_EDGE_LEFT /* Leading edge is the left of the page */
} cups_edge_t;
typedef enum
{
CUPS_ORDER_CHUNKED, /* CMYK CMYK CMYK ... */
CUPS_ORDER_BANDED, /* CCC MMM YYY KKK ... */
CUPS_ORDER_PLANAR /* CCC ... MMM ... YYY ... KKK ... */
} cups_order_t;
typedef enum
{
CUPS_CSPACE_W, /* Luminance */
CUPS_CSPACE_RGB, /* Red, green, blue */
CUPS_CSPACE_RGBA, /* Red, green, blue, alpha */
CUPS_CSPACE_K, /* Black */
CUPS_CSPACE_CMY, /* Cyan, magenta, yellow */
CUPS_CSPACE_YMC, /* Yellow, magenta, cyan */
CUPS_CSPACE_CMYK, /* Cyan, magenta, yellow, black */
CUPS_CSPACE_YMCK, /* Yellow, magenta, cyan, black */
CUPS_CSPACE_KCMY, /* Black, cyan, magenta, yellow */
CUPS_CSPACE_KCMYcm, /* Black, cyan, magenta, yellow, *
* light-cyan, light-magenta */
CUPS_CSPACE_GMCK, /* Gold, magenta, yellow, black */
CUPS_CSPACE_GMCS, /* Gold, magenta, yellow, silver */
CUPS_CSPACE_WHITE, /* White ink (as black) */
CUPS_CSPACE_GOLD, /* Gold foil */
CUPS_CSPACE_SILVER /* Silver foil */
} cups_cspace_t;
/*
* The page header structure contains the standard PostScript page device
* dictionary, along with some CUPS-specific parameters that are provided
* by the RIPs...
*/
typedef struct
{
/**** Standard Page Device Dictionary String Values ****/
char MediaClass[64]; /* MediaClass string */
char MediaColor[64]; /* MediaColor string */
char MediaType[64]; /* MediaType string */
char OutputType[64]; /* OutputType string */
/**** Standard Page Device Dictionary Integer Values ****/
unsigned AdvanceDistance; /* AdvanceDistance value in points */
cups_adv_t AdvanceMedia; /* AdvanceMedia value (see above) */
cups_bool_t Collate; /* Collated copies value */
cups_cut_t CutMedia; /* CutMedia value (see above) */
cups_bool_t Duplex; /* Duplexed (double-sided) value */
unsigned HWResolution[2]; /* Resolution in dots-per-inch */
unsigned ImagingBoundingBox[4]; /* Pixel region that is painted (points) */
cups_bool_t InsertSheet; /* InsertSheet value */
cups_jog_t Jog; /* Jog value (see above) */
cups_edge_t LeadingEdge; /* LeadingEdge value (see above) */
unsigned Margins[2]; /* Lower-lefthand margins in points */
cups_bool_t ManualFeed; /* ManualFeed value */
unsigned MediaPosition; /* MediaPosition value */
unsigned MediaWeight; /* MediaWeight value in grams/m^2 */
cups_bool_t MirrorPrint; /* MirrorPrint value */
cups_bool_t NegativePrint; /* NegativePrint value */
unsigned NumCopies; /* Number of copies to produce */
cups_orient_t Orientation; /* Orientation value (see above) */
cups_bool_t OutputFaceUp; /* OutputFaceUp value */
unsigned PageSize[2]; /* Width and length of page in points */
cups_bool_t Separations; /* Separations value */
cups_bool_t TraySwitch; /* TraySwitch value */
cups_bool_t Tumble; /* Tumble value */
/**** CUPS Page Device Dictionary Values ****/
unsigned cupsWidth; /* Width of page image in pixels */
unsigned cupsHeight; /* Height of page image in pixels */
unsigned cupsMediaType; /* Media type code */
unsigned cupsBitsPerColor; /* Number of bits for each color */
unsigned cupsBitsPerPixel; /* Number of bits for each pixel */
unsigned cupsBytesPerLine; /* Number of bytes per line */
cups_order_t cupsColorOrder; /* Order of colors */
cups_cspace_t cupsColorSpace; /* True colorspace */
unsigned cupsCompression; /* Device compression to use */
unsigned cupsRowCount; /* Rows per band */
unsigned cupsRowFeed; /* Feed between bands */
unsigned cupsRowStep; /* Spacing between lines */
} cups_page_header_t;
/*
* The raster structure maintains information about a raster data
* stream...
*/
typedef struct
{
unsigned sync; /* Sync word from start of stream */
int fd; /* File descriptor */
cups_mode_t mode; /* Read/write mode */
} cups_raster_t;
/*
* Prototypes...
*/
extern void cupsRasterClose(cups_raster_t *r);
extern cups_raster_t *cupsRasterOpen(int fd, cups_mode_t mode);
extern unsigned cupsRasterReadHeader(cups_raster_t *r,
cups_page_header_t *h);
extern unsigned cupsRasterReadPixels(cups_raster_t *r,
unsigned char *p, unsigned len);
extern unsigned cupsRasterWriteHeader(cups_raster_t *r,
cups_page_header_t *h);
extern unsigned cupsRasterWritePixels(cups_raster_t *r,
unsigned char *p, unsigned len);
# ifdef __cplusplus
}
# endif /* __cplusplus */
#endif /* !_CUPS_RASTER_H_ */
/*
* End of "$Id$".
*/
+125
Ver Arquivo
@@ -0,0 +1,125 @@
/*
* "$Id$"
*
* String functions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* strdup() - Duplicate a string.
* strcasecmp() - Do a case-insensitive comparison.
* strncasecmp() - Do a case-insensitive comparison on up to N chars.
*/
/*
* Include necessary headers...
*/
#include "string.h"
/*
* 'strdup()' - Duplicate a string.
*/
# ifndef HAVE_STRDUP
char * /* O - New string pointer */
strdup(const char *s) /* I - String to duplicate */
{
char *t; /* New string pointer */
if (s == NULL)
return (NULL);
if ((t = malloc(strlen(s) + 1)) == NULL)
return (NULL);
return (strcpy(t, s));
}
# endif /* !HAVE_STRDUP */
/*
* 'strcasecmp()' - Do a case-insensitive comparison.
*/
# ifndef HAVE_STRCASECMP
int /* O - Result of comparison (-1, 0, or 1) */
strcasecmp(const char *s, /* I - First string */
const char *t) /* I - Second string */
{
while (*s != '\0' && *t != '\0')
{
if (tolower(*s) < tolower(*t))
return (-1);
else if (tolower(*s) > tolower(*t))
return (1);
s ++;
t ++;
}
if (*s == '\0' && *t == '\0')
return (0);
else if (*s != '\0')
return (1);
else
return (-1);
}
# endif /* !HAVE_STRCASECMP */
/*
* 'strncasecmp()' - Do a case-insensitive comparison on up to N chars.
*/
# ifndef HAVE_STRNCASECMP
int /* O - Result of comparison (-1, 0, or 1) */
strncasecmp(const char *s, /* I - First string */
const char *t, /* I - Second string */
size_t n) /* I - Maximum number of characters to compare */
{
while (*s != '\0' && *t != '\0' && n > 0)
{
if (tolower(*s) < tolower(*t))
return (-1);
else if (tolower(*s) > tolower(*t))
return (1);
s ++;
t ++;
n --;
}
if (n == 0)
return (0);
else if (*s == '\0' && *t == '\0')
return (0);
else if (*s != '\0')
return (1);
else
return (-1);
}
# endif /* !HAVE_STRNCASECMP */
/*
* End of "$Id$".
*/
+66
Ver Arquivo
@@ -0,0 +1,66 @@
/*
* "$Id$"
*
* String definitions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
#ifndef _CUPS_STRING_H_
# define _CUPS_STRING_H_
/*
* Include necessary headers...
*/
# include <config.h>
# include <string.h>
/*
* Stuff for WIN32 and OS/2...
*/
# if defined(WIN32) || defined(__EMX__)
# define strcasecmp stricmp
# define strncasecmp strnicmp
# endif /* WIN32 || __EMX__ */
/*
* Prototypes...
*/
# ifndef HAVE_STRDUP
extern char *strdup(const char *);
# endif /* !HAVE_STRDUP */
# ifndef HAVE_STRCASECMP
extern int strcasecmp(const char *, const char *);
# endif /* !HAVE_STRCASECMP */
# ifndef HAVE_STRNCASECMP
extern int strncasecmp(const char *, const char *, size_t n);
# endif /* !HAVE_STRNCASECMP */
#endif /* !_CUPS_STRING_H_ */
/*
* End of "$Id$".
*/
+109
Ver Arquivo
@@ -0,0 +1,109 @@
/*
* "$Id$"
*
* HTTP test program for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* main() - Main entry.
*/
/*
* Include necessary headers...
*/
#include <stdio.h>
#include "http.h"
/*
* 'main()' - Main entry.
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments */
char *argv[]) /* I - Command-line arguments */
{
int i; /* Looping var */
http_t *http; /* HTTP connection */
http_status_t status; /* Status of GET command */
char buffer[1024]; /* Input buffer */
int bytes; /* Number of bytes read */
FILE *out; /* Output file */
#define HOST "dns.easysw.com"
#define PORT 80
puts("Connecting to " HOST "...");
httpInitialize();
http = httpConnect(HOST, PORT);
if (http == NULL)
{
puts("Unable to connect to " HOST "!");
return (1);
}
puts("Connected to " HOST "...");
out = stdout;
for (i = 1; i < argc; i ++)
{
if (strcmp(argv[i], "-o") == 0)
{
i ++;
out = fopen(argv[i], "wb");
continue;
}
printf("Requesting file \"%s\"...\n", argv[i]);
httpClearFields(http);
httpSetField(http, HTTP_FIELD_ACCEPT_LANGUAGE, "en");
httpGet(http, argv[i]);
status = httpUpdate(http);
if (status == HTTP_OK)
puts("GET OK:");
else
printf("GET failed with status %d...\n", status);
while ((bytes = httpRead(http, buffer, sizeof(buffer))) > 0)
{
fwrite(buffer, bytes, 1, out);
if (out != stdout)
printf("Read %d bytes, %d total...\n", bytes, ftell(out));
}
}
puts("Closing connection to server...");
httpClose(http);
if (out != stdout)
fclose(out);
return (0);
}
/*
* End of "$Id$".
*/
+199
Ver Arquivo
@@ -0,0 +1,199 @@
/*
* "$Id$"
*
* MIME test program for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* main() - Main entry for the test program.
*/
/*
* Include necessary headers...
*/
#include <stdio.h>
#include "mime.h"
/*
* Local functions...
*/
static void print_rules(mime_magic_t *rules);
/*
* 'main()' - Main entry for the test program.
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line args */
char *argv[]) /* I - Command-line arguments */
{
int i; /* Looping var */
char super[MIME_MAX_SUPER], /* Super-type name */
type[MIME_MAX_TYPE]; /* Type name */
mime_t *mime; /* MIME database */
mime_type_t *src, /* Source type */
*dst, /* Destination type */
**types; /* File type array pointer */
mime_filter_t *filters; /* Filters for the file */
int num_filters; /* Number of filters for the file */
mime = mimeLoad("../conf");
puts("MIME database types:");
for (i = 0, types = mime->types; i < mime->num_types; i ++, types ++)
{
printf("\t%s/%s: ", (*types)->super, (*types)->type);
print_rules((*types)->rules);
puts("");
}
puts("");
puts("MIME database filters:");
for (i = 0, filters = mime->filters; i < mime->num_filters; i ++, filters ++)
printf("\t%s/%s to %s/%s: %s (%d)\n",
filters->src->super, filters->src->type,
filters->dst->super, filters->dst->type,
filters->filter, filters->cost);
puts("");
switch (argc)
{
default :
fputs("Usage: testmime source-file [destination-type]\n", stderr);
return (1);
case 2 :
src = mimeFileType(mime, argv[1]);
if (src != NULL)
{
printf("%s: %s/%s\n", argv[1], src->super, src->type);
return (0);
}
else
{
printf("%s: unknown\n", argv[1]);
return (1);
}
case 3 :
src = mimeFileType(mime, argv[1]);
sscanf(argv[2], "%[^/]/%s", super, type);
dst = mimeType(mime, super, type);
filters = mimeFilter(mime, src, dst, &num_filters);
if (filters == NULL)
{
printf("No filters to convert from %s to %s.\n", argv[1], argv[2]);
return (1);
}
else
{
for (i = 0; i < num_filters; i ++)
if (i < (num_filters - 1))
printf("%s | ", filters[i].filter);
else
puts(filters[i].filter);
return (0);
}
}
}
/*
* 'print_rules()' - Print the rules for a file type...
*/
static void
print_rules(mime_magic_t *rules) /* I - Rules to print */
{
char logic; /* Logic separator */
if (rules == NULL)
return;
if (rules->parent == NULL ||
rules->parent->op == MIME_MAGIC_OR)
logic = ',';
else
logic = '+';
while (rules != NULL)
{
if (rules->prev != NULL)
putchar(logic);
switch (rules->op)
{
case MIME_MAGIC_MATCH :
printf("match(%s)", rules->value.matchv);
break;
case MIME_MAGIC_LOCALE :
printf("locale(%s)", rules->value.localev);
break;
case MIME_MAGIC_ASCII :
printf("ascii(%d,%d)", rules->offset, rules->length);
break;
case MIME_MAGIC_PRINTABLE :
printf("printable(%d,%d)", rules->offset, rules->length);
break;
case MIME_MAGIC_STRING :
printf("string(%d,%s)", rules->offset, rules->value.stringv);
break;
case MIME_MAGIC_CHAR :
printf("char(%d,%d)", rules->offset, rules->value.charv);
break;
case MIME_MAGIC_SHORT :
printf("short(%d,%d)", rules->offset, rules->value.shortv);
break;
case MIME_MAGIC_INT :
printf("int(%d,%d)", rules->offset, rules->value.intv);
break;
default :
if (rules->child != NULL)
{
putchar('(');
print_rules(rules->child);
putchar(')');
}
break;
}
rules = rules->next;
}
}
/*
* End of "$Id$".
*/
+102
Ver Arquivo
@@ -0,0 +1,102 @@
# Microsoft Developer Studio Project File - Name="testmime" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=testmime - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "testmime.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "testmime.mak" CFG="testmime - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "testmime - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "testmime - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "testmime - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I ".." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 cups.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"testmime.exe"
!ELSEIF "$(CFG)" == "testmime - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "testmime___Win32_Debug"
# PROP BASE Intermediate_Dir "testmime___Win32_Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 cupsd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"testmimed.exe" /pdbtype:sept
!ENDIF
# Begin Target
# Name "testmime - Win32 Release"
# Name "testmime - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\testmime.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\mime.h
# End Source File
# End Group
# End Target
# End Project
+183
Ver Arquivo
@@ -0,0 +1,183 @@
/*
* "$Id$"
*
* PPD test program for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* PostScript is a trademark of Adobe Systems, Inc.
*
* Contents:
*
* main() - Main entry for test program.
*/
/*
* Include necessary headers...
*/
#include "cups.h"
#include "string.h"
/*
* 'main()' - Main entry for test program.
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments */
char *argv[]) /* I - Command-line arguments */
{
int i, j, k, m, n; /* Looping vars */
const char *filename; /* File to load */
ppd_file_t *ppd; /* PPD file record */
ppd_size_t *size; /* Size record */
ppd_group_t *group; /* UI group */
ppd_option_t *option; /* Standard UI option */
ppd_choice_t *choice; /* Standard UI option choice */
static char *uis[] = { "BOOLEAN", "PICKONE", "PICKMANY" };
static char *sections[] = { "ANY", "DOCUMENT", "EXIT",
"JCL", "PAGE", "PROLOG" };
/*
* Display PPD files for each file listed on the command-line...
*/
if (argc == 1)
{
fputs("Usage: ppdtest filename1.ppd [... filenameN.ppd]\n", stderr);
return (1);
}
for (i = 1; i < argc; i ++)
{
if (strstr(argv[i], ".ppd"))
filename = argv[i];
else
filename = cupsGetPPD(argv[i]);
if ((ppd = ppdOpenFile(filename)) == NULL)
{
fprintf(stderr, "Unable to open \'%s\' as a PPD file!\n", filename);
continue;
}
printf("FILE: %s\n", filename);
printf(" language_level = %d\n", ppd->language_level);
printf(" color_device = %s\n", ppd->color_device ? "TRUE" : "FALSE");
printf(" variable_sizes = %s\n", ppd->variable_sizes ? "TRUE" : "FALSE");
printf(" landscape = %d\n", ppd->landscape);
switch (ppd->colorspace)
{
case PPD_CS_CMYK :
puts(" colorspace = PPD_CS_CMYK");
break;
case PPD_CS_CMY :
puts(" colorspace = PPD_CS_CMY");
break;
case PPD_CS_GRAY :
puts(" colorspace = PPD_CS_GRAY");
break;
case PPD_CS_RGB :
puts(" colorspace = PPD_CS_RGB");
break;
default :
puts(" colorspace = <unknown>");
break;
}
printf(" num_emulations = %d\n", ppd->num_emulations);
for (j = 0; j < ppd->num_emulations; j ++)
printf(" emulations[%d] = %s\n", j, ppd->emulations[j].name);
printf(" lang_encoding = %s\n", ppd->lang_encoding);
printf(" lang_version = %s\n", ppd->lang_version);
printf(" modelname = %s\n", ppd->modelname);
printf(" ttrasterizer = %s\n",
ppd->ttrasterizer == NULL ? "None" : ppd->ttrasterizer);
printf(" manufacturer = %s\n", ppd->manufacturer);
printf(" product = %s\n", ppd->product);
printf(" nickname = %s\n", ppd->nickname);
printf(" shortnickname = %s\n", ppd->shortnickname);
printf(" patches = %d bytes\n",
ppd->patches == NULL ? 0 : strlen(ppd->patches));
printf(" num_groups = %d\n", ppd->num_groups);
for (j = 0, group = ppd->groups; j < ppd->num_groups; j ++, group ++)
{
printf(" group[%d] = %s\n", j, group->text);
for (k = 0, option = group->options; k < group->num_options; k ++, option ++)
{
printf(" options[%d] = %s (%s) %s %s %.0f\n", k,
option->keyword, option->text, uis[option->ui],
sections[option->section], option->order);
if (strcmp(option->keyword, "PageSize") == 0 ||
strcmp(option->keyword, "PageRegion") == 0)
{
for (m = option->num_choices, choice = option->choices;
m > 0;
m --, choice ++)
{
size = ppdPageSize(ppd, choice->choice);
if (size == NULL)
printf(" %s (%s) = ERROR", choice->choice, choice->text);
else
printf(" %s (%s) = %.2fx%.2fin (%.1f,%.1f,%.1f,%.1f)", choice->choice,
choice->text, size->width / 72.0, size->length / 72.0,
size->left / 72.0, size->bottom / 72.0,
size->right / 72.0, size->top / 72.0);
if (strcmp(option->defchoice, choice->choice) == 0)
puts(" *");
else
putchar('\n');
}
}
else
{
for (m = option->num_choices, choice = option->choices;
m > 0;
m --, choice ++)
{
printf(" %s (%s)", choice->choice, choice->text);
if (strcmp(option->defchoice, choice->choice) == 0)
puts(" *");
else
putchar('\n');
}
}
}
}
ppdClose(ppd);
}
return (0);
}
/*
* End of "$Id$".
*/
+102
Ver Arquivo
@@ -0,0 +1,102 @@
# Microsoft Developer Studio Project File - Name="testppd" - Package Owner=<4>
# Microsoft Developer Studio Generated Build File, Format Version 6.00
# ** DO NOT EDIT **
# TARGTYPE "Win32 (x86) Console Application" 0x0103
CFG=testppd - Win32 Debug
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
!MESSAGE use the Export Makefile command and run
!MESSAGE
!MESSAGE NMAKE /f "testppd.mak".
!MESSAGE
!MESSAGE You can specify a configuration when running NMAKE
!MESSAGE by defining the macro CFG on the command line. For example:
!MESSAGE
!MESSAGE NMAKE /f "testppd.mak" CFG="testppd - Win32 Debug"
!MESSAGE
!MESSAGE Possible choices for configuration are:
!MESSAGE
!MESSAGE "testppd - Win32 Release" (based on "Win32 (x86) Console Application")
!MESSAGE "testppd - Win32 Debug" (based on "Win32 (x86) Console Application")
!MESSAGE
# Begin Project
# PROP AllowPerConfigDependencies 0
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
RSC=rc.exe
!IF "$(CFG)" == "testppd - Win32 Release"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 0
# PROP BASE Output_Dir "Release"
# PROP BASE Intermediate_Dir "Release"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 0
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD CPP /nologo /MT /W3 /GX /O2 /I ".." /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
# ADD BASE RSC /l 0x409 /d "NDEBUG"
# ADD RSC /l 0x409 /d "NDEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
# ADD LINK32 cups.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"testppd.exe"
!ELSEIF "$(CFG)" == "testppd - Win32 Debug"
# PROP BASE Use_MFC 0
# PROP BASE Use_Debug_Libraries 1
# PROP BASE Output_Dir "testppd___Win32_Debug"
# PROP BASE Intermediate_Dir "testppd___Win32_Debug"
# PROP BASE Target_Dir ""
# PROP Use_MFC 0
# PROP Use_Debug_Libraries 1
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Ignore_Export_Lib 0
# PROP Target_Dir ""
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD CPP /nologo /MTd /W3 /Gm /GX /Zi /Od /I ".." /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
# ADD BASE RSC /l 0x409 /d "_DEBUG"
# ADD RSC /l 0x409 /d "_DEBUG"
BSC32=bscmake.exe
# ADD BASE BSC32 /nologo
# ADD BSC32 /nologo
LINK32=link.exe
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
# ADD LINK32 cupsd.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /incremental:no /debug /machine:I386 /out:"testppdd.exe" /pdbtype:sept
!ENDIF
# Begin Target
# Name "testppd - Win32 Release"
# Name "testppd - Win32 Debug"
# Begin Group "Source Files"
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
# Begin Source File
SOURCE=.\testppd.c
# End Source File
# End Group
# Begin Group "Header Files"
# PROP Default_Filter "h;hpp;hxx;hm;inl"
# Begin Source File
SOURCE=.\ppd.h
# End Source File
# End Group
# End Target
# End Project
+1011
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+175
Ver Arquivo
@@ -0,0 +1,175 @@
/*
* "$Id$"
*
* User, system, and password routines for the Common UNIX Printing
* System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
*/
/*
* Include necessary headers...
*/
#include "cups.h"
#include <config.h>
#include <stdlib.h>
#include <ctype.h>
#if defined(WIN32) || defined(__EMX__)
/*
* WIN32 and OS/2 username and password stuff...
*/
/*
* 'cupsUser()' - Return the current user's name.
*/
const char * /* O - User name */
cupsUser(void)
{
return ("WindowsUser");
}
/*
* 'cupsGetPassword()' - Get a password from the user...
*/
const char * /* O - Password */
cupsGetPassword(const char *prompt) /* I - Prompt string */
{
return (NULL);
}
#else
/*
* UNIX username and password stuff...
*/
# include <pwd.h>
/*
* 'cupsUser()' - Return the current user's name.
*/
const char * /* O - User name */
cupsUser(void)
{
struct passwd *pwd; /* User/password entry */
/*
* Rewind the password file...
*/
setpwent();
/*
* Lookup the password entry for the current user.
*/
if ((pwd = getpwuid(getuid())) == NULL)
return ("unknown"); /* Unknown user! */
/*
* Rewind the password file again and return the username...
*/
setpwent();
return (pwd->pw_name);
}
/*
* 'cupsGetPassword()' - Get a password from the user...
*/
const char * /* O - Password */
cupsGetPassword(const char *prompt) /* I - Prompt string */
{
return (getpass(prompt));
}
#endif /* WIN32 || __EMX__ */
/*
* 'cupsServer()' - Return the hostname of the default server...
*/
const char * /* O - Server name */
cupsServer(void)
{
FILE *fp; /* cupsd.conf file */
char *server; /* Pointer to server name */
static char line[1024]; /* Line from file */
/*
* First see if the CUPS_SERVER environment variable is set...
*/
if ((server = getenv("CUPS_SERVER")) != NULL)
return (server);
/*
* Next check to see if we have a cupsd.conf file...
*/
if ((fp = fopen(CUPS_SERVERROOT "/conf/cupsd.conf", "r")) == NULL)
return ("localhost");
/*
* Read the cupsd.conf file and look for a ServerName line...
*/
while (fgets(line, sizeof(line), fp) != NULL)
if (strncmp(line, "ServerName ", 11) == 0)
{
/*
* Got it! Drop any trailing newline and find the name...
*/
server = line + strlen(line) - 1;
if (*server == '\n')
*server = '\0';
for (server = line + 11; isspace(*server); server ++);
if (*server)
return (server);
}
/*
* Didn't see a ServerName line, so return "localhost"...
*/
fclose(fp);
return ("localhost");
}
/*
* End of "$Id$".
*/
+989
Ver Arquivo
@@ -0,0 +1,989 @@
/*
* "$Id$"
*
* Printing utilities for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* cupsCancelJob() - Cancel a print job.
* cupsDoFileRequest() - Do an IPP request...
* cupsGetClasses() - Get a list of printer classes.
* cupsGetDefault() - Get the default printer or class.
* cupsGetPPD() - Get the PPD file for a printer.
* cupsGetPrinters() - Get a list of printers.
* cupsPrintFile() - Print a file to a printer or class.
* cups_connect() - Connect to the specified host...
*/
/*
* Include necessary headers...
*/
#include "cups.h"
#include "ipp.h"
#include "language.h"
#include "string.h"
#include "debug.h"
#include <stdlib.h>
#include <ctype.h>
#include <errno.h>
#include <sys/stat.h>
#if defined(WIN32) || defined(__EMX__)
# include <io.h>
#else
# include <unistd.h>
#endif /* WIN32 || __EMX__ */
/*
* Local globals...
*/
static http_t *cups_server = NULL;
/*
* Local functions...
*/
static char *cups_connect(const char *name, char *printer, char *hostname);
/*
* 'cupsCancelJob()' - Cancel a print job.
*/
int /* O - 1 on success, 0 on failure */
cupsCancelJob(const char *name, /* I - Name of printer or class */
int job) /* I - Job ID */
{
char printer[HTTP_MAX_URI], /* Printer name */
hostname[HTTP_MAX_URI], /* Hostname */
uri[HTTP_MAX_URI]; /* Printer URI */
ipp_t *request, /* IPP request */
*response; /* IPP response */
cups_lang_t *language; /* Language info */
/*
* See if we can connect to the server...
*/
if (!cups_connect(name, printer, hostname))
return (0);
/*
* Build an IPP_CANCEL_JOB request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
* printer-uri
* job-id
*/
request = ippNew();
request->request.op.operation_id = IPP_CANCEL_JOB;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL,
language != NULL ? language->language : "C");
sprintf(uri, "ipp://%s:%d/printers/%s", hostname, ippPort(), printer);
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
ippAddInteger(request, IPP_TAG_OPERATION, IPP_TAG_INTEGER, "job-id", job);
/*
* Do the request...
*/
if ((response = cupsDoRequest(cups_server, request, "/jobs/")) == NULL)
return (0);
ippDelete(response);
return (1);
}
/*
* 'cupsDoFileRequest()' - Do an IPP request...
*/
ipp_t * /* O - Response data */
cupsDoFileRequest(http_t *http, /* I - HTTP connection to server */
ipp_t *request, /* I - IPP request */
const char *resource, /* I - HTTP resource for POST */
const char *filename) /* I - File to send or NULL */
{
ipp_t *response; /* IPP response data */
char length[255]; /* Content-Length field */
http_status_t status; /* Status of HTTP request */
FILE *file; /* File to send */
struct stat fileinfo; /* File information */
int bytes; /* Number of bytes read/written */
char buffer[8192]; /* Output buffer */
const char *password; /* Password string */
char plain[255], /* Plaintext username:password */
encode[255]; /* Encoded username:password */
static char authstring[255] = "";
/* Authorization string */
DEBUG_printf(("cupsDoFileRequest(%08x, %08s, \'%s\', \'%s\')\n",
http, request, resource, filename ? filename : "(null)"));
/*
* See if we have a file to send...
*/
if (filename != NULL)
{
if (stat(filename, &fileinfo))
{
/*
* Can't get file information!
*/
ippDelete(request);
return (NULL);
}
if ((file = fopen(filename, "rb")) == NULL)
{
/*
* Can't open file!
*/
ippDelete(request);
return (NULL);
}
}
/*
* Loop until we can send the request without authorization problems.
*/
response = NULL;
while (response == NULL)
{
DEBUG_puts("cupsDoFileRequest: setup...");
/*
* Setup the HTTP variables needed...
*/
if (filename != NULL)
sprintf(length, "%u", ippLength(request) + (size_t)fileinfo.st_size);
else
sprintf(length, "%u", ippLength(request));
httpClearFields(http);
httpSetField(http, HTTP_FIELD_CONTENT_LENGTH, length);
httpSetField(http, HTTP_FIELD_CONTENT_TYPE, "application/ipp");
httpSetField(http, HTTP_FIELD_AUTHORIZATION, authstring);
/*
* Try the request...
*/
DEBUG_puts("cupsDoFileRequest: post...");
if (httpPost(http, resource))
continue;
/*
* Send the IPP data and wait for the response...
*/
DEBUG_puts("cupsDoFileRequest: ipp write...");
request->state = IPP_IDLE;
if (ippWrite(http, request) != IPP_ERROR)
if (filename != NULL)
{
DEBUG_puts("cupsDoFileRequest: file write...");
/*
* Send the file...
*/
rewind(file);
while ((bytes = fread(buffer, 1, sizeof(buffer), file)) > 0)
if (httpWrite(http, buffer, bytes) < bytes)
break;
}
/*
* Get the server's return status...
*/
DEBUG_puts("cupsDoFileRequest: update...");
while ((status = httpUpdate(http)) == HTTP_CONTINUE);
if (status == HTTP_UNAUTHORIZED)
{
DEBUG_puts("cupsDoFileRequest: unauthorized...");
/*
* Flush any error message...
*/
httpFlush(http);
if ((password = cupsGetPassword("Password:")) != NULL)
{
/*
* Got a password; send it to the server...
*/
if (!password[0])
break;
sprintf(plain, "%s:%s", cupsUser(), password);
httpEncode64(encode, plain);
sprintf(authstring, "Basic %s", encode);
continue;
}
else
break;
}
else if (status == HTTP_ERROR)
{
if (http->error != ENETDOWN && http->error != ENETUNREACH)
continue;
else
break;
}
else if (status != HTTP_OK)
{
DEBUG_printf(("cupsDoFileRequest: error %d...\n", status));
/*
* Flush any error message...
*/
httpFlush(http);
break;
}
else
{
/*
* Read the response...
*/
DEBUG_puts("cupsDoFileRequest: response...");
response = ippNew();
if (ippRead(http, response) == IPP_ERROR)
{
/*
* Delete the response...
*/
ippDelete(response);
response = NULL;
/*
* Flush any remaining data...
*/
httpFlush(http);
break;
}
}
}
/*
* Close the file if needed...
*/
if (filename != NULL)
fclose(file);
/*
* Delete the original request and return the response...
*/
ippDelete(request);
return (response);
}
/*
* 'cupsGetClasses()' - Get a list of printer classes.
*/
int /* O - Number of classes */
cupsGetClasses(char ***classes) /* O - Classes */
{
int n; /* Number of classes */
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language; /* Default language */
/*
* Try to connect to the server...
*/
if (!cups_connect("default", NULL, NULL))
return (0);
/*
* Build a CUPS_GET_CLASSES request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
*/
request = ippNew();
request->request.op.operation_id = CUPS_GET_CLASSES;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
/*
* Do the request and get back a response...
*/
n = 0;
*classes = NULL;
if ((response = cupsDoRequest(cups_server, request, "/classes/")) != NULL)
{
for (attr = response->attrs; attr != NULL; attr = attr->next)
if (strcmp(attr->name, "printer-name") == 0 &&
attr->value_tag == IPP_TAG_NAME)
{
if (n == 0)
*classes = malloc(sizeof(char *));
else
*classes = realloc(*classes, sizeof(char *) * (n + 1));
if (*classes == NULL)
{
ippDelete(response);
return (0);
}
(*classes)[n] = strdup(attr->values[0].string.text);
n ++;
}
ippDelete(response);
}
return (n);
}
/*
* 'cupsGetDefault()' - Get the default printer or class.
*/
const char * /* O - Default printer or NULL */
cupsGetDefault(void)
{
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language; /* Default language */
static char def_printer[64];/* Default printer */
/*
* First see if the LPDEST or PRINTER environment variables are
* set...
*/
if (getenv("LPDEST") != NULL)
return (getenv("LPDEST"));
else if (getenv("PRINTER") != NULL)
return (getenv("PRINTER"));
/*
* Try to connect to the server...
*/
if (!cups_connect("default", NULL, NULL))
return (NULL);
/*
* Build a CUPS_GET_DEFAULT request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
*/
request = ippNew();
request->request.op.operation_id = CUPS_GET_DEFAULT;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
/*
* Do the request and get back a response...
*/
if ((response = cupsDoRequest(cups_server, request, "/printers/")) != NULL)
{
if ((attr = ippFindAttribute(response, "printer-name", IPP_TAG_NAME)) != NULL)
{
strcpy(def_printer, attr->values[0].string.text);
ippDelete(response);
return (def_printer);
}
ippDelete(response);
}
return (NULL);
}
/*
* 'cupsGetPPD()' - Get the PPD file for a printer.
*/
const char * /* O - Filename for PPD file */
cupsGetPPD(const char *name) /* I - Printer name */
{
FILE *fp; /* PPD file */
int bytes; /* Number of bytes read */
char buffer[8192]; /* Buffer for file */
char printer[HTTP_MAX_URI], /* Printer name */
hostname[HTTP_MAX_URI], /* Hostname */
resource[HTTP_MAX_URI]; /* Resource name */
static char filename[HTTP_MAX_URI]; /* Local filename */
char *tempdir; /* Temporary file directory */
/*
* See if we can connect to the server...
*/
if (!cups_connect(name, printer, hostname))
return (NULL);
/*
* Then check for the cache file...
*/
#if defined(WIN32) || defined(__EMX__)
tempdir = "C:/WINDOWS/TEMP";
sprintf(filename, "%s/%s.ppd", tempdir, printer);
#else
if ((tempdir = getenv("TMPDIR")) == NULL)
tempdir = "/tmp";
sprintf(filename, "%s/%d.%s.ppd", tempdir, getuid(), printer);
#endif /* WIN32 || __EMX__ */
/*
* And send a request to the HTTP server...
*/
sprintf(resource, "/printers/%s.ppd", printer);
httpClearFields(cups_server);
httpSetField(cups_server, HTTP_FIELD_HOST, hostname);
httpGet(cups_server, resource);
switch (httpUpdate(cups_server))
{
case HTTP_OK : /* New file - get it! */
break;
default :
return (NULL);
}
/*
* OK, we need to copy the file; open the file and copy it...
*/
unlink(filename);
if ((fp = fopen(filename, "w")) == NULL)
{
/*
* Can't open file; close the server connection and return NULL...
*/
httpClose(cups_server);
cups_server = NULL;
return (NULL);
}
while ((bytes = httpRead(cups_server, buffer, sizeof(buffer))) > 0)
fwrite(buffer, bytes, 1, fp);
fclose(fp);
return (filename);
}
/*
* 'cupsGetPrinters()' - Get a list of printers.
*/
int /* O - Number of printers */
cupsGetPrinters(char ***printers) /* O - Printers */
{
int n; /* Number of printers */
ipp_t *request, /* IPP Request */
*response; /* IPP Response */
ipp_attribute_t *attr; /* Current attribute */
cups_lang_t *language; /* Default language */
/*
* Try to connect to the server...
*/
if (!cups_connect("default", NULL, NULL))
return (0);
/*
* Build a CUPS_GET_PRINTERS request, which requires the following
* attributes:
*
* attributes-charset
* attributes-natural-language
*/
request = ippNew();
request->request.op.operation_id = CUPS_GET_PRINTERS;
request->request.op.request_id = 1;
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL, language->language);
/*
* Do the request and get back a response...
*/
n = 0;
*printers = NULL;
if ((response = cupsDoRequest(cups_server, request, "/printers/")) != NULL)
{
for (attr = response->attrs; attr != NULL; attr = attr->next)
if (strcmp(attr->name, "printer-name") == 0 &&
attr->value_tag == IPP_TAG_NAME)
{
if (n == 0)
*printers = malloc(sizeof(char *));
else
*printers = realloc(*printers, sizeof(char *) * (n + 1));
if (*printers == NULL)
{
ippDelete(response);
return (0);
}
(*printers)[n] = strdup(attr->values[0].string.text);
n ++;
}
ippDelete(response);
}
return (n);
}
/*
* 'cupsPrintFile()' - Print a file to a printer or class.
*/
int /* O - Job ID */
cupsPrintFile(const char *name, /* I - Printer or class name */
const char *filename, /* I - File to print */
const char *title, /* I - Title of job */
int num_options,/* I - Number of options */
cups_option_t *options) /* I - Options */
{
int i; /* Looping var */
int n, n2; /* Attribute values */
char *option, /* Name of option */
*val, /* Pointer to option value */
*s; /* Pointer into option value */
ipp_t *request; /* IPP request */
ipp_t *response; /* IPP response */
ipp_attribute_t *attr; /* IPP job-id attribute */
char hostname[HTTP_MAX_URI], /* Hostname */
printer[HTTP_MAX_URI], /* Printer or class name */
uri[HTTP_MAX_URI]; /* Printer URI */
cups_lang_t *language; /* Language to use */
int jobid; /* New job ID */
DEBUG_printf(("cupsPrintFile(\'%s\', \'%s\', %d, %08x)\n",
printer, filename, num_options, options));
if (name == NULL || filename == NULL)
return (0);
/*
* Setup a connection and request data...
*/
if ((request = ippNew()) == NULL)
return (0);
if (!cups_connect(name, printer, hostname))
{
DEBUG_printf(("cupsPrintFile: Unable to open connection - %s.\n",
strerror(errno)));
ippDelete(request);
return (0);
}
/*
* Build a standard CUPS URI for the printer and fill the standard IPP
* attributes...
*/
request->request.op.operation_id = IPP_PRINT_JOB;
request->request.op.request_id = 1;
sprintf(uri, "ipp://%s:%d/printers/%s", hostname, ippPort(), printer);
language = cupsLangDefault();
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_CHARSET,
"attributes-charset", NULL, cupsLangEncoding(language));
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_LANGUAGE,
"attributes-natural-language", NULL,
language != NULL ? language->language : "C");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_URI, "printer-uri",
NULL, uri);
/*
* Handle raw print files...
*/
if (cupsGetOption("raw", num_options, options))
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
NULL, "application/vnd.cups-raw");
else
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_MIMETYPE, "document-format",
NULL, "application/octet-stream");
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "requesting-user-name",
NULL, cupsUser());
if (title)
ippAddString(request, IPP_TAG_OPERATION, IPP_TAG_NAME, "job-name", NULL, title);
/*
* Then add all options on the command-line...
*/
for (i = 0; i < num_options; i ++)
{
/*
* Skip the "raw" option - handled above...
*/
if (strcmp(options[i].name, "raw") == 0)
continue;
/*
* See what the option value is; for compatibility with older interface
* scripts, we have to support single-argument options as well as
* option=value, option=low-high, and option=MxN.
*/
option = options[i].name;
val = options[i].value;
if (*val == '\0')
val = NULL;
if (val != NULL)
{
if (strcasecmp(val, "true") == 0 ||
strcasecmp(val, "on") == 0 ||
strcasecmp(val, "yes") == 0)
{
/*
* Boolean value - true...
*/
n = 1;
val = "";
}
else if (strcasecmp(val, "false") == 0 ||
strcasecmp(val, "off") == 0 ||
strcasecmp(val, "no") == 0)
{
/*
* Boolean value - false...
*/
n = 0;
val = "";
}
n = strtol(val, &s, 0);
}
else
{
if (strncmp(option, "no", 2) == 0)
{
option += 2;
n = 0;
}
else
n = 1;
s = "";
}
if (*s != '\0' && *s != '-' && (*s != 'x' || s == val))
{
/*
* String value(s)...
*/
DEBUG_printf(("cupsPrintFile: Adding string option \'%s\' with value \'%s\'...\n",
option, val));
ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, option, NULL, val);
}
else if (val != NULL)
{
/*
* Numeric value, range, or resolution...
*/
if (*s == '-')
{
n2 = strtol(s + 1, NULL, 0);
ippAddRange(request, IPP_TAG_JOB, option, n, n2);
DEBUG_printf(("cupsPrintFile: Adding range option \'%s\' with value %d-%d...\n",
option, n, n2));
}
else if (*s == 'x')
{
n2 = strtol(s + 1, &s, 0);
if (strcmp(s, "dpc") == 0)
ippAddResolution(request, IPP_TAG_JOB, option, IPP_RES_PER_CM, n, n2);
else if (strcmp(s, "dpi") == 0)
ippAddResolution(request, IPP_TAG_JOB, option, IPP_RES_PER_INCH, n, n2);
else
ippAddString(request, IPP_TAG_JOB, IPP_TAG_KEYWORD, option, NULL, val);
DEBUG_printf(("cupsPrintFile: Adding resolution option \'%s\' with value %s...\n",
option, val));
}
else
{
ippAddInteger(request, IPP_TAG_JOB, IPP_TAG_INTEGER, option, n);
DEBUG_printf(("cupsPrintFile: Adding integer option \'%s\' with value %d...\n",
option, n));
}
}
else
{
/*
* Boolean value...
*/
DEBUG_printf(("cupsPrintFile: Adding boolean option \'%s\' with value %d...\n",
option, n));
ippAddBoolean(request, IPP_TAG_JOB, option, (char)n);
}
}
/*
* Try printing the file...
*/
sprintf(uri, "/printers/%s", printer);
if ((response = cupsDoFileRequest(cups_server, request, uri, filename)) == NULL)
jobid = 0;
else if (response->request.status.status_code > IPP_OK_CONFLICT)
{
DEBUG_printf(("IPP response code was 0x%x!\n",
response->request.status.status_code));
jobid = 0;
}
else if ((attr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) == NULL)
{
DEBUG_puts("No job ID!");
jobid = 0;
}
else
jobid = attr->values[0].integer;
if (response != NULL)
ippDelete(response);
return (jobid);
}
/*
* 'cupsTempFile()' - Generate a temporary filename.
*/
char * /* O - Filename */
cupsTempFile(char *filename, /* I - Pointer to buffer */
int len) /* I - Size of buffer */
{
char *tmpdir; /* TMPDIR environment var */
static char buf[1024] = ""; /* Buffer if you pass in NULL and 0 */
/*
* See if a filename was specified...
*/
if (filename == NULL)
{
filename = buf;
len = sizeof(buf);
}
/*
* See if TMPDIR is defined...
*/
if ((tmpdir = getenv("TMPDIR")) == NULL)
tmpdir = "/var/tmp";
if ((strlen(tmpdir) + 8) > len)
{
/*
* The specified directory exceeds the size of the buffer; default it...
*/
strcpy(buf, "/var/tmp/XXXXXX");
return (mktemp(buf));
}
else
{
/*
* Make the temporary name using the specified directory...
*/
sprintf(filename, "%s/XXXXXX", tmpdir);
return (mktemp(filename));
}
}
/*
* 'cups_connect()' - Connect to the specified host...
*/
static char * /* I - Printer name or NULL */
cups_connect(const char *name, /* I - Destination (printer[@host]) */
char *printer, /* O - Printer name */
char *hostname) /* O - Hostname */
{
char hostbuf[HTTP_MAX_URI];
/* Name of host */
static char printerbuf[HTTP_MAX_URI];
/* Name of printer or class */
if (name == NULL)
return (NULL);
if (sscanf(name, "%[^@]@%s", printerbuf, hostbuf) == 1)
strcpy(hostbuf, cupsServer());
if (hostname != NULL)
strcpy(hostname, hostbuf);
else
hostname = hostbuf;
if (printer != NULL)
strcpy(printer, printerbuf);
else
printer = printerbuf;
if (cups_server != NULL)
{
if (strcasecmp(cups_server->hostname, hostname) == 0)
return (printer);
httpClose(cups_server);
}
if ((cups_server = httpConnect(hostname, ippPort())) == NULL)
return (NULL);
else
return (printer);
}
/*
* End of "$Id$".
*/
+2 -2
Ver Arquivo
@@ -42,7 +42,7 @@ include ../Makedefs
#
DOCUMENTS = cmp.shtml idd.shtml sam.shtml sdd.shtml ssr.shtml \
stp.shtml sum.shtml svd.shtml
stp.shtml sum.shtml
DOCIMAGES = images/cups-block-diagram.gif images/cups-large.gif \
images/cups-medium.gif images/cups-small.gif
WEBPAGES = cups.css cupsdoc.css index.html documentation.html
@@ -86,7 +86,7 @@ install:
overview.pdf: overview.html
echo Formatting $@...
htmldoc --duplex --compression=9 --jpeg --webpage -f $@ $<
htmldoc --duplex --compression=9 --jpeg --webpage -f overview.pdf overview.html
sam.html: sam.shtml
echo Formatting $@...
+3 -3
Ver Arquivo
@@ -152,10 +152,10 @@ sections:
<UL>
<LI>IEEE 1387.4, System Administration: Printing (draft) </LI>
<LI>IPP/1.0: Additional Optional Operations - Set 1 </LI>
<LI>IPP/1.0: Encoding and Transport </LI>
<LI>IPP/1.0: Implementers Guide </LI>
<LI>IPP/1.0: Model and Semantics </LI>
<LI>RFC 1179, Line Printer Daemon Protocol </LI>
<LI>RFC 2565, IPP/1.0: Encoding and Transport </LI>
<LI>RFC 2566, IPP/1.0: Model and Semantics </LI>
<LI>RFC 2639, IPP/1.0: Implementers Guide </LI>
</UL>
<H1><A NAME=3>3 File Management</A></H1>
<H2><A NAME=3_1>3.1 Directory Structure</A></H2>
+118 -121
Ver Arquivo
@@ -1,6 +1,6 @@
%PDF-1.2
%âãÏÓ
1 0 obj<</Producer(htmldoc 2.0b1 Copyright 1997-1999 Michael Sweet, All Rights Reserved.)/CreationDate(D:19990521210307Z)/Title(CUPS Configuration Management Plan)/Author(Easy Software Products)>>endobj
1 0 obj<</Producer(htmldoc 2.0b1 Copyright 1997-1999 Michael Sweet, All Rights Reserved.)/CreationDate(D:19990922200456Z)/Title(CUPS Configuration Management Plan)/Author(Easy Software Products)>>endobj
2 0 obj<</Type/Encoding/BaseEncoding/WinAnsiEncoding>>endobj
3 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding 2 0 R>>endobj
4 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Roman/Encoding 2 0 R>>endobj
@@ -400,13 +400,10 @@ endobj
endobj
198 0 obj<</Type/Page/Parent 191 0 R/Contents 199 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F8 7 0 R/F9 8 0 R/Fc 9 0 R>>>>>>endobj
199 0 obj<</Length 200 0 R/Filter/FlateDecode>>stream
xÚ•UMo"9½ó+J9%ÒЛB`oC¾„4™aŒöÀŸ«Á·«c»Aì¯ß²» E‹¢Hi»ªÞ{õÊ•·V
×ü“Âmº}Ek4oýñ8„tóœoú·=˜g—)Ì$•x5ÿUßÞ$ƒú¾}3Hêˆ$…q†Æ«\Iá™:¸iÚ„vúuè|­H2¹ZU6†B!ŒXaÁéPja #YÕ_–6*C~°ªøO­ æd!Ã
j*cœ0QÆó¯0ò€Ï¨i7éÔPàŽŠ‚Ñ^¾ÿ†‰åheV0Û9,./î^&³‹ÅüDë«4¹G¹ß
‹É íÝá^{g_åÇíFáöñŸÓx, $ëÅR#Ÿ51ZìÐFí!wѹé»zÈ—.p Œ=¬…;’¿D4ûŽaË<·ƒY#yPVIϦÀ¡ LÁyn¬°Ù#]EË ¡u­bƒ&#ë‚
xÚ•UMo"9½ó+J9%ÒЛB`oC¾„4™aŒöÀŸ«Á·«c»Aì¯ß²» E‹¢Hi»ªÞ{õÊ•·V
×ü“Âmº}Ek4oýñ8„tóœoú·=˜g—)Ì$•x5ÿUßÞ$ƒú¾}3Hêˆ$…q†Æ«\Iá™:¸iÚ„vúuè|­H2¹ZU6†B!ŒXaÁéPja #YÕ_–6*C~°ªøO­ æd!Ã
j*cœ0QÆó¯0ò€Ï¨i7éÔPàŽŠ‚Ñ^¾ÿ†‰åheV0Û9,./î^&³‹ÅüDë«4¹G¹ß
_ËrƇ'<Red¶AhGG®*Ã$°i[å×`‘}â¼22!´ò»“ýYæ€Û²%ûZ+dNKK[$r~&­*ýAºx ¢°‹Éäž_D›[††€â}˜•Ó\™¤ÐÀ¸:Q–ºÙ*“a=¼§³zv]êª~²rž
‹É íÝá^{g_åÇíFáöñŸÓx, $ëÅR#Ÿ51ZìÐFí!wѹé»zÈ—.p Œ=¬…;’¿D4ûŽaË<·ƒY#yPVIϦÀ¡ LÁyn¬°Ù#]EË ¡u­bƒ&#ë‚
G¸•ãf&Zû»™ÞŸÑºÚWÔ¸ã±(x²vpm.$º¤©ºïb,Ç¥ëRãšÉj<IÒìêøaþØO&쫨שz‚âØ…ø(~Ñ2J€·
+6ëHηÀ+°÷ƒ‹Ëo“û/0}¼KÓÛáâê Ìxøþ㱆‘&ùÊa³çQ¸
_ËrƇ'<Red¶AhGG®*Ã$°i[å×`‘}â¼22!´ò»“ýYæ€Û²%ûZ+dNKK[$r~&­*ýAºx ¢°‹Éäž_D›[††€â}˜•Ó\™¤ÐÀ¸:Q–ºÙ*“a=¼§³zv]êª~²rž
@@ -842,122 +839,122 @@ xref
0000014635 00000 n
0000014669 00000 n
0000014703 00000 n
0000014669 00000 n
0000014703 00000 n
0000015402 00000 n
0000015451 00000 n
0000015500 00000 n
0000015549 00000 n
0000015598 00000 n
0000015647 00000 n
0000015696 00000 n
0000015745 00000 n
0000015794 00000 n
0000015843 00000 n
0000015892 00000 n
0000015941 00000 n
0000015990 00000 n
0000016039 00000 n
0000016088 00000 n
0000016137 00000 n
0000016186 00000 n
0000016235 00000 n
0000016284 00000 n
0000016333 00000 n
0000016382 00000 n
0000016431 00000 n
0000016480 00000 n
0000016529 00000 n
0000016578 00000 n
0000016627 00000 n
0000016676 00000 n
0000016725 00000 n
0000016774 00000 n
0000016823 00000 n
0000016872 00000 n
0000016921 00000 n
0000016970 00000 n
0000017019 00000 n
0000017068 00000 n
0000017117 00000 n
0000017166 00000 n
0000017215 00000 n
0000017264 00000 n
0000017313 00000 n
0000017362 00000 n
0000017411 00000 n
0000017460 00000 n
0000017509 00000 n
0000017558 00000 n
0000017607 00000 n
0000017656 00000 n
0000017705 00000 n
0000017754 00000 n
0000017803 00000 n
0000017852 00000 n
0000017901 00000 n
0000017950 00000 n
0000017999 00000 n
0000018260 00000 n
0000018412 00000 n
0000024803 00000 n
0000024825 00000 n
0000024938 00000 n
0000025040 00000 n
0000025060 00000 n
0000025200 00000 n
0000026140 00000 n
0000026161 00000 n
0000026274 00000 n
0000026462 00000 n
0000026483 00000 n
0000026623 00000 n
0000027216 00000 n
0000027237 00000 n
0000027350 00000 n
0000027543 00000 n
0000027564 00000 n
0000027695 00000 n
0000028308 00000 n
0000028329 00000 n
0000028442 00000 n
0000028631 00000 n
0000028652 00000 n
0000028783 00000 n
0000029727 00000 n
0000029748 00000 n
0000029879 00000 n
0000030166 00000 n
0000030187 00000 n
0000030327 00000 n
0000031243 00000 n
0000031264 00000 n
0000031395 00000 n
0000031753 00000 n
0000031774 00000 n
0000031914 00000 n
0000032410 00000 n
0000032431 00000 n
0000032562 00000 n
0000033014 00000 n
0000033035 00000 n
0000033175 00000 n
0000034315 00000 n
0000034337 00000 n
0000034477 00000 n
0000035383 00000 n
0000035404 00000 n
0000035544 00000 n
0000036470 00000 n
0000036491 00000 n
0000036631 00000 n
0000037277 00000 n
0000037298 00000 n
0000037438 00000 n
0000038258 00000 n
0000038279 00000 n
0000015402 00000 n
0000015451 00000 n
0000015500 00000 n
0000015549 00000 n
0000015598 00000 n
0000015647 00000 n
0000015696 00000 n
0000015745 00000 n
0000015794 00000 n
0000015843 00000 n
0000015892 00000 n
0000015941 00000 n
0000015990 00000 n
0000016039 00000 n
0000016088 00000 n
0000016137 00000 n
0000016186 00000 n
0000016235 00000 n
0000016284 00000 n
0000016333 00000 n
0000016382 00000 n
0000016431 00000 n
0000016480 00000 n
0000016529 00000 n
0000016578 00000 n
0000016627 00000 n
0000016676 00000 n
0000016725 00000 n
0000016774 00000 n
0000016823 00000 n
0000016872 00000 n
0000016921 00000 n
0000016970 00000 n
0000017019 00000 n
0000017068 00000 n
0000017117 00000 n
0000017166 00000 n
0000017215 00000 n
0000017264 00000 n
0000017313 00000 n
0000017362 00000 n
0000017411 00000 n
0000017460 00000 n
0000017509 00000 n
0000017558 00000 n
0000017607 00000 n
0000017656 00000 n
0000017705 00000 n
0000017754 00000 n
0000017803 00000 n
0000017852 00000 n
0000017901 00000 n
0000017950 00000 n
0000017999 00000 n
0000018260 00000 n
0000018412 00000 n
0000024803 00000 n
0000024825 00000 n
0000024938 00000 n
0000025040 00000 n
0000025060 00000 n
0000025200 00000 n
0000026140 00000 n
0000026161 00000 n
0000026274 00000 n
0000026462 00000 n
0000026483 00000 n
0000026623 00000 n
0000027230 00000 n
0000027251 00000 n
0000027364 00000 n
0000027557 00000 n
0000027578 00000 n
0000027709 00000 n
0000028322 00000 n
0000028343 00000 n
0000028456 00000 n
0000028645 00000 n
0000028666 00000 n
0000028797 00000 n
0000029741 00000 n
0000029762 00000 n
0000029893 00000 n
0000030180 00000 n
0000030201 00000 n
0000030341 00000 n
0000031257 00000 n
0000031278 00000 n
0000031409 00000 n
0000031767 00000 n
0000031788 00000 n
0000031928 00000 n
0000032424 00000 n
0000032445 00000 n
0000032576 00000 n
0000033028 00000 n
0000033049 00000 n
0000033189 00000 n
0000034329 00000 n
0000034351 00000 n
0000034491 00000 n
0000035397 00000 n
0000035418 00000 n
0000035558 00000 n
0000036484 00000 n
0000036505 00000 n
0000036645 00000 n
0000037291 00000 n
0000037312 00000 n
0000037452 00000 n
0000038272 00000 n
0000038293 00000 n
0000038433 00000 n
0000039360 00000 n
0000039381 00000 n
0000039521 00000 n
0000039925 00000 n
0000039507 00000 n
0000039946 00000 n
0000040059 00000 n
+7 -7
Ver Arquivo
@@ -75,10 +75,10 @@ The following non-CUPS documents are referenced by this document:
<UL>
<LI>IEEE 1387.4, System Administration: Printing (draft)
<LI>IPP/1.0: Additional Optional Operations - Set 1
<LI>IPP/1.0: Encoding and Transport
<LI>IPP/1.0: Implementers Guide
<LI>IPP/1.0: Model and Semantics
<LI>RFC 1179, Line Printer Daemon Protocol
<LI>RFC 2565, IPP/1.0: Encoding and Transport
<LI>RFC 2566, IPP/1.0: Model and Semantics
<LI>RFC 2639, IPP/1.0: Implementers Guide
</UL>
<H1>File Management</H1>
@@ -334,12 +334,12 @@ extension of ".h".
The top of each source file shall contain a header giving the name of the
file, the purpose or nature of the source file, the copyright and licensing
notice, and the functions contained in the file. The file name and revision
information is provided by the CVS "$Id: cmp.shtml 351 1999-05-21 20:54:09Z mike $" tag:
information is provided by the CVS "$Id: cmp.shtml 679 1999-09-22 20:06:27Z mike $" tag:
<UL>
<PRE>
/*
* "$Id: cmp.shtml 351 1999-05-21 20:54:09Z mike $"
* "$Id: cmp.shtml 679 1999-09-22 20:06:27Z mike $"
*
* Description of file contents.
*
@@ -372,14 +372,14 @@ information is provided by the CVS "$Id: cmp.shtml 351 1999-05-21 20:54:09Z mike
</UL>
The bottom of each source file shall contain a trailer giving the name
of the file using the CVS "$Id: cmp.shtml 351 1999-05-21 20:54:09Z mike $" tag. The primary purpose of this is to
of the file using the CVS "$Id: cmp.shtml 679 1999-09-22 20:06:27Z mike $" tag. The primary purpose of this is to
mark the end of a source file; if the trailer is missing it is possible
that code has been lost near the end of the file:
<UL>
<PRE>
/*
* End of "$Id: cmp.shtml 351 1999-05-21 20:54:09Z mike $".
* End of "$Id: cmp.shtml 679 1999-09-22 20:06:27Z mike $".
*/
</PRE>
</UL>
-2
Ver Arquivo
@@ -55,8 +55,6 @@ The following documentation for CUPS is available on this server:
<A HREF="ssr.html">HTML</A> |
<A HREF="ssr.pdf">PDF</A> )
<LI>Software Test Plan (Not Yet Available)
</UL>
<HR>
+146 -93
Ver Arquivo
@@ -1,13 +1,13 @@
<HTML>
<HEAD>
<TITLE>DRAFT - CUPS Interface Design Description</TITLE>
<TITLE>CUPS Interface Design Description</TITLE>
<META NAME="AUTHOR" CONTENT="Easy Software Products">
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
<META NAME="DOCNUMBER" CONTENT="CUPS-IDD-1.0">
</HEAD>
<BODY>
<CENTER><A HREF=#contents><IMG SRC="images/cups-large.gif" BORDER=0><BR>
<H1>DRAFT - CUPS Interface Design Description</H1></A><BR>
<H1>CUPS Interface Design Description</H1></A><BR>
CUPS-IDD-1.0<BR>
Easy Software Products<BR>
Copyright 1997-1999, All Rights Reserved<BR>
@@ -53,26 +53,24 @@ Copyright 1997-1999, All Rights Reserved<BR>
<LI><A HREF=#4_3>4.3 CUPS PostScript File</A></LI>
<LI><A HREF=#4_4>4.4 CUPS Raster File</A></LI>
<LI><A HREF=#4_5>4.5 CUPS Raw Files</A></LI>
<LI><A HREF=#4_6>4.6 File Transfer Protocol</A></LI>
<LI><A HREF=#4_7>4.7 Internet Printing Protocol</A></LI>
<LI><A HREF=#4_6>4.6 Internet Printing Protocol</A></LI>
<UL>
<LI><A HREF=#4_7_1>4.7.1 Get Default Destination (CUPS_GET_DEFAULT =
<LI><A HREF=#4_6_1>4.6.1 Get Default Destination (CUPS_GET_DEFAULT =
0x4001)</A></LI>
<LI><A HREF=#4_7_2>4.7.2 Get Printers (CUPS_GET_PRINTERS = 0x4002)</A></LI>
<LI><A HREF=#4_7_3>4.7.3 Add Printer (CUPS_ADD_PRINTER = 0x4003)</A></LI>
<LI><A HREF=#4_7_4>4.7.4 Delete Printer (CUPS_DELETE_PRINTER = 0x4004)</A>
<LI><A HREF=#4_6_2>4.6.2 Get Printers (CUPS_GET_PRINTERS = 0x4002)</A></LI>
<LI><A HREF=#4_6_3>4.6.3 Add Printer (CUPS_ADD_PRINTER = 0x4003)</A></LI>
<LI><A HREF=#4_6_4>4.6.4 Delete Printer (CUPS_DELETE_PRINTER = 0x4004)</A>
</LI>
<LI><A HREF=#4_7_5>4.7.5 Get Classes (CUPS_GET_CLASSES = 0x4005)</A></LI>
<LI><A HREF=#4_7_6>4.7.6 Add Class (CUPS_ADD_CLASS = 0x4006)</A></LI>
<LI><A HREF=#4_7_7>4.7.7 Delete Class (CUPS_DELETE_CLASS = 0x4007)</A></LI>
<LI><A HREF=#4_7_8>4.7.8 Accept Jobs (CUPS_ACCEPT_JOBS = 0x4008)</A></LI>
<LI><A HREF=#4_7_9>4.7.9 Reject Jobs (CUPS_REJECT_JOBS = 0x4009)</A></LI>
<LI><A HREF=#4_7_10>4.7.10 Set Default Destination (CUPS_SET_DEFAULT =
<LI><A HREF=#4_6_5>4.6.5 Get Classes (CUPS_GET_CLASSES = 0x4005)</A></LI>
<LI><A HREF=#4_6_6>4.6.6 Add Class (CUPS_ADD_CLASS = 0x4006)</A></LI>
<LI><A HREF=#4_6_7>4.6.7 Delete Class (CUPS_DELETE_CLASS = 0x4007)</A></LI>
<LI><A HREF=#4_6_8>4.6.8 Accept Jobs (CUPS_ACCEPT_JOBS = 0x4008)</A></LI>
<LI><A HREF=#4_6_9>4.6.9 Reject Jobs (CUPS_REJECT_JOBS = 0x4009)</A></LI>
<LI><A HREF=#4_6_10>4.6.10 Set Default Destination (CUPS_SET_DEFAULT =
0x400A)</A></LI>
</UL>
<LI><A HREF=#4_8>4.8 Line Printer Daemon Protocol</A></LI>
<LI><A HREF=#4_9>4.9 Server Message Block Protocol</A></LI>
<LI><A HREF=#4_10>4.10 Trivial File Transfer Protocol</A></LI>
<LI><A HREF=#4_7>4.7 Line Printer Daemon Protocol</A></LI>
<LI><A HREF=#4_8>4.8 Server Message Block Protocol</A></LI>
</UL>
<B><A HREF=#5>5 5 - Directories</A></B>
<BR>
@@ -133,10 +131,10 @@ following sections: </P>
<UL>
<LI>IEEE 1387.4, System Administration: Printing (draft) </LI>
<LI>IPP/1.0: Additional Optional Operations - Set 1 </LI>
<LI>IPP/1.0: Encoding and Transport </LI>
<LI>IPP/1.0: Implementers Guide </LI>
<LI>IPP/1.0: Model and Semantics </LI>
<LI>RFC 1179, Line Printer Daemon Protocol </LI>
<LI>RFC 2565, IPP/1.0: Encoding and Transport </LI>
<LI>RFC 2566, IPP/1.0: Model and Semantics </LI>
<LI>RFC 2639, IPP/1.0: Implementers Guide </LI>
</UL>
<H1><A NAME=3>3 Internal Interfaces</A></H1>
<H2><A NAME=3_1>3.1 Character Set Files</A></H2>
@@ -285,13 +283,18 @@ understood:
<TABLE BORDER=1 WIDTH=90%>
<TR><TH WIDTH=25%>Directive</TH><TH>Description</TH></TR>
<TR><TD>&lt;Class name&gt;
<BR> &lt;/Class&gt;</TD><TD></TR>
<BR> &lt;/Class&gt;</TD><TD>Surrounds a class definition.</TD></TR>
<TR><TD>&lt;DefaultClass name&gt;
<BR> &lt;/Class&gt;</TD><TD></TR>
<TR><TD>Info</TD><TD></TR>
<TR><TD>Location</TD><TD></TR>
<TR><TD>MoreInfo</TD><TD></TR>
<TR><TD>Printer</TD><TD></TR>
<BR> &lt;/Class&gt;</TD><TD>Surrounds a class definition for the default
destination.</TD></TR>
<TR><TD>Accepting</TD><TD>Specifies whether the class is accepting new
jobs. May be the names &quot;Yes&quot; or &quot;No&quot;.</TD></TR>
<TR><TD>Info</TD><TD>A textual description of the class.</TD></TR>
<TR><TD>Location</TD><TD>A textual location of the class.</TD></TR>
<TR><TD>MoreInfo</TD><TD>A URL pointing to additional information on
the class.</TD></TR>
<TR><TD>Printer</TD><TD>Specifies a printer that is a member of the
class.</TD></TR>
</TABLE>
</CENTER>
</P>
@@ -304,43 +307,92 @@ understood:
<CENTER>
<TABLE BORDER=1 WIDTH=90%>
<TR><TH WIDTH=25%>Directive</TH><TH>Default</TH><TH>Description</TH></TR>
<TR><TD>AccessLog</TD><TD><TD>Specifies the location of the access log
file (default &quot;logs/access_log&quot;).</TD></TR>
<TR><TD>Allow</TD><TD><TD></TR>
<TR><TD>AuthClass</TD><TD><TD></TR>
<TR><TD>AuthType</TD><TD><TD></TR>
<TR><TD>BrowseAddress</TD><TD><TD></TR>
<TR><TD>BrowseInterval</TD><TD><TD></TR>
<TR><TD>BrowsePort</TD><TD><TD></TR>
<TR><TD>BrowseTimeout</TD><TD><TD></TR>
<TR><TD>Browsing</TD><TD><TD></TR>
<TR><TD>DefaultCharset</TD><TD><TD></TR>
<TR><TD>DefaultLanguage</TD><TD><TD></TR>
<TR><TD>Deny</TD><TD><TD></TR>
<TR><TD>DocumentRoot</TD><TD><TD></TR>
<TR><TD>ErrorLog</TD><TD><TD></TR>
<TR><TD>Group</TD><TD><TD></TR>
<TR><TD>HostNameLookups</TD><TD><TD></TR>
<TR><TD>ImplicitClasses</TD><TD><TD></TR>
<TR><TD>KeepAlive</TD><TD><TD></TR>
<TR><TD>KeepAliveTimeout</TD><TD><TD></TR>
<TR><TD>AccessLog</TD><TD>logs/access_log</TD><TD>Specifies the
location of the access log file.</TD></TR>
<TR><TD>Allow</TD><TD>-</TD><TD>Allows connections from the specified
host, network, or domain.</TD></TR>
<TR><TD>AuthClass</TD><TD>-</TD><TD>Specifies what level of
authentication is required; may be either &quot;User&quot;, &quot;System&quot;, or &quot;Group&quot;.</TD>
</TR>
<TR><TD>AuthType</TD><TD>None</TD><TD>Specifies the type of
authentication to perform; may be either &quot;None&quot; or &quot;Basic&quot;.</TD></TR>
<TR><TD>BrowseAddress</TD><TD>255.255.255.255</TD><TD>Specifies a
broadcast address to send CUPS browsing packets to.</TD></TR>
<TR><TD>BrowseInterval</TD><TD>30</TD><TD>Specifies the number of
seconds between browsing updates.</TD></TR>
<TR><TD>BrowsePort</TD><TD>631</TD><TD>Specifies the UDP port number to
use for browse packets.</TD></TR>
<TR><TD>BrowseTimeout</TD><TD>300</TD><TD>Specifies the number of
seconds to wait until remote destinations are removed from the local
destination list.</TD></TR>
<TR><TD>Browsing</TD><TD>On</TD><TD>Specifies whether or not printer
and class browsing is enabled; can be &quot;On&quot; or &quot;Off&quot;.</TD></TR>
<TR><TD>DefaultCharset</TD><TD>iso-8859-1</TD><TD>Specifies the default
character set.</TD></TR>
<TR><TD>DefaultLanguage</TD><TD>current locale</TD><TD>Specifies the
default language.</TD></TR>
<TR><TD>Deny</TD><TD>-</TD><TD>Refuses connections from the specified
host, network, or domain.</TD></TR>
<TR><TD>DocumentRoot</TD><TD>/usr/share/cups/doc</TD><TD>Specifies the
document data root directory.</TD></TR>
<TR><TD>ErrorLog</TD><TD>logs/error_log</TD><TD>Specifies the error log
file location.</TD></TR>
<TR><TD>Group</TD><TD>root, sys, system</TD><TD>Specifies the group
name or ID that is used when running external programs.</TD></TR>
<TR><TD>HostNameLookups</TD><TD>Off</TD><TD>Specifies whether or not to
perform reverse IP address lookups to get the actual hostname; may be
&quot;On&quot; or &quot;Off&quot;. Hostname lookups can significantly degrade the
performance of the CUPS server if one or more DNS servers is not
functioning properly.</TD></TR>
<TR><TD>ImplicitClasses</TD><TD>On</TD><TD>Specifies whether or not to
automatically create printer classes when more than one printer or
class of the same name is detected on the network; may be &quot;On&quot; or
&quot;Off&quot;.</TD></TR>
<TR><TD>KeepAlive</TD><TD>On</TD><TD>Specifies whether or not to use
the HTTP Keep-Alive feature; may be &quot;On&quot; or &quot;Off&quot;.</TD></TR>
<TR><TD>KeepAliveTimeout</TD><TD>30</TD><TD>Specifies the amount of
time to keep the HTTP connection alive before closing it.</TD></TR>
<TR><TD>&lt;Location path&gt;
<BR> &lt;/Location&gt;</TD><TD><TD></TR>
<TR><TD>LogLevel</TD><TD><TD></TR>
<TR><TD>MaxClients</TD><TD><TD></TR>
<TR><TD>MaxLogSize</TD><TD><TD></TR>
<TR><TD>MaxRequestSize</TD><TD><TD></TR>
<TR><TD>Order</TD><TD><TD></TR>
<TR><TD>PageLog</TD><TD><TD></TR>
<TR><TD>Port</TD><TD><TD></TR>
<TR><TD>RIPCache</TD><TD><TD></TR>
<TR><TD>ServerAdmin</TD><TD><TD></TR>
<TR><TD>ServerName</TD><TD><TD></TR>
<TR><TD>ServerRoot</TD><TD><TD></TR>
<TR><TD>SystemGroup</TD><TD><TD></TR>
<TR><TD>TempDir</TD><TD><TD></TR>
<TR><TD>Timeout</TD><TD><TD></TR>
<TR><TD>User</TD><TD><TD></TR>
<BR> &lt;/Location&gt;</TD><TD>-</TD><TD>Specifies a location to restrict
access to.</TD></TR>
<TR><TD>LogLevel</TD><TD>info</TD><TD>Controls the amount of
information that is logged in the error log file. Can be one of
&quot;debug&quot;, &quot;info&quot;, &quot;warn&quot;, &quot;error&quot;, or &quot;none&quot;, in decreasing order or
verbosity.</TD></TR>
<TR><TD>MaxClients</TD><TD>100</TD><TD>Specifies the maximum number of
simultaneous active clients. This value is internally limited to 1/3
of the total number of availabel file descriptors.</TD></TR>
<TR><TD>MaxLogSize</TD><TD>0</TD><TD>Specifies the maximum size of the
access, error, and page log files in bytes. If set to 0 then no
maximum size is set. Log files are rotated automatically when this
size is exceeded.</TD></TR>
<TR><TD>MaxRequestSize</TD><TD>0</TD><TD>Specifies the maximum size of
HTTP requests in bytes. If set to 0 then there is no maximum.</TD></TR>
<TR><TD>Order</TD><TD>Allow,Deny</TD><TD>Specifies the order of Allow
and Deny directive processing; can be &quot;Deny,Allow&quot; to implicitly deny
hosts unless they are allowed by an Allow line, or &quot;Allow,Deny&quot; to
implicitly allow hosts unless they are denied by a Deny line.</TD></TR>
<TR><TD>PageLog</TD><TD>logs/page_log</TD><TD>Specifies the location of
the page log file.</TD></TR>
<TR><TD>Port</TD><TD>631</TD><TD>Specifies a port number to listen to
for HTTP connections.</TD></TR>
<TR><TD>RIPCache</TD><TD>8m</TD><TD>Specifies the size of the memory
cache in bytes that is used by RIP filters.</TD></TR>
<TR><TD>ServerAdmin</TD><TD>root@ServerName</TD><TD>Specifies the
person to contact with problems.</TD></TR>
<TR><TD>ServerName</TD><TD>hostname</TD><TD>Specifies the hostname that
is supplied to HTTP clients. This is also used to determine the
default CUPS server for the CUPS IPP client applications.</TD></TR>
<TR><TD>ServerRoot</TD><TD>/var/cups</TD><TD>Specifies the root
directory for server data files.</TD></TR>
<TR><TD>SystemGroup</TD><TD>root, sys, system</TD><TD>Specifies the
group name used for System class authentication.</TD></TR>
<TR><TD>TempDir</TD><TD>/var/tmp</TD><TD>Specifies the temporary
directory to use.</TD></TR>
<TR><TD>Timeout</TD><TD>300</TD><TD>The timeout in seconds before
client connections are closed in the middle of a request.</TD></TR>
<TR><TD>User</TD><TD>lp</TD><TD>Specifies the user that is used when
running external programs.</TD></TR>
</TABLE>
</CENTER>
</P>
@@ -353,22 +405,28 @@ understood:
<CENTER>
<TABLE BORDER=1 WIDTH=90%>
<TR><TH WIDTH=25%>Directive</TH><TH>Description</TH></TR>
<TR><TD>Accepting</TD><TD>Specifies whether the printer is accepting
new jobs. May be the names &quot;Yes&quot; or &quot;No&quot;.</TD></TR>
<TR><TD>&lt;DefaultPrinter name&gt;
<BR> &lt;/Printer&gt;</TD><TD></TR>
<TR><TD>DeviceURI</TD><TD></TR>
<TR><TD>Info</TD><TD></TR>
<TR><TD>Location</TD><TD></TR>
<TR><TD>MoreInfo</TD><TD></TR>
<BR> &lt;/Printer&gt;</TD><TD>Surrounds the printer definition for a default
destination.</TD></TR>
<TR><TD>DeviceURI</TD><TD>Specifies the device-uri attribute for the
printer.</TD></TR>
<TR><TD>Info</TD><TD>A textual description of the printer.</TD></TR>
<TR><TD>Location</TD><TD>A textual location of the printer.</TD></TR>
<TR><TD>MoreInfo</TD><TD>A URL pointing to additional information on
the printer.</TD></TR>
<TR><TD>&lt;Printer name&gt;
<BR> &lt;/Printer&gt;</TD><TD></TR>
<TR><TD>State</TD><TD></TR>
<BR> &lt;/Printer&gt;</TD><TD>Surrounds the printer definition.</TD></TR>
<TR><TD>State</TD><TD>Specifies the initial state of the printer; can
be &quot;Idle&quot; or &quot;Stopped&quot;.</TD></TR>
</TABLE>
</CENTER>
</P>
<H1><A NAME=4>4 External Interfaces</A></H1>
<H2><A NAME=4_1>4.1 AppSocket Protocol</A></H2>
<P>The AppSocket protocol is an 8-bit clean TCP/IP socket connection.
The default IP service port is 9100. </P>
The default IP service port is 9100. The URI method name is &quot;socket&quot;. </P>
<H2><A NAME=4_2>4.2 CUPS Browsing Protocol</A></H2>
<P>The CUPS Browsing Protocol is a UDP/IP-based broadcast service. By
default this service operates on IP service port 631. </P>
@@ -545,10 +603,7 @@ application/vnd.cups-raster</CODE>. </P>
<P>Raw files are printer-dependent print files that are in a format
suitable to the destination printer (e.g. HP-PCL, HP-RTL, etc.) The
MIME type for CUPS Raw files is <CODE>application/vnd.cups-raw</CODE>. </P>
<H2><A NAME=4_6>4.6 File Transfer Protocol</A></H2>
<P>The File Transfer Protocol (FTP) is described by <A HREF=http://www.ietf.org/rfc/rfc959.txt>
RFC 959: File Transfer Protocol</A>. </P>
<H2><A NAME=4_7>4.7 Internet Printing Protocol</A></H2>
<H2><A NAME=4_6>4.6 Internet Printing Protocol</A></H2>
<P>The Internet Printing Protocol is described by the following RFCs: </P>
<UL>
<LI><A HREF=http://www.ietf.org/rfc/rfc2565.txt>RFC 2565: Internet
@@ -563,20 +618,21 @@ Protocol</A></LI>
<LI><A HREF=http://www.ietf.org/rfc/rfc2569.txt>RFC 2569: Mapping
between LPD and IPP Protocols</A></LI>
</UL>
<P>The URI method name for IPP is &quot;ipp&quot;. </P>
<P>CUPS defines the following extension operations to IPP. </P>
<H3><A NAME=4_7_1>4.7.1 Get Default Destination (CUPS_GET_DEFAULT =
<H3><A NAME=4_6_1>4.6.1 Get Default Destination (CUPS_GET_DEFAULT =
0x4001)</A></H3>
<P>The get default destination operation returns the printer attributes
for the system default printer or class. The only required attributes
are <CODE>attributes-charset</CODE> and <CODE>
attributes-natural-language</CODE>. </P>
<P>Get default destination will only return <CODE>ipp-ok</CODE>. </P>
<H3><A NAME=4_7_2>4.7.2 Get Printers (CUPS_GET_PRINTERS = 0x4002)</A></H3>
<H3><A NAME=4_6_2>4.6.2 Get Printers (CUPS_GET_PRINTERS = 0x4002)</A></H3>
<P>The get printers operation returns the printer attributes for all
printers known to the system. The only required attributes are <CODE>
attributes-charset</CODE> and <CODE>attributes-natural-language</CODE>. </P>
<P>Get printers will only return <CODE>ipp-ok</CODE>. </P>
<H3><A NAME=4_7_3>4.7.3 Add Printer (CUPS_ADD_PRINTER = 0x4003)</A></H3>
<H3><A NAME=4_6_3>4.6.3 Add Printer (CUPS_ADD_PRINTER = 0x4003)</A></H3>
<P>The add printer operation adds or replaces the specified printer.
The <CODE>attributes-charset</CODE>, <CODE>attributes-natural-language</CODE>
and <CODE>printer-uri</CODE> attributes are required. </P>
@@ -589,19 +645,19 @@ body. If a valid interface script or PPD file is not provided then the
printer is treated as a generic PostScript device. </P>
<P>Add printer will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-authorized</CODE>
, <CODE>ipp-bad-request</CODE>, or <CODE>ipp-attributes</CODE>. </P>
<H3><A NAME=4_7_4>4.7.4 Delete Printer (CUPS_DELETE_PRINTER = 0x4004)</A>
<H3><A NAME=4_6_4>4.6.4 Delete Printer (CUPS_DELETE_PRINTER = 0x4004)</A>
</H3>
<P>The delete printer operation removes the specified printer. The only
required attributes are <CODE>attributes-charset</CODE>, <CODE>
attributes-natural-language</CODE>, and <CODE>printer-uri</CODE>. </P>
<P>Delete printer will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-found</CODE>
, or <CODE>ipp-not-authorized</CODE>. </P>
<H3><A NAME=4_7_5>4.7.5 Get Classes (CUPS_GET_CLASSES = 0x4005)</A></H3>
<H3><A NAME=4_6_5>4.6.5 Get Classes (CUPS_GET_CLASSES = 0x4005)</A></H3>
<P>The get classes operation returns the printer attributes for all
classes known to the system. The only required attributes are <CODE>
attributes-charset</CODE> and <CODE>attributes-natural-language</CODE>. </P>
<P>Get classes will only return <CODE>ipp-ok</CODE>. </P>
<H3><A NAME=4_7_6>4.7.6 Add Class (CUPS_ADD_CLASS = 0x4006)</A></H3>
<H3><A NAME=4_6_6>4.6.6 Add Class (CUPS_ADD_CLASS = 0x4006)</A></H3>
<P>The add class operation adds or replaces the specified class. The <CODE>
attributes-charset</CODE>, <CODE>attributes-natural-language</CODE>,
and <CODE>printer-uri</CODE> attributes are required. </P>
@@ -611,27 +667,27 @@ required when initially adding a printer and optional when modifying a
printer. </P>
<P>Add class will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-authorized</CODE>
, <CODE>ipp-bad-request</CODE>, or <CODE>ipp-attributes</CODE>. </P>
<H3><A NAME=4_7_7>4.7.7 Delete Class (CUPS_DELETE_CLASS = 0x4007)</A></H3>
<H3><A NAME=4_6_7>4.6.7 Delete Class (CUPS_DELETE_CLASS = 0x4007)</A></H3>
<P>The delete class operation removes the specified class. The only
required attributes are <CODE>attributes-charset</CODE>, <CODE>
attributes-natural-language</CODE>, and <CODE>printer-uri</CODE>. </P>
<P>Delete class will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-found</CODE>
, or <CODE>ipp-not-authorized</CODE>. </P>
<H3><A NAME=4_7_8>4.7.8 Accept Jobs (CUPS_ACCEPT_JOBS = 0x4008)</A></H3>
<H3><A NAME=4_6_8>4.6.8 Accept Jobs (CUPS_ACCEPT_JOBS = 0x4008)</A></H3>
<P>The accept jobs operation allows jobs to be accepted by the
specified destination. The only required attributes are <CODE>
attributes-charset</CODE>, <CODE>attributes-natural-language</CODE>,
and <CODE>printer-uri</CODE>. </P>
<P>Accept jobs will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-found</CODE>
, or <CODE>ipp-not-authorized</CODE>. </P>
<H3><A NAME=4_7_9>4.7.9 Reject Jobs (CUPS_REJECT_JOBS = 0x4009)</A></H3>
<H3><A NAME=4_6_9>4.6.9 Reject Jobs (CUPS_REJECT_JOBS = 0x4009)</A></H3>
<P>The reject jobs operation prevents jobs from being accepted by the
specified destination. The only required attributes are <CODE>
attributes-charset</CODE>, <CODE>attributes-natural-language</CODE>,
and <CODE>printer-uri</CODE>. </P>
<P>Reject jobs will return <CODE>ipp-ok</CODE>, <CODE>ipp-not-found</CODE>
, or <CODE>ipp-not-authorized</CODE>. </P>
<H3><A NAME=4_7_10>4.7.10 Set Default Destination (CUPS_SET_DEFAULT =
<H3><A NAME=4_6_10>4.6.10 Set Default Destination (CUPS_SET_DEFAULT =
0x400A)</A></H3>
<P>The set default destination operation returns the printer attributes
for the system default printer or class. The only required attributes
@@ -640,27 +696,24 @@ are <CODE>attributes-charset</CODE>, <CODE>attributes-natural-language</CODE>
<P>Set default destination will return <CODE>ipp-ok</CODE>, <CODE>
ipp-not-authorized</CODE>, <CODE>ipp-bad-request</CODE>, or <CODE>
ipp-not-found</CODE>. </P>
<H2><A NAME=4_8>4.8 Line Printer Daemon Protocol</A></H2>
<H2><A NAME=4_7>4.7 Line Printer Daemon Protocol</A></H2>
<P>The Line Printer Daemon (LPD) protocol is described by <A HREF=http://www.ietf.org/rfc/rfc1179.txt>
RFC 1179: Line Printer Daemon Protocol</A>. </P>
<H2><A NAME=4_9>4.9 Server Message Block Protocol</A></H2>
<P>The URI method name for LPD is &quot;lpd&quot;. </P>
<H2><A NAME=4_8>4.8 Server Message Block Protocol</A></H2>
<P>The Server Message Block (SMB) and related Common Internet File
System (CIFS) protocols are described at <A HREF=http://anu.samba.org/cifs>
http://anu.samba.org/cifs</A>. </P>
<H2><A NAME=4_10>4.10 Trivial File Transfer Protocol</A></H2>
<P>The Trivial File Transfer Protocol (TFTP) is described by <A HREF=http://www.ietf.org/rfc/rfc1350.txt>
RFC 1350: The TFTP Protocol (Revision 2)</A>. </P>
<P>The URI method name for SMB is &quot;smb&quot;. </P>
<H1><A NAME=5>5 5 - Directories</A></H1>
<DL>
<DT>/usr/bin </DT>
<DD>The <CODE>cancel</CODE>, <CODE>lp</CODE>, <CODE>lpq</CODE>, <CODE>
lpr</CODE>, <CODE>lprm</CODE>, and <CODE>lpstat</CODE> commands reside
here. </DD>
<DT>/usr/lib </DT>
<DD>The <CODE>accept</CODE>, <CODE>disable</CODE>, <CODE>enable</CODE>, <CODE>
lpadmin</CODE>, and <CODE>reject</CODE> commands reside here. </DD>
<DT>/usr/sbin </DT>
<DD>The <CODE>lpc</CODE> and <CODE>cupsd</CODE> commands resize here. </DD>
<DD>The <CODE>accept</CODE>, <CODE>cupsd</CODE>, <CODE>lpadmin</CODE>, <CODE>
lpc</CODE>, and <CODE>reject</CODE> commands reside here. </DD>
<DT>/usr/share/cups </DT>
<DD>This is the root directory of the CUPS static data. </DD>
<DT>/usr/share/cups/data </DT>
+1157 -1216
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+136 -105
Ver Arquivo
@@ -3,7 +3,7 @@
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
<META NAME="DOCNUMBER" CONTENT="CUPS-IDD-1.0">
<META NAME="Author" CONTENT="Easy Software Products">
<TITLE>DRAFT - CUPS Interface Design Description</TITLE>
<TITLE>CUPS Interface Design Description</TITLE>
</HEAD>
<BODY>
@@ -74,10 +74,10 @@ sections:
<UL>
<LI>IEEE 1387.4, System Administration: Printing (draft)
<LI>IPP/1.0: Additional Optional Operations - Set 1
<LI>IPP/1.0: Encoding and Transport
<LI>IPP/1.0: Implementers Guide
<LI>IPP/1.0: Model and Semantics
<LI>RFC 1179, Line Printer Daemon Protocol
<LI>RFC 2565, IPP/1.0: Encoding and Transport
<LI>RFC 2566, IPP/1.0: Model and Semantics
<LI>RFC 2639, IPP/1.0: Implementers Guide
</UL>
<H1>Internal Interfaces</H1>
@@ -269,28 +269,33 @@ followed by its value. The following directives are understood:
<TR>
<TD>&lt;Class name&gt;<BR>
&lt;/Class&gt;</TD>
<TD></TD>
<TD>Surrounds a class definition.</TD>
</TR>
<TR>
<TD>&lt;DefaultClass name&gt;<BR>
&lt;/Class&gt;</TD>
<TD></TD>
<TD>Surrounds a class definition for the default destination.</TD>
</TR>
<TR>
<TD>Accepting</TD>
<TD>Specifies whether the class is accepting new jobs. May be
the names "Yes" or "No".</TD>
</TR>
<TR>
<TD>Info</TD>
<TD></TD>
<TD>A textual description of the class.</TD>
</TR>
<TR>
<TD>Location</TD>
<TD></TD>
<TD>A textual location of the class.</TD>
</TR>
<TR>
<TD>MoreInfo</TD>
<TD></TD>
<TD>A URL pointing to additional information on the class.</TD>
</TR>
<TR>
<TD>Printer</TD>
<TD></TD>
<TD>Specifies a printer that is a member of the class.</TD>
</TR>
</TABLE></CENTER>
@@ -310,180 +315,208 @@ followed by its value. The following directives are understood:
</TR>
<TR>
<TD>AccessLog</TD>
<TD></TD>
<TD>Specifies the location of the access log file (default
"logs/access_log").</TD>
<TD>logs/access_log</TD>
<TD>Specifies the location of the access log file.</TD>
</TR>
<TR>
<TD>Allow</TD>
<TD></TD>
<TD></TD>
<TD>-</TD>
<TD>Allows connections from the specified host, network, or
domain.</TD>
</TR>
<TR>
<TD>AuthClass</TD>
<TD></TD>
<TD></TD>
<TD>-</TD>
<TD>Specifies what level of authentication is required; may be either
"User", "System", or "Group".</TD>
</TR>
<TR>
<TD>AuthType</TD>
<TD></TD>
<TD></TD>
<TD>None</TD>
<TD>Specifies the type of authentication to perform; may be either
"None" or "Basic".</TD>
</TR>
<TR>
<TD>BrowseAddress</TD>
<TD></TD>
<TD></TD>
<TD>255.255.255.255</TD>
<TD>Specifies a broadcast address to send CUPS browsing packets to.</TD>
</TR>
<TR>
<TD>BrowseInterval</TD>
<TD></TD>
<TD></TD>
<TD>30</TD>
<TD>Specifies the number of seconds between browsing updates.</TD>
</TR>
<TR>
<TD>BrowsePort</TD>
<TD></TD>
<TD></TD>
<TD>631</TD>
<TD>Specifies the UDP port number to use for browse packets.</TD>
</TR>
<TR>
<TD>BrowseTimeout</TD>
<TD></TD>
<TD></TD>
<TD>300</TD>
<TD>Specifies the number of seconds to wait until remote destinations
are removed from the local destination list.</TD>
</TR>
<TR>
<TD>Browsing</TD>
<TD></TD>
<TD></TD>
<TD>On</TD>
<TD>Specifies whether or not printer and class browsing is enabled; can
be "On" or "Off".</TD>
</TR>
<TR>
<TD>DefaultCharset</TD>
<TD></TD>
<TD></TD>
<TD>iso-8859-1</TD>
<TD>Specifies the default character set.</TD>
</TR>
<TR>
<TD>DefaultLanguage</TD>
<TD></TD>
<TD></TD>
<TD>current locale</TD>
<TD>Specifies the default language.</TD>
</TR>
<TR>
<TD>Deny</TD>
<TD></TD>
<TD></TD>
<TD>-</TD>
<TD>Refuses connections from the specified host, network, or
domain.</TD>
</TR>
<TR>
<TD>DocumentRoot</TD>
<TD></TD>
<TD></TD>
<TD>/usr/share/cups/doc</TD>
<TD>Specifies the document data root directory.</TD>
</TR>
<TR>
<TD>ErrorLog</TD>
<TD></TD>
<TD></TD>
<TD>logs/error_log</TD>
<TD>Specifies the error log file location.</TD>
</TR>
<TR>
<TD>Group</TD>
<TD></TD>
<TD></TD>
<TD>root, sys, system</TD>
<TD>Specifies the group name or ID that is used when running
external programs.</TD>
</TR>
<TR>
<TD>HostNameLookups</TD>
<TD></TD>
<TD></TD>
<TD>Off</TD>
<TD>Specifies whether or not to perform reverse IP address lookups to
get the actual hostname; may be "On" or "Off". Hostname lookups can
significantly degrade the performance of the CUPS server if one or
more DNS servers is not functioning properly.</TD>
</TR>
<TR>
<TD>ImplicitClasses</TD>
<TD></TD>
<TD></TD>
<TD>On</TD>
<TD>Specifies whether or not to automatically create printer classes
when more than one printer or class of the same name is detected on
the network; may be "On" or "Off".</TD>
</TR>
<TR>
<TD>KeepAlive</TD>
<TD></TD>
<TD></TD>
<TD>On</TD>
<TD>Specifies whether or not to use the HTTP Keep-Alive feature; may
be "On" or "Off".</TD>
</TR>
<TR>
<TD>KeepAliveTimeout</TD>
<TD></TD>
<TD></TD>
<TD>30</TD>
<TD>Specifies the amount of time to keep the HTTP connection alive
before closing it.</TD>
</TR>
<TR>
<TD>&lt;Location path&gt;<BR>
&lt;/Location&gt;</TD>
<TD></TD>
<TD></TD>
<TD>-</TD>
<TD>Specifies a location to restrict access to.</TD>
</TR>
<TR>
<TD>LogLevel</TD>
<TD></TD>
<TD></TD>
<TD>info</TD>
<TD>Controls the amount of information that is logged in the
error log file. Can be one of "debug", "info", "warn", "error",
or "none", in decreasing order or verbosity.</TD>
</TR>
<TR>
<TD>MaxClients</TD>
<TD></TD>
<TD></TD>
<TD>100</TD>
<TD>Specifies the maximum number of simultaneous active clients.
This value is internally limited to 1/3 of the total number of
availabel file descriptors.</TD>
</TR>
<TR>
<TD>MaxLogSize</TD>
<TD></TD>
<TD></TD>
<TD>0</TD>
<TD>Specifies the maximum size of the access, error, and page
log files in bytes. If set to 0 then no maximum size is set.
Log files are rotated automatically when this size is
exceeded.</TD>
</TR>
<TR>
<TD>MaxRequestSize</TD>
<TD></TD>
<TD></TD>
<TD>0</TD>
<TD>Specifies the maximum size of HTTP requests in bytes. If set to 0
then there is no maximum.</TD>
</TR>
<TR>
<TD>Order</TD>
<TD></TD>
<TD></TD>
<TD>Allow,Deny</TD>
<TD>Specifies the order of Allow and Deny directive processing; can
be "Deny,Allow" to implicitly deny hosts unless they are allowed by
an Allow line, or "Allow,Deny" to implicitly allow hosts unless they
are denied by a Deny line.</TD>
</TR>
<TR>
<TD>PageLog</TD>
<TD></TD>
<TD></TD>
<TD>logs/page_log</TD>
<TD>Specifies the location of the page log file.</TD>
</TR>
<TR>
<TD>Port</TD>
<TD></TD>
<TD></TD>
<TD>631</TD>
<TD>Specifies a port number to listen to for HTTP connections.</TD>
</TR>
<TR>
<TD>RIPCache</TD>
<TD></TD>
<TD></TD>
<TD>8m</TD>
<TD>Specifies the size of the memory cache in bytes that is used by
RIP filters.</TD>
</TR>
<TR>
<TD>ServerAdmin</TD>
<TD></TD>
<TD></TD>
<TD>root@ServerName</TD>
<TD>Specifies the person to contact with problems.</TD>
</TR>
<TR>
<TD>ServerName</TD>
<TD></TD>
<TD></TD>
<TD>hostname</TD>
<TD>Specifies the hostname that is supplied to HTTP clients. This
is also used to determine the default CUPS server for the CUPS IPP
client applications.</TD>
</TR>
<TR>
<TD>ServerRoot</TD>
<TD></TD>
<TD></TD>
<TD>/var/cups</TD>
<TD>Specifies the root directory for server data files.</TD>
</TR>
<TR>
<TD>SystemGroup</TD>
<TD></TD>
<TD></TD>
<TD>root, sys, system</TD>
<TD>Specifies the group name used for System class authentication.</TD>
</TR>
<TR>
<TD>TempDir</TD>
<TD></TD>
<TD></TD>
<TD>/var/tmp</TD>
<TD>Specifies the temporary directory to use.</TD>
</TR>
<TR>
<TD>Timeout</TD>
<TD></TD>
<TD></TD>
<TD>300</TD>
<TD>The timeout in seconds before client connections are closed
in the middle of a request.</TD>
</TR>
<TR>
<TD>User</TD>
<TD></TD>
<TD></TD>
<TD>lp</TD>
<TD>Specifies the user that is used when running external programs.</TD>
</TR>
</TABLE></CENTER>
@@ -500,35 +533,41 @@ followed by its value. The following directives are understood:
<TH WIDTH="25%">Directive</TH>
<TH>Description</TH>
</TR>
<TR>
<TD>Accepting</TD>
<TD>Specifies whether the printer is accepting new jobs. May be
the names "Yes" or "No".</TD>
</TR>
<TR>
<TD>&lt;DefaultPrinter name&gt;<BR>
&lt;/Printer&gt;</TD>
<TD></TD>
<TD>Surrounds the printer definition for a default destination.</TD>
</TR>
<TR>
<TD>DeviceURI</TD>
<TD></TD>
<TD>Specifies the device-uri attribute for the printer.</TD>
</TR>
<TR>
<TD>Info</TD>
<TD></TD>
<TD>A textual description of the printer.</TD>
</TR>
<TR>
<TD>Location</TD>
<TD></TD>
<TD>A textual location of the printer.</TD>
</TR>
<TR>
<TD>MoreInfo</TD>
<TD></TD>
<TD>A URL pointing to additional information on the printer.</TD>
</TR>
<TR>
<TD>&lt;Printer name&gt;<BR>
&lt;/Printer&gt;</TD>
<TD></TD>
<TD>Surrounds the printer definition.</TD>
</TR>
<TR>
<TD>State</TD>
<TD></TD>
<TD>Specifies the initial state of the printer; can be "Idle" or
"Stopped".</TD>
</TR>
</TABLE></CENTER>
@@ -537,7 +576,7 @@ followed by its value. The following directives are understood:
<H2>AppSocket Protocol</H2>
<P>The AppSocket protocol is an 8-bit clean TCP/IP socket connection.
The default IP service port is 9100.
The default IP service port is 9100. The URI method name is "socket".
<H2>CUPS Browsing Protocol</H2>
@@ -912,12 +951,6 @@ raster data for that page.
to the destination printer (e.g. HP-PCL, HP-RTL, etc.) The MIME type for CUPS
Raw files is <CODE>application/vnd.cups-raw</CODE>.
<H2>File Transfer Protocol</H2>
<P>The File Transfer Protocol (FTP) is described by
<A HREF="http://www.ietf.org/rfc/rfc959.txt">RFC 959: File Transfer
Protocol</A>.
<H2>Internet Printing Protocol</H2>
<P>The Internet Printing Protocol is described by the following RFCs:
@@ -942,6 +975,8 @@ Protocol</A>.
</UL>
<P>The URI method name for IPP is "ipp".
<P>CUPS defines the following extension operations to IPP.
<H3>Get Default Destination (CUPS_GET_DEFAULT = 0x4001)</H3>
@@ -1062,17 +1097,15 @@ are <CODE>attributes-charset</CODE>,
<A HREF="http://www.ietf.org/rfc/rfc1179.txt">RFC 1179: Line Printer Daemon
Protocol</A>.
<P>The URI method name for LPD is "lpd".
<H2>Server Message Block Protocol</H2>
<P>The Server Message Block (SMB) and related Common Internet File
System (CIFS) protocols are described at
<A HREF="http://anu.samba.org/cifs">http://anu.samba.org/cifs</A>.
<H2>Trivial File Transfer Protocol</H2>
<P>The Trivial File Transfer Protocol (TFTP) is described by
<A HREF="http://www.ietf.org/rfc/rfc1350.txt">RFC 1350: The TFTP Protocol
(Revision 2)</A>.
<P>The URI method name for SMB is "smb".
<H1>5 - Directories</H1>
@@ -1083,12 +1116,10 @@ System (CIFS) protocols are described at
<CODE>lpr</CODE>, <CODE>lprm</CODE>, and <CODE>lpstat</CODE> commands
reside here.
<DT>/usr/lib
<DD>The <CODE>accept</CODE>, <CODE>disable</CODE>, <CODE>enable</CODE>,
<CODE>lpadmin</CODE>, and <CODE>reject</CODE> commands reside here.
<DT>/usr/sbin
<DD>The <CODE>lpc</CODE> and <CODE>cupsd</CODE> commands resize here.
<DD>The <CODE>accept</CODE>, <CODE>cupsd</CODE>,
<CODE>lpadmin</CODE>, <CODE>lpc</CODE>, and <CODE>reject</CODE>
commands reside here.
<DT>/usr/share/cups
<DD>This is the root directory of the CUPS static data.
+14 -9
Ver Arquivo
@@ -11,7 +11,7 @@
<TD><H1 ALIGN=right>An Overview of the<BR>
Common UNIX Printing System</H1></DIV>
<P ALIGN=right>May 11, 1999<BR>
<P ALIGN=right>September 14, 1999<BR>
Michael Sweet, Easy Software Products<BR>
Copyright 1998-1999, All Rights Reserved.</P>
</TD>
@@ -163,7 +163,9 @@ Apache server configuration file and defines all of the access control
properties for the server.
<P>The printer and class definition files list the available printer
queues and classes.
queues and classes. Printer classes are collections of printers. Jobs
sent to a class are forwarded to the first available printer in the
class, round-robin fashion.
<P>The MIME type files list the supported MIME types (text/plain,
application/postscript, etc.) and "magic" rules for automatically
@@ -174,13 +176,16 @@ when a <I>Print-Job</I> request is received with a
<I>document-format</I> of <I>application/octet-stream</I>.
<P>The MIME conversion rule files list the available filters. These
files are augmented by <I>AddFilter</I> entries in the printer
definition files. The filters are used when a job is dispatched so that
an application can send a convenient file format to the printing system
files are augmented by <I>cupsFilter</I> entries in the printer PPD
files. The filters are used when a job is dispatched so that an
application can send a convenient file format to the printing system
which then converts the document into a printable format as needed.
Each filter has a relative cost associated with it, and the filtering
algorithm chooses the set of filters that will convert the file to the
needed format with the lowest total "cost".
<P>The PPD files describe the capabilities of PostScript printers. There is
one PPD file for each printer.
<P>The PPD files describe the capabilities of PostScript printers.
There is one PPD file for each printer.
<H3>CUPS Interface Library</H3>
@@ -199,8 +204,8 @@ and job options. All output is sent to the standard output.
<H3>Backends</H3>
A backend program is a special filter that writes incoming data to a
device or network connection. Backends for serial, parallel, LPD, TFTP,
FTP, IPP, SMB, and AppSocket (JetDirect) connections are provided in
device or network connection. Backends for serial, parallel, LPD,
IPP, SMB, and AppSocket (JetDirect) connections are provided in
CUPS 1.0.
<H2>Berkeley and System V Commands</H2>
Arquivo binário não exibido.
+2 -2
Ver Arquivo
@@ -1,13 +1,13 @@
<HTML>
<HEAD>
<TITLE>DRAFT - CUPS Software Administrators Manual</TITLE>
<TITLE>CUPS Software Administrators Manual</TITLE>
<META NAME="AUTHOR" CONTENT="Easy Software Products">
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
<META NAME="DOCNUMBER" CONTENT="CUPS-SAM-1.0.0">
</HEAD>
<BODY>
<CENTER><A HREF=#contents><IMG SRC="images/cups-large.gif" BORDER=0><BR>
<H1>DRAFT - CUPS Software Administrators Manual</H1></A><BR>
<H1>CUPS Software Administrators Manual</H1></A><BR>
CUPS-SAM-1.0.0<BR>
Easy Software Products<BR>
Copyright 1997-1999, All Rights Reserved<BR>
+509 -493
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+1 -1
Ver Arquivo
@@ -3,7 +3,7 @@
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
<META NAME="DOCNUMBER" CONTENT="CUPS-SAM-1.0.0">
<META NAME="Author" CONTENT="Easy Software Products">
<TITLE>DRAFT - CUPS Software Administrators Manual</TITLE>
<TITLE>CUPS Software Administrators Manual</TITLE>
</HEAD>
<BODY>
+61 -67
Ver Arquivo
@@ -1,13 +1,13 @@
<HTML>
<HEAD>
<TITLE>DRAFT - CUPS Software Design Description</TITLE>
<TITLE>CUPS Software Design Description</TITLE>
<META NAME="AUTHOR" CONTENT="Easy Software Products">
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
<META NAME="DOCNUMBER" CONTENT="CUPS-SDD-1.0">
</HEAD>
<BODY>
<CENTER><A HREF=#contents><IMG SRC="images/cups-large.gif" BORDER=0><BR>
<H1>DRAFT - CUPS Software Design Description</H1></A><BR>
<H1>CUPS Software Design Description</H1></A><BR>
CUPS-SDD-1.0<BR>
Easy Software Products<BR>
Copyright 1997-1999, All Rights Reserved<BR>
@@ -34,8 +34,7 @@ Copyright 1997-1999, All Rights Reserved<BR>
<LI><A HREF=#3_1_2>3.1.2 lpd</A></LI>
<LI><A HREF=#3_1_3>3.1.3 parallel</A></LI>
<LI><A HREF=#3_1_4>3.1.4 serial</A></LI>
<LI><A HREF=#3_1_5>3.1.5 smb</A></LI>
<LI><A HREF=#3_1_6>3.1.6 socket</A></LI>
<LI><A HREF=#3_1_5>3.1.5 socket</A></LI>
</UL>
<LI><A HREF=#3_2>3.2 Berkeley Commands</A></LI>
<UL>
@@ -45,9 +44,9 @@ Copyright 1997-1999, All Rights Reserved<BR>
</UL>
<LI><A HREF=#3_3>3.3 CGI</A></LI>
<UL>
<LI><A HREF=#3_3_1>3.3.1 classes</A></LI>
<LI><A HREF=#3_3_2>3.3.2 jobs</A></LI>
<LI><A HREF=#3_3_3>3.3.3 printers</A></LI>
<LI><A HREF=#3_3_1>3.3.1 classes.cgi</A></LI>
<LI><A HREF=#3_3_2>3.3.2 jobs.cgi</A></LI>
<LI><A HREF=#3_3_3>3.3.3 printers.cgi</A></LI>
</UL>
<LI><A HREF=#3_4>3.4 CUPS Interface Library</A></LI>
<UL>
@@ -63,8 +62,11 @@ Copyright 1997-1999, All Rights Reserved<BR>
<UL>
<LI><A HREF=#3_5_1>3.5.1 hpgltops</A></LI>
<LI><A HREF=#3_5_2>3.5.2 imagetops</A></LI>
<LI><A HREF=#3_5_3>3.5.3 pstops</A></LI>
<LI><A HREF=#3_5_4>3.5.4 texttops</A></LI>
<LI><A HREF=#3_5_3>3.5.3 imagetoraster</A></LI>
<LI><A HREF=#3_5_4>3.5.4 pstops</A></LI>
<LI><A HREF=#3_5_5>3.5.5 pstoraster</A></LI>
<LI><A HREF=#3_5_6>3.5.6 rastertohp</A></LI>
<LI><A HREF=#3_5_7>3.5.7 texttops</A></LI>
</UL>
<LI><A HREF=#3_6>3.6 Scheduler</A></LI>
<UL>
@@ -75,8 +77,9 @@ Copyright 1997-1999, All Rights Reserved<BR>
<LI><A HREF=#3_6_5>3.6.5 Directory Services</A></LI>
<LI><A HREF=#3_6_6>3.6.6 IPP</A></LI>
<LI><A HREF=#3_6_7>3.6.7 Jobs</A></LI>
<LI><A HREF=#3_6_8>3.6.8 Main</A></LI>
<LI><A HREF=#3_6_9>3.6.9 Printers</A></LI>
<LI><A HREF=#3_6_8>3.6.8 Logging</A></LI>
<LI><A HREF=#3_6_9>3.6.9 Main</A></LI>
<LI><A HREF=#3_6_10>3.6.10 Printers</A></LI>
</UL>
<LI><A HREF=#3_7>3.7 System V Commands</A></LI>
<UL>
@@ -90,12 +93,10 @@ Copyright 1997-1999, All Rights Reserved<BR>
<LI><A HREF=#3_7_8>3.7.8 reject</A></LI>
</UL>
</UL>
<B><A HREF=#4>4 Detailed Design</A></B>
<BR>
<BR><B><A HREF=#5>A Glossary</A></B>
<B><A HREF=#4>A Glossary</A></B>
<UL>
<LI><A HREF=#5_1>A.1 Terms</A></LI>
<LI><A HREF=#5_2>A.2 Acronyms</A></LI>
<LI><A HREF=#4_1>A.1 Terms</A></LI>
<LI><A HREF=#4_2>A.2 Acronyms</A></LI>
</UL>
<HR>
<H1><A NAME=1>1 Scope</A></H1>
@@ -126,7 +127,6 @@ can be used to support non-PostScript printers. </P>
<LI>1 - Scope </LI>
<LI>2 - References </LI>
<LI>3 - Design Overview </LI>
<LI>4 - Detailed Design </LI>
<LI>A - Glossary </LI>
</UL>
<H1><A NAME=2>2 References</A></H1>
@@ -148,10 +148,10 @@ can be used to support non-PostScript printers. </P>
<UL>
<LI>IEEE 1387.4, System Administration: Printing (draft) </LI>
<LI>IPP/1.0: Additional Optional Operations - Set 1 </LI>
<LI>IPP/1.0: Encoding and Transport </LI>
<LI>IPP/1.0: Implementers Guide </LI>
<LI>IPP/1.0: Model and Semantics </LI>
<LI>RFC 1179, Line Printer Daemon Protocol </LI>
<LI>RFC 2565, IPP/1.0: Encoding and Transport </LI>
<LI>RFC 2566, IPP/1.0: Model and Semantics </LI>
<LI>RFC 2639, IPP/1.0: Implementers Guide </LI>
</UL>
<H1><A NAME=3>3 Design Overview</A></H1>
CUPS is composed of 7 software sub-systems that operate together to
@@ -219,17 +219,7 @@ form:
<LI><CODE>parity=<I>odd</I></CODE> - Sets odd parity checking. </LI>
<LI><CODE>parity=<I>none</I></CODE> - Turns parity checking off. </LI>
</UL>
<H3><A NAME=3_1_5>3.1.5 smb</A></H3>
The smb backend sends the specified job to a network host using the
Server Message Block protocol, which is used by most machines running
Microsoft&reg; Windows&reg;. The URI is of the form:
<UL>
<PRE>smb://hostname/queue
</PRE>
</UL>
Usernames and passwords required to access the printer are stored in
an external file.
<H3><A NAME=3_1_6>3.1.6 socket</A></H3>
<H3><A NAME=3_1_5>3.1.5 socket</A></H3>
The socket backend sends the specified job to a network host using the
AppSocket protocol commonly used by Hewlett-Packard and Tektronix
printers. The URI is of the form:
@@ -241,41 +231,32 @@ printers. The URI is of the form:
<H2><A NAME=3_2>3.2 Berkeley Commands</A></H2>
The Berkeley commands provide a simple command-line interface to CUPS
to submit and control print jobs. It is provided for compatibility with
existing software that is hard coded to use the Berkeley commands,
however since printer options cannot be specified using the Berkeley
commands their use it not encouraged.
existing software that is hard coded to use the Berkeley commands.
<H3><A NAME=3_2_1>3.2.1 lpc</A></H3>
The lpc command allows users and administrators to check the status
and control print queues. The version provided with CUPS supports the
following commands:
<UL>
<LI>abort - Stops a printer or all printers and any active print jobs. </LI>
<LI>disable - Prevents new jobs from being submitted to the specified
printer or all printers. </LI>
<LI>down - Stops a printer or all printers after completing the current
print jobs. </LI>
<LI>enable - Allows new jobs to be submitted. </LI>
<LI>start - Starts a printer or all printers. </LI>
<LI>quit - Quits the lpc command. </LI>
<LI>status - Shows the status of printers and jobs in the queue. </LI>
<LI>up - Starts a printer or all printers. </LI>
</UL>
<H3><A NAME=3_2_2>3.2.2 lpr</A></H3>
The lpr command submits a job for printing. The CUPS version of lpr
silently ignores the &quot;i&quot;, &quot;p&quot;, &quot;t&quot;, &quot;m&quot;, &quot;h&quot;, and &quot;s&quot; options.
silently ignores the &quot;i&quot;, &quot;t&quot;, &quot;m&quot;, &quot;h&quot;, and &quot;s&quot; options.
<H3><A NAME=3_2_3>3.2.3 lprm</A></H3>
The lprm removes one or more print jobs.
<H2><A NAME=3_3>3.3 CGI</A></H2>
The Common Gateway Interface (CGI) programs provide a web-based status
interface to monitor the status of printers, classes, and jobs.
<H3><A NAME=3_3_1>3.3.1 classes</A></H3>
<H3><A NAME=3_3_1>3.3.1 classes.cgi</A></H3>
The classes CGI lists the available printer classes and any pending
jobs for the class. The user can click on individual classes to limit
the display and click on jobs to see the job status.
<H3><A NAME=3_3_2>3.3.2 jobs</A></H3>
<H3><A NAME=3_3_2>3.3.2 jobs.cgi</A></H3>
The jobs CGI lists the queued print jobs in order of priority. The
list can be limited by printer or job. When the user displays the
status of an individual print job all job options are displayed.
<H3><A NAME=3_3_3>3.3.3 printers</A></H3>
<H3><A NAME=3_3_3>3.3.3 printers.cgi</A></H3>
The printers CGI lists the available printer queues and any pending
jobs for the printer. The user can click on individual printers to
limit the display and click on jobs to see the job status.
@@ -284,8 +265,9 @@ limit the display and click on jobs to see the job status.
language, MIME, PPD, and raster functions used by the CUPS software.
<H3><A NAME=3_4_1>3.4.1 Convenience Functions</A></H3>
Convenience functions are provided to submit an IPP request, send a
print file, cancel a job, get a list of available printers, and get a
list of available classes.
print file, cancel a job, get a list of available printers, get a list
of available classes, get the default printer or class, get the default
server name, get the local username, and get a password string.
<H3><A NAME=3_4_2>3.4.2 HTTP Functions</A></H3>
The HTTP functions provide functions to connect to HTTP servers, issue
requests, read data from a server, and write data to a server.
@@ -329,16 +311,24 @@ necessary conversions from one file type to another.
The hpgltops filter converts HP-GL/2 files into PostScript.
<H3><A NAME=3_5_2>3.5.2 imagetops</A></H3>
The imagetops filter converts image files into PostScript.
<H3><A NAME=3_5_3>3.5.3 pstops</A></H3>
<H3><A NAME=3_5_3>3.5.3 imagetoraster</A></H3>
The imagetoraster filter converts image files into CUPS raster data.
<H3><A NAME=3_5_4>3.5.4 pstops</A></H3>
The pstops filter inserts printer-specific commands from PPD files and
performs page filtering as requested by the user.
<H3><A NAME=3_5_4>3.5.4 texttops</A></H3>
<H3><A NAME=3_5_5>3.5.5 pstoraster</A></H3>
The pstoraster filter converts PostScript program data into CUPS
raster data.
<H3><A NAME=3_5_6>3.5.6 rastertohp</A></H3>
The rastertohp filter handles converting CUPS raster data to HP PCL
and supports both color and black-and-white printers.
<H3><A NAME=3_5_7>3.5.7 texttops</A></H3>
The texttops filter converts text files into PostScript.
<H2><A NAME=3_6>3.6 Scheduler</A></H2>
The scheduler is a fully-functional HTTP/1.1 server that manages the
printers, classes, and jobs in the system. It also handles a simple
broadcast-based directory service so that remote print queues and
classes can be accessed transparently from the local system.
The scheduler is a fully-functional HTTP/1.1 and IPP/1.0 server that
manages the printers, classes, and jobs in the system. It also handles
a simple broadcast-based directory service so that remote print queues
and classes can be accessed transparently from the local system.
<H3><A NAME=3_6_1>3.6.1 Authorization</A></H3>
The authorization module is responsible for performing access control
and authentication for all HTTP and IPP requests entering the system.
@@ -372,24 +362,28 @@ multiple addresses and ports as needed. </P>
<H3><A NAME=3_6_6>3.6.6 IPP</A></H3>
The IPP module handles IPP requests and acts accordingly. URI
validation is also performed here, as a client can post IPP data to any
URI on the server (which might sidestep the access control or
authentication of the HTTP server.)
URI on the server which might sidestep the access control or
authentication of the HTTP server.
<H3><A NAME=3_6_7>3.6.7 Jobs</A></H3>
The jobs module manages print jobs, starts filter and backend
processes for jobs to be printed, and monitors status messages from
those filters and backends.
<H3><A NAME=3_6_8>3.6.8 Main</A></H3>
<H3><A NAME=3_6_8>3.6.8 Logging</A></H3>
The logging module manages the access, error, and page log files that
are generated by the scheduler.
<H3><A NAME=3_6_9>3.6.9 Main</A></H3>
The main module is responsible for timing out and dispatching input
and output for client connections. It also watches for incoming <CODE>
SIGHUP</CODE> signals and reloads the server configuration files as
needed.
<H3><A NAME=3_6_9>3.6.9 Printers</A></H3>
SIGHUP</CODE> and <CODE>SIGCHLD</CODE> signals, reloads the server
configuration files as needed, and handles child process errors and
exits.
<H3><A NAME=3_6_10>3.6.10 Printers</A></H3>
The printers module is responsible for managing printers and PPD files
in the system. The printers module also reads and writes the printers
configuration file.
<H2><A NAME=3_7>3.7 System V Commands</A></H2>
The System V commands provide a robust command-line interface to CUPS
to submit and control print jobs.
to submit and control printers and jobs.
<H3><A NAME=3_7_1>3.7.1 accept</A></H3>
The accept command tells the scheduler to accept new jobs for specific
printers.
@@ -411,17 +405,17 @@ separate job ID for each file that is printed. Also, the Solaris &quot;f&quot;,
The lpadmin command manages printer queues and classes. The Solaris
&quot;A&quot;, &quot;F&quot;, &quot;I&quot;, &quot;M&quot;, &quot;P&quot;, &quot;Q&quot;, &quot;S&quot;, &quot;T&quot;, &quot;U&quot;, &quot;W&quot;, &quot;f&quot;, &quot;l&quot;, &quot;m&quot;, &quot;o&quot;,
&quot;s&quot;, &quot;t&quot;, and &quot;u&quot; options are not supported, and new options &quot;P&quot; (PPD
file) and &quot;F&quot; (filter) are provided to configure CUPS-specific features
such as PPD file and conversion filters.
file), &quot;F&quot; (filter), and &quot;E&quot; (enable and accept) are provided to
configure CUPS-specific features such as PPD file and conversion
filters.
<H3><A NAME=3_7_7>3.7.7 lpstat</A></H3>
The lpstat command lists printers, classes, and jobs as requested by
the user.
<H3><A NAME=3_7_8>3.7.8 reject</A></H3>
The reject command tells the scheduler not to accept new jobs for
specific printers.
<H1><A NAME=4>4 Detailed Design</A></H1>
<H1 TYPE=A VALUE=1><A NAME=5>A Glossary</A></H1>
<H2><A NAME=5_1>A.1 Terms</A></H2>
<H1 TYPE=A VALUE=1><A NAME=4>A Glossary</A></H1>
<H2><A NAME=4_1>A.1 Terms</A></H2>
<DL>
<DT>C </DT>
<DD>A computer language. </DD>
@@ -434,7 +428,7 @@ specific printers.
<DT>socket </DT>
<DD>A two-way network communications channel. </DD>
</DL>
<H2><A NAME=5_2>A.2 Acronyms</A></H2>
<H2><A NAME=4_2>A.2 Acronyms</A></H2>
<DL>
<DT>ASCII </DT>
<DD>American Standard Code for Information Interchange </DD>
+793 -783
Ver Arquivo
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+42 -52
Ver Arquivo
@@ -3,7 +3,7 @@
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
<META NAME="DOCNUMBER" CONTENT="CUPS-SDD-1.0">
<META NAME="Author" CONTENT="Easy Software Products">
<TITLE>DRAFT - CUPS Software Design Description</TITLE>
<TITLE>CUPS Software Design Description</TITLE>
</HEAD>
<BODY>
@@ -48,8 +48,6 @@ following sections:
<LI>3 - Design Overview
<LI>4 - Detailed Design
<LI>A - Glossary
</UL>
@@ -79,10 +77,10 @@ The following non-CUPS documents are referenced by this document:
<UL>
<LI>IEEE 1387.4, System Administration: Printing (draft)
<LI>IPP/1.0: Additional Optional Operations - Set 1
<LI>IPP/1.0: Encoding and Transport
<LI>IPP/1.0: Implementers Guide
<LI>IPP/1.0: Model and Semantics
<LI>RFC 1179, Line Printer Daemon Protocol
<LI>RFC 2565, IPP/1.0: Encoding and Transport
<LI>RFC 2566, IPP/1.0: Model and Semantics
<LI>RFC 2639, IPP/1.0: Implementers Guide
</UL>
<H1>Design Overview</H1>
@@ -185,18 +183,6 @@ The options can be any combination of the following:
</UL>
<H3>smb</H3>
The smb backend sends the specified job to a network host using the Server
Message Block protocol, which is used by most machines running Microsoft&reg;
Windows&reg;. The URI is of the form:
<UL><PRE>smb://hostname/queue
</PRE></UL>
Usernames and passwords required to access the printer are stored in an
external file.
<H3>socket</H3>
The socket backend sends the specified job to a network host using the
@@ -212,9 +198,7 @@ The default port number is 9100.
The Berkeley commands provide a simple command-line interface to CUPS
to submit and control print jobs. It is provided for compatibility with
existing software that is hard coded to use the Berkeley commands,
however since printer options cannot be specified using the Berkeley
commands their use it not encouraged.
existing software that is hard coded to use the Berkeley commands.
<H3>lpc</H3>
@@ -224,28 +208,16 @@ commands:
<UL>
<LI>abort - Stops a printer or all printers and any active print jobs.
<LI>disable - Prevents new jobs from being submitted to the specified
printer or all printers.
<LI>down - Stops a printer or all printers after completing the current
print jobs.
<LI>enable - Allows new jobs to be submitted.
<LI>start - Starts a printer or all printers.
<LI>quit - Quits the lpc command.
<LI>status - Shows the status of printers and jobs in the queue.
<LI>up - Starts a printer or all printers.
</UL>
<H3>lpr</H3>
The lpr command submits a job for printing. The CUPS version of lpr silently
ignores the "i", "p", "t", "m", "h", and "s" options.
ignores the "i", "t", "m", "h", and "s" options.
<H3>lprm</H3>
@@ -256,19 +228,19 @@ The lprm removes one or more print jobs.
The Common Gateway Interface (CGI) programs provide a web-based status interface
to monitor the status of printers, classes, and jobs.
<H3>classes</H3>
<H3>classes.cgi</H3>
The classes CGI lists the available printer classes and any pending jobs for
the class. The user can click on individual classes to limit the display and
click on jobs to see the job status.
<H3>jobs</H3>
<H3>jobs.cgi</H3>
The jobs CGI lists the queued print jobs in order of priority. The list can
be limited by printer or job. When the user displays the status of an
individual print job all job options are displayed.
<H3>printers</H3>
<H3>printers.cgi</H3>
The printers CGI lists the available printer queues and any pending jobs for
the printer. The user can click on individual printers to limit the display and
@@ -282,8 +254,9 @@ language, MIME, PPD, and raster functions used by the CUPS software.
<H3>Convenience Functions</H3>
Convenience functions are provided to submit an IPP request, send a print file,
cancel a job, get a list of available printers, and get a list of available
classes.
cancel a job, get a list of available printers, get a list of available
classes, get the default printer or class, get the default server name, get
the local username, and get a password string.
<H3>HTTP Functions</H3>
@@ -354,21 +327,34 @@ The hpgltops filter converts HP-GL/2 files into PostScript.
The imagetops filter converts image files into PostScript.
<H3>imagetoraster</H3>
The imagetoraster filter converts image files into CUPS raster data.
<H3>pstops</H3>
The pstops filter inserts printer-specific commands from PPD files and
performs page filtering as requested by the user.
<H3>pstoraster</H3>
The pstoraster filter converts PostScript program data into CUPS raster data.
<H3>rastertohp</H3>
The rastertohp filter handles converting CUPS raster data to HP PCL and
supports both color and black-and-white printers.
<H3>texttops</H3>
The texttops filter converts text files into PostScript.
<H2>Scheduler</H2>
The scheduler is a fully-functional HTTP/1.1 server that manages the printers,
classes, and jobs in the system. It also handles a simple broadcast-based
directory service so that remote print queues and classes can be accessed
transparently from the local system.
The scheduler is a fully-functional HTTP/1.1 and IPP/1.0 server that
manages the printers, classes, and jobs in the system. It also handles
a simple broadcast-based directory service so that remote print queues
and classes can be accessed transparently from the local system.
<H3>Authorization</H3>
@@ -413,8 +399,8 @@ ports as needed.
The IPP module handles IPP requests and acts accordingly. URI
validation is also performed here, as a client can post IPP data to any
URI on the server (which might sidestep the access control or
authentication of the HTTP server.)
URI on the server which might sidestep the access control or
authentication of the HTTP server.
<H3>Jobs</H3>
@@ -422,11 +408,17 @@ The jobs module manages print jobs, starts filter and backend processes
for jobs to be printed, and monitors status messages from those filters
and backends.
<H3>Logging</H3>
The logging module manages the access, error, and page log files that are
generated by the scheduler.
<H3>Main</H3>
The main module is responsible for timing out and dispatching input and output
for client connections. It also watches for incoming <CODE>SIGHUP</CODE>
signals and reloads the server configuration files as needed.
and <CODE>SIGCHLD</CODE> signals, reloads the server configuration files as
needed, and handles child process errors and exits.
<H3>Printers</H3>
@@ -437,7 +429,7 @@ configuration file.
<H2>System V Commands</H2>
The System V commands provide a robust command-line interface to CUPS
to submit and control print jobs.
to submit and control printers and jobs.
<H3>accept</H3>
@@ -471,8 +463,8 @@ and "y" options are silently ignored.
The lpadmin command manages printer queues and classes. The Solaris
"A", "F", "I", "M", "P", "Q", "S", "T", "U", "W", "f", "l", "m", "o",
"s", "t", and "u" options are not supported, and new options "P" (PPD
file) and "F" (filter) are provided to configure CUPS-specific features
such as PPD file and conversion filters.
file), "F" (filter), and "E" (enable and accept) are provided to configure
CUPS-specific features such as PPD file and conversion filters.
<H3>lpstat</H3>
@@ -484,8 +476,6 @@ user.
The reject command tells the scheduler not to accept new jobs for specific
printers.
<H1>Detailed Design</H1>
<H1 TYPE=A VALUE=1>Glossary</H1>
<H2>Terms</H2>
+24 -9
Ver Arquivo
@@ -91,10 +91,10 @@ sections:</P>
<UL>
<LI>IEEE 1387.4, System Administration: Printing (draft) </LI>
<LI>IPP/1.0: Additional Optional Operations - Set 1 </LI>
<LI>IPP/1.0: Encoding and Transport </LI>
<LI>IPP/1.0: Implementers Guide </LI>
<LI>IPP/1.0: Model and Semantics </LI>
<LI>RFC 1179, Line Printer Daemon Protocol </LI>
<LI>RFC 2565, IPP/1.0: Encoding and Transport </LI>
<LI>RFC 2566, IPP/1.0: Model and Semantics </LI>
<LI>RFC 2639, IPP/1.0: Implementers Guide </LI>
</UL>
<H1><A NAME=3>3 Local Access Risks</A></H1>
<P>Local access risks are those that can be exploited only with a local
@@ -102,17 +102,32 @@ user account. This section does not address issues related to
dissemination of the root password or other security issues associated
with the UNIX operating system. </P>
<H2><A NAME=3_1>3.1 Security Breaches</A></H2>
<P>Since the default installation creates a world-readable request
directory, it is possible for local users to read the contents of print
files before they are printed. </P>
<P>This problem can be alleviated by making the request directory
readable only by the user specified in the CUPS configuration file. </P>
<P>There are two known security vulnerabilities with local access: </P>
<OL>
<LI>Since the default installation creates a world-readable request
directory, it is possible for local users to read the contents of
print files before they are printed.
<P>This problem can be alleviated by making the request directory
readable only by the user specified in the CUPS configuration file. </P>
</LI>
<LI>Device URIs are passed to backend filters in argv[0] and in an
environment variable. Since device URIs can contain usernames and
passwords it may be possible for a local user to gain access to a
remote resource.
<P>We recommend that any password-protected accounts used for remote
printing have limited access priviledges so that the possible damages
can be minimized. </P>
<P>The device URI is &quot;sanitized&quot; (the username and password are
removed) when sent to an IPP client so that a remote user cannot
exploit this vulnerability. </P>
</LI>
</OL>
<H1><A NAME=4>4 Remote Access Risks</A></H1>
<P>Remote access risks are those that can be exploited without a local
user account and/or from a remote system. This section does not address
issues related to network or firewall security. </P>
<H2><A NAME=4_1>4.1 Denial of Service Attacks</A></H2>
<P>Like all internet services, the CUPS server is vulnerable to denial
<P>Like all Internet services, the CUPS server is vulnerable to denial
of service attacks, including: </P>
<OL>
<LI>Establishing multiple connections to the server until the server
+59 -67
Ver Arquivo
@@ -1,6 +1,6 @@
%PDF-1.2
%âãÏÓ
1 0 obj<</Producer(htmldoc 2.0b1 Copyright 1997-1999 Michael Sweet, All Rights Reserved.)/CreationDate(D:19990709142834Z)/Title(DRAFT - CUPS Software Security Report)/Author(Easy Software Products)>>endobj
1 0 obj<</Producer(htmldoc 2.0b1 Copyright 1997-1999 Michael Sweet, All Rights Reserved.)/CreationDate(D:19990922200511Z)/Title(DRAFT - CUPS Software Security Report)/Author(Easy Software Products)>>endobj
2 0 obj<</Type/Encoding/BaseEncoding/WinAnsiEncoding>>endobj
3 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding 2 0 R>>endobj
4 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Roman/Encoding 2 0 R>>endobj
@@ -194,13 +194,10 @@ endobj
xÚ+ä2T0BCc3JÎår
ár
á
äHendstream
endobj
78 0 obj
31
äHendstream
endobj
78 0 obj
80 0 obj<</Length 81 0 R/Filter/FlateDecode>>stream
31
endobj
79 0 obj<</Type/Page/Parent 72 0 R/Contents 80 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F8 7 0 R/F9 8 0 R/Fc 9 0 R>>>>>>endobj
80 0 obj<</Length 81 0 R/Filter/FlateDecode>>stream
@@ -213,13 +210,12 @@ endobj
endobj
82 0 obj<</Type/Page/Parent 72 0 R/Contents 83 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 7 0 R>>>>>>endobj
83 0 obj<</Length 84 0 R/Filter/FlateDecode>>stream
ÁÉù© Q×®@.ü7 £endstream
endobj
84 0 obj
118
xÚ+ä2T0BCc3JÎår
áÒw³P04TIS041T072PIÑp rt QÐUp
VÎO+)O,JUNM.-Ê,©TJ-È/*Ñ ÉâÒiÒ…ê2‰˜˜˜é™)€ù†
ÁÉù© Q×®@.ü7 £endstream
endobj
86 0 obj<</Length 87 0 R/Filter/FlateDecode>>stream
84 0 obj
118
endobj
85 0 obj<</Type/Page/Parent 72 0 R/Contents 86 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F8 7 0 R/F9 8 0 R/Fc 9 0 R>>>>>>endobj
@@ -232,17 +228,13 @@ endobj
536
endobj
88 0 obj<</Type/Page/Parent 72 0 R/Contents 89 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 7 0 R>>>>>>endobj
88 0 obj<</Type/Page/Parent 72 0 R/Contents 89 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 7 0 R>>>>>>endobj
89 0 obj<</Length 90 0 R/Filter/FlateDecode>>stream
xÚ-‹Í1…÷÷)Î’E™[Ͱ5˜5Óë¤n3TE¼½©È9›óó=ˆQb,êâp£FhÞ®À ‰`ÇXÚ
ržl»u+0Ø÷~ˆù}J
¯á•.ùƒNïCÊS¹’)ùS®4Îò¬Æ/Ûñ5iôY¦Ð¾­u"§endstream
endobj
90 0 obj
121
89 0 obj<</Length 90 0 R/Filter/FlateDecode>>stream
xÚ-‹Í1…÷÷)Î’E™[Ͱ5˜5Óë¤n3TE¼½©È9›óó=ˆQb,êâp£FhÞ®À ‰`ÇXÚ
ržl»u+0Ø÷~ˆù}J
¯á•.ùƒNïCÊS¹’)ùS®4Îò¬Æ/Ûñ5iôY¦Ð¾­u"§endstream
endobj
90 0 obj
92 0 obj<</Length 93 0 R/Filter/FlateDecode>>stream
121
endobj
91 0 obj<</Type/Page/Parent 72 0 R/Contents 92 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
92 0 obj<</Length 93 0 R/Filter/FlateDecode>>stream
@@ -393,54 +385,54 @@ xref
0000003913 00000 n
0000004017 00000 n
0000004121 00000 n
0000004121 00000 n
0000004225 00000 n
0000004329 00000 n
0000004433 00000 n
0000004537 00000 n
0000004641 00000 n
0000004744 00000 n
0000004848 00000 n
0000004953 00000 n
0000005058 00000 n
0000005163 00000 n
0000005268 00000 n
0000005586 00000 n
0000005618 00000 n
0000005650 00000 n
0000005849 00000 n
0000005896 00000 n
0000005943 00000 n
0000005990 00000 n
0000006037 00000 n
0000006084 00000 n
0000006131 00000 n
0000006178 00000 n
0000006225 00000 n
0000006272 00000 n
0000006319 00000 n
0000006366 00000 n
0000006413 00000 n
0000006461 00000 n
0000006509 00000 n
0000006557 00000 n
0000006728 00000 n
0000006877 00000 n
0000013254 00000 n
0000013275 00000 n
0000013385 00000 n
0000013485 00000 n
0000013504 00000 n
0000013641 00000 n
0000014534 00000 n
0000014554 00000 n
0000014664 00000 n
0000014851 00000 n
0000014871 00000 n
0000015008 00000 n
0000015599 00000 n
0000004225 00000 n
0000004329 00000 n
0000004433 00000 n
0000004537 00000 n
0000004641 00000 n
0000004744 00000 n
0000004848 00000 n
0000004953 00000 n
0000005058 00000 n
0000005163 00000 n
0000005268 00000 n
0000005586 00000 n
0000005618 00000 n
0000005650 00000 n
0000005849 00000 n
0000005896 00000 n
0000005943 00000 n
0000005990 00000 n
0000006037 00000 n
0000006084 00000 n
0000006131 00000 n
0000006178 00000 n
0000006225 00000 n
0000006272 00000 n
0000006319 00000 n
0000006366 00000 n
0000006413 00000 n
0000006461 00000 n
0000006509 00000 n
0000006557 00000 n
0000006728 00000 n
0000006877 00000 n
0000013254 00000 n
0000013275 00000 n
0000013385 00000 n
0000013485 00000 n
0000013504 00000 n
0000013641 00000 n
0000014534 00000 n
0000014554 00000 n
0000014664 00000 n
0000014851 00000 n
0000014871 00000 n
0000015008 00000 n
0000015613 00000 n
0000015633 00000 n
0000015743 00000 n
0000015933 00000 n
0000015953 00000 n
0000015939 00000 n
0000016081 00000 n
0000016910 00000 n
+29 -9
Ver Arquivo
@@ -71,10 +71,10 @@ The following non-CUPS documents are referenced by this document:
<UL>
<LI>IEEE 1387.4, System Administration: Printing (draft)
<LI>IPP/1.0: Additional Optional Operations - Set 1
<LI>IPP/1.0: Encoding and Transport
<LI>IPP/1.0: Implementers Guide
<LI>IPP/1.0: Model and Semantics
<LI>RFC 1179, Line Printer Daemon Protocol
<LI>RFC 2565, IPP/1.0: Encoding and Transport
<LI>RFC 2566, IPP/1.0: Model and Semantics
<LI>RFC 2639, IPP/1.0: Implementers Guide
</UL>
<H1>Local Access Risks</H1>
@@ -86,12 +86,32 @@ system.
<H2>Security Breaches</H2>
<P>Since the default installation creates a world-readable request directory,
it is possible for local users to read the contents of print files before they
are printed.
<P>There are two known security vulnerabilities with local access:
<P>This problem can be alleviated by making the request directory readable only
by the user specified in the CUPS configuration file.
<OL>
<LI>Since the default installation creates a world-readable
request directory, it is possible for local users to read the
contents of print files before they are printed.
<P>This problem can be alleviated by making the request
directory readable only by the user specified in the CUPS
configuration file.
<LI>Device URIs are passed to backend filters in argv[0] and in
an environment variable. Since device URIs can contain
usernames and passwords it may be possible for a local user to
gain access to a remote resource.
<P>We recommend that any password-protected accounts used for
remote printing have limited access priviledges so that the
possible damages can be minimized.
<P>The device URI is "sanitized" (the username and password are
removed) when sent to an IPP client so that a remote user
cannot exploit this vulnerability.
</OL>
<H1>Remote Access Risks</H1>
@@ -101,7 +121,7 @@ related to network or firewall security.
<H2>Denial of Service Attacks</H2>
<P>Like all internet services, the CUPS server is vulnerable to denial of
<P>Like all Internet services, the CUPS server is vulnerable to denial of
service attacks, including:
<OL>
+4 -4
Ver Arquivo
@@ -1,14 +1,14 @@
<HTML>
<HEAD>
<TITLE>DRAFT - CUPS Software Users Manual</TITLE>
<TITLE>CUPS Software Users Manual</TITLE>
<META NAME="AUTHOR" CONTENT="Easy Software Products">
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
<META NAME="DOCNUMBER" CONTENT="CUPS-SUM-1.0.0b1">
<META NAME="DOCNUMBER" CONTENT="CUPS-SUM-1.0.0">
</HEAD>
<BODY>
<CENTER><A HREF=#contents><IMG SRC="images/cups-large.gif" BORDER=0><BR>
<H1>DRAFT - CUPS Software Users Manual</H1></A><BR>
CUPS-SUM-1.0.0b1<BR>
<H1>CUPS Software Users Manual</H1></A><BR>
CUPS-SUM-1.0.0<BR>
Easy Software Products<BR>
Copyright 1997-1999, All Rights Reserved<BR>
</CENTER>
+399 -417
Ver Arquivo
@@ -1,6 +1,6 @@
%PDF-1.2
%âãÏÓ
1 0 obj<</Producer(htmldoc 2.0b1 Copyright 1997-1999 Michael Sweet, All Rights Reserved.)/CreationDate(D:19990713124419Z)/Title(DRAFT - CUPS Software Users Manual)/Author(Easy Software Products)>>endobj
1 0 obj<</Producer(htmldoc 2.0b1 Copyright 1997-1999 Michael Sweet, All Rights Reserved.)/CreationDate(D:19990922200514Z)/Title(CUPS Software Users Manual)/Author(Easy Software Products)>>endobj
2 0 obj<</Type/Encoding/BaseEncoding/WinAnsiEncoding>>endobj
3 0 obj<</Type/Font/Subtype/Type1/BaseFont/Courier/Encoding 2 0 R>>endobj
4 0 obj<</Type/Font/Subtype/Type1/BaseFont/Times-Roman/Encoding 2 0 R>>endobj
@@ -362,43 +362,30 @@
]>>endobj
198 0 obj<</Type/Page/Parent 197 0 R/Contents 199 0 R/Resources<</ProcSet[/PDF/Text/ImageB/ImageC/ImageI]/Font<</F4 4 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
199 0 obj<</Length 200 0 R/Filter/FlateDecode>>stream
xÚíßoä8rÇ¥nõË<ÉÞíwº=
$@Æ#{ܳ;@hlk“}8 $QÈCÍíÞ%Áæön$¸ÿ>ýËÝúAJUEJ¢|æ›tó#¿U$‹ê¿¼¹Ñö·â«;ñá£øýÿ¼yoùæ/âCôõÍWû_~øøñ&_º¹ww·7÷ûZß¾Ìÿíý·ï³~Œöåþ|Ü—Oûò¸/ßìË?ýûûoů?ÿöÃû÷nßÿ‹ØÜÞ¾€Gq/¾}zS¼Ì¯\fE>Ý­V««‹]ÙþÇêþiê\òquzªrqyý4M.yw¥F*Á­î'Æ%ﺘžËåu2.<Ôí~
\W¹ø«Äq®‡Ðã•ËÃ\w\*›æÎŒ•Ý1³Ìõ(<óòEâW~åY)þµS\wžµ2Û8Ã%…g³\;Âe¬v‡Ì—¼ò¬ÿíè\yèõQ¾™ëÁë©Ì’1¹n½ÞŠ¿˲Z·±¶åí(\2ô<ÁÀI!¬–/çÀâ€Á°`à´dðŦåyë¸z÷[fšÍ50Ö,¸>{#”yï\™7Jù²g®<‡‹ Šà¾Â³´¦ … 퀉huŠÑ¹roÔ²é‹+ 9Å`™ãÅ`ž‹,öD.9>–ç÷À%àòë\™çDÙXæ’¡\3Ë\‘çHYZåÊ<gJb‘Ë+D91Wì9T6Ö¸r—°:¥¦'¨¨&(˜¨&iàµË•º†Õ1`0=G
LPã1ÎÇ%]ÄjëaŠ˜a0=—Œša0Üp]\®VoŸvåawñ¡ßƒA†Ë¿|Ûœä»{½
ô?\~KÒ¿|¼êgÀ ïáºì\*= ­
¸¢~†ª<j+ëa=ô8\„ôcÉÍ
Þ°¹Ø¡-]œI6çrqC
zznÎZ2$L.æp±Ò©9C0¹X<71d>+íGÛ-ÙšÅeƒ'oZ‘z°¿«a’öÎI6Ø0¸Ä`S‹Ÿyйò°È`>‹,ò¾+’ÂX9Ú¹FÂ"‚Í©\éFÈ1Å„È%ÆÂ"-i\¹É \Ø[x}YX-™‘!‚µHÞ2éöՒ•ZgŒJdðá`I5üÄ>¡ žKši¦%碞 F\‡ò™mˆ`e…2+z*kˆ`Cf{™\´É°ÄrÅc9dž(ϰ\=Á3D07Ãþ¬¢‰kWä„zà¸ÐBštø(®ldÌP°
¯†AÑ{ÁIØÃº!­Ÿ!¸2~`6Þ€%Ý\±+¢A°u7WèˆÆ“útren
rÀf\±cÃ…ôaIWèØp!Ÿô²ƒ+wÆ%Óºtp¥Î
.Jœup ÇfZÊ’V.éàpáæüº•+sp¸pÛHA+RåýA±PV4kå
Š ‰ÊÑÆ…Uù±PÓcÓÂ…Tù`h®‚dCÀUùÍà\Cœ·p9°·Æ6Ä™ž+sQäÑ‚–h¹ÀE‘G; µ–K8ª8SZ踤«ª›úsWF
«žìü¯š±?ÿŽÏ4­¨r†õó¾cÀ
¢–(®¥–KVnÜ–ÐJt­‰†KÐbV®¹–ëø1eÃ8‰Ÿ À™^ŽËÓsAI½r|¸)ЖœéµFr­µ\yéùÖ 1³$PsÑyµsZ®ƒíÍ΃0³¤ô35— :¯v®™žë¬’²êA?s`‡k,׳q)¸ÎÚžáÍ£ô‰Š+§ÆP\K-×YcÊ^IŠ}è@_{x®¹ž+~~D!eñcÈkíJ(ßÁåé¹²ãßÊ)fˆ˜(Š+$ša'×ZËuø¬ÅáGø-»Na+¸ =WtÍ3T£í6_Á•QͰ“Ë×s>쉸<Èd¯œ`¹æ§ÚJ®ƒq\PwŽ‘"P½ò¬Àr-ÂgyRr•DвJ8{ªl,ñ\ñócPs¥¬Ujgˆ¸hpåd3lçÊ*8
.ÉÚ,IqºDÙ˜x.ùlj®“I6Kr\¸V\ûŽz®”µg‡z ÊÆšÂÇÑpIÖž]g/\ŒôÅv®ü(
®c‰{v1ª‹@“YAá*ŽJ¯ãÎSŠ2) ÉÆ‚ÆuTz¯ 剀&k×Qéu\!g~IÔ³î Šë¨ô®Œw†b$HÑÆŒÈuTz
WÌÛìïzþó*—dL¯N®ƒÒk¸BÞáLŒyø@’5•ë ôj®œyŠ‘b3ö6
*×AéÕ\ 7³HªÊ3¦W7×^éÕ\‚™¹#1Ž(QT@çÚ[w¬_W®†Ø%p
ëP¹[)¸ö½*®ƒÝKFÈ!ÝJ•¨]R6¿ÊuîDK4YÐ
1BÀÊ"¨r­Ë¦Î®ç"œ¦`·ae.ÄžÍ\c˲¢Îj\¹†+=òätCL29\jLbÞüG}ÿ³É=?ôi%ÚÓV¸G6*Gòä‹J\±’Kžz
Q"ì
Ñ¡Ö$‚ÀºÎ•)¹ÒSå”û"tðÑáLïûw¯´¹-kfÃOÕ¹¢“ÆHz¾UˆçÊ9^ùüþE^WT¹JQc_Ñ >:\b|ɢɕ*¸Ê©(1Ù£î x9Ü`´)irå
®²ÞdäEà¹"–l4lb^4¹Ž¶Zá
Ë–¼“Oí¥Ä%X²QŸ˜§Û{Šuq™«šõÑôT±Zù¬òpŠ}Œ2W\1ì´‡Ô?@Ë¡vñw~¯ÉÛBÉ%\aÅòòR5õêí$ß¿øÔ¿à
)•+eÊás9LV÷¸º£y¿˜T¬ÌÏ&É%xQ”ó\!/ŠrKšÈ¡Ã\¹¡ºÊ•q£Cǹҗ&‡G®˜ºÍñ£C§¹ÄK“ù#WøÒäðÈÅÙšŸ—|q2àÊ^œÌc¹&!óåE àܲûѼ<|[Éå¦Ä³e¾\çr£ú©wq]Ùö;ïö6®ó)£í®FšMÀ¹å5‚ë¼oSŸœ‰’kÉáZª¹Ê3éË—`»/5¾Fuj]œs¸æJ®\}¾²Ý—@cƵ.z.OÉ%ÔçüMµ½êrSk]\s¸Ö
®´©r€rË3,×\¾¬U\‡+Pp…ÍÇh™ë`°ºÜ¹Zg®Y“ëY4ü‹ðd÷€rËšk­æòU\õë|(®ÆÀ“œïüÉcx4×¢•kÿ_«ô`Qu,‰Šk©tEÕxѨìdžÛn,»¹Ž/Ÿ7N>{•ëå.Î9\FYÅ?P›ØkW)-¥:ÄçÜžz=W£QõÐé˜Ç¨0jƒá:§)²äÊ.®9\õF¢˜ïi(—gÛ¹¤†+Ös®z£ÚLÙ›å PaTá:ÿC‘ý¯æò9\µFõ‹§Ïå÷Á¥¸Î×Í¥h”Õìj[®ÎÌ¹šº¡¸Î×Í¥»¨ÖËž.©áŠÔ:¯¸Î‡àj6Š•0aTP˜èaxʹ­v±yÁÕl$”Žŵ@qejÿ•iâ(Åu>W³‘–+³ÄÇsRëbó:‚«Ù(T:"×Ã%½†"·®S×ù0\FZ®”F•úpüŠÆ5z]©¸Î‡áj4*W?"ŠkS®¿–Ê.6®óa¸´\À£
õÀhvU]<Š6«ÞÈ€«@sªŸú‰¦‹õë|(®z#-Wl‘k£ÅDÝÅúu>W½‘–+⇇…Úà4Ûû.Ö¯ó¡¸êÂZšê‰KXãò
W)T­t±vÇUkÄçš!¹üué§G¿|ÜöXª»X»Î‡ãª5%Å®p…v¸Jù‡åxã°í¨»X»Î‡ãª5jÄQ)–+(pë”BÅUz?”¢‹{ѦrUEõˆ(>ryýrem\Õë|H.ÅÀr#,׈+×Åó§ R¹ªÒúT \²g.©¹Å¡¸Î‡äª6Êj’-=,×Òˆ«håW¥‘¬…æ©\9‡«Ú(¬N0qäêÎ=\÷ÈU¹Î‡åª6ŠÉø[®l\®˜ÃUi”žO•Ï›¼£se®J#YîevŠ7L–•¸$‡«ÚHœÏ¿<WÒ'Wù:š«Ú(mœWºÀ•r¸ªj‘ Øs™,—Q\a;WÎáª6ª®ŒƒÈ ®Òu><W­QeÀ’x@®¾‹1‡«Ú¨šF{®Îí
ßKxå-Ú…:à§rÕ}./Óa¸NoÐtQr¸êJ[¸Ü)ûüÃ/ÎïŸïäšJ¬,ß„îm¶Éåö¸Ä+×+׸æ/”+˜&WøÊõÊõÊõÊõÊ…ãZ¼r½rõÏå™smW>è{¥”ºãr=ìßaæ_cºK©;2×UýúZõeC¥7Ì)êªOÔ'Užâ¢”¶wÆ\¢‘¾QÍÓ/O5ë2¸6ÕÍО¸>7W4Õ—yåçÎϘU\ëêí‡K*N”ª/4LO[üuó¨“k9¨–Ö¢<Áj鵺 ®EQ™šýp…ª£2(σ°’&S¯Ëà
ª–Ò Wþ|ðtQ®[~uíù´^Y—Á5«|t?\éé PÞ–>´$çì
e]>WÖ'W\:±ŽÎÞ¥ä²ÎÉ皺ªm~õ§VwÒ>¹DI äyV5°ôBfM]:>ÝNâYo\ayNÔ”þl<IK]×ìô8â..“x¾òk8«ÅieÕ$mU]×üô8¶O&†+=ÿë”Õ$mU]WP~t 3®ŽôÃÓ¯ó‹mY–Ä*)Ý‘Ò×%qíîÓ²W®™î;žRRqÛV?žK'én
¯{ã
ué8Ç3å¼¶¤î๢ãßÛýåMo\‡Hp£‰g•i¤­KâŠ2´³ô¤7®ãYçåF`í3)žå\[—ÄçìW¿èë¢7z{øâ‡°ä‹õu•\ÍÄÎ=Ezœ¯;÷ÕW)¤ÖÛøÙÛœ|±¾.…+;@´ûÃf\mçzåz•÷§Í,Zm]
W~üçÎ-ÃÆÊ{•ÅqÒY—Â%½Ó Ñí\FçËR›Y*Y-úº®âè˜÷?í«–Eë' u)\ǼwË}r•^´U¥P}Éœ®.…ëà˜³½ï“ëù"l#—J•lÚZÇupÌÙ¾¾WgÞ×C¨š5BùPÔuñ~yï“Ýÿû\6òÙ¯š‹šT³ÈQÕ%p¥{ Ü»åþ¹Î½×B©
xÚíßoä8rÇ¥nõË<ÉÞíwº=
$@Æ#{ܳ7@hlë’}8 $QÈCÅí^~`“ÍÍì&¸ÿ>ýËÝúAJUEJ¢|ætó#¿U$‹ê?¿¹Ñö·â»;ñá£øã½yoùæÏâCô»›ïö¿üðñãM$~÷éæNÜÝÝÞÜïk}ÿþ1ÿ—÷ß¿ÏþñAlþ>Ú—ûòq_>íËã¾ü~_þá_ß/~ýòÛOïÿYܸ}ÿObs{ûþŽøþéMñ2 ¼r™ùt·Z­®.veû«û§©sÉÇÕEè©ÊÅåõÓ4¹äÝ•©·ºŸ—¼ëbz.—×ÉT¸ðPG´û)p=^yäâ¯ǹBW.7sÝq©lš#83VvÇÌ2×£ðÌË7‰c\ù•g¥ø×NqÝyÖÊlã žÍrí—±^Ø2K\òʳ^ü·£så¡×Gùfd®¯§2KÆäºõz+þf4.Ë:h ÜÆÚ–·£pÉÐó\'…°Z¾œk,LSÀb€Ó’Á˜–ç­âêÝo™9h6×ÀX[°d®È¼ÌàúìPæ½seÞ(åÛž¹òp.‚(‚û
ÏÒ˜‚Ô)FçʽQ˦/®p\.äƒ 8dŽƒix.²Ø¹äøXžß—p€Ë ¬sežec™K†npÍ,sEž#ei•+óœ)‰E.W¬åÄ\±çPÙXãÊ]Âꔘžh ¢˜ h`¢˜T¤×z,WêVÇ€Áô45`0AÇ8g—t«5®‡)j<b†Áô\2j†ÁpÃuq¹Z½}Ú•‡ÝŇ~ .ÿòms’ïîAô6`Ðÿpù-IÿòñªŸƒ¾‡ë²s©ô`€¶6àŠúªò¨­¬‡õÐãpÒ%77xÃæb‡´tq&ÙœËÅ
5èé¹9kÉ0¹˜ÃÅJ§æ YÀäbòÜlHÆù<®´m·8dkW8”
ž¼YhEêÁþ®†IÚ;'Ù`ÃàƒM-~æU@çÊGÀ"ƒùt.²Èûv®H
cåhç 6§r¥#"— ¶¤qåV<$,4ra`oáõmaµdF†Ö"yËX¤ÛWK
Wj!œ1*‘Á‡ƒ%Õðû\„$x.i¤™–œoˆz.urÊg¶!‚•ʬè©®!‚
™íerÑ&ÃËåy¢<ÃrÌp^ôXÏÁÜ û³BŠ&®q\‘VHèI€ãr@ iÒ᣸²‘=2CÁ6'a Wè†hP´~†àÊøÙx–tsÅ®ˆeÀÖÝ\¡#OêOÐÉ•¹5\È›urÅŽ
Ò‡%]\¡cÃ…|ÒˮܗLëRÐÁ•:7\¸(qÖÁ%›]h)KZ¹¤ƒÃ…›óëV®ÌÁáÂm#­\H•÷ÅBYѬ•+t(2$*GÆBMM R僡¹
Wå7ƒs! qÞÂåÀÞÛgz®ÌE‘G Z¢åEí€ÖZ.á¨jàLi¡ã’®ªnêÏu\-4¬z²ó¿jÆþüs8>Ó´¢ÊÖÏGøŽ+ˆZ¢¸–Z.Yy¸q[B+ѵ&.A5Z¹æZ®ãÇ”uã8$~gz8.OÏ%õÊñá¦@[p¦×ɵÖrå¥çX3ÄÌ’@ÍDçÕζ7;ÂÌ’ÒÏÔ\‚è¼Ú¹fz®³VHʪýÌ®±\ÏÆ¥à:k{†7CŒÒ'*®œCup-µ\gŒ){%)ö¡à¹æz®øù…”ÅwŽD ¯µ+¡|—§çÊŽ+§˜!b¢h†\k-×á³á·ì:…m®à’T3ìä
ô\ÑH4ÏP¶Û|WF5ÃN._Ïuø°'âò C
"½r‚嚟j+¹ÆqAÝ9FFˆ@õʳ˵ŸåIÉU)Ê*Uàì ¨²±ÄsÅÏAÍ•²V©!â¢Á•“Ͱ+«à4¸$k³$ÅéecVà¹ä³Y¨¹N&EÚ,Éq=âZ9 pí;è¹RÖž(k
?FÃ%Y{v½lp1ÒÛ¹ò£(h¸Ž]$îÙŨ.M6f…«8*½Ž 8N)ʤ€& ×Qéu\1g¼2”'šl¬i\G¥×q…œù%Qϸ‚(®£Òk¸Fˆ‘l E3"×Qé5\1o³¿ëùÏ«\1½:¹J¯á
y‡31æáI6ÖT®ƒÒ«¹ræ)FŠqÌ@ÚÛ(¨\¥WsÞ Ì"©*W̘^Ý\{¥Ws fæŽÄ8f DQkoݱ~]¹bb—Àm*\¬Cåjl¥àÚ÷^¨¸v/!‡@t(QT¢~tIÙ@ü*×¹u.qÐdA7Äp+‹ Êµ.?š:h¸žŠpš‚݆Y”¹{6sI,ËŠ:«qå®ôÈ“Ó
1EÈäp©1‰yóõýÏ&WôüЧ•hO[áÙ¨
Ë’/*qÅJ.yêAD6D‰°+ D‡Z“Jë:W¦äJO•Szì‹ÐÀG‡3½ïß½Òæ¶¬™
?UçŠN#éùV!ž+çxåóGøUxE\Qå*ýEAŽ}Ew€øèp‰ñ%&Wªà*§¢ÄdCŒº' àåpƒÑ¦¤É•+¸Êz“‘a€çŠX²Ñ°‰yÑä:Új…+,OXò"L>µ——`ÉF}bžnï)ÖÅe®jFTÔCF#ÐSÅjå³ÊÃ)ö1Ê\qŰÓRÿ-‡ÚÅßù½&o %—lp…ËË{HÕtÔ«·“|ÿâSÿr€+¤T®”)‡Ïå0YÝãêŽæýbR°2?$—àEQÎs…¼(Êu.i"‡så†rè*WÆçJ_š¹bvtè6WÄæ/Mæ\áK“Ã#gk~\òÅÉü+{q2嚄̗€sËîGóòðm%—›WÌ–ùrËê§ÞÅueÛï¼Û۸ΧŒ¶»i6Yç–×®ó¾M}r&J®%‡k©æ*ϤoO\‚í¾ÔøÕ©uqÎáš+¹rõùrÈv_j׺èq¸<%—PŸ;ð7mÔöªËM­uqÍáZ+¸Ò¦ÊÊ-ϰ\sMø²Vq®@Á6£e®ƒÁêrçj]œq¸fM®gÑð/“ÝÊ-h®µšËWqÕ¯ó¡¸wOr¾ó'áÑlp\V®ý=
¯ÒƒEÕ±$*®¥ÒUãQD£²“y>lT¸±ìæ:¾Þ8uøìU®”»8çp5epü8@mb¯\¥´”êŸs{ê]ô8\FÕC§c Â¨
†ëœF¤È’_(»¸æpÕ‰j`¾§   \žmç’®XÏp¸êj3eo–3@…Q†ëüEö¿šËçpÕÕ/žJ<—ß—â:_7—¢QVw°«m¹Lx83çjê†â:_7—î` Z/{v¸¤†+Rë¼â:‚«Ù(V:XÀ„QAa¢‡á)ç¶ÚÅæu>W³‘P:"×Å•©ýW¦‰£×ù\ÍFZ®ÌW¬Œ7ÏaH­‹Íë|®f£PéˆP\K —ôŠÜºNQ\çÃp5i¹R~UêÃñ+×èu¥â:†«Ñ¨\ýü‰(®Ma¸þZ*»Ø¸Î‡áj4Òr?Œ*Ô£ÙUmtñ(Ú4®z#®Í¨~ê'š.Ö¯ó¡¸ê´\±E®zuë×ùP\õFZ®ˆjƒÓlï7ºX¿Î‡âª7
kiª'.aËO4\¥PµÒÅÚu>Ÿk†äò×¥ŸýòqÛc©îbí:Ž«ÖH”»ÂÚá*å–ãöG îbí:ޫ֍G¥X® À­S
WéýPŠ.îE›ÊUmÕ#¢øÈåõË•µqU¯ó!¹wË]Œ°\ #®\ÏŸ‚JAäª6JëS%<pÉž¹¤æ‡â:’«Ú(«I¶ô°\K#®¢• 8\•F²š§Npå®j£°:ÁÄ‘«;÷pÝ#Wå:–«Ú(V$ão¹²q¹bW¥Qz>U>oòŽÎ•q¸*d¹—Ù)Þ0YVZà’®j#q>ÿzð\IŸ\åë|h®j£´q^éWÊáª6ªE‚bÏe²\Fq…í\9‡«Ú¨º2"'¸J×ùð\µF•¹6ú.Æ®j£jì¹:·7|C.á•·hꀟÊUkô¹¼XL‡á:½ @ÓEÉáª7z(mEXàr§<îó¿9¿¾“k*9°²|gº·Ù&—Û{à¯\¯\Sàš¿P®`š\á+×+×+×+×+ŽkñÊõÊÕ?—gε]ù ï•RêŽËõ°‡™é.¥îÈ\WõëkÕ—
•Þ0§¨«>
×V2üìà
PŸTyŠ‹RÚÞs‰FúF5O¿|<Õ¬ËàÚT7C{âúÜ\ÑT_敟;>cnTur­«´.©8Qª¾Ð0=mñKÔÍ£N®å\ ZZ‹ò«¥oÔê2¸EejöêŽÊ <ÂJšL½.ƒ+¨ZJ/\ùóÁÓE¹nùÕµçÓze]׬òÑýp¥§ƒBy[úÐ’ž³+”uù\YŸ\qéÄ::{—’Ë:'ŸkꪶùÕŸZ=ÞIûä%çYuÖÀÒ ™5ui\þéøt;‰g½q…åm8QSú³ñ$-ui\³Ó㈻¸Lâùʯᬧ –U“´UuI\óÓãØ>™`®ôü¯S
T“´UuI\AùÑ-̸:ÒO¿Î/¶eY«¤tGJ_—ĵ»ÿuzLË^¹fº_ìxJIÅm[ýx.qœ¤»)¼î+Ô¥ãÏ”óLØ’ºƒçŠŽo÷—7½q&nœU¦‘¶.‰+>ÊÐÎÒ“Þ¸Žgu€µÏ¤x–sm]œ³_ý¢7®SˆÞèíá‹Â’/Ö×Ur5éq¾îÜW\¥|ZoãgosòÅúº®ìhÑî›qµë•ëUÞKœ6³hµu)\ùñŸ;·lÈÕv+ïqTÇIg]
—ôN/D_´s/Kmf©hdµè븊£cÞÿ´?®Z­Ÿ4F2@Ô¥póÞ-÷ÉUzÑV•Bõ%sºº®ƒcÎö>¾O®ç‹°\*U²ik]×Á1gûúf\y_¡jÖåCQ×Åûå½LvÿïwpÙÈg{¼j.jRÍ"GU—À•î-pï–ûç:÷v^ ¥6¨º®ƒcÞ»å!¸žEa¦4mu \Ǽwˆ\ØwfíbÐV—À%Ÿ½Øb(®sâu7W­.ëà˜"ÙÊe½{•̺ꊵ\mu)\[œåçýÓ^¸ªî:7;uu)\[Éð³ƒc4äJpû‡\mu)\»‘N½Ó‹êzãšUlËoåÒÕ¥pÁá2¬ßÅerïFT~-Zu¾­.…+=ܬ™™s­Û—_Ëò:d®åj«KáÊÎN½7®´<žQícjm«KáÊÏ«V.“{ˆ‡¶þýùPk­åj«ÛÏWÞ¶%«§‚\ËÎsØó!¤~±ØV—ÂUz/l\qËZ­ÎÕR—Ä%p\F÷²ó–ªu®–º ®ÄœkK·©‡þXE_—Ä7~ÒW®W˜WÎݪRÀé©´r½£ºómÑÊ¥¯KâÒ½ŸÕ.W©³×E—¶.‰+;ùôv.£ì
µ%&uŠá{{Ž…òõzÃ|Ÿá{–œ-†ïÅzåž«ûuËÓäŠÿj¹’Iruopl&Ée²`~åžËha9i®Å$¹ä_-W0I®îØü…rͦɾÀÀ×ðû8^¹FàŠ^`à‹ûŸõ$¹à…r¥/0@4ü^³±J×Ë^—†ßC7Véêò÷½Î©.©K ¿—s¬£¸ÂÉö{o] 8D—}!¿§Øµ¶°Kß+íZÀᡸ`j‡ìô·Èï7w,àÈp\“û>ú´sm9瘡sÚÆ\sÌQ§ÌF^œs`¢Ó-Æ8çÀÂÎQ¿k¬;씽:æÀòn5”¾8¶²ÌºÕPþÀ1–vwPÀ1w  Ö±õ*Žt̉n‘œpº%ôˆ¾ÎÑ9%ô9¶7²N }†ÐÀ)ŒSBˆ pUúÑU@­KB/¦È©èRDv»¯g.9!¡—é†+ô‹ÉÈáºÄ%¦#ˆ)fÆ2ärHcŒÂAzo*rè—¹²é"ʰ @ ½#bŽŠø @ }09\”¹BïˆpÊ® @ ½#¡tÐêéŠp„ˆÕW‰+H$Õ)‡£(ðBLB6fU.„ÐÏ&!A• ±uãOB65.1
@@ -418,11 +405,10 @@ endobj
È\Ò L†æì¹M0),|(X2i^/\´OØ–o––P,ì.”¬Â\oí˜ØX¯Z£aéã°²¿Pr'›!±ôR¶¢´ØÛ”°ý0,j“©z±Zn£ž-æ!õƒ6WrÀêßtŽ*wôÙð¹R—çßS‹añmq@sÀ<ï2éy°Ú×F\±Ç-ø/¬i\˜pI_.QÖ˜_ñþúÚˆË`ÀvóìºË™Tˇn.“; =éÿö]Èþ»KC.ê2Li×Oq“«Ðäq¦\¹g§\\®V«·OÛò¸Z]…†miÌecÀ¬—®üG —tkiËLG.—{¶¶ÂåÜ€uo}á¸äÔ† ÉE8µ¢ 6ô\EèׯW6­áBs±v:zÒøÄ&Wî ײ°ÉåŒÖãŽ7ð\2œŠÆÓ¸¸[8#ˆË éÀž÷R¸äd¬Æå€%¢I\£[">ë€Æ•OÄ
©\#Ç¿„l"ר–HÉ}¡ré)ÇOT®{RÒ™k´)FK{¡s4ň‰e ®q¦ñl—Á5Ê£fp¸(éch›kpí §Êñ¸ÖF “K
w¥Ð„kHQd¥s¹†ãe’±¹i?ƒ8.c®\CøgŸ{‘„«Sägi

–ÌÁb@Eš×Kí¶å‹¥°%Ô » %«0WÅ[;&6Ö«ÁhXúx¬ì/”ÜÉfH,½T­(íöv %l? ‹Údªd¬–Ûh`ÏóŸ­ƒg‹yHý €ÍU„°ú7£Êýc6|®”Ååù÷ÔÁbX|[ÐÅÅ0Ï»Lz¬öµQ'Wìq þKçk&\Òã—K”5æW¼¿¾6â2°Ý<»î2ÇG&UÇò¡›ËdÀhOú¿}²ÿîÒ‹º SäõScÜäã*4y\…)WîÙ)—«ÕêíÓ¶<®VW¡á_[0ë¥+ÿÃ%äZZà2“ÄQ† ÇåÞ€­­p97`Ý[_8.9µáBrNm†(ˆ
f|jÆÕ¯*š$ rõé r M¹ú3KÆ7æ"çP÷´0±ÏÕDzÅ0]Ý—}Y4¿7a…«vmñÚ¼Gv¸¶¶hoÈf›Â®B^¹3X6¹,
Ùå¦p«wÆ2øÖV_lrñS«T×özb—Ë ½‘º=&—Ì.U\²Ë·¶ûÐ1/Þ_õðž‹~¸¶å —ï_Þ÷òñ½qíG­Ã /VO}}vŸ\ûa»[]¨Çéú©ÏÏí›ë0p»««‹]¹\­®ŸžzÿÈA¸F(|ÿ&}ó ß¼ÿý'qûIÈ?‰ÛèÓÍ'qÝÜ ùãß<‹ü—?ýú?|ùI_úòUüá‡ÿþ퇟ÿVþç¶Õ½¸½ÝµúÝ|'ÞÝ~¸¹{nõ./þðîö&º‰v5ß}Úýþîãá¯&?|ýËù¯Â—_~üí¿~Ý×»ÿpó±ô‡~ùŸ¿|ùû÷_·ûôÝ»íÿ}ú;ñùçŸE¶ûáW‘ý´íÑÿþôã®i"·(ÿ«=ïendstream
endobj
$ß¾Iß<È7ï¿ù$n? ùññãÍ×â>º¹òû¿{Ê>#Å;ñX@.òŸþðëÿ}÷ó¢øå‡Ÿ¿ûîO¿}÷ãßËÿÞ6¾··»Æ·w_ß|ïn?ÜÜíšïš½Ë‹ß½»½‰n¢ÿ¸ÝU~w¿ýÝ»»H¾ûå¯ç? ?ÿôýo¿ÿõ—C½7Kê§?ÿõçÿúãþºí槯ÞmÿïÓ?ˆÏ?þ(²ÝÙÛNýïßïš&r õÿÉ„ñkendstream
200 0 obj
6298
endobj
201 0 obj<</Type/Page/Parent 197 0 R/Contents 202 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 7 0 R>>>>>>endobj
@@ -435,41 +421,40 @@ endobj
203 0 obj
31
endobj
31
endobj
204 0 obj<</Type/Page/Parent 197 0 R/Contents 205 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
205 0 obj<</Length 206 0 R/Filter/FlateDecode>>stream
xÚ…TKoâ0¾ó+F=Ôd P(Ç¥/!µÝl“V{ÈÅI&Å­c§¶býŽ ºl¥UN±?{¾ÇŒ?Œé‹`1éŠz°Jßn—-!­`ÍÂÌ3HËa¬±bŽÒ7BÌ Š"è Át²'•n¸£*»c¡5¨
ÔL¶L@‰¦Ð<Gµ«Ü.Ø
•ªk%áùqý bÍ¥åò’½±XC6<»zŽ“³l/tCM»‚Q8¦¯cE¼/ÂKÇ‹Óeèy÷ýØ¢ÞrÜýÍŸp“y‡KÿäÑjËI0h”¶,Hk=F°=j¨”ög³ÉÅTƒšùMã/0!¬-l˜9#Jòf‹‚N”ïᆙ=$c­Ê¶°Æ9Fje(ËdÉty¤`”h-ùãY0!:[”¥¢ }R×g‚s÷¨ÍÅÑë}qg`…úî¡ kh!\"PIÔ®LØßzpÑ_GWwW­N¢=šIj¬*” `×7ém°ŽcŠ–uðœêÇŸJ±W‡÷òàMå^|´ØRQ °NäÜ;^¾ qÍÐå˜
ïãësxº½Š¢Å2CBM@ûh {EX U¼,yX¹]Wá{Ó$´Hœ›ž*U¦˜0ꤤi× ÚŽÛ
h¤œè§jeá‚`‚Ûý—þ°²4@¶ì”~ï§\«q’‹X›Ð´4ö¨ÉOã#¦©ˆãkŠ€,ÃOM ü¾ë•¯¹IšDª+J`M#xÁº­,±kÞ¯“zJ½m7Ek¬ªùoª½íÆTwÏp·9RφE«5J+öÐUÕ¿¨Y8žf£¾Î&×.¦ŠÓ¬=­cjf¡ õÜ¿-¥›‰ƒ2©dðɶÞVÓ?
—ÇÆýËðéE›]ŽÃ%mºÅýߤƒŸƒ?¿¸¥†endstream
204 0 obj<</Type/Page/Parent 197 0 R/Contents 205 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
205 0 obj<</Length 206 0 R/Filter/FlateDecode>>stream
xÚ…TKoâ0¾ó+F=Ôd P(Ç¥/!µÝl“V{ÈÅI&Å­c§¶býŽ ºl¥UN±?{¾ÇŒ?Œé‹`1éŠz°Jßn—-!­`ÍÂÌ3HËa¬±bŽÒ7BÌ Š"è Át²'•n¸£*»c¡5¨
ÔL¶L@‰¦Ð<Gµ«Ü.Ø
•ªk%áùqý bÍ¥åò’½±XC6<»zŽ“³l/tCM»‚Q8¦¯cE¼/ÂKÇ‹Óeèy÷ýØ¢ÞrÜýÍŸp“y‡KÿäÑjËI0h”¶,Hk=F°=j¨”ög³ÉÅTƒšùMã/0!¬-l˜9#Jòf‹‚N”ïᆙ=$c­Ê¶°Æ9Fje(ËdÉty¤`”h-ùãY0!:[”¥¢ }R×g‚s÷¨ÍÅÑë}qg`…úî¡ kh!\"PIÔ®LØßzpÑ_GWwW­N¢=šIj¬*” `×7ém°ŽcŠ–uðœêÇŸJ±W‡÷òàMå^|´ØRQ °NäÜ;^¾ qÍÐå˜
ïãësxº½Š¢Å2CBM@ûh {EX U¼,yX¹]Wá{Ó$´Hœ›ž*U¦˜0ꤤi× ÚŽÛ
h¤œè§jeá‚`‚Ûý—þ°²4@¶ì”~ï§\«q’‹X›Ð´4ö¨ÉOã#¦©ˆãkŠ€,ÃOM ü¾ë•¯¹IšDª+J`M#xÁº­,±kÞ¯“zJ½m7Ek¬ªùoª½íÆTwÏp·9RφE«5J+öÐUÕ¿¨Y8žf£¾Î&×.¦ŠÓ¬=­cjf¡ õÜ¿-¥›‰ƒ2©dðɶÞVÓ?
—ÇÆýËðéE›]ŽÃ%mºÅýߤƒŸƒ?¿¸¥†endstream
endobj
206 0 obj
690
endobj
207 0 obj<</Type/Page/Parent 197 0 R/Contents 208 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F8 7 0 R/F9 8 0 R/Fc 9 0 R>>>>>>endobj
690
208 0 obj<</Length 209 0 R/Filter/FlateDecode>>stream
xÚ•‘ÁOƒ0Åïüï8 Ì£Sof30½x©PFZmËýëmaK›&í÷¾ß÷š÷å„vÄ©ÛUïÝ–ÞõÃdä(³,HQÖ³;Y
=«S;ÎöWå»Õ& dRúñbR–-×в1{ªÍ”FOÅ@;Ø‚T[*ø«Á…‘0-C#»Nî¹ØB³Êp)ôͯð("øQ$Žÿ¥þOŸøX+Kt”â[ÖŸ­þŒ’Øâ΀ìl´£8g'È‹H±%†Ššªz1…Õçø¿‹@‰-[V}]Yª4ž9¯/ìmêÈ$!AlÏÜ—›uâ˜ÆfLãqLÃ5ù$]søY:qäÞâ<Gx6òûÒ{ò~xŸÎendstream
endobj
xÚ•ÑÍRƒ0à=Oq–u6€@Ýù×Ó*¡nÜDHÛhI4 íèÓ›@;Žé¢6Iîýr™óŒÝ"H2ÿÕmpKƒËéä**@—î.Ëó(mF÷ªîZ.-f[®·‚ï.軫MAÈP&“¡’®…QK»cš£3\´Lvlw¡ôŠIñÃiìšc©6µrÃk+”4×^ïñ¸ˆb„q¥Þ³ÿ_„˜k'z¥ü6–·GƒÖƒ’Äq' ÷y–”8©´L6L7Ä5fŸýÿ¥º[óúã0•Smg°¬ß¾ð·¡£Øw’E9HZô¹=ßL©ªy‰òJÕ§òاâ›C’¦Ña}SìÏ’¢Àødô4x
~aT¡¯endstream
endobj
209 0 obj
296
endobj
210 0 obj<</Type/Page/Parent 197 0 R/Contents 211 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
209 0 obj
291
endobj
210 0 obj<</Type/Page/Parent 197 0 R/Contents 211 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
211 0 obj<</Length 212 0 R/Filter/FlateDecode>>stream
UMsÛ6½ëWìÑž‘}8Šul2É´‡ÔêXnsð"—"b`PŠþ}ß‚ÔG¨L2ÓÑE$w÷½}ûøw4¥ ~Sz7£ù‚òzô~=zóiIÓ%­KšMÙœïîi]ÜLéŽV^ۨ햞!rM;ö;ÍûÛõW¤ÝÓt*iw]ÞÝü~’¥Ôu¥å•j"{j¼Ûé‚)K®Ï'WRåö®®¥ç?ÿør…·wþ5dH¾Ío¨å‰ÏI+ï6†ëïÉuÁ þä<Xù@]È¢¹ͱJó£*7T©@QÛ–‹Äõeöv‘ѳ5ú•é³Î½ ®Œò–þѶpûþò³ÊŸÆ]ƒRÅ:©
^Óy6^!*[(_°/UÎ’: ´X¼*å]Û4Î÷4StÈè7È·MRgÚ¨SÏ;íÚ`¤vJ…–Æ3€~Ïþ•
^Óy6^!*[(_°/UÎ’: ´X¼*å]Û4Î÷4StÈè7È·MRgÚ¨SÏ;íÚ`¤vJ…–Æ3€~Ïþ•
GÑÿ>kÑqÀè<'€Ú…˜j+Ã6f}±Ùâ4ŒÀ×É=i2Úò‰6½ÜDþÉYsx¹•~W¨ý”{ÝÄ« !·õª©t^nÇéy¯c5ÔÑÕL¹Sßt§ÇrxnÚªwb¢¨l!¯ì–ÅŠ'<)\j“Ä®U„¸¿»=ôc”ÉU‹öXåCÜòrH%)
Ú5ìÕ… „\Ô§B—%{‰è„T•|‹–ÇTÖ¸æbÔÔÂëp_(ȯ¢šçšáÁÖykbFëJEHUo0“NËmt­#^ì`¤Z*
0ó6DˆÜ£Š]·GÄÞø’£Do•ăvŒ@kj›K+§,`ªŸc±Î‡ç ½â˜Ñ[é@,ÍXùl{FV¬$° †cë-†ñ´ÁÁW—’„Kß}‡l™‹ ÃBª¬ñj 
 Å~kW´Fyqª$œO
@õ¶#@àäÎ&Ò'6(¹,ù„+ß\zž<btŒ&N—ˆ„—ž´¶Ìà|Öo\ï¨Ó™"«u:mN"ˆÄøÆ
@õ¶#@àäÎ&Ò'6(¹,ù„+ß\zž<btŒ&N—ˆ„—ž´¶Ìà|Öo\ï¨Ó™"«u:mN"ˆÄøÆ
Xx<
Xx<
«t°á¨Á=«&•ß°åR4I»X\.‘óÊ:㶇ÎÙàŠË-¯’‡óݰXÊòëÛîþa’-‘€Ð¹<\þýçm»endstream
endobj
212 0 obj
212 0 obj
843
endobj
213 0 obj<</Type/Page/Parent 197 0 R/Contents 214 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
214 0 obj<</Length 215 0 R/Filter/FlateDecode>>stream
@@ -483,31 +468,30 @@ endobj
»IZ£“<¨DF·êQúð\¨ü~u Ñ
Ä“PZ¬µBTµìÄ,ÄŽ³Õä^®6Kîxh£ìÏèÝßšçâ+´Cª,úv]«À>tä
Xé}SPжè£ÂŽãŸfô9òP©äk‚Z£~´0·¶^³-á’õÌ@2©#ïÕ£aö,>P´Z8øšÇÙ„æÃiëÛ裊^õi°“ÄÞˆ'9:ÂÚB .´Saò­§ÆÝÉfÈþFÉÑúÄÑ…m”ìMWZ§Âî%Þk\)ýËslô4¨–Eè)§ÑÓ¶Æv†“šP<} ƒƒ»FA•{¶RÎOÇÌ^‰Ck*7Ç8/UûQiÎ÷·ÕöëÉ4X>õ½hÓ3f±¨¢{3i¶
Š©<žg'£à¬cë0Òawì0È ™1ùÂÖB#a7Ikrõ‚ÈèF?)^ •?,_Hc´ñ,t%V•BT¶ìÄ,ÄŽ³åä^®6KîøÒFÙ#ŸÑ»¿5ÏOÄ—h‡T=XôíªÖ}hϰÒû¦ í¢v˜ÑçhÈX"@©“¯ jþÑÂÜÚzŶ„KÖ0ɤ6Ž ¼×O†
Û²Dø€l+áàkgš‡­o£GŒ*z|×§ÁNx-žÕè\\h§Ãše[O=Œ»“Íý’£õ‰£=¤m´êMWZ§Ãö->V¸Rù·çØè1hÐJÉÐSN£§mŒí '5!A¾} ƒƒ»FA•{¶ÔÎOÇÌN‰Ckj7Ç8oU{«+Î÷·ÕöëÉ4X>õ½hšjh$–Ʀf"Ì,bQF÷fÒlææ©’çJ–æxW»¢Ù)µÉ^"1Ö§*“›‚%É‚è5—jÏhiëaìo„ˆ—õ)as¡ËÁps²6Ÿú
±^RQœSȳ9£¿xy‚osÈý‰3ꥵfAš‹
ssdÅs%Ks<«}ÑŒì”Úd/ˆ˜ ëSVɉMÉ’dAôšKµg´²õ°?ö7BÄËú”°¹TU…`¸9Y›O}…XÏ©(NŒ)äÙœÑ_<‡<Á·9äþÈõRˆZ³ ÍÅ…ßúl*„Qlej¤!ŒY™ÄÚþB¸ªY~‚‘CtFgôŒ·ï"2½TzÈbPÑ€Õ‹–<$sä0Ç$«š+¸žÑ§åìÏû×Ããòöãð‘ <ßâsöÕãìÖhWZ¢æUáTâÙý5ôUx&ä.~ƒ!É&nù-
I~½[âC¤r ý 6Ä8“‹“(P¥µ
µhz1ôo6{}ºtóÿ‚nè`ߊ`ìÐ:XhDhŠf`ßœ0±;ë¶Î">–áV9(l’ÿÃéM³²¸/<¼:£Uj™/€…ºÁKÙ6E¾Çëeê<¬ß
YC©ã›To×½ç‹wÙ[Z\_˜Þ
ï··â7Ϫø‚—d¡ùØ,íž]]œóæKþîòü:ã?"žýáC~ò÷É…4yendstream
endobj
}ž ¹ß`H²‰[~KC’_ïø©hbœÉÅI¨ÎÒJ‡Z4½ú7›>]ºùA·JôN°‹oE°Fvè*XhDTÍ$Á4¾9abwÖm0œE|þ¬ÂvPØ$ÿÇÃM³´¸/<¾;¢ej™/€…ºÆKÙ&E~Àëeê<¬ßUC©ã›ToçççÙ{º¸ºJ6póõÃm}Å"—xÏí¸%¿yVǼ,‹ŠÏÒ©Ùåé :çïÎO®2þcâÕ?üQendstream
215 0 obj
1359
endobj
216 0 obj<</Type/Page/Parent 197 0 R/Contents 217 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
endobj
216 0 obj<</Type/Page/Parent 197 0 R/Contents 217 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
217 0 obj<</Length 218 0 R/Filter/FlateDecode>>stream
xÚ…UÁRÛ0½ç+¶¹4Ì$'![K)Óvh‡–0½p²«È’+ɘü}w%Û$¦°´»o÷½·â÷(…üIa=‡Å
x9ºØŒŽ¯Î!=MÎ`“ãÝj½NV°É&7Vj/,\Zù$¬;ÚüÂÈ%¤iŒ›-Îã²RÇ»›[àF;é<˜Œô«4V@.•§0W .sÉÁ`PÅ"IL•š«:/++%º{j¡ÓE2'è ¹±ðI4Jx?»aü‘Ù ®™ö‹ðÀt—Â=Òßm—ÀÏBbU_H×ö
217 0 obj<</Length 218 0 R/Filter/FlateDecode>>stream
xÚ…UÁRÛ0½ç+¶¹4Ì8'[‡ÒNÛi;tÓ !˱Š,¹’ŒÉßwW²MbÚépK»ûvß{+~O28ß Ö X®€W“«íäô㲋ôÞ­ÖëtÛ|vc¥öµ•Oº“í/Œ<‡,‹qóåæ8.q 5¼¿»¹n´“΃)ÀhA¿*cRy
sµà²¼u,’ÆT©¹jráð±ªV¢¿§&:[¦ ‚ŽP ŸD«„÷óÆ™Íá+sÂ~˜ÎáZ¸Gú»«âRøYJ¬êK麾!7ˆ§ÐÂ2×^VLi|Ýø4aæ²(„z(ŒæB¹¤õrQ! >”+M gZ+ñ¿,˜Vé=…Ô3r`lm(uíKQá5òFd¥Q˜C IšsŠü.|kì£Ô»ÿ©1¹bÎaÛF#5”á8¾Û; µc7óÕ\‰g9´Ò—`0Þv¡C¾Žð)l‘çÑXÁ´.‚ƒ8á›:ؤCó@Ê‘;Bëtëûr¨9i‰Ú¸Ú…œ£I*„5€~¤CãhˆÏág”Ô>N<ËycQ`ìûƒó±~º„òh^öb’øéâ\ ŸÔs'Á¾ôh7Va”B¨Ð@Øx_L<ã¹H3uì(‰2â•«Ò %¸}âþ[²ýkô¶”¼ìéBމÕû™Hw)L»üwD^6%2ŽÓôþ¤+·XE£…­eÊ‘jæIÒêFÇ­:ÇÍ$®±ä¸ÇŽ
<Ë ‘¾ƒñ¶
9K vD.ãFÑ,7‡h¯zŠÍô&}MH:l3ZÕ(/éY‰
b K2”¬Ë½#«÷J÷$ÁQâ9¼L 8Äa£ßz°B‘Ñ5ä5Øœ
…ªxšÂ•àl°w`“`»IoÅñ“á- #Ð_
H›sH$ÎDÊc}»ö€Oö6íš lõ“ª±b
„ýÀB:€wÅÄ3n‘‹4SÇŽ’(sJ\ reC:¡÷! K|صK¶{Þ]È1±z?É6q›ÿŽÈKÇDæÁÑ|œÜµåæ«h´°µL9RÍ<IZÝè¸U븉Ä5–÷¢õØ¡!'Sˆ‘˸Q4‹ÄÍ!Ú«=‡c3I_ †$ÛÁߌVÖÊKzV"È…ô%«bçÈêÒ]'Óà(ñ^¦)8Ä`£ßz°B‘Ñ5äÕÛœ
Vèd⺽9,6ï1wáÄ÷íMû²;[mÒ X.ñ
Þ¹5…oIü»`éoL7,lì<FÏ׋³üS:¿<K7n/èûÃvòcòj”Mendstream
endobj
218 0 obj
815
endobj
218 0 obj
219 0 obj<</Type/Page/Parent 197 0 R/Contents 220 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 7 0 R>>>>>>endobj
220 0 obj<</Length 221 0 R/Filter/FlateDecode>>stream
xÚ+ä2T0BCc3JÎår
áÒw³P04TIS04³Ô3U072PIÑp
@@ -519,88 +503,86 @@ endobj
endobj
222 0 obj<</Type/Page/Parent 197 0 R/Contents 223 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
223 0 obj<</Length 224 0 R/Filter/FlateDecode>>stream
endobj
222 0 obj<</Type/Page/Parent 197 0 R/Contents 223 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
223 0 obj<</Length 224 0 R/Filter/FlateDecode>>stream
xÚ•SÁrÚ0½óÛCgÈ ¸6PÀ=¦CŽZœž¸{‹Ê’#Édü÷Ý•pÒ¤i;\¬•Þ¾·ï- Rúe°YÀr
e;¹-&îrÈr(jX¤«$ƒõfE5]ÀîÔà„½•Úóá08íMq&Ü
²Œqóœ/Wi°E#è<Zpyr0˜è¼ןZégðØ£f t¥Ð%*è˜Îæäø]%ë-R%ÔѺ$ò’ÞÉ–™S"Í#ç!t
ï¤Bµ±Ï²_ë¨5£>ßïÔÞ\dE“ñM7N ßá8Ðô
ªîu¯éñ&Lp‹ö*þ„°¿CºÑÏÒ´-á]…¹Î/ ¦Ø–Ra-zå¹éΖɂu_£Ã#õ§439Íu5Œ¶¬£ýâ‚ñÂh$
xÚ•SÁrÚ0½óÛCgÈ ¸6PÀ=¦CŽZœž¸{‹Ê’#Édü÷Ý•pÒ¤i;\¬•Þ¾·ï- Rúe°YÀr
e;¹-&îrÈr(jX¤«$ƒõfE5]ÀîÔà„½•Úóá08íMq&Ü
²Œqóœ/Wi°E#è<Zpyr0˜è¼ןZégðØ£f t¥Ð%*è˜Îæäø]%ë-R%ÔѺ$ò’ÞÉ–™S"Í#ç!t
ï¤Bµ±Ï²_ë¨5£>ßïÔÞ\dE“ñM7N ßá8Ðô
ªîu¯éñ&Lp‹ö*þ„°¿CºÑÏÒ´-á]…¹Î/ ¦Ø–Ra-zå¹éΖɂu_£Ã#õ§439Íu5Œ¶¬£ýâ‚ñÂh$
endobj
\;÷΃F¬ÝÐá§Q}ÎD5¯É3é¨!ãÃ{P]ªE‹°ûRì¾½Ù
†Ž>û_í¿w öº¢õðl$Ã/»ÃC90uèèèÂbéíÔ¥ê+Î`oœ?”Vv>D)[ñ€ñ9¥Â«,”¢~ÛçÇÌjkZêèhb¢ë”,…—F;}ê÷\I3xjdÙà…#"ݤ‚îõµ$áïâÌÛ—ÍÒ4Žü׿æj›&9Aèí†Ï»bòuòž5Ùendstream
endobj
224 0 obj
225 0 obj<</Type/Page/Parent 197 0 R/Contents 226 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R>>>>/Annots 12 0 R>>endobj
226 0 obj<</Length 227 0 R/Filter/FlateDecode>>stream
xÚ­VmoÓ0þÞ_qB* ÍÚõi lð([ø^â4ǶӪÿž;;I·ve›„6uss/Ï=÷Ü9 Œð'ñ”~³jð1¼»^@rÏ!-ðÙt6‹§æÃe©µj
VF(ÇÍ›ôO I‚i4^Ó¯LíÀî¬ã•…­J¶áPiÃÁ•LVê؆ Éî$>Òø”Cc¹‰!-¹í,dèuÇ9Dz’ç­-!À¼É8>§¼RgL¶‰a#B­™aRr ÚÆø¼Öƽ¥ó>³Þ Ê­¸Ûjó;nŸOã N5:cvÂ:ÐÅ=×á[ÂícZF--CY[ÇÜC®†éªb*ß/¨‚‚šÐWÓ—Ðá5„8Õåpõ-½ºy3"߮ȜEõèÚ ­ÀÖ<…à–øw°Ó
504
endobj
225 0 obj<</Type/Page/Parent 197 0 R/Contents 226 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R>>>>/Annots 12 0 R>>endobj
226 0 obj<</Length 227 0 R/Filter/FlateDecode>>stream
xÚ­VÛnÛ8}÷W RÈ‘jÅ÷éîK»ÞFýF¢,v)KR6ü÷!%9±ã&ŠNhÍåÌ™3Cý?Ê`Œ?Læô[4£OùèÃçd³t y…Ïæ‹E:‡¼¼¼­µvBm€ÁÚ
å¹ý#ÿÆSȲhšLVÑô S{p{çyã`'¤„šm94Úrð5S ƒÛ2!ÙƒÄGŸrh·)ä5wƒ‘ƒ½80ïYQó²³%˜7›¤×”Wê‚É.1lC¨†Y&%— -`\϶þŠÎ‡Ìz‹@(·â~§íiøzžN)p®Ñ³ƒ΃®¹ö¯iw´\Jã<óO¹º„B7
Å¥aÍÝþA‹ãäý~jª¶¢íý¶ ±/SÓðƒu1oã$“I¼€é|NúɇŸn>\§Áòçênuá¶TçOK/Gø¾Õ0IîQðŠfç#ršÓwãÅ~5:ý‡#òcð7?òäendstream
SåÇÞxETÔ„¡š¾¸Œï!ÆÄ@RÂÝ×üîÛÓ˜ ùö@öà"1 Z•àŽø÷°×-ì˜òDãÓÂå ºPÎERa,'ò\ø¾h­å"Ò}Ô‰’W¬•~h2²]HæÜ3ÄÂz”Eïvàô1ˆN&'4ÿЉÛs%$W¬á/­m‡qý"Fû;@ZHÖ¿Dy˜ßg ûž{Oܰº³cü kh”ýÞ rP ¥A¥t8C‡=
ªk+l¤ Tgq¸xéRø[ïø–š‹ap!D‡#ýxÑ`Æ]ÍUÐ*y§.MTDŸ¢‡1÷¢h%‹„'f»éÄšOt÷.½s!&b0(㓪۰£
t¯‚7*OƒÄl®`†Óÿ‘ôf1£SÃKÁnþœýN˜Í àÕêÃõì@éþ˜`ÞžàÀïQµÌ»|4NÇx{ÐGFßþ‚éäÓg«ÙÀt1Æ¿ñ$ážî4]-#„ðd„n™Ý£Æ W%1K#UVáv\‡ªd¶|¨á%w…(¡à<ÎGÈç,]á|êb7CiúÛšÂ; ¬Çõez2‰1À0ŒëN™ð§H¤àV\Ðg§ñ“öõëuôÕ½wñn~<NýÐ]Ø…6ûp÷
¾QÜ
endobj
228 0 obj<</Type/Page/Parent 197 0 R/Contents 229 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R>>>>/Annots 15 0 R>>endobj
229 0 obj<</Length 230 0 R/Filter/FlateDecode>>stream
TÛ$E(ñ™u¼ßÞýÒúŒæ#AÇvßñ0ï«Vú™›XJæQ0ÝžBqiØpxÐá8{¿Ÿ›ªè:†;áh¿ÝÆØ7¹mùѺXvq²ù*Á|¹$ý Ç÷õ=ÜëÊ慨ïŽ^Šð=«e’Ü’h,®Çd¼¤ï&«Yº‚ñùw7G?Ï ñ endstream
endobj
227 0 obj
910
endobj
228 0 obj<</Type/Page/Parent 197 0 R/Contents 229 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R>>>>/Annots 15 0 R>>endobj
229 0 obj<</Length 230 0 R/Filter/FlateDecode>>stream
Ò@B•¢ÚçýyÎ9þ’B‚¿Š æ ¨»Éåäô*UœAÙÐÝbY@¹™þ[~™$¥)žì!R †.ªu/¸…HÃ…–’9þ¼4‡FH®XÇáò}yyCÖ§W+HÏâ%ùÐq4_Å9y»hyýU¨ÏàZ×F(Ç
xÚ½UmoÓ0þÞ_qLB*R“%i×´“øÂØhÀX3ñÙIbpì`;«öï¹³Ó²ŽnÒ@B•¢Úw¾—ç¹—Ÿ£ü¥g0CՎޣ㋖qEMwóEÅzüªø>J JS:¼ÙA¤@õmTéNp ‘†3-%süuazµ\±–Ãù§âüš^_,!=‰d7BÃÑtÏÈÚYëB}×p¸2B9n`å˜ë-ÔF·þþL·-SëèR(¬Í€‚©1|²4'K*a2Dz³hiÿŪ`
*¦ äÐ[¾§¡¢H Ö¾ëÒ¢_æàN÷а[¶/[áj’BGqbЧ[¿‹Ò)ý?€…òhÈ9JÑm£ÖšÃl–åy>?¨•í´Ò“|qXgºÓ™æÙb–íç¿E‡™Ï–RXJP(¹6kdÿÝÁFHIHù´ù:†Bƒå6¨O6@@ƒÜk¬râ–O^oï(ꎶáéÎ ­žÀqpo¹ýñ;Pz³ãi{¥ñ`|6T¶Á‡n‡ ¦E‡mj÷óÑG^L‰AHÅþE.úp:ÿ§,þ½i导|´ƒWBUØì7W+BÙzý÷dEaDWÛh®ŒvºÒrÂ@ФÕÀ î¥ŒjŽÞ ñ†—X¢æ–_­Dö²¡{r^Œ’8ÁéGŸ”>×ï [¤ñ²“sk‘º<>NV4<¦”øz\½±ÜL«•pÚì• hüÙ;ì©v‚õÁC[Ý\_Bèƒ}ÿæŒçºÓãc©+&mÝé|šî«&[Õ£.HO¦Ùƒöº<T²
è*É,";ñÅ=ÙoÚpW¯¤ÀAˆÚ ÊÞ9­^<¤=¹G:CÎ$ñÂEðA—ϙѕ7ðÄŒF)’⤸ŸÑcá5=ŠÄúþ2ztñ|Gxù08*:Z¥ØÄfÁðNV ñQÞy0ÿØHaå<gkÙ¡ƒ /±LçÙ,à›g¥k·¡|c‰ØLõÌ#í(Ï’Ýd ê>öÒ‰NÒ¢¥}Nª³E‚ÍàÕ–CÇ|ýqÏ^yendstream
endobj
w ôvÏÓî2Jã_€ñÁPØ
Ý,»ÒÖ£O¼˜
ƒPŠýZôñrþN[üz2ÊŸxõÓ ^ Uã°ß^¯ eëõ_“]ï²¹6ÚéZË)Vƒf2j8F3ØÄ[^a‹š;n|·i8ˆî)üe9Iâ·}Rúܼ‚l™Æ+Èά­CêŠøl<IXÓnLð˜Rá›ieôÖrß0VÂisÐ& Uˆgïq¦ºöcu{óÂÆ7ŸaÚ:ןŸžJ]3ÙjëÎóôP5Ù©žÄp5Bj|i´Í×à¡“mà@7PKfÙ™oîÙáÐn…k½z-.BÔfP
ÎiõÏcÚ“¤3äL/,Potõ”]{¿ØÑ(ECž”÷f,X“Q$6£Ÿ.à ^ìò“£¦£ç¯ò ‡xË,ÞkãÂSB|T÷Ì^¤ÇΰsžòjÙq—£ ÍslÚE–^Þ¼¸*!
230 0 obj
807
endobj
231 0 obj<</Type/Page/Parent 197 0 R/Contents 232 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 7 0 R>>>>>>endobj
232 0 obj<</Length 233 0 R/Filter/FlateDecode>>stream
xÚ+ä2T0BCc3JÎår
áÒw³P04TIS04³Ô3U072PIÑp
VÎO+)O,JU-N-*VðMÌ+MÌÑ ÉâÒ…¨Õ…*64 ÅÀE™y%™yé
¾¥9%™
Îù™©Å e®!\\%Uendstream
endobj
230 0 obj
233 0 obj
126
endobj
234 0 obj<</Type/Page/Parent 197 0 R/Contents 235 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F8 7 0 R/F9 8 0 R/Fc 9 0 R>>>>>>endobj
232 0 obj<</Length 233 0 R/Filter/FlateDecode>>stream
xÚ-‹A0÷=Å[ê¢Ø/(ºT” J9@£ÅÔÔ‚´ÄëkÕ¼·šÌ<A|FH×ñ—ÛK¶(7 ‚ì@Y–l/äuv8ïJ Ž¢­4}^jÔh½=*å&eçòÎø¯áÿˆD„iNÉ
_PÆãn¨&Ì`5Š~0ÚGí(Ù‰½5'-endstream
endobj
235 0 obj<</Length 236 0 R/Filter/FlateDecode>>stream
xÚ¥TMÓ0½÷WŒVBJ¥&Û|4m‘¸ .,,$Üzq·1rlc»´Ý_Ï8N¶Ý²° ”S<3ï½y3ö÷Q Süb˜'æPµ£·åèöÝâ%”[HâY”B>Ï ¬ƒB(,5Ñ5Ük&,ÕðIY&…—ß°,ƒ8ve¡¯ Ólu¥eà T
Q®¤¦¦ÒlC
endobj
؆‚U(="¢)„q²á
>˜m:O>íÉ®žª  ’m‹,‘?ÇæfÑÂE¦(qé¾§‚jŸïÇçå¾
[ɹ<8 ƒV¢?]É#œƒ=)lSnaË85gþ4JÜÄã”Óª«sÝÑš@‰@ùPȽ®è¥Ý„ZWüæxz¸éõ¡Ö›Ý…Àt¸vÀ½•LýzpréõáF„^k¸’9Ö:x\Á#ÕjÝà\‚´VËÕ—ó'w{nÙý^+iè?—š£p=Duú/æ—.¶ÚÙqiöy1Ͼo¬ñó¶\yEñGá¦Ðoú6{ ­4Ì^)©mýe»†~úA¬ƒŠ ax¡ Û ¶ev=îgWõb“f‡Iî·{äóëk⽸¾*!|- è:XD³#F˜¨×.JçÇd¾lÛõø)á¥ÂgÙv„ÿ† #WvÍ•Îò3×âñ}éºÃ»³ø›‡)›g˜8u©qìVåèóè'½G{®endstream
endobj
Q®¤¦¦ÒlC
؆‚U(="¢)„q²á
>˜m:O>íÉ®žª  ’m‹,‘?ÇæfÑÂE¦(qé¾§‚jŸïÇçå¾
[ɹ<8 ƒV¢?]É#œƒ=)lSnaË85gþ4JÜÄã”Óª«sÝÑš@‰@ùPȽ®è¥Ý„ZWüæxz¸éõ¡Ö›Ý…Àt¸vÀ½•LýzpréõáF„^k¸’9Ö:x\Á#ÕjÝà\‚´VËÕ—ó'w{nÙý^+iè?—š£p=Duú/æ—.¶ÚÙqiöy1Ͼo¬ñó¶\yEñGá¦Ðoú6{ ­4Ì^)©mýe»†~úA¬ƒŠ ax¡ Û ¶ev=îgWõb“f‡Iî·{äóëk⽸¾*!|- è:XD³#F˜¨×.JçÇd¾lÛõø)á¥ÂgÙv„ÿ† #WvÍ•Îò3×âñ}éºÃ»³ø›‡)›g˜8u©qìVåèóè'½G{®endstream
endobj
236 0 obj
539
endobj
237 0 obj<</Type/Page/Parent 197 0 R/Contents 238 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R/Fc 9 0 R>>>>>>endobj
238 0 obj<</Length 239 0 R/Filter/FlateDecode>>stream
V]oë6 }ϯ 2 kس×Iô¡·í.ЮYí¾õE±•ă#y’Ü$ûõ#e;7‰=Ü›¢HE‘‡<<"ûÏÀ¿|n_’Áï_Sð}H–¢ièN!ɮރh×ÉßxÁk.\Ý…õAØß⸠áý
½';ßw£ä"]s=© ð½]0›l6ï×µo‹æãð î_ž}¯‹öÃ/¾âƒ²ä;sov¡ë7'¨¡¿ó½›‹Qžú |x:†œºQ„˜ãñ dàaõÞʼnbB—Lq‘î»àÇVØð,g`ö˜jY©”_„õV–\õJÇP2úmÛ_óInûbÚãÏÆ|®
“Ï+UJÍ»¡­Õ)kó§ÓfjÅïYÉÒÜôðnÍ6ö3Ǿg<s#
Ÿ¬9°ÔT¬Yš\
º*K© Ï[ Þ-U. W¿i˜Ï`™¼µœå8g+çÿžS0:¿÷M”•‰ i:™ÈNï±òLjJPLçÕ7E¸õù jë;ê’cnL.V6é•saùœFòN):
LH#«|Ø À6/
PýyMÖ 39[)Î5YóE¼QþÌ?Úgu–8Ø%’‰*öé_¡(á8K½`&¯çå:©-xN9PÅ/¾H³†8Ï0;¹´IÏYç]õ¯ÉåÖl¥CŸ2G¯Q"CêQ¯¹b5<(Êò„Ù.P-YU|GÙH«›¶Ì¦êF_8¨òå±àZUjÈû~
236 0 obj
539
endobj
237 0 obj<</Type/Page/Parent 197 0 R/Contents 238 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R/Fc 9 0 R>>>>>>endobj
238 0 obj<</Length 239 0 R/Filter/FlateDecode>>stream
VÑnÚJ}ç+F\]ÝD¾^*å!MR©RÒp yËËb/à+³ëî®ôë;³¶)`W-!ïΜ9gÎÎò­Ã Àƒ~Dñ¦óqÞù÷S ŒÁ| áØ!ü1Ì“«×0ÁõüÜT®nåƒAý<ø<{†Û¼^aôhǘM •ñZ˜(
! vád´Ù¼^—±5Zë#à/ îžŸXÐD{™Á_,€ù&2• øÃÝÀgáðuÀv,^ŒzÿØNðþñrìGböû'a€ìƒ‹!çšK“s-d¼o¯ÂF$)»Ç"ШBÇâ"¬—<ºETz 9§ÿVóýE9Õ¶-§{üÞœOEfÓi¡seD3µ[õòrùÝes½w<çqj[twËWëg ž;)^âG”~¾Àc[ð TnS%
˜"Ï•¶"l$b™JüœJ°¸7ש´Bÿc`:½‡eš‰z嬯)_‰Yúý\‚Þù¾Ï2/ì,S¶±‘Ëätï‘*Oä¦9šéœ}EÂ/ŸO  p±ý°¤<Ö¦råŠ~Ö©–SÌi¦àT¢®§  ª*º
lÓ,­0^”â g˜¨ÙJ aÀªR/’èö?`~¨ NÊ*q°1fôåoÈr8®ÁI/ùFÀ×ùÃ×sºeª O©bü,ᣲk˜¥ V§–®è)oœ«ò†BnìVyô)ñÌ-Ò¥µ.gJ®ºG9°Úº%)òLì¨å|SÓ¬XWþÂA•.
W»Ò@jý×kpu5Ê©ú’’‰Sëð–8m~ªF‘·]“q›èÝv„T‰æ©-ó]ÜÅV1[:úÛ@*ò'ÌD&bg_¹D·¢ 褚߀˜zšbÌc}Ǹ¤Sê:¥ÛP*UyïbŽñØŸhsà
ÞÒõ& [­•)嬴¹E[¬ÕV_¨7Ñ;ƒQ=ò¦¸WðÆ³‚´„N_ìª\e¥7{
ÝýÌ!V™kê]­€,6 ¡M='l\RÂÆàåËi/ö˜`³áÆw§l;•<Ûò½¡:ʃæ=7±‰;£:ºZ¬¸N2aSÃ-à—3d{È^Ý
ÝŸ׆ñ«˜0òÎaª² oBe•$µ…)ÇëÁ†FØ|× ßç-JB êÚïŠk³Ç¸ê-ë÷ý!DÃÈQ‚»—é fji·t•¾—xÛº«˜Eø¼QÐfÒÃpÔ‡àô¬wwá]¨= {Ï]˜ºþõ0ïü×ù½;>qendstream
endobj
239 0 obj
966
endobj
240 0 obj<</Type/Page/Parent 197 0 R/Contents 241 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
241 0 obj<</Length 242 0 R/Filter/FlateDecode>>stream
òÅl6L»öáÔí±¯’[¶×”GýÐì g:å"³oTe\SYÁõajXþq†lÑ›­0üÎq+·ñ "7´
xÚ¥U[oÓ0~ϯ8š„T$â$K[¤½¬* Æ ^â4Ƕ³ŽϱÝõ"m]ש/U|ÎwuÚ¿?Æ ¤9”]pYï?N¤QEgù„دÕhÁŒiÅLÃàRµËƦõÛâ7.d@ˆÓi”Ûñ_r€’
(¥0Jr·&œÃífdíNzÕ
Ã*ƒéƒ~`: åÎøEÏTÉ„9Ù›VŠž>†©—‹B/½Ù#Ôc…U£7À{؇"I uË™ ƒùU1ÿ±ï%´`n~R>0
KŨa
•¡3ǰjÑ·˜Ll¼ƒUƒÈpç·¸5º¿RQõ7ZyÒÝÄÃ4ñ¤»‰¢]Ga&•b¥u~RîKRn@ŽJß-]8+'Çî1È8~}ä§dþtèçÑd›_fi voà›³ùôå.µ–œË•Mʇ¢ö=ÿ‡2ÃIr)Z8ëYÛôÕÐÝ¢_¬fÖPEK4¯áŸ|esP‘m«ìÛý®@3£°Ø—[`|¡ EàWj‰Hòh[‹¾Ðƒ&¿´ø6ïã;Ì“­YŽÉëÍ$ºg.‘«ÌÏ=oËÝ¥õôËûZ³<^Ùd-¤ity–{‰³›ë,dmVT1¸ÑöÆ|¥b Ü®…$Ÿât8Æ_ÒƒÙ8Ã÷Ì
endobj
‘Ô>˜Á÷à?î]ð0endstream
endobj
242 0 obj
xÚ¥U[o›0~çWUª”Iƒa`„LêÚ¥Ó¤­k:i.˜ÀflfL³ýûÛi.R›¦©òás¾«IþxG§P´Þyî½»˜‰ƒò
514
endobj
243 0 obj<</Type/Page/Parent 197 0 R/Contents 244 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F0 3 0 R/F4 4 0 R/F6 6 0 R/F8 7 0 R/F9 8 0 R>>>>>>endobj
244 0 obj<</Length 245 0 R/Filter/FlateDecode>>stream
@@ -646,304 +628,304 @@ xref
xÚÍ›ÝsÜ6ÀßýWè±¹lÄ/}<6n“kçÒújgî%/òZ¶·]­|Úݤ¹¿þ”H%é™ÚÞtÆ
‡ÀO Èü÷Œe¹þe%ÏD‘­»³7Wg¯ßÖ«³«ÛŒbų¢TúçÕÍwWÍõ¶ÍúÛì¼ßÚÝaÿýÕg?]å«\Sàƒ¿¿ƒAVˆJ«u™P+‰ƒmv ˜ÉwÙë·*c  zµ}ÜÅÐÞ6ë2iä¨!ÄJha-¶:ù?lÑN¢Cq¥vYÉV „¡$J»«ààòËþÐvÙâC<n§•åJ…OÁyÃúíS;|Ú´Ÿ¿mtÉVõ =fWÆV•~åJ®
¬É¸–Ðïöc¿>v:¼—-êµEy©­ðqyrí'aSN~Ϊ‚ïX[SÿºöïI_³ª
¥ÝUò pùe·o»lñ!·ÓÊÅJ†OÁyÃúýS;|Z·Ÿ¿mô‚­Ô=fWÆVµ~åºX•8X´+X“q-¡ßíMsètx/[Ô#j‹òJ[%àã<ò"6å:Ú¦œüœe
ß±¶¦þuíß“¾fY—ZT¿#Ì9"µ5+ý]|;‹”ÓeЧÙeRé˜08œ‹a½Ý¯·÷Ë8ÐeJê&Àá4âbŸ §¯_±ÈWUHÃy¤EF¾x¸úÓ7™_JýaØAZB“•À•æ¡%<3aµg
ðƒÿ œn‰9Ú#hßaâóp~äõzì%pé1|Ë1éèÍGe™':¹,¯µ!°GP{ó°í7ýý—oQ2>im/"æ,¤Y ô;–8 ÍY”vaøµ¿Þ}ÛLu3ŠàÚ]Vªq@E9Û4»]»[ªúŽØ*1ƒh§Bú/M>1Ò <·«Áùz³o‡ƒèÚCu ÄŒ’—&ï–5,‰f@%¯¼´ÞËùÈB>bs<Î#îͰþ´hcY:Ò$mÖB “ˆëZ‡‡Pf-”‰´ßÚýç~øK¯– yùhJÕTc@áZ”¥IDPGÚ¿'®EYÙ„ÄéÂÕáM}ðí,Rb…«ÃèµA…œF·YÌxê&ÓÌ~%œFÖžZÐ=eø€Ê¹õpQñ2ËG@¥ô¾'
Ñ–Ô QUäÂn˜*­
.d»ŠÃu·ÞÓfõè°¹‡Mhð,œ/Ƶ¤Ý>òôíÆ¶iNqw=}u
+ùüWsE¸%[,­Ù‹¹<æi½¡ƒe¦Îáë2Ì®:g}OÎÑ$ó2Äã4â‚3©B”˜U!Ùy ‡:¢PqŒŽ°ÜÖ 
¤c¸)Ë/ÛÈ7çá 5BiÀq¾N*T|}È‹PÐ4'`{Iûu¿]*TøQl?cNaÂì–ªÒ½NaŪN[b<¢mtÖ!ç‘÷î°Ù¯7-•'´m`wÏúÇõÒÎ…×/còÜJ&«˜阜áŽí¡½ù+!!^U:“xœf U‰§ ”)"|Î3¯*!?> y6eÏ ðrßìÔê4¯†=mÈCäÝ
=Ñ5ôõ5M}õ¶N År¾z§÷|ô¸ƒ©àUÏú®k¶·§ÿZoŽ`ªüïhE‡¨¨+[SAÄØ¢¢®mm‘¢o¢(Àã4ââ!êH6~Î×^ÕÑ‘gâ'à9¦…èÈ3òPy)!:ÒÔWoëR,ç«ëå¹^
C˜
öz!ÙæÏÓ‰E«Ypt´BÑkd´ºsÖ³f{Ónèp:\Ùø0®vZF CO–L(²bÆ„*µZNÚPÈäó—vˆûµ_ð+ޤ‹®È¾‚(*{¼¨_Çþ=©¯ ŠÚV ‚î+8¼Ùþ|;‹”X_Áaôv=186¶·ÍpK6¦—†ŽÚŒW-¡êe>MÔó—ÔŽ®z¡›þÂáÂ"GÑBfÙ­L24ƒ´^€Ò.ÇoÛm;4¢øÐî&xÎ#޶¨8®cþeãš*Fp†Ý¹ªp´h]¸èÂ9.•í¦½‰t­<¦=œOYß<uÛ™ýºNaïÚÛ5‘»}¬äÐËq(à^wý¿öÔR>ôê«ßKÌp(€¸«/Îhœ‰©ç§ÓóÔ5¬„;,! Ü«ö‡añæPþgkÑ Ík<Š€ƒP;"ƒ4Ç[PÑn„O„‚“Ã"ëóéõÔaíŽC„ý>¬Û­®8u2Y¸­P¿L«–qÚ\¹ûPг#Ê\¥ö¹= ¸îtx'`óð–òŤ •?µ!  éu¿ ªþIü
{v›»¾%ÛÄž:$5Ús,-¬€õwQž/x.ç¾ÐŽCÆ­¯
Ù¾ñ䬛ÇÅöæÓß+Œ†fËÌÒbGdhÖxÑ,y=Ÿ`Þ6x@$µüxÊžPé‡(@Ôûf{Oec àPqdXyÚ°+…ÿ‡,@ÖEs¿Ø·{îZ(e%du;"££TØ»J[HF¾Iôß ¨”v“§î„õ"„¡Â^ëû‡ý¶Ýí–n½½PMÊDÄoõYãH©>¹twýáøÖ^>ß ”)µ§§nÛHÕ {Ût]Cw‘ªÇóò+
î¬ÈM‹eÂómâXär/ðöb
Æ-x¤kà wg±ý/Ññh]¦à !@ã4¢èÝYñòûÝïþH¸»h"–«Xµ%òïùD݆°OG‹Kù@ªÌç¿(
XÔo‡îšìoxú¶Ž®g4+`iäZæéBSC°¤³‡fhnà¾Q+y M,òÑA®V²–xA½¦¯¬QRÍ9-à@¿lo~pë ":•Lb3Ë “±B‹•«ú{âÒñmäø|'€À”Èt08 ›ŽgÃ'à¡@™PiyÚ°ä£YÃèt,8M¢BÓ@zÿN L0:4=eØTóßÌ ŒÏ'¾Œ
Óœû_Îc_.¾¯âs|F>ß ˆôŠÏÁl 0@Xb˜£€‡ÈKSdqfò[ÀBw ¹ßºÅX=Ó5ÈX`Àîy*=íˆ
¦òï*=G¾q\ÀGLŒVÀ5¿f vcÍӇ柿:
8Ú»f¸_/ºR>ÿõiVD¼ZM—–݈ôj5Þ‰Öný;sñºØ•!Î\<yïåOèXäj9üãUsùË„C»ÍJ.¿tdôy0ë!¢q¾H8c9®>•…ÂZ é숌J™c­tÓl"¹f"Ú–”
ù(à€‘\3©Ã6Žp0ãî…ÎÏ ï³¢x•Z—Ï G¤GÞ¬þéöÏÃ.Ö&œ˜*à®wð'r“ÜWŸ@— „¡Âþy Û„“º½¾RÏ`(€°?\é<öñGú
K=ô?C"
T u†§
å0ìêC
«ÙRµð¤
l97@ÊO}y:«Ü]P7aÃE¬Ráx)<=VÝl,ñàÒº(’Žh'u[]Ìa(à®è7ûÃ`Ž¿¨ãÓn;B&
ó#”Ÿý@ŬéÌŽ{†tˆ¤bÖ×îLWJÎX(P¸ƒZª0iÃ%Ã|ôýذȢb¶úûw]ÌüK¡Wç5^°8e&ÉK…·"Þ¼ÿéü*;ÍÎ>\\f—ýÝþs3´Ù‡´SÞ5ÛC³}! ÍqZqóÛ­Ñÿ>ù?7±½endstream
endobj
254 0 obj
2716
endobj
255 0 obj<</Type/Page/Parent 197 0 R/Contents 256 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 7 0 R>>>>>>endobj
256 0 obj<</Length 257 0 R/Filter/FlateDecode>>stream
xÚ+ä2T0BCc3JÎår
áÒw³P04TIS041ѳT072PIÑp rt QÐUp
VÎO+)O,JU-N-*VðMÌ+MÌÑ ÉâÒ…èÑ…jÊÌ º†pr¿%endstream
endobj
257 0 obj
102
endobj
258 0 obj<</Count 5/First 259 0 R/Last 279 0 R>>endobj
259 0 obj<</Parent 258 0 R/Title(Table of Contents)/Dest[252 0 R/XYZ null 756 null]/Next 260 0 R>>endobj
260 0 obj<</Parent 258 0 R/Count -2/First 261 0 R/Last 262 0 R/Title(Preface)/Dest[204 0 R/XYZ null 743 null]/Prev 259 0 R/Next 263 0 R>>endobj
261 0 obj<</Parent 260 0 R/Title(System Overview)/Dest[204 0 R/XYZ null 371 null]/Next 262 0 R>>endobj
262 0 obj<</Parent 260 0 R/Title(Document Overview)/Dest[207 0 R/XYZ null 736 null]/Prev 261 0 R>>endobj
263 0 obj<</Parent 258 0 R/Count -7/First 264 0 R/Last 270 0 R/Title(1 - Printing System Overview)/Dest[210 0 R/XYZ null 743 null]/Prev 260 0 R/Next 271 0 R>>endobj
264 0 obj<</Parent 263 0 R/Title(The Printing Problem)/Dest[210 0 R/XYZ null 371 null]/Next 265 0 R>>endobj
265 0 obj<</Parent 263 0 R/Title(The Technology)/Dest[213 0 R/XYZ null 736 null]/Prev 264 0 R/Next 266 0 R>>endobj
266 0 obj<</Parent 263 0 R/Title(Jobs)/Dest[213 0 R/XYZ null 478 null]/Prev 265 0 R/Next 267 0 R>>endobj
267 0 obj<</Parent 263 0 R/Title(Classes)/Dest[213 0 R/XYZ null 372 null]/Prev 266 0 R/Next 268 0 R>>endobj
268 0 obj<</Parent 263 0 R/Title(Filters)/Dest[213 0 R/XYZ null 280 null]/Prev 267 0 R/Next 269 0 R>>endobj
269 0 obj<</Parent 263 0 R/Title(Printer Drivers)/Dest[216 0 R/XYZ null 736 null]/Prev 268 0 R/Next 270 0 R>>endobj
270 0 obj<</Parent 263 0 R/Title(Networking)/Dest[216 0 R/XYZ null 636 null]/Prev 269 0 R>>endobj
271 0 obj<</Parent 258 0 R/Count -7/First 272 0 R/Last 278 0 R/Title(2 - Using the Printing System)/Dest[222 0 R/XYZ null 743 null]/Prev 263 0 R/Next 279 0 R>>endobj
272 0 obj<</Parent 271 0 R/Title(Submitting Files for Printing)/Dest[222 0 R/XYZ null 371 null]/Next 273 0 R>>endobj
273 0 obj<</Parent 271 0 R/Title(Choosing a Printer)/Dest[225 0 R/XYZ null 736 null]/Prev 272 0 R/Next 274 0 R>>endobj
274 0 obj<</Parent 271 0 R/Title(Setting Printer Options)/Dest[225 0 R/XYZ null 445 null]/Prev 273 0 R/Next 275 0 R>>endobj
275 0 obj<</Parent 271 0 R/Title(Printing Multiple Copies)/Dest[225 0 R/XYZ null 236 null]/Prev 274 0 R/Next 276 0 R>>endobj
276 0 obj<</Parent 271 0 R/Title(Checking the Printer Status from the Command-Line)/Dest[228 0 R/XYZ null 714 null]/Prev 275 0 R/Next 277 0 R>>endobj
277 0 obj<</Parent 271 0 R/Title(Checking the Printer Status from the Web)/Dest[228 0 R/XYZ null 382 null]/Prev 276 0 R/Next 278 0 R>>endobj
278 0 obj<</Parent 271 0 R/Title(Canceling a Print Job)/Dest[228 0 R/XYZ null 276 null]/Prev 277 0 R>>endobj
279 0 obj<</Parent 258 0 R/Count -3/First 280 0 R/Last 293 0 R/Title(3 - Standard Printer Options)/Dest[234 0 R/XYZ null 743 null]/Prev 271 0 R>>endobj
280 0 obj<</Parent 279 0 R/Count -6/First 281 0 R/Last 286 0 R/Title(General Options)/Dest[234 0 R/XYZ null 371 null]/Next 287 0 R>>endobj
281 0 obj<</Parent 280 0 R/Title(Selecting the Media Size, Type, and Source)/Dest[234 0 R/XYZ null 286 null]/Next 282 0 R>>endobj
282 0 obj<</Parent 280 0 R/Title(Setting the Orientation)/Dest[237 0 R/XYZ null 571 null]/Prev 281 0 R/Next 283 0 R>>endobj
283 0 obj<</Parent 280 0 R/Title(Printing On Both Sides of the Paper)/Dest[237 0 R/XYZ null 474 null]/Prev 282 0 R/Next 284 0 R>>endobj
284 0 obj<</Parent 280 0 R/Title(Selecting a Range of Pages)/Dest[237 0 R/XYZ null 340 null]/Prev 283 0 R/Next 285 0 R>>endobj
285 0 obj<</Parent 280 0 R/Title(Setting the Brightness)/Dest[240 0 R/XYZ null 729 null]/Prev 284 0 R/Next 286 0 R>>endobj
286 0 obj<</Parent 280 0 R/Title(Setting the Gamma Correction)/Dest[240 0 R/XYZ null 609 null]/Prev 285 0 R>>endobj
287 0 obj<</Parent 279 0 R/Count -5/First 288 0 R/Last 292 0 R/Title(Text Options)/Dest[240 0 R/XYZ null 479 null]/Prev 280 0 R/Next 293 0 R>>endobj
288 0 obj<</Parent 287 0 R/Title(Setting the Number of Characters Per Inch)/Dest[240 0 R/XYZ null 394 null]/Next 289 0 R>>endobj
289 0 obj<</Parent 287 0 R/Title(Setting the Number of Lines Per Inch)/Dest[240 0 R/XYZ null 297 null]/Prev 288 0 R/Next 290 0 R>>endobj
290 0 obj<</Parent 287 0 R/Title(Setting the Number of Columns)/Dest[240 0 R/XYZ null 201 null]/Prev 289 0 R/Next 291 0 R>>endobj
291 0 obj<</Parent 287 0 R/Title(Setting the Page Margins)/Dest[243 0 R/XYZ null 729 null]/Prev 290 0 R/Next 292 0 R>>endobj
292 0 obj<</Parent 287 0 R/Title(Pretty Printing)/Dest[243 0 R/XYZ null 563 null]/Prev 291 0 R>>endobj
293 0 obj<</Parent 279 0 R/Count -3/First 294 0 R/Last 296 0 R/Title(Image Options)/Dest[243 0 R/XYZ null 459 null]/Prev 287 0 R>>endobj
294 0 obj<</Parent 293 0 R/Title(Scaling the Image)/Dest[243 0 R/XYZ null 374 null]/Next 295 0 R>>endobj
295 0 obj<</Parent 293 0 R/Title(Adjusting the Hue \(Tint\) of an Image)/Dest[243 0 R/XYZ null 148 null]/Prev 294 0 R/Next 296 0 R>>endobj
296 0 obj<</Parent 293 0 R/Title(Adjusting the Saturation \(Color\) of an Image)/Dest[246 0 R/XYZ null 473 null]/Prev 295 0 R>>endobj
297 0 obj<</Type/Catalog/Pages 197 0 R/Names 157 0 R/ViewerPreferences<</PageLayout/TwoColumnRight>>/Outlines 258 0 R/PageMode/UseOutlines/OpenAction[204 0 R/XYZ null null null]>>endobj
xref
0 298
0000000000 65535 f
0000000015 00000 n
0000000218 00000 n
0000000279 00000 n
0000000353 00000 n
0000000431 00000 n
0000000508 00000 n
0000000587 00000 n
0000000663 00000 n
0000000744 00000 n
0000000802 00000 n
0000000907 00000 n
0000001012 00000 n
0000001043 00000 n
0000001094 00000 n
0000001179 00000 n
0000001203 00000 n
0000001307 00000 n
0000001412 00000 n
0000001517 00000 n
0000001622 00000 n
0000001727 00000 n
0000001830 00000 n
0000001933 00000 n
0000002037 00000 n
0000002142 00000 n
0000002247 00000 n
0000002352 00000 n
0000002457 00000 n
0000002562 00000 n
0000002667 00000 n
0000002772 00000 n
0000002877 00000 n
0000002982 00000 n
0000003087 00000 n
0000003192 00000 n
0000003297 00000 n
0000003402 00000 n
0000003505 00000 n
0000003608 00000 n
0000003712 00000 n
0000003817 00000 n
0000003922 00000 n
0000004027 00000 n
0000004132 00000 n
0000004237 00000 n
0000004342 00000 n
0000004447 00000 n
0000004552 00000 n
0000004657 00000 n
0000004762 00000 n
0000004867 00000 n
0000004972 00000 n
0000005077 00000 n
0000005182 00000 n
0000005287 00000 n
0000005392 00000 n
0000005497 00000 n
0000005602 00000 n
0000005707 00000 n
0000005812 00000 n
0000005917 00000 n
0000006022 00000 n
0000006127 00000 n
0000006232 00000 n
0000006337 00000 n
0000006442 00000 n
0000006547 00000 n
0000006652 00000 n
0000006757 00000 n
0000006862 00000 n
0000006967 00000 n
0000007072 00000 n
0000007177 00000 n
0000007282 00000 n
0000007385 00000 n
0000007488 00000 n
0000007592 00000 n
0000007697 00000 n
0000007802 00000 n
0000007907 00000 n
0000008012 00000 n
0000008117 00000 n
0000008222 00000 n
0000008327 00000 n
0000008432 00000 n
0000008537 00000 n
0000008642 00000 n
0000008747 00000 n
0000008852 00000 n
0000008957 00000 n
0000009062 00000 n
0000009167 00000 n
0000009272 00000 n
0000009377 00000 n
0000009482 00000 n
0000009587 00000 n
0000009692 00000 n
0000009797 00000 n
0000009902 00000 n
0000010007 00000 n
0000010113 00000 n
0000010219 00000 n
0000010325 00000 n
0000010431 00000 n
0000010537 00000 n
0000010643 00000 n
0000010749 00000 n
0000010855 00000 n
0000010961 00000 n
0000011067 00000 n
0000011173 00000 n
0000011279 00000 n
0000011385 00000 n
0000011491 00000 n
0000011597 00000 n
0000011703 00000 n
0000011809 00000 n
0000011915 00000 n
0000012021 00000 n
0000012127 00000 n
-ªßŽæ‘Úš¥þ®¾EÊ«eЧÙeªÖ1`p9ÃfwØìî–q¡Ëj¥?š‡Óˆ‹}‚ž¾~E™¯Ê†óH‹Œzñpô‡§Jn2¿Rúðƒ´„¦J+Í}KxfÂjÏHðƒÿ œn‰9Ú#hßaâóp~äõzì%pé)|Ë1éèÍGU':¹,¯´!°GP»¾ßõÛþî˷ͨ˜NŸ§´¶Ëˆ9¥2+¤9ea†_úëý·-ÀêÓ¯nbF\[£ËŠz©@ηÍ~ßî—ª¾¶JÌ Ú©þ “OÌ€4Ïíjðv³=´Ã‚Atí¡N:PbFÉ “w
–D3 ’—^Zo‡å|ä!±9ç÷ã°ù´hc‘ŸX:ÒmVY “ˆ«J‡‡Pf•µ‰´_ÛÃç~øS¯– yùdJÕTc@á*‹Â$"¨#íß“
WY”6!qºpuxS_|;‹”Xáê0zm¨C N#çÞ,f<u“if¿N#ë@-èž2|@ÅÜz8¨x™å# Îªõ¾'
Ñ–Ô IeäTÂn˜J­
–Jâ®âxÝm´Y=:lîa< ç帖´{ÂGž¾ÝØÊæØW×°‚Ï5' Ã-ÙbiÍ^Ìå1Oë
,3U_—ÙV2»êœß÷=ý9{D“̋ӈkΤ
QbV…dçY°¸.Tõ õ€ªˆct„å¶­q@:†›²ü²|sR#”¶竤BÅׇ¼]@s¶—ôpØô»¥B…ŸÄö3æ&Ìn©”îÍ€t
“«*m‰ñˆ¶ÑY…|œGÞûãö°yضT:œжÝ}tH<ï6K;^½¼obŽÉs[(™¬b¤cr†;¶ûvýgBC|]êLàqš%T%ž2,P¦ˆðQ8ϼª„üø<‚æ)Ø”<'€ÀËCs8R ¨Gм
ö´!w;ôD×Ð××´ú«·u)–óÕ;½oä£Ç¬^õ¼ïºfwóê_›ÝÂL™ÿý]Ó!*ªÒÖT1v@…¨¨*[[$†¨Ã›(
ð8¸xˆ:’Ÿ…ó•WõÄCt䙸 xNi!:òL…<@^JˆŽ´ú«·u)–óÕuˆò\/…!¬^õ?íõB²ÍŸ§+‹V³àèh…¢×Èhuç¬çÍnÝnép:\Ùø0®vZE CO–L(²PÍ&Œ Ujµœ´¡Éç/í÷K¿à=&O¤‹^“}!K{¼¨_Çþ=©¯ de«Þlÿ¾EJ¬¯à0z»ž‡œFŽN»›f¸!ÓKCGmÆ+äDK¨z™OÕü%µÀ„£«^覿p¸°ÈQ´Ò,»¥I†fÖ BÙåø]»k‡fK¿ÚÀÂyÄѧuÌ¿l\SÅΰû¡V%Ž­ ]8Ç¥²Ý¶ëH×ÊcÚÓÁ:|‚à)ë›§n;"³_× ì}{³!r·€•zÙ!Üënþ×þƒZÊ'€^}õ{‰wõåÂù31àœâtú!`žº†p‡%„¡€{Õþ8,ÞÊŸâl-¤y…GpjGdæx ð‰PprXd}¾@ ¢ž:¬=Ðña(€°ß†M»Ó§N& ·ª—iÕ2Nûƒ×î>´Áìˆò¯SûÜÜw:¼°yxGùbÒ…ÊŠÚ†ô¦?ÜSUÿ¤
~…=HÈB»ÍÝÜmbOO=Ús,-¬€õ·©=_ð\Í}¡‡Œ[_²
È X/6‹íͧ¿W
Í
/–™¥ÅŽÈЬð¢Yòz6>Á¼mð'€Hjùñ”!<¡ÒQ(€¨ß›Ý•y<DP€CÄ‘aåiîþ²PYÍÝbßî¹k¡ht–xÕíˆŒŽ¢ÆÞUÚB2òM¢øN Ni7yêàNX/B
ìͰ¹»?ìÚý~éÖÛ Õ¤LDü¡ðVŸ5ŽR‘ê“+wg0ÑŽoíåó@‘R{zê¶TÎ`(€°wM×5t©q</¾Â¡âÎûa€Ü´X&<ß&ŽE.Çq‰·+0®ä‘®
—îÎbûÑñh]VÃB€ÆiDÑ»3ùòûÝG$Ü] 4ËëXµ%òÇ|"ŽnCا£€Å¥| Uäó_,ê×cwMö7<}[GW3š°4r-ót¡)
XÒù}34k¸/FÔJCe>:ÈÕJVÀ/¨×ô•5JÕó_N 8ÐÏ»õýBÃîb=ADG£’)lf™ a*Vh±bU=&.ßFŽÏwL‰L³ÀPa‰±éx6|
 •–§
ë@>š5ŒNÇ‚Ó$*4=ô  ÷à´À£CÓS†A9ÿ͜ˆð|â˸Ñ0͹_ñå<VñåâqŸãÛ0òùN@¤W|fc(€¡ÂÃÔñl<@^B˜"3“ß
¸KÈýöØ-.Àõ3]ƒŒìž§ÒÓŽ¨À`uþ¨ÒsäÇ|pÀ„Àa®ù…0+à`°#hž>4øüÕQÀÑÞ7ÃÝfÑ•êù¯O3ñj9]Zv#Ò«åx'Z»õKìÌeÄëbW…x8sñhäu¼—?¡c‘«åðWÍå/4+L¸üÜ‘ÑçÁ¬‡XˆÆy™pÆrZ5|4*eµÒÙ•*ÇZiÝl#¹f"Ú–TòQÀ#¹fR‡m.„0+à`ÆÝ ŸÞgE="ð*µ.ŸŽH¼YýÃÍÇ}¬M81!UÀ]ïà N å&¹¯>.AC„ýóH¶ 'u{}¥šÁPa¿»Òyìã÷ô–j"ÖÐÿ ‰(P&Ôž6”ð«Y(€¬fGÕ“6°ÅÜlNYT(?õåéh¬rwAÝ„
±J…ã¥ðôXuO°±ÄƒKëV@&ÑN궺˜ÃPÀ]ÑoÇÁQÆ=¦Ýv„L@æG(?ûŠYÒ™÷ éIŬ¯Ý™®”š±P@ºƒZª0iÃ%Ã|ôýذȢb¶üûw]ÌüK¡×o+¼`ñŠåp§j¼qþáâ2»ìoŸ›¡Í>ì¡ò¾Ù›-è ¦²W%7¿ÓMðï³ÿó_º´endstream
endobj
254 0 obj
2708
endobj
255 0 obj<</Type/Page/Parent 197 0 R/Contents 256 0 R/Resources<</ProcSet[/PDF/Text]/Font<</F8 7 0 R>>>>>>endobj
256 0 obj<</Length 257 0 R/Filter/FlateDecode>>stream
xÚ+ä2T0BCc3JÎår
áÒw³P04TIS04³Ô3U072PIÑp
VÎO+)O,JU-N-*VðMÌ+MÌÑ ÉâÒ…¨Õ…*ÎÌ º†prÇvMendstream
endobj
257 0 obj
94
endobj
258 0 obj<</Count 5/First 259 0 R/Last 279 0 R>>endobj
259 0 obj<</Parent 258 0 R/Title(Table of Contents)/Dest[252 0 R/XYZ null 756 null]/Next 260 0 R>>endobj
260 0 obj<</Parent 258 0 R/Count -2/First 261 0 R/Last 262 0 R/Title(Preface)/Dest[204 0 R/XYZ null 743 null]/Prev 259 0 R/Next 263 0 R>>endobj
261 0 obj<</Parent 260 0 R/Title(System Overview)/Dest[204 0 R/XYZ null 371 null]/Next 262 0 R>>endobj
262 0 obj<</Parent 260 0 R/Title(Document Overview)/Dest[207 0 R/XYZ null 736 null]/Prev 261 0 R>>endobj
263 0 obj<</Parent 258 0 R/Count -7/First 264 0 R/Last 270 0 R/Title(1 - Printing System Overview)/Dest[210 0 R/XYZ null 743 null]/Prev 260 0 R/Next 271 0 R>>endobj
264 0 obj<</Parent 263 0 R/Title(The Printing Problem)/Dest[210 0 R/XYZ null 371 null]/Next 265 0 R>>endobj
265 0 obj<</Parent 263 0 R/Title(The Technology)/Dest[213 0 R/XYZ null 736 null]/Prev 264 0 R/Next 266 0 R>>endobj
266 0 obj<</Parent 263 0 R/Title(Jobs)/Dest[213 0 R/XYZ null 478 null]/Prev 265 0 R/Next 267 0 R>>endobj
267 0 obj<</Parent 263 0 R/Title(Classes)/Dest[213 0 R/XYZ null 372 null]/Prev 266 0 R/Next 268 0 R>>endobj
268 0 obj<</Parent 263 0 R/Title(Filters)/Dest[213 0 R/XYZ null 280 null]/Prev 267 0 R/Next 269 0 R>>endobj
269 0 obj<</Parent 263 0 R/Title(Printer Drivers)/Dest[216 0 R/XYZ null 736 null]/Prev 268 0 R/Next 270 0 R>>endobj
270 0 obj<</Parent 263 0 R/Title(Networking)/Dest[216 0 R/XYZ null 636 null]/Prev 269 0 R>>endobj
271 0 obj<</Parent 258 0 R/Count -7/First 272 0 R/Last 278 0 R/Title(2 - Using the Printing System)/Dest[222 0 R/XYZ null 743 null]/Prev 263 0 R/Next 279 0 R>>endobj
272 0 obj<</Parent 271 0 R/Title(Submitting Files for Printing)/Dest[222 0 R/XYZ null 371 null]/Next 273 0 R>>endobj
273 0 obj<</Parent 271 0 R/Title(Choosing a Printer)/Dest[225 0 R/XYZ null 736 null]/Prev 272 0 R/Next 274 0 R>>endobj
274 0 obj<</Parent 271 0 R/Title(Setting Printer Options)/Dest[225 0 R/XYZ null 445 null]/Prev 273 0 R/Next 275 0 R>>endobj
275 0 obj<</Parent 271 0 R/Title(Printing Multiple Copies)/Dest[225 0 R/XYZ null 236 null]/Prev 274 0 R/Next 276 0 R>>endobj
276 0 obj<</Parent 271 0 R/Title(Checking the Printer Status from the Command-Line)/Dest[228 0 R/XYZ null 714 null]/Prev 275 0 R/Next 277 0 R>>endobj
277 0 obj<</Parent 271 0 R/Title(Checking the Printer Status from the Web)/Dest[228 0 R/XYZ null 382 null]/Prev 276 0 R/Next 278 0 R>>endobj
278 0 obj<</Parent 271 0 R/Title(Canceling a Print Job)/Dest[228 0 R/XYZ null 276 null]/Prev 277 0 R>>endobj
279 0 obj<</Parent 258 0 R/Count -3/First 280 0 R/Last 293 0 R/Title(3 - Standard Printer Options)/Dest[234 0 R/XYZ null 743 null]/Prev 271 0 R>>endobj
280 0 obj<</Parent 279 0 R/Count -6/First 281 0 R/Last 286 0 R/Title(General Options)/Dest[234 0 R/XYZ null 371 null]/Next 287 0 R>>endobj
281 0 obj<</Parent 280 0 R/Title(Selecting the Media Size, Type, and Source)/Dest[234 0 R/XYZ null 286 null]/Next 282 0 R>>endobj
282 0 obj<</Parent 280 0 R/Title(Setting the Orientation)/Dest[237 0 R/XYZ null 571 null]/Prev 281 0 R/Next 283 0 R>>endobj
283 0 obj<</Parent 280 0 R/Title(Printing On Both Sides of the Paper)/Dest[237 0 R/XYZ null 474 null]/Prev 282 0 R/Next 284 0 R>>endobj
284 0 obj<</Parent 280 0 R/Title(Selecting a Range of Pages)/Dest[237 0 R/XYZ null 340 null]/Prev 283 0 R/Next 285 0 R>>endobj
285 0 obj<</Parent 280 0 R/Title(Setting the Brightness)/Dest[240 0 R/XYZ null 729 null]/Prev 284 0 R/Next 286 0 R>>endobj
286 0 obj<</Parent 280 0 R/Title(Setting the Gamma Correction)/Dest[240 0 R/XYZ null 609 null]/Prev 285 0 R>>endobj
287 0 obj<</Parent 279 0 R/Count -5/First 288 0 R/Last 292 0 R/Title(Text Options)/Dest[240 0 R/XYZ null 479 null]/Prev 280 0 R/Next 293 0 R>>endobj
288 0 obj<</Parent 287 0 R/Title(Setting the Number of Characters Per Inch)/Dest[240 0 R/XYZ null 394 null]/Next 289 0 R>>endobj
289 0 obj<</Parent 287 0 R/Title(Setting the Number of Lines Per Inch)/Dest[240 0 R/XYZ null 297 null]/Prev 288 0 R/Next 290 0 R>>endobj
290 0 obj<</Parent 287 0 R/Title(Setting the Number of Columns)/Dest[240 0 R/XYZ null 201 null]/Prev 289 0 R/Next 291 0 R>>endobj
291 0 obj<</Parent 287 0 R/Title(Setting the Page Margins)/Dest[243 0 R/XYZ null 729 null]/Prev 290 0 R/Next 292 0 R>>endobj
292 0 obj<</Parent 287 0 R/Title(Pretty Printing)/Dest[243 0 R/XYZ null 563 null]/Prev 291 0 R>>endobj
293 0 obj<</Parent 279 0 R/Count -3/First 294 0 R/Last 296 0 R/Title(Image Options)/Dest[243 0 R/XYZ null 459 null]/Prev 287 0 R>>endobj
294 0 obj<</Parent 293 0 R/Title(Scaling the Image)/Dest[243 0 R/XYZ null 374 null]/Next 295 0 R>>endobj
295 0 obj<</Parent 293 0 R/Title(Adjusting the Hue \(Tint\) of an Image)/Dest[243 0 R/XYZ null 148 null]/Prev 294 0 R/Next 296 0 R>>endobj
296 0 obj<</Parent 293 0 R/Title(Adjusting the Saturation \(Color\) of an Image)/Dest[246 0 R/XYZ null 473 null]/Prev 295 0 R>>endobj
297 0 obj<</Type/Catalog/Pages 197 0 R/Names 157 0 R/ViewerPreferences<</PageLayout/TwoColumnRight>>/Outlines 258 0 R/PageMode/UseOutlines/OpenAction[204 0 R/XYZ null null null]>>endobj
xref
0 298
0000000000 65535 f
0000000015 00000 n
0000000210 00000 n
0000000271 00000 n
0000000345 00000 n
0000000423 00000 n
0000000500 00000 n
0000000579 00000 n
0000000655 00000 n
0000000736 00000 n
0000000794 00000 n
0000000899 00000 n
0000001004 00000 n
0000001035 00000 n
0000001086 00000 n
0000001171 00000 n
0000001195 00000 n
0000001299 00000 n
0000001404 00000 n
0000001509 00000 n
0000001614 00000 n
0000001719 00000 n
0000001822 00000 n
0000001925 00000 n
0000002029 00000 n
0000002134 00000 n
0000002239 00000 n
0000002344 00000 n
0000002449 00000 n
0000002554 00000 n
0000002659 00000 n
0000002764 00000 n
0000002869 00000 n
0000002974 00000 n
0000003079 00000 n
0000003184 00000 n
0000003289 00000 n
0000003394 00000 n
0000003497 00000 n
0000003600 00000 n
0000003704 00000 n
0000003809 00000 n
0000003914 00000 n
0000004019 00000 n
0000004124 00000 n
0000004229 00000 n
0000004334 00000 n
0000004439 00000 n
0000004544 00000 n
0000004649 00000 n
0000004754 00000 n
0000004859 00000 n
0000004964 00000 n
0000005069 00000 n
0000005174 00000 n
0000005279 00000 n
0000005384 00000 n
0000005489 00000 n
0000005594 00000 n
0000005699 00000 n
0000005804 00000 n
0000005909 00000 n
0000006014 00000 n
0000006119 00000 n
0000006224 00000 n
0000006329 00000 n
0000006434 00000 n
0000006539 00000 n
0000006644 00000 n
0000006749 00000 n
0000006854 00000 n
0000006959 00000 n
0000007064 00000 n
0000007169 00000 n
0000007274 00000 n
0000007377 00000 n
0000007480 00000 n
0000007584 00000 n
0000007689 00000 n
0000007794 00000 n
0000007899 00000 n
0000008004 00000 n
0000008109 00000 n
0000008214 00000 n
0000008319 00000 n
0000008424 00000 n
0000008529 00000 n
0000008634 00000 n
0000008739 00000 n
0000008844 00000 n
0000008949 00000 n
0000009054 00000 n
0000009159 00000 n
0000009264 00000 n
0000009369 00000 n
0000009474 00000 n
0000009579 00000 n
0000009684 00000 n
0000009789 00000 n
0000009894 00000 n
0000009999 00000 n
0000010105 00000 n
0000010211 00000 n
0000010317 00000 n
0000010423 00000 n
0000010529 00000 n
0000010635 00000 n
0000010741 00000 n
0000010847 00000 n
0000010953 00000 n
0000011059 00000 n
0000011165 00000 n
0000011271 00000 n
0000011377 00000 n
0000011483 00000 n
0000011589 00000 n
0000011695 00000 n
0000011801 00000 n
0000011907 00000 n
0000012013 00000 n
0000012119 00000 n
0000012225 00000 n
0000012331 00000 n
0000012437 00000 n
0000012543 00000 n
0000012649 00000 n
0000012339 00000 n
0000012445 00000 n
0000012551 00000 n
0000012657 00000 n
0000012763 00000 n
0000012869 00000 n
0000012975 00000 n
0000013081 00000 n
0000013187 00000 n
0000013293 00000 n
0000013399 00000 n
0000013505 00000 n
0000013611 00000 n
0000013717 00000 n
0000013823 00000 n
0000013929 00000 n
0000014035 00000 n
0000014141 00000 n
0000014247 00000 n
0000014353 00000 n
0000014459 00000 n
0000014565 00000 n
0000014671 00000 n
0000014777 00000 n
0000014883 00000 n
0000014989 00000 n
0000015095 00000 n
0000015201 00000 n
0000015307 00000 n
0000015413 00000 n
0000015519 00000 n
0000015625 00000 n
0000015731 00000 n
0000015837 00000 n
0000015943 00000 n
0000016997 00000 n
0000017031 00000 n
0000017065 00000 n
0000017576 00000 n
0000017625 00000 n
0000017674 00000 n
0000017723 00000 n
0000017772 00000 n
0000017821 00000 n
0000017870 00000 n
0000017919 00000 n
0000017968 00000 n
0000018017 00000 n
0000018066 00000 n
0000018115 00000 n
0000018164 00000 n
0000018213 00000 n
0000018262 00000 n
0000018311 00000 n
0000018360 00000 n
0000018409 00000 n
0000018458 00000 n
0000018507 00000 n
0000018556 00000 n
0000018605 00000 n
0000018654 00000 n
0000018703 00000 n
0000018752 00000 n
0000018801 00000 n
0000018850 00000 n
0000012755 00000 n
0000012861 00000 n
0000012967 00000 n
0000013073 00000 n
0000013179 00000 n
0000013285 00000 n
0000013391 00000 n
0000013497 00000 n
0000013603 00000 n
0000013709 00000 n
0000013815 00000 n
0000013921 00000 n
0000014027 00000 n
0000014133 00000 n
0000014239 00000 n
0000014345 00000 n
0000014451 00000 n
0000014557 00000 n
0000014663 00000 n
0000014769 00000 n
0000014875 00000 n
0000014981 00000 n
0000015087 00000 n
0000015193 00000 n
0000015299 00000 n
0000015405 00000 n
0000015511 00000 n
0000015617 00000 n
0000015723 00000 n
0000015829 00000 n
0000015935 00000 n
0000016989 00000 n
0000017023 00000 n
0000017057 00000 n
0000017568 00000 n
0000017617 00000 n
0000017666 00000 n
0000017715 00000 n
0000017764 00000 n
0000017813 00000 n
0000017862 00000 n
0000017911 00000 n
0000017960 00000 n
0000018009 00000 n
0000018058 00000 n
0000018107 00000 n
0000018156 00000 n
0000018205 00000 n
0000018254 00000 n
0000018303 00000 n
0000018352 00000 n
0000018401 00000 n
0000018450 00000 n
0000018499 00000 n
0000018548 00000 n
0000018597 00000 n
0000018646 00000 n
0000018695 00000 n
0000018744 00000 n
0000018793 00000 n
0000018842 00000 n
0000018891 00000 n
0000018940 00000 n
0000018989 00000 n
0000019038 00000 n
0000019087 00000 n
0000018948 00000 n
0000018997 00000 n
0000019046 00000 n
0000019095 00000 n
0000019144 00000 n
0000019193 00000 n
0000019242 00000 n
0000019291 00000 n
0000019340 00000 n
0000019389 00000 n
0000019618 00000 n
0000019770 00000 n
0000026151 00000 n
0000026173 00000 n
0000026286 00000 n
0000026388 00000 n
0000019136 00000 n
0000019185 00000 n
0000019234 00000 n
0000019283 00000 n
0000019332 00000 n
0000019381 00000 n
0000019610 00000 n
0000019762 00000 n
0000026131 00000 n
0000026153 00000 n
0000026266 00000 n
0000026368 00000 n
0000026388 00000 n
0000026519 00000 n
0000027280 00000 n
0000027301 00000 n
0000027441 00000 n
0000026539 00000 n
0000027300 00000 n
0000027321 00000 n
0000027461 00000 n
0000027828 00000 n
0000027849 00000 n
0000027989 00000 n
0000028903 00000 n
0000028924 00000 n
0000029064 00000 n
0000030502 00000 n
0000027803 00000 n
0000027824 00000 n
0000027964 00000 n
0000028878 00000 n
0000028899 00000 n
0000029039 00000 n
0000030469 00000 n
0000030491 00000 n
0000030631 00000 n
0000031517 00000 n
0000031538 00000 n
0000031651 00000 n
0000031838 00000 n
0000031577 00000 n
0000031859 00000 n
0000031999 00000 n
+2 -2
Ver Arquivo
@@ -2,9 +2,9 @@
<HEAD>
<META NAME="Description" CONTENT="Common UNIX Printing System Software Users Manual">
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
<META NAME="DOCNUMBER" CONTENT="CUPS-SUM-1.0.0b1">
<META NAME="DOCNUMBER" CONTENT="CUPS-SUM-1.0.0">
<META NAME="Author" CONTENT="Easy Software Products">
<TITLE>DRAFT - CUPS Software Users Manual</TITLE>
<TITLE>CUPS Software Users Manual</TITLE>
</HEAD>
<BODY>
-149
Ver Arquivo
@@ -1,149 +0,0 @@
<HTML>
<HEAD>
<TITLE>CUPS Software Version Description</TITLE>
<META NAME="AUTHOR" CONTENT="Easy Software Products">
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
<META NAME="DOCNUMBER" CONTENT="CUPS-SVD-1.0.0">
</HEAD>
<BODY>
<CENTER><A HREF=#contents><IMG SRC="images/cups-large.gif" BORDER=0><BR>
<H1>CUPS Software Version Description</H1></A><BR>
CUPS-SVD-1.0.0<BR>
Easy Software Products<BR>
Copyright 1997-1999, All Rights Reserved<BR>
</CENTER>
<HR>
<H1 ALIGN=CENTER><A NAME=CONTENTS>Table of Contents</A></H1>
<BR>
<BR><B><A HREF=#1>1 Scope</A></B>
<UL>
<LI><A HREF=#1_1>1.1 Identification</A></LI>
<LI><A HREF=#1_2>1.2 System Overview</A></LI>
<LI><A HREF=#1_3>1.3 Document Overview</A></LI>
</UL>
<B><A HREF=#2>2 References</A></B>
<UL>
<LI><A HREF=#2_1>2.1 CUPS Documentation</A></LI>
<LI><A HREF=#2_2>2.2 Other Documents</A></LI>
</UL>
<B><A HREF=#3>3 Additions</A></B>
<BR>
<BR><B><A HREF=#4>4 Changes</A></B>
<BR>
<BR><B><A HREF=#5>A Glossary</A></B>
<UL>
<LI><A HREF=#5_1>A.1 Terms</A></LI>
<LI><A HREF=#5_2>A.2 Acronyms</A></LI>
</UL>
<HR>
<H1><A NAME=1>1 Scope</A></H1>
<H2><A NAME=1_1>1.1 Identification</A></H2>
This software version description document provides release
information for the Common UNIX Printing System (&quot;CUPS&quot;) Version 1.0.
<H2><A NAME=1_2>1.2 System Overview</A></H2>
The Common UNIX Printing System provides a portable printing layer for
UNIX&reg; operating systems. It has been developed by Easy Software
Products to promote a standard printing solution for all UNIX vendors
and users. CUPS provides the System V and Berkeley command-line
interfaces.
<P>CUPS uses the Internet Printing Protocol (IETF-IPP) as the basis for
managing print jobs and queues. The Line Printer Daemon (LPD, RFC1179),
Server Message Block (SMB), and AppSocket protocols are also supported
with reduced functionality. </P>
<P>CUPS adds network printer browsing and PostScript Printer
Description (&quot;PPD&quot;)-based printing options to support real world
applications under UNIX. </P>
<P>CUPS also includes a customized version of GNU GhostScript
(currently based off GNU GhostScript 4.03) and an image file RIP that
can be used to support non-PostScript printers. </P>
<H2><A NAME=1_3>1.3 Document Overview</A></H2>
<P>This Something Something Something document is organized into the
following sections:</P>
<UL>
<LI>1 - Scope</LI>
<LI>2 - References</LI>
<LI>3 - Additions</LI>
<LI>4 - Changes</LI>
<LI>A - Glossary</LI>
</UL>
<H1><A NAME=2>2 References</A></H1>
<H2><A NAME=2_1>2.1 CUPS Documentation</A></H2>
The following CUPS documentation is referenced by this document:
<UL>
<LI>CUPS-CMP-1.0: CUPS Configuration Management Plan </LI>
<LI>CUPS-IDD-1.0: CUPS System Interface Design Description </LI>
<LI>CUPS-SAM-1.0.x: CUPS Software Administrators Manual </LI>
<LI>CUPS-SDD-1.0: CUPS Software Design Description </LI>
<LI>CUPS-SPM-1.0: CUPS Software Programming Manual </LI>
<LI>CUPS-SSR-1.0: CUPS Software Security Report </LI>
<LI>CUPS-STP-1.0: CUPS Software Test Plan </LI>
<LI>CUPS-SUM-1.0.x: CUPS Software Users Manual </LI>
<LI>CUPS-SVD-1.0.x: CUPS Software Version Description </LI>
</UL>
<H2><A NAME=2_2>2.2 Other Documents</A></H2>
The following non-CUPS documents are referenced by this document:
<UL>
<LI>IEEE 1387.4, System Administration: Printing (draft) </LI>
<LI>IPP/1.0: Additional Optional Operations - Set 1 </LI>
<LI>IPP/1.0: Encoding and Transport </LI>
<LI>IPP/1.0: Implementers Guide </LI>
<LI>IPP/1.0: Model and Semantics </LI>
<LI>RFC 1179, Line Printer Daemon Protocol </LI>
</UL>
<H1><A NAME=3>3 Additions</A></H1>
Since this is the first release of CUPS, there are no additions to
report.
<H1><A NAME=4>4 Changes</A></H1>
Since this is the first release of CUPS, there are no changes to
report.
<H1 TYPE=A VALUE=1><A NAME=5>A Glossary</A></H1>
<H2><A NAME=5_1>A.1 Terms</A></H2>
<DL>
<DT>C </DT>
<DD>A computer language. </DD>
<DT>parallel </DT>
<DD>Sending or receiving data more than 1 bit at a time. </DD>
<DT>pipe </DT>
<DD>A one-way communications channel between two programs. </DD>
<DT>serial </DT>
<DD>Sending or receiving data 1 bit at a time. </DD>
<DT>socket </DT>
<DD>A two-way network communications channel. </DD>
</DL>
<H2><A NAME=5_2>A.2 Acronyms</A></H2>
<DL>
<DT>ASCII </DT>
<DD>American Standard Code for Information Interchange </DD>
<DT>CUPS </DT>
<DD>Common UNIX Printing System </DD>
<DT>ESC/P </DT>
<DD>EPSON Standard Code for Printers </DD>
<DT>FTP </DT>
<DD>File Transfer Protocol </DD>
<DT>HP-GL </DT>
<DD>Hewlett-Packard Graphics Language </DD>
<DT>HP-PCL </DT>
<DD>Hewlett-Packard Printer Control Language </DD>
<DT>HP-PJL </DT>
<DD>Hewlett-Packard Printer Job Language </DD>
<DT>IETF </DT>
<DD>Internet Engineering Task Force </DD>
<DT>IPP </DT>
<DD>Internet Printing Protocol </DD>
<DT>ISO </DT>
<DD>International Standards Organization </DD>
<DT>LPD </DT>
<DD>Line Printer Daemon </DD>
<DT>MIME </DT>
<DD>Multimedia Internet Mail Exchange </DD>
<DT>PCL </DT>
<DD>Page Control Language </DD>
<DT>PPD </DT>
<DD>PostScript Printer Description </DD>
<DT>SMB </DT>
<DD>Server Message Block </DD>
<DT>TFTP </DT>
<DD>Trivial File Transfer Protocol </DD>
</DL>
</BODY>
</HTML>
BIN
Ver Arquivo
Arquivo binário não exibido.
-167
Ver Arquivo
@@ -1,167 +0,0 @@
<HTML>
<HEAD>
<META NAME="COPYRIGHT" CONTENT="Copyright 1997-1999, All Rights Reserved">
<META NAME="DOCNUMBER" CONTENT="CUPS-SVD-1.0.0">
<META NAME="Author" CONTENT="Easy Software Products">
<TITLE>CUPS Software Version Description</TITLE>
</HEAD>
<BODY>
<H1>Scope</H1>
<H2>Identification</H2>
This software version description document provides release information for the
Common UNIX Printing System ("CUPS") Version 1.0.
<H2>System Overview</H2>
The Common UNIX Printing System provides a portable printing layer for
UNIX&reg; operating systems. It has been developed by Easy Software
Products to promote a standard printing solution for all UNIX vendors
and users. CUPS provides the System V and Berkeley command-line interfaces.
<P>CUPS uses the Internet Printing Protocol (IETF-IPP) as the basis
for managing print jobs and queues. The Line Printer Daemon (LPD,
RFC1179), Server Message Block (SMB), and AppSocket protocols are also
supported with reduced functionality.
<P>CUPS adds network printer browsing and PostScript Printer
Description (&quot;PPD&quot;)-based printing options to support real
world applications under UNIX.
<P>CUPS also includes a customized version of GNU GhostScript
(currently based off GNU GhostScript 4.03) and an image file RIP that
can be used to support non-PostScript printers.
<H2>Document Overview</H2>
<P>This Something Something Something document is organized into the following
sections:</P>
<UL>
<LI>1 - Scope</LI>
<LI>2 - References</LI>
<LI>3 - Additions</LI>
<LI>4 - Changes</LI>
<LI>A - Glossary</LI>
</UL>
<H1>References</H1>
<H2>CUPS Documentation</H2>
The following CUPS documentation is referenced by this document:
<UL>
<LI>CUPS-CMP-1.0: CUPS Configuration Management Plan
<LI>CUPS-IDD-1.0: CUPS System Interface Design Description
<LI>CUPS-SAM-1.0.x: CUPS Software Administrators Manual
<LI>CUPS-SDD-1.0: CUPS Software Design Description
<LI>CUPS-SPM-1.0: CUPS Software Programming Manual
<LI>CUPS-SSR-1.0: CUPS Software Security Report
<LI>CUPS-STP-1.0: CUPS Software Test Plan
<LI>CUPS-SUM-1.0.x: CUPS Software Users Manual
<LI>CUPS-SVD-1.0.x: CUPS Software Version Description
</UL>
<H2>Other Documents</H2>
The following non-CUPS documents are referenced by this document:
<UL>
<LI>IEEE 1387.4, System Administration: Printing (draft)
<LI>IPP/1.0: Additional Optional Operations - Set 1
<LI>IPP/1.0: Encoding and Transport
<LI>IPP/1.0: Implementers Guide
<LI>IPP/1.0: Model and Semantics
<LI>RFC 1179, Line Printer Daemon Protocol
</UL>
<H1>Additions</H1>
Since this is the first release of CUPS, there are no additions to report.
<H1>Changes</H1>
Since this is the first release of CUPS, there are no changes to report.
<H1 TYPE=A VALUE=1>Glossary</H1>
<H2>Terms</H2>
<DL>
<DT>C
<DD>A computer language.
<DT>parallel
<DD>Sending or receiving data more than 1 bit at a time.
<DT>pipe
<DD>A one-way communications channel between two programs.
<DT>serial
<DD>Sending or receiving data 1 bit at a time.
<DT>socket
<DD>A two-way network communications channel.
</DL>
<H2>Acronyms</H2>
<DL>
<DT>ASCII
<DD>American Standard Code for Information Interchange
<DT>CUPS
<DD>Common UNIX Printing System
<DT>ESC/P
<DD>EPSON Standard Code for Printers
<DT>FTP
<DD>File Transfer Protocol
<DT>HP-GL
<DD>Hewlett-Packard Graphics Language
<DT>HP-PCL
<DD>Hewlett-Packard Printer Control Language
<DT>HP-PJL
<DD>Hewlett-Packard Printer Job Language
<DT>IETF
<DD>Internet Engineering Task Force
<DT>IPP
<DD>Internet Printing Protocol
<DT>ISO
<DD>International Standards Organization
<DT>LPD
<DD>Line Printer Daemon
<DT>MIME
<DD>Multimedia Internet Mail Exchange
<DT>PCL
<DD>Page Control Language
<DT>PPD
<DD>PostScript Printer Description
<DT>SMB
<DD>Server Message Block
<DT>TFTP
<DD>Trivial File Transfer Protocol
</DL>
</BODY>
</HTML>
+255
Ver Arquivo
@@ -0,0 +1,255 @@
/*
* "$Id$"
*
* Common filter routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* SetCommonOptions() - Set common filter options for media size, etc.
*/
/*
* Include necessary headers...
*/
#include "common.h"
/*
* Globals...
*/
int Orientation = 0, /* 0 = portrait, 1 = landscape, etc. */
Duplex = 0, /* Duplexed? */
LanguageLevel = 1, /* Language level of printer */
ColorDevice = 1; /* Do color text? */
float PageLeft = 18.0f, /* Left margin */
PageRight = 594.0f, /* Right margin */
PageBottom = 36.0f, /* Bottom margin */
PageTop = 756.0f, /* Top margin */
PageWidth = 612.0f, /* Total page width */
PageLength = 792.0f; /* Total page length */
/*
* 'SetCommonOptions()' - Set common filter options for media size, etc.
*/
ppd_file_t * /* O - PPD file */
SetCommonOptions(int num_options, /* I - Number of options */
cups_option_t *options, /* I - Options */
int change_size) /* I - Change page size? */
{
float temp; /* Swapping variable */
ppd_file_t *ppd; /* PPD file */
ppd_size_t *pagesize; /* Current page size */
const char *val; /* Option value */
ppd = ppdOpenFile(getenv("PPD"));
ppdMarkDefaults(ppd);
cupsMarkOptions(ppd, num_options, options);
if ((pagesize = ppdPageSize(ppd, NULL)) != NULL)
{
PageWidth = pagesize->width;
PageLength = pagesize->length;
PageTop = pagesize->top;
PageBottom = pagesize->bottom;
PageLeft = pagesize->left;
PageRight = pagesize->right;
fprintf(stderr, "DEBUG: Page = %.0fx%.0f; %.0f,%.0f to %.0f,%.0f\n",
PageWidth, PageLength, PageLeft, PageBottom, PageRight, PageTop);
}
if (ppd != NULL)
{
ColorDevice = ppd->color_device;
LanguageLevel = ppd->language_level;
}
if ((val = cupsGetOption("landscape", num_options, options)) != NULL)
Orientation = 1;
if ((val = cupsGetOption("orientation-requested", num_options, options)) != NULL)
{
/*
* Map IPP orientation values to 0 to 3:
*
* 3 = 0 degrees = 0
* 4 = 90 degrees = 1
* 5 = -90 degrees = 3
* 6 = 180 degrees = 2
*/
Orientation = atoi(val) - 3;
if (Orientation >= 2)
Orientation ^= 1;
}
if ((val = cupsGetOption("page-left", num_options, options)) != NULL)
{
switch (Orientation)
{
case 0 :
PageLeft = (float)atof(val);
break;
case 1 :
PageBottom = (float)atof(val);
break;
case 2 :
PageRight = PageWidth - (float)atof(val);
break;
case 3 :
PageTop = PageLength - (float)atof(val);
break;
}
}
if ((val = cupsGetOption("page-right", num_options, options)) != NULL)
{
switch (Orientation)
{
case 0 :
PageRight = PageWidth - (float)atof(val);
break;
case 1 :
PageTop = PageLength - (float)atof(val);
break;
case 2 :
PageLeft = (float)atof(val);
break;
case 3 :
PageBottom = (float)atof(val);
break;
}
}
if ((val = cupsGetOption("page-bottom", num_options, options)) != NULL)
{
switch (Orientation)
{
case 0 :
PageBottom = (float)atof(val);
break;
case 1 :
PageRight = PageWidth - (float)atof(val);
break;
case 2 :
PageTop = PageLength - (float)atof(val);
break;
case 3 :
PageLeft = (float)atof(val);
break;
}
}
if ((val = cupsGetOption("page-top", num_options, options)) != NULL)
{
switch (Orientation)
{
case 0 :
PageTop = PageLength - (float)atof(val);
break;
case 1 :
PageLeft = (float)atof(val);
break;
case 2 :
PageBottom = (float)atof(val);
break;
case 3 :
PageRight = PageWidth - (float)atof(val);
break;
}
}
if (change_size)
switch (Orientation)
{
case 0 : /* Portait */
break;
case 1 : /* Landscape */
temp = PageLeft;
PageLeft = PageBottom;
PageBottom = temp;
temp = PageRight;
PageRight = PageTop;
PageTop = temp;
temp = PageWidth;
PageWidth = PageLength;
PageLength = temp;
break;
case 2 : /* Reverse Portrait */
temp = PageWidth - PageLeft;
PageLeft = PageWidth - PageRight;
PageRight = temp;
temp = PageLength - PageBottom;
PageBottom = PageLength - PageTop;
PageTop = temp;
break;
case 3 : /* Reverse Landscape */
temp = PageWidth - PageLeft;
PageLeft = PageWidth - PageRight;
PageRight = temp;
temp = PageLength - PageBottom;
PageBottom = PageLength - PageTop;
PageTop = temp;
temp = PageLeft;
PageLeft = PageBottom;
PageBottom = temp;
temp = PageRight;
PageRight = PageTop;
PageTop = temp;
temp = PageWidth;
PageWidth = PageLength;
PageLength = temp;
break;
}
if ((val = cupsGetOption("sides", num_options, options)) != NULL &&
strncmp(val, "two-", 4) == 0)
Duplex = 1;
else if ((val = cupsGetOption("Duplex", num_options, options)) != NULL &&
strcmp(val, "DuplexNoTumble") == 0)
Duplex = 1;
else if (ppdIsMarked(ppd, "Duplex", "DuplexNoTumble") ||
ppdIsMarked(ppd, "Duplex", "DuplexTumble"))
Duplex = 1;
return (ppd);
}
/*
* End of "$Id$".
*/
+67
Ver Arquivo
@@ -0,0 +1,67 @@
/*
* "$Id$"
*
* Common filter definitions for the Common UNIX Printing System (CUPS).
*
* Copyright 1997-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
/*
* Include necessary headers...
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#include <ctype.h>
#include <time.h>
#include <cups/cups.h>
#include <cups/language.h>
#include <cups/string.h>
/*
* Globals...
*/
extern int Orientation, /* 0 = portrait, 1 = landscape, etc. */
Duplex, /* Duplexed? */
LanguageLevel, /* Language level of printer */
ColorDevice; /* Do color text? */
extern float PageLeft, /* Left margin */
PageRight, /* Right margin */
PageBottom, /* Bottom margin */
PageTop, /* Top margin */
PageWidth, /* Total page width */
PageLength; /* Total page length */
/*
* Prototypes...
*/
extern ppd_file_t *SetCommonOptions(int num_options, cups_option_t *options,
int change_size);
/*
* End of "$Id$".
*/
+405
Ver Arquivo
@@ -0,0 +1,405 @@
/*
* "$Id$"
*
* HP-GL/2 attribute processing for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* CR_color_range() - Set the range for color values.
* AC_anchor_corner() - Set the anchor corner.
* FT_fill_type() - Set the fill type or pattern.
* LA_line_attributes() - Set the line drawing attributes.
* LT_line_type() - Set the line type (style)...
* NP_number_pens() - Set the number of pens to be used.
* PC_pen_color() - Set the pen color...
* PW_pen_width() - Set the pen width.
* RF_raster_fill() - Set the raster fill pattern.
* SM_symbol_mode() - Set where symbols are drawn.
* SP_select_pen() - Select a pen for drawing.
* UL_user_line_type() - Set a user-defined line type.
* WU_width_units() - Set the units used for pen widths.
*/
/*
* Include necessary headers...
*/
#include "hpgltops.h"
/*
* 'CR_color_range()' - Set the range for color values.
*/
void
CR_color_range(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0)
{
/*
* Default to 0 to 255 for all color values.
*/
ColorRange[0][0] = 0.0;
ColorRange[0][1] = 255.0;
ColorRange[1][0] = 0.0;
ColorRange[1][1] = 255.0;
ColorRange[2][0] = 0.0;
ColorRange[2][1] = 255.0;
}
else if (num_params == 6)
{
/*
* Set the range based on the parameters...
*/
ColorRange[0][0] = params[0].value.number;
ColorRange[0][1] = params[1].value.number - params[0].value.number;
ColorRange[1][0] = params[2].value.number;
ColorRange[1][1] = params[3].value.number - params[2].value.number;
ColorRange[2][0] = params[4].value.number;
ColorRange[2][1] = params[5].value.number - params[4].value.number;
}
else
fprintf(stderr, "WARNING: HP-GL/2 \'CR\' command with invalid number of parameters (%d)!\n",
num_params);
}
/*
* 'AC_anchor_corner()' - Set the anchor corner.
*/
void
AC_anchor_corner(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'FT_fill_type()' - Set the fill type or pattern.
*
* Note:
*
* This needs to be updated to support non-solid fill.
*/
void
FT_fill_type(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0 ||
params[0].value.number == 1 ||
params[0].value.number == 2)
{
/**** SOLID PATTERN ****/
}
}
/*
* 'LA_line_attributes()' - Set the line drawing attributes.
*/
void
LA_line_attributes(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
int i; /* Looping var */
if (num_params == 0)
{
Outputf("3.0 setmiterlimit\n");
Outputf("0 setlinecap\n");
Outputf("0 setlinejoin\n");
}
else for (i = 0; i < (num_params - 1); i += 2)
switch ((int)params[i].value.number)
{
case 1 :
Outputf("%d setlinecap\n",
params[i + 1].value.number == 1 ? 0 :
params[i + 1].value.number == 4 ? 1 : 2);
break;
case 2 :
switch ((int)params[i + 1].value.number)
{
case 1 :
case 2 :
case 3 :
Outputf("0 setlinejoin\n");
break;
case 5 :
Outputf("2 setlinejoin\n");
break;
default :
Outputf("1 setlinejoin\n");
break;
}
break;
case 3 :
Outputf("%f setmiterlimit\n",
1.0 + 0.5 * (params[i + 1].value.number - 1.0));
break;
}
}
/*
* 'LT_line_type()' - Set the line type (style)...
*
* Note:
*
* This needs to be updated to support line types.
*/
void
LT_line_type(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'NP_number_pens()' - Set the number of pens to be used.
*/
void
NP_number_pens(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
int i; /* Looping var */
if (num_params == 0)
PenCount = 8;
else if (num_params == 1)
PenCount = (int)params[0].value.number;
else
fprintf(stderr, "WARNING: HP-GL/2 \'NP\' command with invalid number of parameters (%d)!\n",
num_params);
PC_pen_color(0, NULL);
for (i = 0; i <= PenCount; i ++)
Outputf("/W%d { DefaultPenWidth PenScaling mul setlinewidth } bind def\n", i);
}
/*
* 'PC_pen_color()' - Set the pen color...
*/
void
PC_pen_color(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
int i; /* Looping var */
static float standard_colors[8][3] = /* Standard colors for first 8 pens */
{
{ 1.0, 1.0, 1.0 }, /* White */
{ 0.0, 0.0, 0.0 }, /* Black */
{ 1.0, 0.0, 0.0 }, /* Red */
{ 0.0, 1.0, 0.0 }, /* Green */
{ 1.0, 1.0, 0.0 }, /* Yellow */
{ 0.0, 0.0, 1.0 }, /* Blue */
{ 1.0, 0.0, 1.0 }, /* Magenta */
{ 0.0, 1.0, 1.0 } /* Cyan */
};
if (num_params == 0)
{
for (i = 0; i <= PenCount; i ++)
if (i < 8)
Outputf("/P%d { %.3f %.3f %.3f setrgbcolor } bind def\n",
i, standard_colors[i][0],
standard_colors[i][1], standard_colors[i][2]);
else
Outputf("/P%d { 0.0 0.0 0.0 setrgbcolor } bind def\n", i);
}
else if (num_params == 1)
{
i = (int)params[0].value.number;
Outputf("/P%d { %.3f %.3f %.3f setrgbcolor } bind def\n",
i, standard_colors[i & 7][0], standard_colors[i & 7][1],
standard_colors[i & 7][2]);
}
else if (num_params == 4)
Outputf("/P%d { %.3f %.3f %.3f setrgbcolor } bind def\n",
(int)params[0].value.number,
(params[1].value.number - ColorRange[0][0]) / ColorRange[0][1],
(params[2].value.number - ColorRange[1][0]) / ColorRange[1][1],
(params[3].value.number - ColorRange[2][0]) / ColorRange[2][1]);
else
fprintf(stderr, "WARNING: HP-GL/2 \'PC\' command with invalid number of parameters (%d)!\n",
num_params);
}
/*
* 'PW_pen_width()' - Set the pen width.
*/
void
PW_pen_width(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
int pen; /* Pen number */
float w; /* Width value */
if (WidthUnits == 0)
{
/*
* Metric...
*/
if (num_params == 0)
w = 0.35f / 25.4f * 72.0f;
else
w = params[0].value.number / 25.4f * 72.0f;
}
else
{
/*
* Relative...
*/
w = (float)hypot(PlotSize[0], PlotSize[1]) / 1016.0f * 72.0f;
if (num_params == 0)
w *= 0.01f;
else
w *= params[0].value.number;
}
if (num_params == 2)
Outputf("/W%d { %.1f PenScaling mul setlinewidth } bind def W%d\n",
(int)params[1].value.number, w, (int)params[1].value.number);
else if (num_params < 2)
{
/*
* Set width for all pens...
*/
for (pen = 0; pen <= PenCount; pen ++)
Outputf("/W%d { %.1f PenScaling mul setlinewidth } bind def\n",
pen, w);
Outputf("W%d\n", PenNumber);
}
else
fprintf(stderr, "WARNING: HP-GL/2 \'PW\' command with invalid number of parameters (%d)!\n",
num_params);
}
/*
* 'RF_raster_fill()' - Set the raster fill pattern.
*
* Note:
*
* This needs to be implemented.
*/
void
RF_raster_fill(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'SM_symbol_mode()' - Set where symbols are drawn.
*/
void
SM_symbol_mode(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'SP_select_pen()' - Select a pen for drawing.
*/
void
SP_select_pen(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0)
PenNumber = 1;
else if (params[0].value.number <= PenCount)
PenNumber = (int)params[0].value.number;
else
fprintf(stderr, "WARNING: HP-GL/2 \'SP\' command with invalid number or value of parameters (%d, %d)!\n",
num_params, (int)params[0].value.number);
Outputf("P%d W%d\n", PenNumber, PenNumber);
}
/*
* 'UL_user_line_type()' - Set a user-defined line type.
*/
void
UL_user_line_type(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'WU_width_units()' - Set the units used for pen widths.
*/
void
WU_width_units(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0)
WidthUnits = 0;
else if (num_params == 1)
WidthUnits = (int)params[0].value.number;
else
fprintf(stderr, "WARNING: HP-GL/2 \'WU\' command with invalid number of parameters (%d)!\n",
num_params);
}
/*
* End of "$Id$".
*/
+433
Ver Arquivo
@@ -0,0 +1,433 @@
/*
* "$Id$"
*
* HP-GL/2 character processing for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* AD_define_alternate() - Define the alternate font.
* CF_character_fill() - Set whether or not to fill or outline
* characters.
* CP_character_plot() - Move the current pen position for the given
* number of columns and rows.
* DI_absolute_direction() - Set the direction vector for text.
* DR_relative_direction() - Set the relative direction vector for text.
* DT_define_label_term() - Set the label string terminator.
* DV_define_variable_path() - Define a path for text.
* ES_extra_space() - Set extra spacing (kerning) between characters.
* LB_label() - Display a label string.
* LO_label_origin() - Set the label origin.
* SA_select_alternate() - Select the alternate font.
* SD_define_standard() - Define the standard font...
* SI_absolute_size() - Set the absolute size of text.
* SL_character_slant() - Set the slant of text.
* SR_relative_size() - Set the relative size of text.
* SS_select_standard() - Select the standard font for text.
* TD_transparent_data() - Send transparent print data.
*/
/*
* Include necessary headers...
*/
#include "hpgltops.h"
/*
* 'AD_define_alternate()' - Define the alternate font.
*/
void
AD_define_alternate(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
int i; /* Looping var */
int typeface, /* Typeface number */
posture, /* Posture number */
weight; /* Weight number */
float height; /* Height/size of font */
/*
* Set default font attributes...
*/
typeface = 48;
posture = 0;
weight = 0;
height = 11.5;
/*
* Loop through parameter value pairs...
*/
for (i = 0; i < (num_params - 1); i += 2)
switch ((int)params[i].value.number)
{
case 4 :
height = params[i + 1].value.number;
break;
case 5 :
posture = (int)params[i + 1].value.number;
break;
case 6 :
weight = (int)params[i + 1].value.number;
break;
case 7 :
typeface = (int)params[i + 1].value.number;
break;
}
/*
* Define the font...
*/
Outputf("/SA { /%s%s%s%s findfont %.1f scalefont setfont } def\n",
typeface == 48 ? "Courier" : "Helvetica",
(weight != 0 || posture != 0) ? "-" : "",
weight != 0 ? "Bold" : "",
posture != 0 ? "Oblique" : "",
height);
CharHeight[1] = height;
}
/*
* 'CF_character_fill()' - Set whether or not to fill or outline characters.
*/
void
CF_character_fill(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0)
CharFillMode = 0;
else
CharFillMode = (int)params[0].value.number;
if (num_params == 2)
CharPen = (int)params[1].value.number;
}
/*
* 'CP_character_plot()' - Move the current pen position for the given number
* of columns and rows.
*/
void
CP_character_plot(int num_params,
param_t *params)
{
if (num_params < 2)
return;
switch (Rotation)
{
case 0:
PenPosition[0] += params[0].value.number * 1.2f / CharHeight[CharFont];
PenPosition[1] += params[1].value.number * CharHeight[CharFont];
break;
case 90:
PenPosition[0] -= params[1].value.number * 1.2f / CharHeight[CharFont];
PenPosition[1] += params[0].value.number * CharHeight[CharFont];
break;
case 180:
PenPosition[0] -= params[0].value.number * 1.2f / CharHeight[CharFont];
PenPosition[1] -= params[1].value.number * CharHeight[CharFont];
break;
case 270:
PenPosition[0] += params[1].value.number * 1.2f / CharHeight[CharFont];
PenPosition[1] -= params[0].value.number * CharHeight[CharFont];
break;
}
}
/*
* 'DI_absolute_direction()' - Set the direction vector for text.
*/
void
DI_absolute_direction(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
Outputf(CharFont == 0 ? "SS\n" : "SA\n");
if (num_params == 2)
Outputf("currentfont [ %f %f %f %f 0.0 0.0 ] makefont setfont\n",
params[0].value.number, -params[1].value.number,
params[1].value.number, params[0].value.number);
}
/*
* 'DR_relative_direction()' - Set the relative direction vector for text.
*/
void
DR_relative_direction(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'DT_define_label_term()' - Set the label string terminator.
*/
void
DT_define_label_term(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0)
StringTerminator = '\003';
else
StringTerminator = params[0].value.string[0];
}
/*
* 'DV_define_variable_path()' - Define a path for text.
*/
void
DV_define_variable_path(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'ES_extra_space()' - Set extra spacing (kerning) between characters.
*/
void
ES_extra_space(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'LB_label()' - Display a label string.
*/
void
LB_label(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
char *s; /* Pointer into string */
if (num_params == 0)
return;
Outputf("gsave\n");
Outputf("currentmiterlimit 1.0 setmiterlimit\n");
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
Outputf("(");
for (s = params[0].value.string; *s != '\0'; s ++)
if (strchr("()\\", *s) != NULL)
Outputf("\\%c", *s);
else
Outputf("%c", *s);
Outputf(") true charpath\n");
if (CharFillMode != 1)
Outputf("FI\n");
if (CharFillMode == 1 || CharFillMode == 3)
Outputf("P%d ST\n", CharPen);
Outputf("setmiterlimit\n");
Outputf("grestore\n");
}
/*
* 'LO_label_origin()' - Set the label origin.
*/
void
LO_label_origin(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'SA_select_alternate()' - Select the alternate font.
*/
void
SA_select_alternate(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
Outputf("SA\n");
CharFont = 1;
}
/*
* 'SD_define_standard()' - Define the standard font...
*/
void
SD_define_standard(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
int i; /* Looping var */
int typeface, /* Typeface number */
posture, /* Posture number */
weight; /* Weight number */
float height; /* Height/size of font */
/*
* Set default font attributes...
*/
typeface = 48;
posture = 0;
weight = 0;
height = 11.5;
/*
* Loop through parameter value pairs...
*/
for (i = 0; i < (num_params - 1); i += 2)
switch ((int)params[i].value.number)
{
case 4 :
height = params[i + 1].value.number;
break;
case 5 :
posture = (int)params[i + 1].value.number;
break;
case 6 :
weight = (int)params[i + 1].value.number;
break;
case 7 :
typeface = (int)params[i + 1].value.number;
break;
}
/*
* Define the font...
*/
Outputf("/SS { /%s%s%s%s findfont %.1f scalefont setfont } def\n",
typeface == 48 ? "Courier" : "Helvetica",
(weight != 0 || posture != 0) ? "-" : "",
weight != 0 ? "Bold" : "",
posture != 0 ? "Oblique" : "",
height);
CharHeight[0] = height;
}
/*
* 'SI_absolute_size()' - Set the absolute size of text.
*/
void
SI_absolute_size(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'SL_character_slant()' - Set the slant of text.
*/
void
SL_character_slant(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'SR_relative_size()' - Set the relative size of text.
*/
void
SR_relative_size(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'SS_select_standard()' - Select the standard font for text.
*/
void
SS_select_standard(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
Outputf("SS\n");
CharFont = 0;
}
/*
* 'TD_transparent_data()' - Send transparent print data.
*/
void
TD_transparent_data(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* End of "$Id$".
*/
+473
Ver Arquivo
@@ -0,0 +1,473 @@
/*
* "$Id$"
*
* HP-GL/2 configuration routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* update_transform() - Update the page transformation matrix as needed.
* BP_begin_plot() - Start a plot...
* DF_default_values() - Set all state info to the default values.
* IN_initialize() - Initialize the plotter.
* IP_input_absolute() - Set P1 and P2 values for the plot.
* IR_input_relative() - Update P1 and P2.
* IW_input_window() - Setup an input window.
* PG_advance_page() - Eject the current page.
* PS_plot_size() - Set the plot size.
* RO_rotate() - Rotate the plot.
* RP_replot() - Replot the current page.
* SC_scale() - Set user-defined scaling.
*/
/*
* Include necessary headers...
*/
#include "hpgltops.h"
/*
* 'update_transform()' - Update the page transformation matrix as needed.
*/
void
update_transform(void)
{
float width, /* Plot width */
height; /* Plot height */
float page_width, /* Actual page width in points */
page_length; /* Actual page length in points */
float scaling; /* Scaling factor */
/*
* Get the page and input window sizes...
*/
width = IW2[0] - IW1[0];
height = IW2[1] - IW1[1];
if (width == 0 || height == 0)
return;
/*
* Scale the plot as needed...
*/
if (FitPlot)
{
page_width = PageRight - PageLeft;
page_length = PageTop - PageBottom;
if (Rotation == 0 || Rotation == 180)
{
scaling = page_width / width;
if (scaling > (page_length / width))
scaling = page_length / width;
}
else
{
scaling = page_width / height;
if (scaling > (page_length / height))
scaling = page_length / height;
}
}
else
{
page_width = PlotSize[0];
page_length = PlotSize[1];
if (Rotation == 0 || Rotation == 180)
scaling = page_width / width;
else
scaling = page_width / height;
}
/*
* Generate a new transformation matrix...
*/
switch (Rotation)
{
case 0 :
Transform[0][0] = scaling;
Transform[0][1] = 0.0;
Transform[0][2] = -IW1[0] * scaling;
Transform[1][0] = 0.0;
Transform[1][1] = scaling;
Transform[1][2] = -IW1[1] * scaling;
break;
case 90 :
Transform[0][0] = 0.0;
Transform[0][1] = -scaling;
Transform[0][2] = (height - IW1[0]) * scaling;
Transform[1][0] = scaling;
Transform[1][1] = 0.0;
Transform[1][2] = -IW1[1] * scaling;
break;
case 180 :
Transform[0][0] = -scaling;
Transform[0][1] = 0.0;
Transform[0][2] = (height - IW1[0]) * scaling;
Transform[1][0] = 0.0;
Transform[1][1] = -scaling;
Transform[1][2] = (width - IW1[1]) * scaling;
break;
case 270 :
Transform[0][0] = 0.0;
Transform[0][1] = scaling;
Transform[0][2] = -IW1[0] * scaling;
Transform[1][0] = -scaling;
Transform[1][1] = 0.0;
Transform[1][2] = (width - IW1[1]) * scaling;
break;
}
PenScaling = Transform[0][0] + Transform[0][1];
if (PenScaling < 0.0)
PenScaling = -PenScaling;
if (PageDirty)
printf("/PenScaling %.3f def W%d\n", PenScaling, PenNumber);
}
/*
* 'BP_begin_plot()' - Start a plot...
*/
void
BP_begin_plot(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'DF_default_values()' - Set all state info to the default values.
*/
void
DF_default_values(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
AC_anchor_corner(0, NULL);
AD_define_alternate(0, NULL);
SD_define_standard(0, NULL);
CF_character_fill(0, NULL);
DI_absolute_direction(0, NULL);
DT_define_label_term(0, NULL);
DV_define_variable_path(0, NULL);
ES_extra_space(0, NULL);
FT_fill_type(0, NULL);
IW_input_window(0, NULL);
LA_line_attributes(0, NULL);
LO_label_origin(0, NULL);
LT_line_type(0, NULL);
PA_plot_absolute(0, NULL);
PolygonMode = 0;
RF_raster_fill(0, NULL);
SC_scale(0, NULL);
SM_symbol_mode(0, NULL);
SS_select_standard(0, NULL);
TD_transparent_data(0, NULL);
UL_user_line_type(0, NULL);
}
/*
* 'IN_initialize()' - Initialize the plotter.
*/
void
IN_initialize(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
DF_default_values(0, NULL);
PU_pen_up(0, NULL);
RO_rotate(0, NULL);
PS_plot_size(0, NULL);
WU_width_units(0, NULL);
PW_pen_width(0, NULL);
SP_select_pen(0, NULL);
PenPosition[0] = PenPosition[1] = 0.0;
}
/*
* 'IP_input_absolute()' - Set P1 and P2 values for the plot.
*/
void
IP_input_absolute(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0)
{
P1[0] = 0.0;
P1[1] = 0.0;
P2[0] = PlotSize[0] / 72.0f * 1016.0f;
P2[1] = PlotSize[1] / 72.0f * 1016.0f;
}
else if (num_params == 2)
{
P2[0] -= P1[0];
P2[1] -= P1[1];
P1[0] = params[0].value.number;
P1[1] = params[1].value.number;
P2[0] += P1[0];
P2[1] += P1[1];
}
else if (num_params == 4)
{
P1[0] = params[0].value.number;
P1[1] = params[1].value.number;
P2[0] = params[2].value.number;
P2[1] = params[3].value.number;
}
IW1[0] = P1[0];
IW1[1] = P1[1];
IW2[0] = P2[0];
IW2[1] = P2[1];
update_transform();
}
/*
* 'IR_input_relative()' - Update P1 and P2.
*/
void
IR_input_relative(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0)
{
P1[0] = PageLeft / 72.0f * 1016.0f;
P1[1] = PageBottom / 72.0f * 1016.0f;
P2[0] = PageRight / 72.0f * 1016.0f;
P2[1] = PageTop / 72.0f * 1016.0f;
}
else if (num_params == 2)
{
P2[0] -= P1[0];
P2[1] -= P1[1];
P1[0] = params[0].value.number * PlotSize[0] / 72.0f * 1016.0f / 100.0f;
P1[1] = params[1].value.number * PlotSize[1] / 72.0f * 1016.0f / 100.0f;
P2[0] += P1[0];
P2[1] += P1[1];
}
else if (num_params == 4)
{
P1[0] = params[0].value.number * PlotSize[0] / 72.0f * 1016.0f / 100.0f;
P1[1] = params[1].value.number * PlotSize[1] / 72.0f * 1016.0f / 100.0f;
P2[0] = params[2].value.number * PlotSize[0] / 72.0f * 1016.0f / 100.0f;
P2[1] = params[3].value.number * PlotSize[1] / 72.0f * 1016.0f / 100.0f;
}
IW1[0] = P1[0];
IW1[1] = P1[1];
IW2[0] = P2[0];
IW2[1] = P2[1];
update_transform();
}
/*
* 'IW_input_window()' - Setup an input window.
*/
void
IW_input_window(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0)
{
IW1[0] = P1[0];
IW1[1] = P1[1];
IW2[0] = P2[0];
IW2[1] = P2[1];
}
else if (num_params == 4)
{
IW1[0] = params[0].value.number;
IW1[1] = params[1].value.number;
IW2[0] = params[2].value.number;
IW2[1] = params[3].value.number;
}
update_transform();
}
/*
* 'PG_advance_page()' - Eject the current page.
*/
void
PG_advance_page(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
if (PageDirty)
{
puts("grestore");
puts("showpage");
PageDirty = 0;
}
}
/*
* 'PS_plot_size()' - Set the plot size.
*/
void
PS_plot_size(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
switch (num_params)
{
case 0 :
if (Rotation == 0 || Rotation == 180)
{
PlotSize[0] = PageRight - PageLeft;
PlotSize[1] = PageTop - PageBottom;
}
else
{
PlotSize[0] = PageTop - PageBottom;
PlotSize[1] = PageRight - PageLeft;
}
break;
case 1 :
if (Rotation == 0 || Rotation == 180)
{
PlotSize[1] = 72.0f * params[0].value.number / 1016.0f;
PlotSize[0] = 0.75f * PlotSize[1];
}
else
{
PlotSize[0] = 72.0f * params[0].value.number / 1016.0f;
PlotSize[1] = 0.75f * PlotSize[0];
}
break;
case 2 :
if (Rotation == 0 || Rotation == 180)
{
PlotSize[0] = 72.0f * params[1].value.number / 1016.0f;
PlotSize[1] = 72.0f * params[0].value.number / 1016.0f;
}
else
{
PlotSize[0] = 72.0f * params[0].value.number / 1016.0f;
PlotSize[1] = 72.0f * params[1].value.number / 1016.0f;
}
break;
}
/*
* This is required for buggy files that don't set the input window.
*/
IP_input_absolute(0, NULL);
}
/*
* 'RO_rotate()' - Rotate the plot.
*/
void
RO_rotate(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0)
Rotation = 0;
else
Rotation = (int)params[0].value.number;
update_transform();
}
/*
* 'RP_replot()' - Replot the current page.
*/
void
RP_replot(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
}
/*
* 'SC_scale()' - Set user-defined scaling.
*/
void
SC_scale(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0)
ScalingType = -1;
else if (num_params > 3)
{
Scaling1[0] = params[0].value.number;
Scaling2[0] = params[1].value.number;
Scaling1[1] = params[2].value.number;
Scaling2[1] = params[3].value.number;
if (num_params > 4)
ScalingType = (int)params[4].value.number;
else
ScalingType = 0;
}
update_transform();
}
/*
* End of "$Id$".
*/
+232
Ver Arquivo
@@ -0,0 +1,232 @@
/*
* "$Id$"
*
* HP-GL/2 input processing for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ParseCommand() - Parse an HPGL/2 command.
* FreeParameters() - Free all string parameter values.
*/
/*
* Include necessary headers...
*/
#include "hpgltops.h"
#include <ctype.h>
#define MAX_PARAMS 16384
/*
* 'ParseCommand()' - Parse an HPGL/2 command.
*
* Returns the number of parameters seen or -1 on EOF.
*/
int /* O - -1 on EOF, # params otherwise */
ParseCommand(FILE *fp, /* I - File to read from */
char *name, /* O - Name of command */
param_t **params) /* O - Parameter list */
{
int num_params, /* Number of parameters seen */
ch, /* Current char */
done, /* Non-zero when the current command is read */
i; /* Looping var */
char buf[262144]; /* String buffer */
static param_t p[MAX_PARAMS]; /* Parameter buffer */
num_params = 0;
done = 0;
do
{
while ((ch = getc(fp)) != EOF)
if (strchr(" \t\r\n,;", ch) == NULL)
break;
if (ch == EOF)
return (-1);
if (ch == 0x1b)
switch (getc(fp))
{
case '.' : /* HP-GL/2 job control */
i = getc(fp);
if (strchr(")Z", i) != NULL)
{
/*
* 'Printer Off' command - look for next 'Printer On' command...
*/
for (;;)
{
while ((i = getc(fp)) != EOF && i != 0x1b);
if (i == EOF)
return (-1);
if (getc(fp) != '.')
continue;
if ((i = getc(fp)) == '(' ||
i == 'Y')
break;
}
}
else if (strchr("@HIMNTI\003", i) != NULL)
{
while ((i = getc(fp)) != EOF && i != ':');
}
break;
default : /* HP RTL/PCL control */
while ((i = getc(fp)) != EOF && !isupper(i));
break;
}
} while (ch == 0x1b);
name[0] = ch;
name[1] = getc(fp);
name[2] = '\0';
if (strcasecmp(name, "LB") == 0)
{
for (i = 0; (ch = getc(fp)) != StringTerminator; i ++)
buf[i] = ch;
buf[i] = '\0';
p[num_params].type = PARAM_STRING;
p[num_params].value.string = strdup(buf);
num_params ++;
}
else if (strcasecmp(name, "SM") == 0)
{
buf[0] = getc(fp);
buf[1] = '\0';
p[num_params].type = PARAM_STRING;
p[num_params].value.string = strdup(buf);
num_params ++;
}
else if (strcasecmp(name, "DT") == 0)
{
if ((buf[0] = getc(fp)) != ';')
{
buf[1] = '\0';
p[num_params].type = PARAM_STRING;
p[num_params].value.string = strdup(buf);
num_params ++;
}
}
else if (strcasecmp(name, "PE") == 0)
{
for (i = 0; i < (sizeof(buf) - 1); i ++)
if ((buf[i] = getc(fp)) == ';')
break;
buf[i] = '\0';
p[num_params].type = PARAM_STRING;
p[num_params].value.string = strdup(buf);
num_params ++;
}
while (!done)
switch (ch = getc(fp))
{
case ',' :
case ' ' :
case '\n' :
case '\r' :
case '\t' :
break;
case '\"' :
fscanf(fp, "%[^\"]\"", buf);
if (num_params < MAX_PARAMS)
{
p[num_params].type = PARAM_STRING;
p[num_params].value.string = strdup(buf);
num_params ++;
};
break;
case '-' :
case '+' :
ungetc(ch, fp);
fscanf(fp, "%f", &(p[num_params].value.number));
if (num_params < MAX_PARAMS)
{
p[num_params].type = PARAM_RELATIVE;
num_params ++;
}
break;
case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
case '6' :
case '7' :
case '8' :
case '9' :
case '.' :
ungetc(ch, fp);
fscanf(fp, "%f", &(p[num_params].value.number));
if (num_params < MAX_PARAMS)
{
p[num_params].type = PARAM_ABSOLUTE;
num_params ++;
}
break;
default :
ungetc(ch, fp);
done = 1;
break;
}
*params = p;
return (num_params);
}
/*
* 'FreeParameters()' - Free all string parameter values.
*/
void
FreeParameters(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameter values */
{
int i; /* Looping var */
for (i = 0; i < num_params; i ++)
if (params[i].type == PARAM_STRING)
free(params[i].value.string);
}
/*
* End of "$Id$".
*/
+255
Ver Arquivo
@@ -0,0 +1,255 @@
/*
* "$Id$"
*
* HP-GL/2 filter main entry for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* main() - Main entry for HP-GL/2 filter.
* compare_names() - Compare two command names.
*/
/*
* Include necessary headers...
*/
/*#define DEBUG*/
#define _HPGL_MAIN_C_
#include "hpgltops.h"
/*
* HP-GL/2 command table...
*/
typedef struct
{
char name[4]; /* Name of command */
void (*func)(int, param_t *); /* Function to call */
} name_t;
static name_t commands[] =
{
{ "BP", BP_begin_plot },
{ "DF", DF_default_values },
{ "IN", IN_initialize },
{ "IP", IP_input_absolute },
{ "IR", IR_input_relative },
{ "IW", IW_input_window },
{ "PG", PG_advance_page },
{ "RO", RO_rotate },
{ "RP", RP_replot },
{ "SC", SC_scale },
{ "AA", AA_arc_absolute },
{ "AR", AR_arc_relative },
{ "AT", AT_arc_absolute3 },
{ "CI", CI_circle },
{ "PA", PA_plot_absolute },
{ "PD", PD_pen_down },
{ "PE", PE_polyline_encoded },
{ "PR", PR_plot_relative },
{ "PS", PS_plot_size },
{ "PU", PU_pen_up },
{ "RT", RT_arc_relative3 },
{ "EA", EA_edge_rect_absolute },
{ "EP", EP_edge_polygon },
{ "ER", ER_edge_rect_relative },
{ "EW", EW_edge_wedge },
{ "FP", FP_fill_polygon },
{ "PM", PM_polygon_mode },
{ "RA", RA_fill_rect_absolute },
{ "RR", RR_fill_rect_relative },
{ "WG", WG_fill_wedge },
{ "AD", AD_define_alternate },
{ "CF", CF_character_fill },
{ "CP", CP_character_plot },
{ "DI", DI_absolute_direction },
{ "DR", DR_relative_direction },
{ "DT", DT_define_label_term },
{ "DV", DV_define_variable_path },
{ "ES", ES_extra_space },
{ "LB", LB_label },
{ "LO", LO_label_origin },
{ "SA", SA_select_alternate },
{ "SD", SD_define_standard },
{ "SI", SI_absolute_size },
{ "SL", SL_character_slant },
{ "SR", SR_relative_size },
{ "SS", SS_select_standard },
{ "TD", TD_transparent_data },
{ "AC", AC_anchor_corner },
{ "FT", FT_fill_type },
{ "LA", LA_line_attributes },
{ "LT", LT_line_type },
{ "NP", NP_number_pens },
{ "PC", PC_pen_color },
{ "CR", CR_color_range },
{ "PW", PW_pen_width },
{ "RF", RF_raster_fill },
{ "SM", SM_symbol_mode },
{ "SP", SP_select_pen },
{ "UL", UL_user_line_type },
{ "WU", WU_width_units }
};
#define NUM_COMMANDS (sizeof(commands) / sizeof(name_t))
/*
* Local functions...
*/
static int compare_names(const void *p1, const void *p2);
/*
* 'main()' - Main entry for HP-GL/2 filter.
*/
int /* O - Exit status */
main(int argc, /* I - Number of command-line arguments */
char *argv[]) /* I - Command-line arguments */
{
FILE *fp; /* Input file */
ppd_file_t *ppd; /* PPD file */
int num_params; /* Number of parameters */
param_t *params; /* Command parameters */
name_t *command, /* Command */
name; /* Name of command */
int num_options; /* Number of print options */
cups_option_t *options; /* Print options */
const char *val; /* Option value */
int shading; /* -1 = black, 0 = grey, 1 = color */
float penwidth; /* Default pen width */
if (argc < 6 || argc > 7)
{
fputs("ERROR: hpgltops job-id user title copies options [file]\n", stderr);
return (1);
}
/*
* If we have 7 arguments, print the file named on the command-line.
* Otherwise, send stdin instead...
*/
if (argc == 6)
fp = stdin;
else
{
/*
* Try to open the print file...
*/
if ((fp = fopen(argv[6], "rb")) == NULL)
{
perror("ERROR: unable to open print file - ");
return (1);
}
}
/*
* Process command-line options and write the prolog...
*/
options = NULL;
num_options = cupsParseOptions(argv[5], 0, &options);
if ((ppd = SetCommonOptions(num_options, options, 1)) != NULL)
ppdClose(ppd);
shading = 1;
penwidth = 1.0;
if ((val = cupsGetOption("blackplot", num_options, options)) != NULL)
shading = 0;
if ((val = cupsGetOption("fitplot", num_options, options)) != NULL)
FitPlot = 1;
if ((val = cupsGetOption("penwidth", num_options, options)) != NULL)
penwidth = (float)atof(val);
/*
* Write the PostScript prolog and initialize the plotting "engine"...
*/
OutputProlog(argv[3], argv[2], shading, penwidth);
IP_input_absolute(0, NULL);
/*
* Sort the command array...
*/
qsort(commands, NUM_COMMANDS, sizeof(name_t),
(int (*)(const void *, const void *))compare_names);
/*
* Read commands until we reach the end of file.
*/
while ((num_params = ParseCommand(fp, name.name, &params)) >= 0)
{
#ifdef DEBUG
{
int i;
fprintf(stderr, "DEBUG: %s(%d)", name.name, num_params);
for (i = 0; i < num_params; i ++)
if (params[i].type == PARAM_STRING)
fprintf(stderr, " \'%s\'", params[i].value.string);
else
fprintf(stderr, " %f", params[i].value.number);
fputs("\n", stderr);
}
#endif /* DEBUG */
if ((command = bsearch(&name, commands, NUM_COMMANDS, sizeof(name_t),
(int (*)(const void *, const void *))compare_names)) != NULL)
(*command->func)(num_params, params);
FreeParameters(num_params, params);
}
OutputTrailer();
if (fp != stdin)
fclose(fp);
return (0);
}
/*
* 'compare_names()' - Compare two command names.
*/
static int /* O - Result of strcasecmp() on names */
compare_names(const void *p1, /* I - First name */
const void *p2) /* I - Second name */
{
return (strcasecmp(((name_t *)p1)->name, ((name_t *)p2)->name));
}
/*
* End of "$Id$".
*/
+380
Ver Arquivo
@@ -0,0 +1,380 @@
/*
* "$Id$"
*
* HP-GL/2 polygon routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* EA_edge_rect_absolute() - Draw a rectangle.
* EP_edge_polygon() - Stroke the edges of a polygon.
* ER_edge_rect_relative() - Draw a rectangle relative to the current
* EW_edge_wedge() - Draw a pie wedge.
* FP_fill_polygon() - Fill a polygon.
* PM_polygon_mode() - Set the polygon drawing mode.
* RA_fill_rect_absolute() - Fill a rectangle.
* RR_fill_rect_relative() - Fill a rectangle relative to the current
* WG_fill_wedge() - Fill a pie wedge.
*/
/*
* Include necessary headers...
*/
#include "hpgltops.h"
/*
* 'EA_edge_rect_absolute()' - Draw a rectangle.
*/
void
EA_edge_rect_absolute(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
float x, y; /* Transformed coordinates */
if (num_params < 2)
return;
x = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
Transform[0][2];
y = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
Transform[1][2];
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
Outputf("%.3f %.3f LI\n", PenPosition[0], y);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("%.3f %.3f LI\n", x, PenPosition[1]);
Outputf("CP\n");
if (!PolygonMode)
Outputf("ST\n");
}
/*
* 'EP_edge_polygon()' - Stroke the edges of a polygon.
*/
void
EP_edge_polygon(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
Outputf("ST\n");
}
/*
* 'ER_edge_rect_relative()' - Draw a rectangle relative to the current
* pen position.
*/
void
ER_edge_rect_relative(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
float x, y; /* Transformed coordinates */
if (num_params < 2)
return;
x = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
PenPosition[0];
y = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
PenPosition[1];
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
Outputf("%.3f %.3f LI\n", PenPosition[0], y);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("%.3f %.3f LI\n", x, PenPosition[1]);
Outputf("CP\n");
if (!PolygonMode)
Outputf("ST\n");
}
/*
* 'EW_edge_wedge()' - Draw a pie wedge.
*/
void
EW_edge_wedge(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
float x, y; /* Transformed coordinates */
float start, end, /* Start and end of arc */
theta, /* Current angle */
dt, /* Step between points */
radius; /* Radius of arc */
if (num_params < 3)
return;
radius = params[0].value.number;
start = params[1].value.number;
end = start + params[2].value.number;
if (num_params > 3)
dt = (float)fabs(params[3].value.number);
else
dt = 5.0f;
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
if (start < end)
for (theta = start + dt; theta < end; theta += dt)
{
x = (float)(PenPosition[0] +
radius * cos(M_PI * theta / 180.0) * Transform[0][0] +
radius * sin(M_PI * theta / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * theta / 180.0) * Transform[1][0] +
radius * sin(M_PI * theta / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
}
else
for (theta = start - dt; theta > end; theta -= dt)
{
x = (float)(PenPosition[0] +
radius * cos(M_PI * theta / 180.0) * Transform[0][0] +
radius * sin(M_PI * theta / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * theta / 180.0) * Transform[1][0] +
radius * sin(M_PI * theta / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
}
x = (float)(PenPosition[0] +
radius * cos(M_PI * end / 180.0) * Transform[0][0] +
radius * sin(M_PI * end / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * end / 180.0) * Transform[1][0] +
radius * sin(M_PI * end / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("CP\n");
if (!PolygonMode)
Outputf("ST\n");
}
/*
* 'FP_fill_polygon()' - Fill a polygon.
*/
void
FP_fill_polygon(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
(void)num_params;
(void)params;
Outputf("FI\n");
}
/*
* 'PM_polygon_mode()' - Set the polygon drawing mode.
*/
void
PM_polygon_mode(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params == 0 ||
params[0].value.number == 0)
{
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
PolygonMode = 1;
}
else if (params[0].value.number == 2)
PolygonMode = 0;
}
/*
* 'RA_fill_rect_absolute()' - Fill a rectangle.
*/
void
RA_fill_rect_absolute(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
float x, y; /* Transformed coordinates */
if (num_params < 2)
return;
x = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
Transform[0][2];
y = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
Transform[1][2];
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
Outputf("%.3f %.3f LI\n", PenPosition[0], y);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("%.3f %.3f LI\n", x, PenPosition[1]);
Outputf("CP\n");
if (!PolygonMode)
Outputf("FI\n");
}
/*
* 'RR_fill_rect_relative()' - Fill a rectangle relative to the current
* pen position.
*/
void
RR_fill_rect_relative(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
float x, y; /* Transformed coordinates */
if (num_params < 2)
return;
x = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
PenPosition[0];
y = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
PenPosition[1];
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
Outputf("%.3f %.3f LI\n", PenPosition[0], y);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("%.3f %.3f LI\n", x, PenPosition[1]);
Outputf("CP\n");
if (!PolygonMode)
Outputf("FI\n");
}
/*
* 'WG_fill_wedge()' - Fill a pie wedge.
*/
void
WG_fill_wedge(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
float x, y; /* Transformed coordinates */
float start, end, /* Start and end angles */
theta, /* Current angle */
dt, /* Step between points */
radius; /* Radius of arc */
if (num_params < 3)
return;
radius = params[0].value.number;
start = params[1].value.number;
end = start + params[2].value.number;
if (num_params > 3)
dt = (float)fabs(params[3].value.number);
else
dt = 5.0;
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
if (start < end)
for (theta = start + dt; theta < end; theta += dt)
{
x = (float)(PenPosition[0] +
radius * cos(M_PI * theta / 180.0) * Transform[0][0] +
radius * sin(M_PI * theta / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * theta / 180.0) * Transform[1][0] +
radius * sin(M_PI * theta / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
}
else
for (theta = start - dt; theta > end; theta -= dt)
{
x = (float)(PenPosition[0] +
radius * cos(M_PI * theta / 180.0) * Transform[0][0] +
radius * sin(M_PI * theta / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * theta / 180.0) * Transform[1][0] +
radius * sin(M_PI * theta / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
}
x = (float)(PenPosition[0] +
radius * cos(M_PI * end / 180.0) * Transform[0][0] +
radius * sin(M_PI * end / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * end / 180.0) * Transform[1][0] +
radius * sin(M_PI * end / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f LI\n", x, y);
Outputf("CP\n");
if (!PolygonMode)
Outputf("FI\n");
}
/*
* End of "$Id$".
*/
+192
Ver Arquivo
@@ -0,0 +1,192 @@
/*
* "$Id$"
*
* HP-GL/2 prolog routines for for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* OutputProlog() - Output the PostScript prolog...
* OutputTrailer() - Output the PostScript trailer...
* Outputf() - Write a formatted string to the output file, creating the
* page header as needed...
*/
/*
* Include necessary headers...
*/
#include "hpgltops.h"
#include <stdarg.h>
/*
* 'OutputProlog()' - Output the PostScript prolog...
*/
void
OutputProlog(char *title, /* I - Job title */
char *user, /* I - Username */
int shading, /* I - Type of shading */
float penwidth) /* I - Default pen width */
{
FILE *prolog; /* Prolog file */
char line[255]; /* Line from prolog file */
time_t curtime; /* Current time */
struct tm *curtm; /* Current date */
curtime = time(NULL);
curtm = localtime(&curtime);
puts("%!PS-Adobe-3.0");
printf("%%%%BoundingBox: %.0f %.0f %.0f %.0f\n",
PageLeft, PageBottom, PageRight, PageTop);
puts("%%Pages: (atend)");
printf("%%%%LanguageLevel: %d\n", LanguageLevel);
puts("%%DocumentData: Clean7Bit");
puts("%%DocumentSuppliedResources: procset hpgltops 1.0 0");
puts("%%DocumentNeededResources: font Courier Helvetica");
puts("%%Creator: hpgltops/" CUPS_SVERSION);
strftime(line, sizeof(line), "%%%%CreationDate: %c", curtm);
puts(line);
printf("%%%%Title: %s\n", title);
printf("%%%%For: %s\n", user);
if (Orientation & 1)
puts("%%Orientation: Landscape");
puts("%%EndComments");
puts("%%BeginProlog");
printf("/DefaultPenWidth %.2f def\n", penwidth * 72.0 / 25.4);
puts("3.0 setmiterlimit");
if (!shading) /* Black only */
puts("/setrgbcolor { pop pop pop } bind def");
else if (!ColorDevice) /* Greyscale */
puts("/setrgbcolor { 0.08 mul exch 0.61 mul add exch 0.31 mul add setgray } bind def\n");
if ((prolog = fopen(CUPS_DATADIR "/data/HPGLprolog", "r")) == NULL)
{
perror("ERROR: Unable to open HPGL prolog \"" CUPS_DATADIR "/data/HPGLprolog\" for reading");
exit(1);
}
while (fgets(line, sizeof(line), prolog) != NULL)
fputs(line, stdout);
fclose(prolog);
puts("%%EndProlog");
IN_initialize(0, NULL);
}
/*
* 'OutputTrailer()' - Output the PostScript trailer...
*/
void
OutputTrailer(void)
{
if (PageDirty)
PG_advance_page(0, NULL);
puts("%%BeginTrailer");
printf("%%%%Pages: %d\n", PageCount);
puts("%%EOF");
}
/*
* 'Outputf()' - Write a formatted string to the output file, creating the
* page header as needed...
*/
int /* O - Number of bytes written */
Outputf(const char *format, /* I - Printf-style string */
...) /* I - Additional args as needed */
{
va_list ap; /* Argument pointer */
int bytes; /* Number of bytes written */
/*
* Write the page header as needed...
*/
if (!PageDirty)
{
PageDirty = 1;
PageCount ++;
printf("%%%%Page: %d %d\n", PageCount, PageCount);
printf("/PenScaling %.3f def\n", PenScaling);
puts("gsave");
if (Duplex && (PageCount & 1) == 0)
switch ((PageRotation / 90) & 3)
{
case 0 :
printf("%.1f %.1f translate\n", PageWidth - PageRight, PageBottom);
break;
case 1 :
printf("%.1f %.1f translate\n", PageLength - PageTop,
PageWidth - PageRight);
break;
case 2 :
printf("%.1f %.1f translate\n", PageLeft, PageLength - PageTop);
break;
case 3 :
printf("%.1f %.1f translate\n", PageBottom, PageLeft);
break;
}
else
switch ((PageRotation / 90) & 3)
{
case 0 :
printf("%.1f %.1f translate\n", PageLeft, PageBottom);
break;
case 1 :
printf("%.1f %.1f translate\n", PageBottom, PageWidth - PageRight);
break;
case 2 :
printf("%.1f %.1f translate\n", PageWidth - PageRight,
PageLength - PageTop);
break;
case 3 :
printf("%.1f %.1f translate\n", PageLength - PageTop, PageLeft);
break;
}
}
/*
* Write the string to the output file...
*/
va_start(ap, format);
bytes = vprintf(format, ap);
va_end(ap);
return (bytes);
}
/*
* End of "$Id$".
*/
+704
Ver Arquivo
@@ -0,0 +1,704 @@
/*
* "$Id$"
*
* HP-GL/2 vector routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* AA_arc_absolute() - Draw an arc.
* AR_arc_relative() - Draw an arc relative to the current pen
* AT_arc_absolute3() - Draw an arc using 3 points.
* CI_circle() - Draw a circle.
* PA_plot_absolute() - Plot a line using absolute coordinates.
* PD_pen_down() - Start drawing.
* PE_polygon_encoded() - Draw an encoded polyline.
* PR_plot_relative() - Plot a line using relative coordinates.
* PU_pen_up() - Stop drawing.
* RT_arc_relative3() - Draw an arc through 3 points relative to the
* decode_number() - Decode an encoded number.
* plot_points() - Plot the specified points.
*/
/*
* Include necessary headers...
*/
#include "hpgltops.h"
/*
* Local functions...
*/
static double decode_number(unsigned char **, int, double);
static void plot_points(int, param_t *);
/*
* 'AA_arc_absolute()' - Draw an arc.
*/
void
AA_arc_absolute(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
float x, y, /* Transformed coordinates */
dx, dy; /* Distance from current pen */
float start, end, /* Start and end angles */
theta, /* Current angle */
dt, /* Step between points */
radius; /* Radius of arc */
if (num_params < 3)
return;
x = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
Transform[0][2];
y = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
Transform[1][2];
dx = PenPosition[0] - x;
dy = PenPosition[1] - y;
start = (float)(180.0 * atan2(dy, dx) / M_PI);
if (start < 0.0)
start += 360.0f;
end = start + params[2].value.number;
radius = (float)hypot(dx, dy);
if (PenDown)
{
if (num_params > 3 && params[3].value.number > 0.0)
dt = (float)fabs(params[3].value.number);
else
dt = 5.0;
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
if (start < end)
for (theta = start + dt; theta < end; theta += dt)
{
PenPosition[0] = (float)(x + radius * cos(M_PI * theta / 180.0));
PenPosition[1] = (float)(y + radius * sin(M_PI * theta / 180.0));
Outputf("%.3f %.3f LI\n", PenPosition[0], PenPosition[1]);
}
else
for (theta = start - dt; theta > end; theta -= dt)
{
PenPosition[0] = (float)(x + radius * cos(M_PI * theta / 180.0));
PenPosition[1] = (float)(y + radius * sin(M_PI * theta / 180.0));
Outputf("%.3f %.3f LI\n", PenPosition[0], PenPosition[1]);
}
}
PenPosition[0] = (float)(x + radius * cos(M_PI * end / 180.0));
PenPosition[1] = (float)(y + radius * sin(M_PI * end / 180.0));
if (PenDown)
{
Outputf("%.3f %.3f LI\n", PenPosition[0], PenPosition[1]);
if (!PolygonMode)
Outputf("ST\n");
}
}
/*
* 'AR_arc_relative()' - Draw an arc relative to the current pen
* position.
*/
void
AR_arc_relative(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
float x, y, /* Transformed coordinates */
dx, dy; /* Distance from current pen */
float start, end, /* Start and end angles */
theta, /* Current angle */
dt, /* Step between points */
radius; /* Radius of arc */
if (num_params < 3)
return;
x = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
PenPosition[0];
y = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
PenPosition[1];
dx = PenPosition[0] - x;
dy = PenPosition[1] - y;
start = (float)(180.0 * atan2(dy, dx) / M_PI);
if (start < 0.0)
start += 360.0f;
end = start + params[2].value.number;
radius = (float)hypot(dx, dy);
if (PenDown)
{
if (num_params > 3 && params[3].value.number > 0.0)
dt = (float)fabs(params[3].value.number);
else
dt = 5.0;
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
if (start < end)
for (theta = start + dt; theta < end; theta += dt)
{
PenPosition[0] = (float)(x + radius * cos(M_PI * theta / 180.0));
PenPosition[1] = (float)(y + radius * sin(M_PI * theta / 180.0));
Outputf("%.3f %.3f LI\n", PenPosition[0], PenPosition[1]);
}
else
for (theta = start - dt; theta > end; theta -= dt)
{
PenPosition[0] = (float)(x + radius * cos(M_PI * theta / 180.0));
PenPosition[1] = (float)(y + radius * sin(M_PI * theta / 180.0));
Outputf("%.3f %.3f LI\n", PenPosition[0], PenPosition[1]);
}
}
PenPosition[0] = (float)(x + radius * cos(M_PI * end / 180.0));
PenPosition[1] = (float)(y + radius * sin(M_PI * end / 180.0));
if (PenDown)
{
Outputf("%.3f %.3f LI\n", PenPosition[0], PenPosition[1]);
if (!PolygonMode)
Outputf("ST\n");
}
}
/*
* 'AT_arc_absolute3()' - Draw an arc using 3 points.
*
* Note:
*
* Currently this only draws two line segments through the
* specified points.
*/
void
AT_arc_absolute3(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params < 4)
return;
if (PenDown)
{
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
PenPosition[0] = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
Transform[0][2];
PenPosition[1] = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
Transform[1][2];
Outputf("%.3f %.3f LI\n", PenPosition[0], PenPosition[1]);
}
PenPosition[0] = Transform[0][0] * params[2].value.number +
Transform[0][1] * params[3].value.number +
Transform[0][2];
PenPosition[1] = Transform[1][0] * params[2].value.number +
Transform[1][1] * params[3].value.number +
Transform[1][2];
if (PenDown)
{
Outputf("%.3f %.3f LI\n", PenPosition[0], PenPosition[1]);
if (!PolygonMode)
Outputf("ST\n");
}
}
/*
* 'CI_circle()' - Draw a circle.
*/
void
CI_circle(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
float x, y; /* Transformed coordinates */
float theta, /* Current angle */
dt, /* Step between points */
radius; /* Radius of circle */
if (num_params < 1)
return;
if (!PenDown)
return;
radius = params[0].value.number;
if (num_params > 1)
dt = (float)fabs(params[1].value.number);
else
dt = 5.0;
if (!PolygonMode)
Outputf("MP\n");
for (theta = 0.0; theta < 360.0; theta += dt)
{
x = (float)(PenPosition[0] +
radius * cos(M_PI * theta / 180.0) * Transform[0][0] +
radius * sin(M_PI * theta / 180.0) * Transform[0][1]);
y = (float)(PenPosition[1] +
radius * cos(M_PI * theta / 180.0) * Transform[1][0] +
radius * sin(M_PI * theta / 180.0) * Transform[1][1]);
Outputf("%.3f %.3f %s\n", x, y, theta == 0.0 ? "MO" : "LI");
}
Outputf("CP\n");
if (!PolygonMode)
Outputf("ST\n");
}
/*
* 'PA_plot_absolute()' - Plot a line using absolute coordinates.
*/
void
PA_plot_absolute(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
PenMotion = 0;
if (num_params > 1)
plot_points(num_params, params);
}
/*
* 'PD_pen_down()' - Start drawing.
*/
void
PD_pen_down(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
PenDown = 1;
if (num_params > 1)
plot_points(num_params, params);
}
/*
* 'PE_polygon_encoded()' - Draw an encoded polyline.
*/
void
PE_polyline_encoded(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
unsigned char *s; /* Pointer into string */
int temp, /* Temporary value */
base_bits, /* Data bits per byte */
draw, /* Draw or move */
abscoords; /* Use absolute coordinates */
double tx, ty, /* Transformed coordinates */
x, y, /* Raw coordinates */
frac_bits; /* Multiplier for encoded number */
base_bits = 6;
frac_bits = 1.0;
draw = 1;
abscoords = 0;
if (num_params == 0)
return;
if (!PolygonMode)
{
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
}
for (s = (unsigned char *)params[0].value.string; *s != '\0';)
switch (*s)
{
case '7' :
s ++;
base_bits = 5;
break;
case ':' : /* Select pen */
s ++;
temp = (int)decode_number(&s, base_bits, 1.0);
Outputf("P%d W%d\n", temp, temp);
break;
case '<' : /* Next coords are a move-to */
draw = 0;
s ++;
break;
case '>' : /* Set fractional bits */
s ++;
temp = (int)decode_number(&s, base_bits, 1.0);
frac_bits = 1.0 / (1 << temp);
break;
case '=' : /* Next coords are absolute */
s ++;
abscoords = 1;
break;
default :
if (*s >= 63)
{
/*
* Coordinate...
*/
x = decode_number(&s, base_bits, frac_bits);
y = decode_number(&s, base_bits, frac_bits);
if (abscoords)
{
tx = Transform[0][0] * x + Transform[0][1] * y +
Transform[0][2];
ty = Transform[1][0] * x + Transform[1][1] * y +
Transform[1][2];
}
else if (x == 0.0 && y == 0.0)
{
draw = 1;
continue;
}
else
{
tx = Transform[0][0] * x + Transform[0][1] * y +
PenPosition[0];
ty = Transform[1][0] * x + Transform[1][1] * y +
PenPosition[1];
}
if (draw)
Outputf("%.3f %.3f LI\n", tx, ty);
else
Outputf("%.3f %.3f MO\n", tx, ty);
PenPosition[0] = (float)tx;
PenPosition[1] = (float)ty;
draw = 1;
abscoords = 0;
}
else
{
/*
* Junk - ignore...
*/
if (*s != '\n' && *s != '\r')
fprintf(stderr, "WARNING: ignoring illegal PE char \'%c\'...\n", *s);
s ++;
}
break;
}
if (!PolygonMode)
Outputf("ST\n");
}
/*
* 'PR_plot_relative()' - Plot a line using relative coordinates.
*/
void
PR_plot_relative(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
PenMotion = 1;
if (num_params > 1)
plot_points(num_params, params);
}
/*
* 'PU_pen_up()' - Stop drawing.
*/
void
PU_pen_up(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
PenDown = 0;
if (num_params > 1)
plot_points(num_params, params);
}
/*
* 'RT_arc_relative3()' - Draw an arc through 3 points relative to the
* current pen position.
*
* Note:
*
* This currently only draws two line segments through the specified
* points.
*/
void
RT_arc_relative3(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
if (num_params < 4)
return;
if (PenDown)
{
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
PenPosition[0] = Transform[0][0] * params[0].value.number +
Transform[0][1] * params[1].value.number +
PenPosition[0];
PenPosition[1] = Transform[1][0] * params[0].value.number +
Transform[1][1] * params[1].value.number +
PenPosition[1];
Outputf("%.3f %.3f LI\n", PenPosition[0], PenPosition[1]);
}
PenPosition[0] = Transform[0][0] * params[2].value.number +
Transform[0][1] * params[3].value.number +
PenPosition[0];
PenPosition[1] = Transform[1][0] * params[2].value.number +
Transform[1][1] * params[3].value.number +
PenPosition[1];
if (PenDown)
{
Outputf("%.3f %.3f LI\n", PenPosition[0], PenPosition[1]);
if (!PolygonMode)
Outputf("ST\n");
}
}
/*
* 'decode_number()' - Decode an encoded number.
*/
static double /* O - Value */
decode_number(unsigned char **s, /* IO - String to decode */
int base_bits, /* I - Number of data bits per byte */
double frac_bits) /* I - Multiplier for fractional data */
{
double temp, /* Current value */
shift; /* Multiplier */
int sign; /* Sign of result */
sign = 0;
if (base_bits == 5)
{
for (temp = 0.0, shift = frac_bits * 0.5; **s != '\0'; (*s) ++)
if (**s >= 95 && **s < 127)
{
if (sign == 0)
{
if ((**s - 95) & 1)
sign = -1;
else
sign = 1;
temp += ((**s - 95) & ~1) * shift;
}
else
temp += (**s - 95) * shift;
break;
}
else if (**s < 63)
{
if (**s != '\r' && **s != '\n')
fprintf(stderr, "hpgl2ps: Bad PE character \'%c\'!\n", **s);
continue;
}
else
{
if (sign == 0)
{
if ((**s - 63) & 1)
sign = -1;
else
sign = 1;
temp += ((**s - 63) & ~1) * shift;
}
else
temp += (**s - 63) * shift;
shift *= 32.0;
}
}
else
{
for (temp = 0.0, shift = frac_bits * 0.5; **s != '\0'; (*s) ++)
if (**s >= 191 && **s < 255)
{
if (sign == 0)
{
if ((**s - 191) & 1)
sign = -1;
else
sign = 1;
temp += ((**s - 191) & ~1) * shift;
}
else
temp += (**s - 191) * shift;
break;
}
else if (**s < 63)
{
if (**s != '\r' && **s != '\n')
fprintf(stderr, "hpgl2ps: Bad PE character \'%c\'!\n", **s);
continue;
}
else
{
if (sign == 0)
{
if ((**s - 63) & 1)
sign = -1;
else
sign = 1;
temp += ((**s - 63) & ~1) * shift;
}
else
temp += (**s - 63) * shift;
shift *= 64.0;
}
}
(*s) ++;
return (temp * sign);
}
/*
* 'plot_points()' - Plot the specified points.
*/
static void
plot_points(int num_params, /* I - Number of parameters */
param_t *params) /* I - Parameters */
{
int i; /* Looping var */
float x, y; /* Transformed coordinates */
if (PenDown)
{
if (!PolygonMode)
Outputf("MP\n");
Outputf("%.3f %.3f MO\n", PenPosition[0], PenPosition[1]);
}
for (i = 0; i < num_params; i += 2)
{
if (PenMotion == 0)
{
x = Transform[0][0] * params[i + 0].value.number +
Transform[0][1] * params[i + 1].value.number +
Transform[0][2];
y = Transform[1][0] * params[i + 0].value.number +
Transform[1][1] * params[i + 1].value.number +
Transform[1][2];
}
else
{
x = Transform[0][0] * params[i + 0].value.number +
Transform[0][1] * params[i + 1].value.number +
PenPosition[0];
y = Transform[1][0] * params[i + 0].value.number +
Transform[1][1] * params[i + 1].value.number +
PenPosition[1];
}
if (PenDown)
Outputf("%.3f %.3f LI\n", x, y);
PenPosition[0] = x;
PenPosition[1] = y;
}
if (PenDown)
{
if (!PolygonMode)
Outputf("ST\n");
}
}
/*
* End of "$Id$".
*/
+196
Ver Arquivo
@@ -0,0 +1,196 @@
/*
* "$Id$"
*
* HP-GL/2 to PostScript filter for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
/*
* Include necessary headers...
*/
#include "common.h"
#include <math.h>
#ifndef M_PI
# define M_PI 3.14159265358979323846
#endif /* M_PI */
/*
* Parameter value structure...
*/
typedef struct
{
int type;
union
{
float number;
char *string;
} value;
} param_t;
#define PARAM_ABSOLUTE 0
#define PARAM_RELATIVE 1
#define PARAM_STRING 2
/*
* Globals...
*/
#ifdef _HPGL_MAIN_C_
# define VAR
# define VALUE(x) =x
# define VALUE2(x,y) ={x,y}
#else
# define VAR extern
# define VALUE(x)
# define VALUE2(x,y)
#endif /* _HPGL_MAIN_C_ */
VAR float P1[2], /* Lower-lefthand physical limit */
P2[2], /* Upper-righthand physical limit */
IW1[2], /* Window lower-lefthand limit */
IW2[2]; /* Window upper-righthand limit */
VAR int Rotation VALUE(0); /* Page rotation */
VAR int ScalingType VALUE(-1); /* Type of scaling (-1 for none) */
VAR float Scaling1[2], /* Lower-lefthand user limit */
Scaling2[2]; /* Upper-righthand user limit */
VAR float Transform[2][3]; /* Transform matrix */
VAR int PageRotation VALUE(0); /* Page/plot rotation */
VAR char StringTerminator VALUE('\003'); /* Terminator for labels */
VAR float PenPosition[2] VALUE2(0.0f, 0.0f),
/* Current pen position */
PenScaling VALUE(1.0f); /* Pen width scaling factor */
VAR int PenMotion VALUE(0), /* 0 = absolute, 1 = relative */
PenNumber VALUE(1), /* Current pen number */
PenCount VALUE(8), /* Number of pens */
PenDown VALUE(0), /* 0 = pen up, 1 = pen down */
PolygonMode VALUE(0), /* Drawing polygons? */
PageCount VALUE(1), /* Number of pages in plot */
PageDirty VALUE(0), /* Current page written on? */
WidthUnits VALUE(0); /* 0 = mm, 1 = proportionate */
VAR float PlotSize[2] VALUE2(2592.0f, 3456.0f);
/* Plot size */
VAR int CharFillMode VALUE(0), /* Where to draw labels */
CharPen VALUE(0), /* Pen to use for labels */
CharFont VALUE(0); /* Font to use for labels */
VAR float CharHeight[2] VALUE2(11.5f,11.5f);
/* Size of font for labels */
VAR int FitPlot VALUE(0); /* 1 = fit to page */
VAR float ColorRange[3][2] /* Range of color values */
#ifdef _HPGL_MAIN_C_
= {
{ 0.0, 255.0 },
{ 0.0, 255.0 },
{ 0.0, 255.0 }
}
#endif /* _HPGL_MAIN_C_ */
;
/*
* Prototypes...
*/
/* hpgl-input.c */
extern int ParseCommand(FILE *fp, char *name, param_t **params);
extern void FreeParameters(int num_params, param_t *params);
/* hpgl-config.c */
extern void update_transform(void);
extern void BP_begin_plot(int num_params, param_t *params);
extern void DF_default_values(int num_params, param_t *params);
extern void IN_initialize(int num_params, param_t *params);
extern void IP_input_absolute(int num_params, param_t *params);
extern void IR_input_relative(int num_params, param_t *params);
extern void IW_input_window(int num_params, param_t *params);
extern void PG_advance_page(int num_params, param_t *params);
extern void PS_plot_size(int num_params, param_t *params);
extern void RO_rotate(int num_params, param_t *params);
extern void RP_replot(int num_params, param_t *params);
extern void SC_scale(int num_params, param_t *params);
/* hpgl-vector.c */
extern void AA_arc_absolute(int num_params, param_t *params);
extern void AR_arc_relative(int num_params, param_t *params);
extern void AT_arc_absolute3(int num_params, param_t *params);
extern void CI_circle(int num_params, param_t *params);
extern void PA_plot_absolute(int num_params, param_t *params);
extern void PD_pen_down(int num_params, param_t *params);
extern void PE_polyline_encoded(int num_params, param_t *params);
extern void PR_plot_relative(int num_params, param_t *params);
extern void PU_pen_up(int num_params, param_t *params);
extern void RT_arc_relative3(int num_params, param_t *params);
/* hpgl-polygon.c */
extern void EA_edge_rect_absolute(int num_params, param_t *params);
extern void EP_edge_polygon(int num_params, param_t *params);
extern void ER_edge_rect_relative(int num_params, param_t *params);
extern void EW_edge_wedge(int num_params, param_t *params);
extern void FP_fill_polygon(int num_params, param_t *params);
extern void PM_polygon_mode(int num_params, param_t *params);
extern void RA_fill_rect_absolute(int num_params, param_t *params);
extern void RR_fill_rect_relative(int num_params, param_t *params);
extern void WG_fill_wedge(int num_params, param_t *params);
/* hpgl-char.c */
extern void AD_define_alternate(int num_params, param_t *params);
extern void CF_character_fill(int num_params, param_t *params);
extern void CP_character_plot(int num_params, param_t *params);
extern void DI_absolute_direction(int num_params, param_t *params);
extern void DR_relative_direction(int num_params, param_t *params);
extern void DT_define_label_term(int num_params, param_t *params);
extern void DV_define_variable_path(int num_params, param_t *params);
extern void ES_extra_space(int num_params, param_t *params);
extern void LB_label(int num_params, param_t *params);
extern void LO_label_origin(int num_params, param_t *params);
extern void SA_select_alternate(int num_params, param_t *params);
extern void SD_define_standard(int num_params, param_t *params);
extern void SI_absolute_size(int num_params, param_t *params);
extern void SL_character_slant(int num_params, param_t *params);
extern void SR_relative_size(int num_params, param_t *params);
extern void SS_select_standard(int num_params, param_t *params);
extern void TD_transparent_data(int num_params, param_t *params);
/* hpgl-attr.c */
extern void AC_anchor_corner(int num_params, param_t *params);
extern void CR_color_range(int num_params, param_t *params);
extern void FT_fill_type(int num_params, param_t *params);
extern void LA_line_attributes(int num_params, param_t *params);
extern void LT_line_type(int num_params, param_t *params);
extern void NP_number_pens(int num_params, param_t *params);
extern void PC_pen_color(int num_params, param_t *params);
extern void PW_pen_width(int num_params, param_t *params);
extern void RF_raster_fill(int num_params, param_t *params);
extern void SM_symbol_mode(int num_params, param_t *params);
extern void SP_select_pen(int num_params, param_t *params);
extern void UL_user_line_type(int num_params, param_t *params);
extern void WU_width_units(int num_params, param_t *params);
/* hpgl-prolog.c */
extern void OutputProlog(char *title, char *user, int shading, float penwidth);
extern void OutputTrailer(void);
extern int Outputf(const char *format, ...);
/*
* End of "$Id$".
*/
+911
Ver Arquivo
@@ -0,0 +1,911 @@
/*
* "$Id$"
*
* Colorspace conversions for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ImageWhiteToWhite() - Convert luminance colors to device-dependent
* ImageWhiteToRGB() - Convert luminance data to RGB.
* ImageWhiteToBlack() - Convert luminance colors to black.
* ImageWhiteToCMY() - Convert luminance colors to CMY.
* ImageWhiteToCMYK() - Convert luminance colors to CMYK.
* ImageRGBToBlack() - Convert RGB data to black.
* ImageRGBToCMY() - Convert RGB colors to CMY.
* ImageRGBToCMYK() - Convert RGB colors to CMYK.
* ImageRGBToWhite() - Convert RGB colors to luminance.
* ImageRGBToRGB() - Convert RGB colors to device-dependent RGB.
* ImageLut() - Adjust all pixel values with the given LUT.
* ImageRGBAdjust() - Adjust the hue and saturation of the given RGB
* colors.
* huerotate() - Rotate the hue, maintaining luminance.
* ident() - Make an identity matrix.
* mult() - Multiply two matrices.
* saturate() - Make a saturation matrix.
* xform() - Transform a 3D point using a matrix...
* xrotate() - Rotate about the x (red) axis...
* yrotate() - Rotate about the y (green) axis...
* zrotate() - Rotate about the z (blue) axis...
* zshear() - Shear z using x and y...
*/
/*
* Include necessary headers...
*/
#include "image.h"
#include <math.h>
/*
* Globals...
*/
extern int ImageHaveProfile;
extern int ImageDensity[256];
extern int ImageMatrix[3][3][256];
/*
* Local functions...
*/
static void huerotate(float [3][3], float);
static void ident(float [3][3]);
static void mult(float [3][3], float [3][3], float [3][3]);
static void saturate(float [3][3], float);
static void xform(float [3][3], float, float, float, float *, float *, float *);
static void xrotate(float [3][3], float, float);
static void yrotate(float [3][3], float, float);
static void zrotate(float [3][3], float, float);
static void zshear(float [3][3], float, float);
/*
* 'ImageWhiteToWhite()' - Convert luminance colors to device-dependent
* luminance.
*/
void
ImageWhiteToWhite(const ib_t *in, /* I - Input pixels */
ib_t *out, /* I - Output pixels */
int count) /* I - Number of pixels */
{
if (ImageHaveProfile)
while (count > 0)
{
*out++ = 255 - ImageDensity[255 - *in++];
count --;
}
else if (in != out)
memcpy(out, in, count);
}
/*
* 'ImageWhiteToRGB()' - Convert luminance data to RGB.
*/
void
ImageWhiteToRGB(const ib_t *in, /* I - Input pixels */
ib_t *out, /* I - Output pixels */
int count) /* I - Number of pixels */
{
if (ImageHaveProfile)
while (count > 0)
{
out[0] = 255 - ImageDensity[255 - *in++];
out[1] = out[0];
out[2] = out[0];
out += 3;
count --;
}
else
while (count > 0)
{
*out++ = *in;
*out++ = *in;
*out++ = *in++;
count --;
}
}
/*
* 'ImageWhiteToBlack()' - Convert luminance colors to black.
*/
void
ImageWhiteToBlack(const ib_t *in, /* I - Input pixels */
ib_t *out, /* I - Output pixels */
int count) /* I - Number of pixels */
{
if (ImageHaveProfile)
while (count > 0)
{
*out++ = ImageDensity[255 - *in++];
count --;
}
else
while (count > 0)
{
*out++ = 255 - *in++;
count --;
}
}
/*
* 'ImageWhiteToCMY()' - Convert luminance colors to CMY.
*/
void
ImageWhiteToCMY(const ib_t *in, /* I - Input pixels */
ib_t *out, /* I - Output pixels */
int count) /* I - Number of pixels */
{
if (ImageHaveProfile)
while (count > 0)
{
out[0] = ImageDensity[255 - *in++];
out[1] = out[0];
out[2] = out[0];
out += 3;
count --;
}
else
while (count > 0)
{
*out++ = 255 - *in;
*out++ = 255 - *in;
*out++ = 255 - *in++;
count --;
}
}
/*
* 'ImageWhiteToCMYK()' - Convert luminance colors to CMYK.
*/
void
ImageWhiteToCMYK(const ib_t *in, /* I - Input pixels */
ib_t *out, /* I - Output pixels */
int count) /* I - Number of pixels */
{
if (ImageHaveProfile)
while (count > 0)
{
*out++ = 0;
*out++ = 0;
*out++ = 0;
*out++ = ImageDensity[255 - *in++];
count --;
}
else
while (count > 0)
{
*out++ = 0;
*out++ = 0;
*out++ = 0;
*out++ = 255 - *in++;
count --;
}
}
/*
* 'ImageRGBToBlack()' - Convert RGB data to black.
*/
void
ImageRGBToBlack(const ib_t *in, /* I - Input pixels */
ib_t *out, /* I - Output pixels */
int count) /* I - Number of pixels */
{
if (ImageHaveProfile)
while (count > 0)
{
*out++ = ImageDensity[255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100];
in += 3;
count --;
}
else
while (count > 0)
{
*out++ = 255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100;
in += 3;
count --;
}
}
/*
* 'ImageRGBToCMY()' - Convert RGB colors to CMY.
*/
void
ImageRGBToCMY(const ib_t *in, /* I - Input pixels */
ib_t *out, /* I - Output pixels */
int count) /* I - Number of pixels */
{
int c, m, y, k; /* CMYK values */
int cc, cm, cy; /* Calibrated CMY values */
if (ImageHaveProfile)
while (count > 0)
{
c = 255 - *in++;
m = 255 - *in++;
y = 255 - *in++;
k = min(c, min(m, y));
c -= k;
m -= k;
y -= k;
cc = ImageMatrix[0][0][c] +
ImageMatrix[0][1][m] +
ImageMatrix[0][2][y] + k;
cm = ImageMatrix[1][0][c] +
ImageMatrix[1][1][m] +
ImageMatrix[1][2][y] + k;
cy = ImageMatrix[2][0][c] +
ImageMatrix[2][1][m] +
ImageMatrix[2][2][y] + k;
if (cc < 0)
*out++ = 0;
else if (cc > 255)
*out++ = ImageDensity[255];
else
*out++ = ImageDensity[cc];
if (cm < 0)
*out++ = 0;
else if (cm > 255)
*out++ = ImageDensity[255];
else
*out++ = ImageDensity[cm];
if (cy < 0)
*out++ = 0;
else if (cy > 255)
*out++ = ImageDensity[255];
else
*out++ = ImageDensity[cy];
count --;
}
else
while (count > 0)
{
c = 255 - in[0];
m = 255 - in[1];
y = 255 - in[2];
k = min(c, min(m, y));
*out++ = (255 - in[1] / 4) * (c - k) / 255 + k;
*out++ = (255 - in[2] / 4) * (m - k) / 255 + k;
*out++ = (255 - in[0] / 4) * (y - k) / 255 + k;
in += 3;
count --;
}
}
/*
* 'ImageRGBToCMYK()' - Convert RGB colors to CMYK.
*/
void
ImageRGBToCMYK(const ib_t *in, /* I - Input pixels */
ib_t *out, /* I - Output pixels */
int count)/* I - Number of pixels */
{
int c, m, y, k, /* CMYK values */
km, /* Maximum K value */
diff, /* Color differences */
divk; /* Color divisor */
int cc, cm, cy; /* Calibrated CMY values */
if (ImageHaveProfile)
while (count > 0)
{
c = 255 - *in++;
m = 255 - *in++;
y = 255 - *in++;
k = min(c, min(m, y));
if ((km = max(c, max(m, y))) > k)
k = k * k / km;
if (k == 255)
c = m = y = 0;
else if (k > 0)
{
divk = 255 - k;
c = 255 * (c - k) / divk;
m = 255 * (m - k) / divk;
y = 255 * (y - k) / divk;
if (c > 255)
c = 255;
if (m > 255)
m = 255;
if (y > 255)
y = 255;
}
cc = (ImageMatrix[0][0][c] +
ImageMatrix[0][1][m] +
ImageMatrix[0][2][y]);
cm = (ImageMatrix[1][0][c] +
ImageMatrix[1][1][m] +
ImageMatrix[1][2][y]);
cy = (ImageMatrix[2][0][c] +
ImageMatrix[2][1][m] +
ImageMatrix[2][2][y]);
if (cc < 0)
*out++ = 0;
else if (cc > 255)
*out++ = ImageDensity[255];
else
*out++ = ImageDensity[cc];
if (cm < 0)
*out++ = 0;
else if (cm > 255)
*out++ = ImageDensity[255];
else
*out++ = ImageDensity[cm];
if (cy < 0)
*out++ = 0;
else if (cy > 255)
*out++ = ImageDensity[255];
else
*out++ = ImageDensity[cy];
*out++ = ImageDensity[k];
count --;
}
else
while (count > 0)
{
c = 255 - *in++;
m = 255 - *in++;
y = 255 - *in++;
k = min(c, min(m, y));
if (k == 255)
c = m = y = 0;
else if (k > 0)
{
divk = 255 - k;
c = 255 * (c - k) / divk;
m = 255 * (m - k) / divk;
y = 255 * (y - k) / divk;
if (c > 255)
c = 255;
if (m > 255)
m = 255;
if (y > 255)
y = 255;
}
*out++ = c;
*out++ = m;
*out++ = y;
*out++ = k;
count --;
}
}
/*
* 'ImageRGBToWhite()' - Convert RGB colors to luminance.
*/
void
ImageRGBToWhite(const ib_t *in, /* I - Input pixels */
ib_t *out, /* I - Output pixels */
int count) /* I - Number of pixels */
{
if (ImageHaveProfile)
while (count > 0)
{
*out++ = 255 - ImageDensity[255 - (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100];
in += 3;
count --;
}
else
while (count > 0)
{
*out++ = (31 * in[0] + 61 * in[1] + 8 * in[2]) / 100;
in += 3;
count --;
}
}
/*
* 'ImageRGBToRGB()' - Convert RGB colors to device-dependent RGB.
*/
void
ImageRGBToRGB(const ib_t *in, /* I - Input pixels */
ib_t *out, /* I - Output pixels */
int count) /* I - Number of pixels */
{
int c, m, y, k; /* CMYK values */
int cr, cg, cb; /* Calibrated RGB values */
if (ImageHaveProfile)
while (count > 0)
{
c = 255 - *in++;
m = 255 - *in++;
y = 255 - *in++;
k = min(c, min(m, y));
c -= k;
m -= k;
y -= k;
cr = ImageMatrix[0][0][c] +
ImageMatrix[0][1][m] +
ImageMatrix[0][2][y] + k;
cg = ImageMatrix[1][0][c] +
ImageMatrix[1][1][m] +
ImageMatrix[1][2][y] + k;
cb = ImageMatrix[2][0][c] +
ImageMatrix[2][1][m] +
ImageMatrix[2][2][y] + k;
if (cr < 0)
*out++ = 255;
else if (cr > 255)
*out++ = 255 - ImageDensity[255];
else
*out++ = 255 - ImageDensity[cr];
if (cg < 0)
*out++ = 255;
else if (cg > 255)
*out++ = 255 - ImageDensity[255];
else
*out++ = 255 - ImageDensity[cg];
if (cb < 0)
*out++ = 255;
else if (cb > 255)
*out++ = 255 - ImageDensity[255];
else
*out++ = 255 - ImageDensity[cb];
count --;
}
else if (in != out)
memcpy(out, in, count * 3);
}
/*
* 'ImageLut()' - Adjust all pixel values with the given LUT.
*/
void
ImageLut(ib_t *pixels, /* IO - Input/output pixels */
int count, /* I - Number of pixels/bytes to adjust */
const ib_t *lut) /* I - Lookup table */
{
while (count > 0)
{
*pixels = lut[*pixels];
pixels ++;
count --;
}
}
/*
* 'ImageRGBAdjust()' - Adjust the hue and saturation of the given RGB colors.
*/
void
ImageRGBAdjust(ib_t *pixels, /* IO - Input/output pixels */
int count, /* I - Number of pixels to adjust */
int saturation, /* I - Color saturation (%) */
int hue) /* I - Color hue (degrees) */
{
int i, j, k; /* Looping vars */
float mat[3][3]; /* Color adjustment matrix */
static int last_sat = 100, /* Last saturation used */
last_hue = 0; /* Last hue used */
static int lut[3][3][256]; /* Lookup table for matrix */
if (saturation != last_sat ||
hue != last_hue)
{
/*
* Build the color adjustment matrix...
*/
ident(mat);
saturate(mat, saturation * 0.01);
huerotate(mat, (float)hue);
/*
* Convert the matrix into a 3x3 array of lookup tables...
*/
for (i = 0; i < 3; i ++)
for (j = 0; j < 3; j ++)
for (k = 0; k < 256; k ++)
lut[i][j][k] = mat[i][j] * k + 0.5;
/*
* Save the saturation and hue to compare later...
*/
last_sat = saturation;
last_hue = hue;
}
/*
* Adjust each pixel in the given buffer.
*/
while (count > 0)
{
i = lut[0][0][pixels[0]] +
lut[1][0][pixels[1]] +
lut[2][0][pixels[2]];
if (i < 0)
pixels[0] = 0;
else if (i > 255)
pixels[0] = 255;
else
pixels[0] = i;
i = lut[0][1][pixels[0]] +
lut[1][1][pixels[1]] +
lut[2][1][pixels[2]];
if (i < 0)
pixels[1] = 0;
else if (i > 255)
pixels[1] = 255;
else
pixels[1] = i;
i = lut[0][2][pixels[0]] +
lut[1][2][pixels[1]] +
lut[2][2][pixels[2]];
if (i < 0)
pixels[2] = 0;
else if (i > 255)
pixels[2] = 255;
else
pixels[2] = i;
count --;
pixels += 3;
}
}
/*
* The color saturation/hue matrix stuff is provided thanks to Mr. Paul
* Haeberli at "http://www.sgi.com/grafica/matrix/index.html".
*/
/*
* 'huerotate()' - Rotate the hue, maintaining luminance.
*/
static void
huerotate(float mat[3][3], /* I - Matrix to append to */
float rot) /* I - Hue rotation in degrees */
{
float hmat[3][3]; /* Hue matrix */
float lx, ly, lz; /* Luminance vector */
float xrs, xrc; /* X rotation sine/cosine */
float yrs, yrc; /* Y rotation sine/cosine */
float zrs, zrc; /* Z rotation sine/cosine */
float zsx, zsy; /* Z shear x/y */
/*
* Load the identity matrix...
*/
ident(hmat);
/*
* Rotate the grey vector into positive Z...
*/
xrs = M_SQRT1_2;
xrc = M_SQRT1_2;
xrotate(hmat,xrs,xrc);
yrs = -1.0 / sqrt(3.0);
yrc = -M_SQRT2 * yrs;
yrotate(hmat,yrs,yrc);
/*
* Shear the space to make the luminance plane horizontal...
*/
xform(hmat, 0.3086, 0.6094, 0.0820, &lx, &ly, &lz);
zsx = lx / lz;
zsy = ly / lz;
zshear(hmat, zsx, zsy);
/*
* Rotate the hue...
*/
zrs = sin(rot * M_PI / 180.0);
zrc = cos(rot * M_PI / 180.0);
zrotate(hmat, zrs, zrc);
/*
* Unshear the space to put the luminance plane back...
*/
zshear(hmat, -zsx, -zsy);
/*
* Rotate the grey vector back into place...
*/
yrotate(hmat, -yrs, yrc);
xrotate(hmat, -xrs, xrc);
/*
* Append it to the current matrix...
*/
mult(hmat, mat, mat);
}
/*
* 'ident()' - Make an identity matrix.
*/
static void
ident(float mat[3][3]) /* I - Matrix to identify */
{
mat[0][0] = 1.0;
mat[0][1] = 0.0;
mat[0][2] = 0.0;
mat[1][0] = 0.0;
mat[1][1] = 1.0;
mat[1][2] = 0.0;
mat[2][0] = 0.0;
mat[2][1] = 0.0;
mat[2][2] = 1.0;
}
/*
* 'mult()' - Multiply two matrices.
*/
static void
mult(float a[3][3], /* I - First matrix */
float b[3][3], /* I - Second matrix */
float c[3][3]) /* I - Destination matrix */
{
int x, y; /* Looping vars */
float temp[3][3]; /* Temporary matrix */
/*
* Multiply a and b, putting the result in temp...
*/
for (y = 0; y < 3; y ++)
for (x = 0; x < 3; x ++)
temp[y][x] = b[y][0] * a[0][x] +
b[y][1] * a[1][x] +
b[y][2] * a[2][x];
/*
* Copy temp to c (that way c can be a pointer to a or b).
*/
memcpy(c, temp, sizeof(temp));
}
/*
* 'saturate()' - Make a saturation matrix.
*/
static void
saturate(float mat[3][3], /* I - Matrix to append to */
float sat) /* I - Desired color saturation */
{
float smat[3][3]; /* Saturation matrix */
smat[0][0] = (1.0 - sat) * 0.3086 + sat;
smat[0][1] = (1.0 - sat) * 0.3086;
smat[0][2] = (1.0 - sat) * 0.3086;
smat[1][0] = (1.0 - sat) * 0.6094;
smat[1][1] = (1.0 - sat) * 0.6094 + sat;
smat[1][2] = (1.0 - sat) * 0.6094;
smat[2][0] = (1.0 - sat) * 0.0820;
smat[2][1] = (1.0 - sat) * 0.0820;
smat[2][2] = (1.0 - sat) * 0.0820 + sat;
mult(smat, mat, mat);
}
/*
* 'xform()' - Transform a 3D point using a matrix...
*/
static void
xform(float mat[3][3], /* I - Matrix */
float x, /* I - Input X coordinate */
float y, /* I - Input Y coordinate */
float z, /* I - Input Z coordinate */
float *tx, /* O - Output X coordinate */
float *ty, /* O - Output Y coordinate */
float *tz) /* O - Output Z coordinate */
{
*tx = x * mat[0][0] + y * mat[1][0] + z * mat[2][0];
*ty = x * mat[0][1] + y * mat[1][1] + z * mat[2][1];
*tz = x * mat[0][2] + y * mat[1][2] + z * mat[2][2];
}
/*
* 'xrotate()' - Rotate about the x (red) axis...
*/
static void
xrotate(float mat[3][3], /* I - Matrix */
float rs, /* I - Rotation angle sine */
float rc) /* I - Rotation angle cosine */
{
float rmat[3][3]; /* I - Rotation matrix */
rmat[0][0] = 1.0;
rmat[0][1] = 0.0;
rmat[0][2] = 0.0;
rmat[1][0] = 0.0;
rmat[1][1] = rc;
rmat[1][2] = rs;
rmat[2][0] = 0.0;
rmat[2][1] = -rs;
rmat[2][2] = rc;
mult(rmat, mat, mat);
}
/*
* 'yrotate()' - Rotate about the y (green) axis...
*/
static void
yrotate(float mat[3][3], /* I - Matrix */
float rs, /* I - Rotation angle sine */
float rc) /* I - Rotation angle cosine */
{
float rmat[3][3]; /* I - Rotation matrix */
rmat[0][0] = rc;
rmat[0][1] = 0.0;
rmat[0][2] = -rs;
rmat[1][0] = 0.0;
rmat[1][1] = 1.0;
rmat[1][2] = 0.0;
rmat[2][0] = rs;
rmat[2][1] = 0.0;
rmat[2][2] = rc;
mult(rmat,mat,mat);
}
/*
* 'zrotate()' - Rotate about the z (blue) axis...
*/
static void
zrotate(float mat[3][3], /* I - Matrix */
float rs, /* I - Rotation angle sine */
float rc) /* I - Rotation angle cosine */
{
float rmat[3][3]; /* I - Rotation matrix */
rmat[0][0] = rc;
rmat[0][1] = rs;
rmat[0][2] = 0.0;
rmat[1][0] = -rs;
rmat[1][1] = rc;
rmat[1][2] = 0.0;
rmat[2][0] = 0.0;
rmat[2][1] = 0.0;
rmat[2][2] = 1.0;
mult(rmat,mat,mat);
}
/*
* 'zshear()' - Shear z using x and y...
*/
static void
zshear(float mat[3][3], /* I - Matrix */
float dx, /* I - X shear */
float dy) /* I - Y shear */
{
float smat[3][3]; /* Shear matrix */
smat[0][0] = 1.0;
smat[0][1] = 0.0;
smat[0][2] = dx;
smat[1][0] = 0.0;
smat[1][1] = 1.0;
smat[1][2] = dy;
smat[2][0] = 0.0;
smat[2][1] = 0.0;
smat[2][2] = 1.0;
mult(smat, mat, mat);
}
/*
* End of "$Id$".
*/
+644
Ver Arquivo
@@ -0,0 +1,644 @@
/*
* "$Id$"
*
* GIF image routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ImageReadGIF() - Read a GIF image file.
* gif_read_cmap() - Read the colormap from a GIF file...
* gif_get_block() - Read a GIF data block...
* gif_get_code() - Get a LZW code from the file...
* gif_read_lzw() - Read a byte from the LZW stream...
* gif_read_image() - Read a GIF image stream...
*/
/*
* Include necessary headers...
*/
#include "image.h"
/*
* GIF definitions...
*/
#define GIF_INTERLACE 0x40
#define GIF_COLORMAP 0x80
typedef ib_t gif_cmap_t[256][4];
/*
* Local globals...
*/
static int gif_eof = 0; /* Did we hit EOF? */
/*
* Local functions...
*/
static int gif_read_cmap(FILE *fp, int ncolors, gif_cmap_t cmap,
int *gray);
static int gif_get_block(FILE *fp, unsigned char *buffer);
static int gif_get_code (FILE *fp, int code_size, int first_time);
static int gif_read_lzw(FILE *fp, int first_time, int input_code_size);
static int gif_read_image(FILE *fp, image_t *img, gif_cmap_t cmap,
int interlace);
/*
* 'ImageReadGIF()' - Read a GIF image file.
*/
int /* O - Read status */
ImageReadGIF(image_t *img, /* IO - Image */
FILE *fp, /* I - Image file */
int primary, /* I - Primary choice for colorspace */
int secondary, /* I - Secondary choice for colorspace */
int saturation, /* I - Color saturation (%) */
int hue, /* I - Color hue (degrees) */
const ib_t *lut) /* I - Lookup table for gamma/brightness */
{
unsigned char buf[1024]; /* Input buffer */
gif_cmap_t cmap; /* Colormap */
int i, /* Looping var */
bpp, /* Bytes per pixel */
gray, /* Grayscale image? */
ncolors, /* Bits per pixel */
transparent; /* Transparent color index */
/*
* Read the header; we already know it is a GIF file...
*/
fread(buf, 13, 1, fp);
img->xsize = (buf[7] << 8) | buf[6];
img->ysize = (buf[9] << 8) | buf[8];
ncolors = 2 << (buf[10] & 0x07);
gray = primary == IMAGE_BLACK || primary == IMAGE_WHITE;
if (buf[10] & GIF_COLORMAP)
if (gif_read_cmap(fp, ncolors, cmap, &gray))
{
fclose(fp);
return (-1);
}
transparent = -1;
for (;;)
{
switch (getc(fp))
{
case ';' : /* End of image */
fclose(fp);
return (-1); /* Early end of file */
case '!' : /* Extension record */
buf[0] = getc(fp);
if (buf[0] == 0xf9) /* Graphic Control Extension */
{
gif_get_block(fp, buf);
if (buf[0] & 1) /* Get transparent color index */
transparent = buf[3];
}
while (gif_get_block(fp, buf) != 0);
break;
case ',' : /* Image data */
fread(buf, 9, 1, fp);
if (buf[8] & GIF_COLORMAP)
{
ncolors = 2 << (buf[8] & 0x07);
gray = primary == IMAGE_BLACK || primary == IMAGE_WHITE;
if (gif_read_cmap(fp, ncolors, cmap, &gray))
{
fclose(fp);
return (-1);
}
}
if (transparent >= 0)
{
/*
* Make transparent color white...
*/
cmap[transparent][0] = 255;
cmap[transparent][1] = 255;
cmap[transparent][2] = 255;
}
if (gray)
{
switch (secondary)
{
case IMAGE_CMYK :
for (i = ncolors - 1; i >= 0; i --)
ImageWhiteToCMYK(cmap[i], cmap[i], 1);
break;
case IMAGE_CMY :
for (i = ncolors - 1; i >= 0; i --)
ImageWhiteToCMY(cmap[i], cmap[i], 1);
break;
case IMAGE_BLACK :
for (i = ncolors - 1; i >= 0; i --)
ImageWhiteToBlack(cmap[i], cmap[i], 1);
break;
case IMAGE_WHITE :
break;
case IMAGE_RGB :
for (i = ncolors - 1; i >= 0; i --)
ImageWhiteToRGB(cmap[i], cmap[i], 1);
break;
}
img->colorspace = secondary;
}
else
{
if (hue != 0 || saturation != 100)
for (i = ncolors - 1; i >= 0; i --)
ImageRGBAdjust(cmap[i], 1, saturation, hue);
switch (primary)
{
case IMAGE_CMYK :
for (i = ncolors - 1; i >= 0; i --)
ImageRGBToCMYK(cmap[i], cmap[i], 1);
break;
case IMAGE_CMY :
for (i = ncolors - 1; i >= 0; i --)
ImageRGBToCMY(cmap[i], cmap[i], 1);
break;
case IMAGE_BLACK :
for (i = ncolors - 1; i >= 0; i --)
ImageRGBToBlack(cmap[i], cmap[i], 1);
break;
case IMAGE_WHITE :
for (i = ncolors - 1; i >= 0; i --)
ImageRGBToWhite(cmap[i], cmap[i], 1);
break;
case IMAGE_RGB :
break;
}
img->colorspace = primary;
}
if (lut)
{
bpp = ImageGetDepth(img);
for (i = ncolors - 1; i >= 0; i --)
ImageLut(cmap[i], bpp, lut);
}
img->xsize = (buf[5] << 8) | buf[4];
img->ysize = (buf[7] << 8) | buf[6];
i = gif_read_image(fp, img, cmap, buf[8] & GIF_INTERLACE);
fclose(fp);
return (i);
}
}
}
/*
* 'gif_read_cmap()' - Read the colormap from a GIF file...
*/
static int /* O - -1 on error, 0 on success */
gif_read_cmap(FILE *fp, /* I - File to read from */
int ncolors, /* I - Number of colors in file */
gif_cmap_t cmap, /* O - Colormap information */
int *gray) /* IO - Is the image grayscale? */
{
int i; /* Looping var */
/*
* Read the colormap...
*/
for (i = 0; i < ncolors; i ++)
if (fread(cmap[i], 3, 1, fp) < 1)
return (-1);
/*
* Check to see if the colormap is a grayscale ramp...
*/
for (i = 0; i < ncolors; i ++)
if (cmap[i][0] != cmap[i][1] || cmap[i][1] != cmap[i][2])
break;
if (i == ncolors)
{
*gray = 1;
return (0);
}
/*
* If this needs to be a grayscale image, convert the RGB values to
* luminance values...
*/
if (*gray)
for (i = 0; i < ncolors; i ++)
cmap[i][0] = (cmap[i][0] * 31 + cmap[i][1] * 61 + cmap[i][2] * 8) / 100;
return (0);
}
/*
* 'gif_get_block()' - Read a GIF data block...
*/
static int /* O - Number characters read */
gif_get_block(FILE *fp, /* I - File to read from */
unsigned char *buf) /* I - Input buffer */
{
int count; /* Number of character to read */
/*
* Read the count byte followed by the data from the file...
*/
if ((count = getc(fp)) == EOF)
{
gif_eof = 1;
return (-1);
}
else if (count == 0)
gif_eof = 1;
else if (fread(buf, 1, count, fp) < count)
{
gif_eof = 1;
return (-1);
}
else
gif_eof = 0;
return (count);
}
/*
* 'gif_get_code()' - Get a LZW code from the file...
*/
static int /* O - LZW code */
gif_get_code(FILE *fp, /* I - File to read from */
int code_size, /* I - Size of code in bits */
int first_time) /* I - 1 = first time, 0 = not first time */
{
unsigned i, j, /* Looping vars */
ret; /* Return value */
int count; /* Number of bytes read */
static unsigned char buf[280]; /* Input buffer */
static unsigned curbit, /* Current bit */
lastbit, /* Last bit in buffer */
done, /* Done with this buffer? */
last_byte; /* Last byte in buffer */
static unsigned char bits[8] = /* Bit masks for codes */
{
0x01, 0x02, 0x04, 0x08,
0x10, 0x20, 0x40, 0x80
};
if (first_time)
{
/*
* Just initialize the input buffer...
*/
curbit = 0;
lastbit = 0;
done = 0;
return (0);
}
if ((curbit + code_size) >= lastbit)
{
/*
* Don't have enough bits to hold the code...
*/
if (done)
return (-1); /* Sorry, no more... */
/*
* Move last two bytes to front of buffer...
*/
buf[0] = buf[last_byte - 2];
buf[1] = buf[last_byte - 1];
/*
* Read in another buffer...
*/
if ((count = gif_get_block (fp, buf + 2)) <= 0)
{
/*
* Whoops, no more data!
*/
done = 1;
return (-1);
}
/*
* Update buffer state...
*/
last_byte = 2 + count;
curbit = (curbit - lastbit) + 16;
lastbit = last_byte * 8;
}
ret = 0;
for (ret = 0, i = curbit + code_size - 1, j = code_size;
j > 0;
i --, j --)
ret = (ret << 1) | ((buf[i / 8] & bits[i & 7]) != 0);
curbit += code_size;
return ret;
}
/*
* 'gif_read_lzw()' - Read a byte from the LZW stream...
*/
static int /* I - Byte from stream */
gif_read_lzw(FILE *fp, /* I - File to read from */
int first_time, /* I - 1 = first time, 0 = not first time */
int input_code_size) /* I - Code size in bits */
{
int i, /* Looping var */
code, /* Current code */
incode; /* Input code */
static short fresh = 0, /* 1 = empty buffers */
code_size, /* Current code size */
set_code_size, /* Initial code size set */
max_code, /* Maximum code used */
max_code_size, /* Maximum code size */
firstcode, /* First code read */
oldcode, /* Last code read */
clear_code, /* Clear code for LZW input */
end_code, /* End code for LZW input */
table[2][4096], /* String table */
stack[8192], /* Output stack */
*sp; /* Current stack pointer */
if (first_time)
{
/*
* Setup LZW state...
*/
set_code_size = input_code_size;
code_size = set_code_size + 1;
clear_code = 1 << set_code_size;
end_code = clear_code + 1;
max_code_size = 2 * clear_code;
max_code = clear_code + 2;
/*
* Initialize input buffers...
*/
gif_get_code(fp, 0, 1);
/*
* Wipe the decompressor table...
*/
fresh = 1;
for (i = 0; i < clear_code; i ++)
{
table[0][i] = 0;
table[1][i] = i;
}
for (; i < 4096; i ++)
table[0][i] = table[1][0] = 0;
sp = stack;
return (0);
}
else if (fresh)
{
fresh = 0;
do
firstcode = oldcode = gif_get_code(fp, code_size, 0);
while (firstcode == clear_code);
return (firstcode);
}
if (sp > stack)
return (*--sp);
while ((code = gif_get_code (fp, code_size, 0)) >= 0)
{
if (code == clear_code)
{
for (i = 0; i < clear_code; i ++)
{
table[0][i] = 0;
table[1][i] = i;
}
for (; i < 4096; i ++)
table[0][i] = table[1][i] = 0;
code_size = set_code_size + 1;
max_code_size = 2 * clear_code;
max_code = clear_code + 2;
sp = stack;
firstcode = oldcode = gif_get_code(fp, code_size, 0);
return (firstcode);
}
else if (code == end_code)
{
unsigned char buf[260];
if (!gif_eof)
while (gif_get_block(fp, buf) > 0);
return (-2);
}
incode = code;
if (code >= max_code)
{
*sp++ = firstcode;
code = oldcode;
}
while (code >= clear_code)
{
*sp++ = table[1][code];
if (code == table[0][code])
return (255);
code = table[0][code];
}
*sp++ = firstcode = table[1][code];
code = max_code;
if (code < 4096)
{
table[0][code] = oldcode;
table[1][code] = firstcode;
max_code ++;
if (max_code >= max_code_size && max_code_size < 4096)
{
max_code_size *= 2;
code_size ++;
}
}
oldcode = incode;
if (sp > stack)
return (*--sp);
}
return (code);
}
/*
* 'gif_read_image()' - Read a GIF image stream...
*/
static int /* I - 0 = success, -1 = failure */
gif_read_image(FILE *fp, /* I - Input file */
image_t *img, /* I - Image pointer */
gif_cmap_t cmap, /* I - Colormap */
int interlace) /* I - Non-zero = interlaced image */
{
unsigned char code_size; /* Code size */
ib_t *pixels, /* Pixel buffer */
*temp; /* Current pixel */
int xpos, /* Current X position */
ypos, /* Current Y position */
pass; /* Current pass */
int pixel; /* Current pixel */
int bpp; /* Bytes per pixel */
static int xpasses[4] = { 8, 8, 4, 2 },
ypasses[5] = { 0, 4, 2, 1, 999999 };
bpp = ImageGetDepth(img);
pixels = calloc(bpp, img->xsize);
xpos = 0;
ypos = 0;
pass = 0;
code_size = getc(fp);
if (gif_read_lzw(fp, 1, code_size) < 0)
return (-1);
temp = pixels;
while ((pixel = gif_read_lzw(fp, 0, code_size)) >= 0)
{
switch (bpp)
{
case 4 :
temp[3] = cmap[pixel][3];
case 3 :
temp[2] = cmap[pixel][2];
case 2 :
temp[1] = cmap[pixel][1];
default :
temp[0] = cmap[pixel][0];
}
xpos ++;
temp += bpp;
if (xpos == img->xsize)
{
ImagePutRow(img, 0, ypos, img->xsize, pixels);
xpos = 0;
temp = pixels;
if (interlace)
{
ypos += xpasses[pass];
if (ypos >= img->ysize)
{
pass ++;
ypos = ypasses[pass];
}
}
else
ypos ++;
}
if (ypos >= img->ysize)
break;
}
free(pixels);
return (0);
}
/*
* End of "$Id$".
*/
+190
Ver Arquivo
@@ -0,0 +1,190 @@
/*
* "$Id$"
*
* JPEG image routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ImageReadJPEG() - Read a JPEG image file.
*/
/*
* Include necessary headers...
*/
#include "image.h"
#ifdef HAVE_LIBJPEG
# include <jpeglib.h> /* JPEG/JFIF image definitions */
/*
* 'ImageReadJPEG()' - Read a JPEG image file.
*/
int /* O - Read status */
ImageReadJPEG(image_t *img, /* IO - Image */
FILE *fp, /* I - Image file */
int primary, /* I - Primary choice for colorspace */
int secondary, /* I - Secondary choice for colorspace */
int saturation, /* I - Color saturation (%) */
int hue, /* I - Color hue (degrees) */
const ib_t *lut) /* I - Lookup table for gamma/brightness */
{
struct jpeg_decompress_struct cinfo; /* Decompressor info */
struct jpeg_error_mgr jerr; /* Error handler info */
ib_t *in, /* Input pixels */
*out; /* Output pixels */
(void)secondary;
cinfo.err = jpeg_std_error(&jerr);
jpeg_create_decompress(&cinfo);
jpeg_stdio_src(&cinfo, fp);
jpeg_read_header(&cinfo, 1);
cinfo.quantize_colors = 0;
if (cinfo.num_components == 1)
{
cinfo.out_color_space = JCS_GRAYSCALE;
cinfo.out_color_components = 1;
cinfo.output_components = 1;
}
else
{
cinfo.out_color_space = JCS_RGB;
cinfo.out_color_components = 3;
cinfo.output_components = 3;
}
jpeg_calc_output_dimensions(&cinfo);
img->xsize = cinfo.output_width;
img->ysize = cinfo.output_height;
img->colorspace = primary;
if (cinfo.X_density > 0 && cinfo.Y_density > 0 && cinfo.density_unit > 0)
{
if (cinfo.density_unit == 1)
{
img->xppi = cinfo.X_density;
img->yppi = cinfo.Y_density;
}
else
{
img->xppi = (int)((float)cinfo.X_density * 2.54);
img->yppi = (int)((float)cinfo.Y_density * 2.54);
}
}
ImageSetMaxTiles(img, 0);
in = malloc(img->xsize * cinfo.output_components);
if (primary < 0)
out = malloc(-img->xsize * primary);
else
out = malloc(img->xsize * primary);
jpeg_start_decompress(&cinfo);
while (cinfo.output_scanline < cinfo.output_height)
{
jpeg_read_scanlines(&cinfo, (JSAMPROW *)&in, (JDIMENSION)1);
if ((saturation != 100 || hue != 0) && cinfo.output_components > 1)
ImageRGBAdjust(in, img->xsize, saturation, hue);
if ((primary == IMAGE_WHITE && cinfo.out_color_space == JCS_GRAYSCALE) ||
(primary == IMAGE_RGB && cinfo.out_color_space == JCS_RGB))
{
if (lut)
ImageLut(in, img->xsize * ImageGetDepth(img), lut);
ImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, in);
}
else if (cinfo.out_color_space == JCS_GRAYSCALE)
{
switch (primary)
{
case IMAGE_BLACK :
ImageWhiteToBlack(in, out, img->xsize);
break;
case IMAGE_RGB :
ImageWhiteToRGB(in, out, img->xsize);
break;
case IMAGE_CMY :
ImageWhiteToCMY(in, out, img->xsize);
break;
case IMAGE_CMYK :
ImageWhiteToCMYK(in, out, img->xsize);
break;
}
if (lut)
ImageLut(out, img->xsize * ImageGetDepth(img), lut);
ImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, out);
}
else
{
switch (primary)
{
case IMAGE_WHITE :
ImageRGBToWhite(in, out, img->xsize);
break;
case IMAGE_BLACK :
ImageRGBToBlack(in, out, img->xsize);
break;
case IMAGE_CMY :
ImageRGBToCMY(in, out, img->xsize);
break;
case IMAGE_CMYK :
ImageRGBToCMYK(in, out, img->xsize);
break;
}
if (lut)
ImageLut(out, img->xsize * ImageGetDepth(img), lut);
ImagePutRow(img, 0, cinfo.output_scanline - 1, img->xsize, out);
}
}
free(in);
free(out);
jpeg_finish_decompress(&cinfo);
jpeg_destroy_decompress(&cinfo);
fclose(fp);
return (0);
}
#endif /* HAVE_LIBJPEG */
/*
* End of "$Id$".
*/
+319
Ver Arquivo
@@ -0,0 +1,319 @@
/*
* "$Id$"
*
* PhotoCD routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ImageReadPhotoCD() - Read a PhotoCD image file.
*/
/*
* Include necessary headers...
*/
#include "image.h"
/*
* PhotoCD support is currently limited to the 768x512 base image, which
* is only YCC encoded. Support for the higher resolution images will
* require a lot of extra code...
*/
/*
* 'ImageReadPhotoCD()' - Read a PhotoCD image file.
*/
int /* O - Read status */
ImageReadPhotoCD(image_t *img, /* IO - Image */
FILE *fp, /* I - Image file */
int primary, /* I - Primary choice for colorspace */
int secondary, /* I - Secondary choice for colorspace */
int saturation, /* I - Color saturation (%) */
int hue, /* I - Color hue (degrees) */
const ib_t *lut) /* I - Lookup table for gamma/brightness */
{
int x, y; /* Looping vars */
int xdir, /* X direction */
xstart; /* X starting point */
int bpp; /* Bytes per pixel */
int pass; /* Pass number */
int rotation; /* 0 for 768x512, 1 for 512x768 */
int temp, /* Adjusted luminance */
temp2, /* Red, green, and blue values */
cb, cr; /* Adjusted chroma values */
ib_t *in, /* Input (YCC) pixels */
*iy, /* Luminance */
*icb, /* Blue chroma */
*icr, /* Red chroma */
*rgb, /* RGB */
*rgbptr, /* Pointer into RGB data */
*out; /* Output pixels */
(void)secondary;
/*
* Get the image orientation...
*/
fseek(fp, 72, SEEK_SET);
rotation = (getc(fp) & 63) != 8;
/*
* Seek to the start of the base image...
*/
fseek(fp, 0x30000, SEEK_SET);
/*
* Allocate and initialize...
*/
img->colorspace = primary;
img->xppi = 128;
img->yppi = 128;
if (rotation)
{
img->xsize = 512;
img->ysize = 768;
}
else
{
img->xsize = 768;
img->ysize = 512;
}
ImageSetMaxTiles(img, 0);
bpp = ImageGetDepth(img);
in = malloc(768 * 3);
out = malloc(768 * bpp);
if (bpp > 1)
rgb = malloc(768 * 3);
if (rotation)
{
xstart = 767 * bpp;
xdir = -2 * bpp;
}
else
{
xstart = 0;
xdir = 0;
}
/*
* Read the image file...
*/
for (y = 0; y < 512; y += 2)
{
/*
* Grab the next two scanlines:
*
* YYYYYYYYYYYYYYY...
* YYYYYYYYYYYYYYY...
* CbCbCb...CrCrCr...
*/
if (fread(in, 1, 768 * 3, fp) < (768 * 3))
{
/*
* Couldn't read a row of data - return an error!
*/
free(in);
free(out);
return (-1);
}
/*
* Process the two scanlines...
*/
for (pass = 0, iy = in; pass < 2; pass ++)
{
if (bpp == 1)
{
/*
* Just extract the luminance channel from the line and put it
* in the image...
*/
if (primary == IMAGE_BLACK)
{
if (rotation)
{
for (rgbptr = out + xstart, x = 0; x < 768; x ++)
*rgbptr-- = 255 - *iy++;
if (lut)
ImageLut(out, 768, lut);
ImagePutCol(img, 511 - y - pass, 0, 768, out);
}
else
{
ImageWhiteToBlack(iy, out, 768);
if (lut)
ImageLut(out, 768, lut);
ImagePutRow(img, 0, y + pass, 768, out);
iy += 768;
}
}
else if (rotation)
{
for (rgbptr = out + xstart, x = 0; x < 768; x ++)
*rgbptr-- = 255 - *iy++;
if (lut)
ImageLut(out, 768, lut);
ImagePutCol(img, 511 - y - pass, 0, 768, out);
}
else
{
if (lut)
ImageLut(iy, 768, lut);
ImagePutRow(img, 0, y + pass, 768, iy);
iy += 768;
}
}
else
{
/*
* Convert YCbCr to RGB... While every pixel gets a luminance
* value, adjacent pixels share chroma information.
*/
for (x = 0, rgbptr = rgb + xstart, icb = in + 1536, icr = in + 1920;
x < 768;
x ++, iy ++, rgbptr += xdir)
{
if (!(x & 1))
{
cb = (float)(*icb - 156);
cr = (float)(*icr - 137);
}
temp = 92241 * (*iy);
temp2 = (temp + 86706 * cr) / 65536;
if (temp2 < 0)
*rgbptr++ = 0;
else if (temp2 > 255)
*rgbptr++ = 255;
else
*rgbptr++ = temp2;
temp2 = (temp - 25914 * cb - 44166 * cr) / 65536;
if (temp2 < 0)
*rgbptr++ = 0;
else if (temp2 > 255)
*rgbptr++ = 255;
else
*rgbptr++ = temp2;
temp2 = (temp + 133434 * cb) / 65536;
if (temp2 < 0)
*rgbptr++ = 0;
else if (temp2 > 255)
*rgbptr++ = 255;
else
*rgbptr++ = temp2;
if (x & 1)
{
icb ++;
icr ++;
}
}
/*
* Adjust the hue and saturation if needed...
*/
if (saturation != 100 || hue != 0)
ImageRGBAdjust(rgb, 768, saturation, hue);
/*
* Then convert the RGB data to the appropriate colorspace and
* put it in the image...
*/
if (img->colorspace == IMAGE_RGB)
{
if (lut)
ImageLut(rgb, 768 * 3, lut);
if (rotation)
ImagePutCol(img, 511 - y - pass, 0, 768, rgb);
else
ImagePutRow(img, 0, y + pass, 768, rgb);
}
else
{
switch (img->colorspace)
{
case IMAGE_CMY :
ImageRGBToCMY(rgb, out, 768);
break;
case IMAGE_CMYK :
ImageRGBToCMYK(rgb, out, 768);
break;
}
if (lut)
ImageLut(out, 768 * bpp, lut);
if (rotation)
ImagePutCol(img, 511 - y - pass, 0, 768, out);
else
ImagePutRow(img, 0, y + pass, 768, out);
}
}
}
}
/*
* Free memory and return...
*/
free(in);
free(out);
if (bpp > 1)
free(rgb);
return (0);
}
/*
* End of "$Id$".
*/
+205
Ver Arquivo
@@ -0,0 +1,205 @@
/*
* "$Id$"
*
* PNG image routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ImageReadPNG() - Read a PNG image file.
*/
/*
* Include necessary headers...
*/
#include "image.h"
#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ)
#include <png.h> /* Portable Network Graphics (PNG) definitions */
/*
* 'ImageReadPNG()' - Read a PNG image file.
*/
int /* O - Read status */
ImageReadPNG(image_t *img, /* IO - Image */
FILE *fp, /* I - Image file */
int primary, /* I - Primary choice for colorspace */
int secondary, /* I - Secondary choice for colorspace */
int saturation, /* I - Color saturation (%) */
int hue, /* I - Color hue (degrees) */
const ib_t *lut) /* I - Lookup table for gamma/brightness */
{
int y; /* Looping var */
png_structp pp; /* PNG read pointer */
png_infop info; /* PNG info pointers */
int bpp; /* Bytes per pixel */
ib_t *in, /* Input pixels */
*out; /* Output pixels */
/*
* Setup the PNG data structures...
*/
pp = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL);
info = png_create_info_struct(pp);
/*
* Initialize the PNG read "engine"...
*/
png_init_io(pp, fp);
/*
* Get the image dimensions and load the output image...
*/
png_read_info(pp, info);
if (info->color_type == PNG_COLOR_TYPE_PALETTE)
png_set_expand(pp);
if (info->color_type == PNG_COLOR_TYPE_GRAY ||
info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
img->colorspace = secondary;
else
img->colorspace = primary;
img->xsize = info->width;
img->ysize = info->height;
if (info->valid & PNG_INFO_pHYs &&
info->phys_unit_type == PNG_RESOLUTION_METER)
{
img->xppi = (int)((float)info->x_pixels_per_unit * 0.0254);
img->yppi = (int)((float)info->y_pixels_per_unit * 0.0254);
}
ImageSetMaxTiles(img, 0);
if (info->bit_depth < 8)
{
png_set_packing(pp);
if (info->valid & PNG_INFO_sBIT)
png_set_shift(pp, &(info->sig_bit));
}
else if (info->bit_depth == 16)
png_set_strip_16(pp);
if (info->color_type == PNG_COLOR_TYPE_GRAY ||
info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
in = malloc(img->xsize);
else
in = malloc(img->xsize * 3);
bpp = ImageGetDepth(img);
out = malloc(img->xsize * bpp);
/*
* This doesn't work for interlaced PNG files... :(
*/
for (y = 0; y < img->ysize; y ++)
{
if (info->color_type == PNG_COLOR_TYPE_GRAY ||
info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
{
if (img->colorspace == IMAGE_WHITE)
png_read_row(pp, (png_bytep)out, NULL);
else
{
png_read_row(pp, (png_bytep)in, NULL);
switch (img->colorspace)
{
case IMAGE_RGB :
ImageWhiteToRGB(in, out, img->xsize);
break;
case IMAGE_BLACK :
ImageWhiteToBlack(in, out, img->xsize);
break;
case IMAGE_CMY :
ImageWhiteToCMY(in, out, img->xsize);
break;
case IMAGE_CMYK :
ImageWhiteToCMYK(in, out, img->xsize);
break;
}
}
}
else
{
if (img->colorspace == IMAGE_RGB)
{
png_read_row(pp, (png_bytep)out, NULL);
if (saturation != 100 || hue != 0)
ImageRGBAdjust(out, img->xsize, saturation, hue);
}
else
{
png_read_row(pp, (png_bytep)in, NULL);
if ((saturation != 100 || hue != 0) && bpp > 1)
ImageRGBAdjust(in, img->xsize, saturation, hue);
switch (img->colorspace)
{
case IMAGE_WHITE :
ImageRGBToWhite(in, out, img->xsize);
break;
case IMAGE_BLACK :
ImageRGBToBlack(in, out, img->xsize);
break;
case IMAGE_CMY :
ImageRGBToCMY(in, out, img->xsize);
break;
case IMAGE_CMYK :
ImageRGBToCMYK(in, out, img->xsize);
break;
}
}
}
if (lut)
ImageLut(out, img->xsize * bpp, lut);
ImagePutRow(img, 0, y, img->xsize, out);
}
png_read_end(pp, info);
png_read_destroy(pp, info, NULL);
fclose(fp);
return (0);
}
#endif /* HAVE_LIBPNG && HAVE_LIBZ */
/*
* End of "$Id$".
*/
+288
Ver Arquivo
@@ -0,0 +1,288 @@
/*
* "$Id$"
*
* Portable Any Map file routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ImageReadPNM() - Read a PNM image file.
*/
/*
* Include necessary headers...
*/
#include "image.h"
#include <ctype.h>
/*
* 'ImageReadPNM()' - Read a PNM image file.
*/
int /* O - Read status */
ImageReadPNM(image_t *img, /* IO - Image */
FILE *fp, /* I - Image file */
int primary, /* I - Primary choice for colorspace */
int secondary, /* I - Secondary choice for colorspace */
int saturation, /* I - Color saturation (%) */
int hue, /* I - Color hue (degrees) */
const ib_t *lut) /* I - Lookup table for gamma/brightness */
{
int x, y; /* Looping vars */
int bpp; /* Bytes per pixel */
ib_t *in, /* Input pixels */
*inptr, /* Current input pixel */
*out, /* Output pixels */
*outptr, /* Current output pixel */
bit; /* Bit in input line */
char line[255], /* Input line */
*lineptr; /* Pointer in line */
int format, /* Format of PNM file */
val, /* Pixel value */
maxval; /* Maximum pixel value */
/*
* Read the file header in the format:
*
* Pformat
* # comment1
* # comment2
* ...
* # commentN
* width
* height
* max sample
*/
lineptr = fgets(line, sizeof(line), fp);
lineptr ++;
format = atoi(lineptr);
while (isdigit(*lineptr))
lineptr ++;
while (lineptr != NULL && img->xsize == 0)
{
if (*lineptr == '\0' || *lineptr == '#')
lineptr = fgets(line, sizeof(line), fp);
else if (isdigit(*lineptr))
{
img->xsize = atoi(lineptr);
while (isdigit(*lineptr))
lineptr ++;
}
else
lineptr ++;
}
while (lineptr != NULL && img->ysize == 0)
{
if (*lineptr == '\0' || *lineptr == '#')
lineptr = fgets(line, sizeof(line), fp);
else if (isdigit(*lineptr))
{
img->ysize = atoi(lineptr);
while (isdigit(*lineptr))
lineptr ++;
}
else
lineptr ++;
}
if (format != 1 && format != 4)
{
maxval = 0;
while (lineptr != NULL && maxval == 0)
{
if (*lineptr == '\0' || *lineptr == '#')
lineptr = fgets(line, sizeof(line), fp);
else if (isdigit(*lineptr))
{
maxval = atoi(lineptr);
while (isdigit(*lineptr))
lineptr ++;
}
else
lineptr ++;
}
}
else
maxval = 1;
if (format == 1 || format == 2 || format == 4 || format == 5)
img->colorspace = secondary;
else
img->colorspace = primary;
ImageSetMaxTiles(img, 0);
bpp = ImageGetDepth(img);
in = malloc(img->xsize * 3);
out = malloc(img->xsize * bpp);
/*
* Read the image file...
*/
for (y = 0; y < img->ysize; y ++)
{
switch (format)
{
case 1 :
case 2 :
for (x = img->xsize, inptr = in; x > 0; x --, inptr ++)
if (fscanf(fp, "%d", &val) == 1)
*inptr = 255 * val / maxval;
break;
case 3 :
for (x = img->xsize, inptr = in; x > 0; x --, inptr += 3)
{
if (fscanf(fp, "%d", &val) == 1)
inptr[0] = 255 * val / maxval;
if (fscanf(fp, "%d", &val) == 1)
inptr[1] = 255 * val / maxval;
if (fscanf(fp, "%d", &val) == 1)
inptr[2] = 255 * val / maxval;
}
break;
case 4 :
fread(out, (img->xsize + 7) / 8, 1, fp);
for (x = img->xsize, inptr = in, outptr = out, bit = 128;
x > 0;
x --, inptr ++)
{
if (*outptr & bit)
*inptr = 255;
else
*inptr = 0;
if (bit > 1)
bit >>= 1;
else
{
bit = 128;
inptr ++;
}
}
break;
case 5 :
fread(in, img->xsize, 1, fp);
break;
case 6 :
fread(in, img->xsize, 3, fp);
break;
}
switch (format)
{
case 1 :
case 2 :
case 4 :
case 5 :
if (img->colorspace == IMAGE_WHITE)
{
if (lut)
ImageLut(in, img->xsize, lut);
ImagePutRow(img, 0, y, img->xsize, in);
}
else
{
switch (img->colorspace)
{
case IMAGE_RGB :
ImageWhiteToRGB(in, out, img->xsize);
break;
case IMAGE_BLACK :
ImageWhiteToBlack(in, out, img->xsize);
break;
case IMAGE_CMY :
ImageWhiteToCMY(in, out, img->xsize);
break;
case IMAGE_CMYK :
ImageWhiteToCMYK(in, out, img->xsize);
break;
}
if (lut)
ImageLut(out, img->xsize * bpp, lut);
ImagePutRow(img, 0, y, img->xsize, out);
}
break;
default :
if ((saturation != 100 || hue != 0) && bpp > 1)
ImageRGBAdjust(in, img->xsize, saturation, hue);
if (img->colorspace == IMAGE_RGB)
{
if (lut)
ImageLut(in, img->xsize * 3, lut);
ImagePutRow(img, 0, y, img->xsize, in);
}
else
{
switch (img->colorspace)
{
case IMAGE_WHITE :
ImageRGBToWhite(in, out, img->xsize);
break;
case IMAGE_BLACK :
ImageRGBToBlack(in, out, img->xsize);
break;
case IMAGE_CMY :
ImageRGBToCMY(in, out, img->xsize);
break;
case IMAGE_CMYK :
ImageRGBToCMYK(in, out, img->xsize);
break;
}
if (lut)
ImageLut(out, img->xsize * bpp, lut);
ImagePutRow(img, 0, y, img->xsize, out);
}
break;
}
}
free(in);
free(out);
fclose(fp);
return (0);
}
/*
* End of "$Id$".
*/
+267
Ver Arquivo
@@ -0,0 +1,267 @@
/*
* "$Id$"
*
* SGI image file routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ImageReadSGI() - Read a SGI image file.
*/
/*
* Include necessary headers...
*/
#include "image.h"
#include "image-sgi.h"
/*
* 'ImageReadSGI()' - Read a SGI image file.
*/
int /* O - Read status */
ImageReadSGI(image_t *img, /* IO - Image */
FILE *fp, /* I - Image file */
int primary, /* I - Primary choice for colorspace */
int secondary, /* I - Secondary choice for colorspace */
int saturation, /* I - Color saturation (%) */
int hue, /* I - Color hue (degrees) */
const ib_t *lut) /* I - Lookup table for gamma/brightness */
{
int i, y; /* Looping vars */
int bpp; /* Bytes per pixel */
sgi_t *sgip; /* SGI image file */
ib_t *in, /* Input pixels */
*inptr, /* Current input pixel */
*out; /* Output pixels */
unsigned short *rows[4], /* Row pointers for image data */
*red,
*green,
*blue,
*gray,
*alpha;
/*
* Setup the SGI file...
*/
sgip = sgiOpenFile(fp, SGI_READ, 0, 0, 0, 0, 0);
/*
* Get the image dimensions and load the output image...
*/
if (sgip->zsize < 3)
img->colorspace = secondary;
else
img->colorspace = primary;
img->xsize = sgip->xsize;
img->ysize = sgip->ysize;
ImageSetMaxTiles(img, 0);
bpp = ImageGetDepth(img);
in = malloc(img->xsize * sgip->zsize);
out = malloc(img->xsize * bpp);
rows[0] = calloc(img->xsize * sgip->zsize, sizeof(unsigned short));
for (i = 1; i < sgip->zsize; i ++)
rows[i] = rows[0] + i * img->xsize;
/*
* Read the SGI image file...
*/
for (y = 0; y < img->ysize; y ++)
{
for (i = 0; i < sgip->zsize; i ++)
sgiGetRow(sgip, rows[i], img->ysize - 1 - y, i);
switch (sgip->zsize)
{
case 1 :
if (sgip->bpp == 1)
for (i = img->xsize - 1, gray = rows[0], inptr = in;
i >= 0;
i --)
{
*inptr++ = *gray++;
}
else
for (i = img->xsize - 1, gray = rows[0], inptr = in;
i >= 0;
i --)
{
*inptr++ = (*gray++) / 256 + 128;
}
break;
case 2 :
if (sgip->bpp == 1)
for (i = img->xsize - 1, gray = rows[0], alpha = rows[1], inptr = in;
i >= 0;
i --)
{
*inptr++ = (*gray++) * (*alpha++) / 255;
}
else
for (i = img->xsize - 1, gray = rows[0], alpha = rows[1], inptr = in;
i >= 0;
i --)
{
*inptr++ = ((*gray++) / 256 + 128) * (*alpha++) / 32767;
}
break;
case 3 :
if (sgip->bpp == 1)
for (i = img->xsize - 1, red = rows[0], green = rows[1],
blue = rows[2], inptr = in;
i >= 0;
i --)
{
*inptr++ = *red++;
*inptr++ = *green++;
*inptr++ = *blue++;
}
else
for (i = img->xsize - 1, red = rows[0], green = rows[1],
blue = rows[2], inptr = in;
i >= 0;
i --)
{
*inptr++ = (*red++) / 256 + 128;
*inptr++ = (*green++) / 256 + 128;
*inptr++ = (*blue++) / 256 + 128;
}
break;
case 4 :
if (sgip->bpp == 1)
for (i = img->xsize - 1, red = rows[0], green = rows[1],
blue = rows[2], alpha = rows[3], inptr = in;
i >= 0;
i --)
{
*inptr++ = (*red++) * (*alpha) / 255;
*inptr++ = (*green++) * (*alpha) / 255;
*inptr++ = (*blue++) * (*alpha++) / 255;
}
else
for (i = img->xsize - 1, red = rows[0], green = rows[1],
blue = rows[2], inptr = in;
i >= 0;
i --)
{
*inptr++ = ((*red++) / 256 + 128) * (*alpha) / 32767;
*inptr++ = ((*green++) / 256 + 128) * (*alpha) / 32767;
*inptr++ = ((*blue++) / 256 + 128) * (*alpha++) / 32767;
}
break;
}
if (sgip->zsize < 3)
{
if (img->colorspace == IMAGE_WHITE)
{
if (lut)
ImageLut(in, img->xsize, lut);
ImagePutRow(img, 0, y, img->xsize, in);
}
else
{
switch (img->colorspace)
{
case IMAGE_RGB :
ImageWhiteToRGB(in, out, img->xsize);
break;
case IMAGE_BLACK :
ImageWhiteToBlack(in, out, img->xsize);
break;
case IMAGE_CMY :
ImageWhiteToCMY(in, out, img->xsize);
break;
case IMAGE_CMYK :
ImageWhiteToCMYK(in, out, img->xsize);
break;
}
if (lut)
ImageLut(out, img->xsize * bpp, lut);
ImagePutRow(img, 0, y, img->xsize, out);
}
}
else
{
if (img->colorspace == IMAGE_RGB)
{
if (saturation != 100 || hue != 0)
ImageRGBAdjust(in, img->xsize, saturation, hue);
if (lut)
ImageLut(in, img->xsize * 3, lut);
ImagePutRow(img, 0, y, img->xsize, in);
}
else
{
if ((saturation != 100 || hue != 0) && bpp > 1)
ImageRGBAdjust(in, img->xsize, saturation, hue);
switch (img->colorspace)
{
case IMAGE_WHITE :
ImageRGBToWhite(in, out, img->xsize);
break;
case IMAGE_BLACK :
ImageRGBToBlack(in, out, img->xsize);
break;
case IMAGE_CMY :
ImageRGBToCMY(in, out, img->xsize);
break;
case IMAGE_CMYK :
ImageRGBToCMYK(in, out, img->xsize);
break;
}
if (lut)
ImageLut(out, img->xsize * bpp, lut);
ImagePutRow(img, 0, y, img->xsize, out);
}
}
}
free(in);
free(out);
free(rows[0]);
sgiClose(sgip);
return (0);
}
/*
* End of "$Id$".
*/
+94
Ver Arquivo
@@ -0,0 +1,94 @@
/*
* "$Id$"
*
* SGI image file format library definitions for the Common UNIX Printing
* System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*/
#ifndef _SGI_H_
# define _SGI_H_
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# ifdef __cplusplus
extern "C" {
# endif
/*
* Constants...
*/
# define SGI_MAGIC 474 /* Magic number in image file */
# define SGI_READ 0 /* Read from an SGI image file */
# define SGI_WRITE 1 /* Write to an SGI image file */
# define SGI_COMP_NONE 0 /* No compression */
# define SGI_COMP_RLE 1 /* Run-length encoding */
# define SGI_COMP_ARLE 2 /* Agressive run-length encoding */
/*
* Image structure...
*/
typedef struct
{
FILE *file; /* Image file */
int mode, /* File open mode */
bpp, /* Bytes per pixel/channel */
comp; /* Compression */
unsigned short xsize, /* Width in pixels */
ysize, /* Height in pixels */
zsize; /* Number of channels */
long firstrow, /* File offset for first row */
nextrow, /* File offset for next row */
**table, /* Offset table for compression */
**length; /* Length table for compression */
unsigned short *arle_row; /* Advanced RLE compression buffer */
long arle_offset, /* Advanced RLE buffer offset */
arle_length; /* Advanced RLE buffer length */
} sgi_t;
/*
* Prototypes...
*/
extern int sgiClose(sgi_t *sgip);
extern int sgiGetRow(sgi_t *sgip, unsigned short *row, int y, int z);
extern sgi_t *sgiOpen(char *filename, int mode, int comp, int bpp,
int xsize, int ysize, int zsize);
extern sgi_t *sgiOpenFile(FILE *file, int mode, int comp, int bpp,
int xsize, int ysize, int zsize);
extern int sgiPutRow(sgi_t *sgip, unsigned short *row, int y, int z);
# ifdef __cplusplus
}
# endif
#endif /* !_SGI_H_ */
/*
* End of "$Id$".
*/
+857
Ver Arquivo
@@ -0,0 +1,857 @@
/*
* "$Id$"
*
* SGI image file format library routines for the Common UNIX Printing
* System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* sgiClose() - Close an SGI image file.
* sgiGetRow() - Get a row of image data from a file.
* sgiOpen() - Open an SGI image file for reading or writing.
* sgiOpenFile() - Open an SGI image file for reading or writing.
* sgiPutRow() - Put a row of image data to a file.
* getlong() - Get a 32-bit big-endian integer.
* getshort() - Get a 16-bit big-endian integer.
* putlong() - Put a 32-bit big-endian integer.
* putshort() - Put a 16-bit big-endian integer.
* read_rle8() - Read 8-bit RLE data.
* read_rle16() - Read 16-bit RLE data.
* write_rle8() - Write 8-bit RLE data.
* write_rle16() - Write 16-bit RLE data.
*/
#include "image-sgi.h"
/*
* Local functions...
*/
static int getlong(FILE *);
static int getshort(FILE *);
static int putlong(long, FILE *);
static int putshort(unsigned short, FILE *);
static int read_rle8(FILE *, unsigned short *, int);
static int read_rle16(FILE *, unsigned short *, int);
static int write_rle8(FILE *, unsigned short *, int);
static int write_rle16(FILE *, unsigned short *, int);
/*
* 'sgiClose()' - Close an SGI image file.
*/
int
sgiClose(sgi_t *sgip) /* I - SGI image */
{
int i; /* Return status */
long *offset; /* Looping var for offset table */
if (sgip == NULL)
return (-1);
if (sgip->mode == SGI_WRITE && sgip->comp != SGI_COMP_NONE)
{
/*
* Write the scanline offset table to the file...
*/
fseek(sgip->file, 512, SEEK_SET);
for (i = sgip->ysize * sgip->zsize, offset = sgip->table[0];
i > 0;
i --, offset ++)
if (putlong(offset[0], sgip->file) < 0)
return (-1);
for (i = sgip->ysize * sgip->zsize, offset = sgip->length[0];
i > 0;
i --, offset ++)
if (putlong(offset[0], sgip->file) < 0)
return (-1);
}
if (sgip->table != NULL)
{
free(sgip->table[0]);
free(sgip->table);
}
if (sgip->length != NULL)
{
free(sgip->length[0]);
free(sgip->length);
}
if (sgip->comp == SGI_COMP_ARLE)
free(sgip->arle_row);
i = fclose(sgip->file);
free(sgip);
return (i);
}
/*
* 'sgiGetRow()' - Get a row of image data from a file.
*/
int
sgiGetRow(sgi_t *sgip, /* I - SGI image */
unsigned short *row, /* O - Row to read */
int y, /* I - Line to read */
int z) /* I - Channel to read */
{
int x; /* X coordinate */
long offset; /* File offset */
if (sgip == NULL ||
row == NULL ||
y < 0 || y >= sgip->ysize ||
z < 0 || z >= sgip->zsize)
return (-1);
switch (sgip->comp)
{
case SGI_COMP_NONE :
/*
* Seek to the image row - optimize buffering by only seeking if
* necessary...
*/
offset = 512 + (y + z * sgip->ysize) * sgip->xsize * sgip->bpp;
if (offset != ftell(sgip->file))
fseek(sgip->file, offset, SEEK_SET);
if (sgip->bpp == 1)
{
for (x = sgip->xsize; x > 0; x --, row ++)
*row = getc(sgip->file);
}
else
{
for (x = sgip->xsize; x > 0; x --, row ++)
*row = getshort(sgip->file);
}
break;
case SGI_COMP_RLE :
offset = sgip->table[z][y];
if (offset != ftell(sgip->file))
fseek(sgip->file, offset, SEEK_SET);
if (sgip->bpp == 1)
return (read_rle8(sgip->file, row, sgip->xsize));
else
return (read_rle16(sgip->file, row, sgip->xsize));
}
return (0);
}
/*
* 'sgiOpen()' - Open an SGI image file for reading or writing.
*/
sgi_t *
sgiOpen(char *filename, /* I - File to open */
int mode, /* I - Open mode (SGI_READ or SGI_WRITE) */
int comp, /* I - Type of compression */
int bpp, /* I - Bytes per pixel */
int xsize, /* I - Width of image in pixels */
int ysize, /* I - Height of image in pixels */
int zsize) /* I - Number of channels */
{
sgi_t *sgip; /* New SGI image file */
FILE *file; /* Image file pointer */
if (mode == SGI_READ)
file = fopen(filename, "rb");
else
file = fopen(filename, "wb+");
if (file == NULL)
return (NULL);
if ((sgip = sgiOpenFile(file, mode, comp, bpp, xsize, ysize, zsize)) == NULL)
fclose(file);
return (sgip);
}
/*
* 'sgiOpenFile()' - Open an SGI image file for reading or writing.
*/
sgi_t *
sgiOpenFile(FILE *file, /* I - File to open */
int mode, /* I - Open mode (SGI_READ or SGI_WRITE) */
int comp, /* I - Type of compression */
int bpp, /* I - Bytes per pixel */
int xsize, /* I - Width of image in pixels */
int ysize, /* I - Height of image in pixels */
int zsize) /* I - Number of channels */
{
int i, j; /* Looping var */
char name[80]; /* Name of file in image header */
short magic; /* Magic number */
sgi_t *sgip; /* New image pointer */
if ((sgip = calloc(sizeof(sgi_t), 1)) == NULL)
return (NULL);
sgip->file = file;
switch (mode)
{
case SGI_READ :
sgip->mode = SGI_READ;
magic = getshort(sgip->file);
if (magic != SGI_MAGIC)
{
free(sgip);
return (NULL);
}
sgip->comp = getc(sgip->file);
sgip->bpp = getc(sgip->file);
getshort(sgip->file); /* Dimensions */
sgip->xsize = getshort(sgip->file);
sgip->ysize = getshort(sgip->file);
sgip->zsize = getshort(sgip->file);
getlong(sgip->file); /* Minimum pixel */
getlong(sgip->file); /* Maximum pixel */
if (sgip->comp)
{
/*
* This file is compressed; read the scanline tables...
*/
fseek(sgip->file, 512, SEEK_SET);
sgip->table = calloc(sgip->zsize, sizeof(long *));
sgip->table[0] = calloc(sgip->ysize * sgip->zsize, sizeof(long));
for (i = 1; i < sgip->zsize; i ++)
sgip->table[i] = sgip->table[0] + i * sgip->ysize;
for (i = 0; i < sgip->zsize; i ++)
for (j = 0; j < sgip->ysize; j ++)
sgip->table[i][j] = getlong(sgip->file);
}
break;
case SGI_WRITE :
if (xsize < 1 ||
ysize < 1 ||
zsize < 1 ||
bpp < 1 || bpp > 2 ||
comp < SGI_COMP_NONE || comp > SGI_COMP_ARLE)
{
free(sgip);
return (NULL);
}
sgip->mode = SGI_WRITE;
putshort(SGI_MAGIC, sgip->file);
putc((sgip->comp = comp) != 0, sgip->file);
putc(sgip->bpp = bpp, sgip->file);
putshort(3, sgip->file); /* Dimensions */
putshort(sgip->xsize = xsize, sgip->file);
putshort(sgip->ysize = ysize, sgip->file);
putshort(sgip->zsize = zsize, sgip->file);
if (bpp == 1)
{
putlong(0, sgip->file); /* Minimum pixel */
putlong(255, sgip->file); /* Maximum pixel */
}
else
{
putlong(-32768, sgip->file); /* Minimum pixel */
putlong(32767, sgip->file); /* Maximum pixel */
}
putlong(0, sgip->file); /* Reserved */
memset(name, 0, sizeof(name));
fwrite(name, sizeof(name), 1, sgip->file);
for (i = 0; i < 102; i ++)
putlong(0, sgip->file);
switch (comp)
{
case SGI_COMP_NONE : /* No compression */
/*
* This file is uncompressed. To avoid problems with sparse files,
* we need to write blank pixels for the entire image...
*/
if (bpp == 1)
{
for (i = xsize * ysize * zsize; i > 0; i --)
putc(0, sgip->file);
}
else
{
for (i = xsize * ysize * zsize; i > 0; i --)
putshort(0, sgip->file);
}
break;
case SGI_COMP_ARLE : /* Aggressive RLE */
sgip->arle_row = calloc(xsize, sizeof(unsigned short));
sgip->arle_offset = 0;
case SGI_COMP_RLE : /* Run-Length Encoding */
/*
* This file is compressed; write the (blank) scanline tables...
*/
for (i = 2 * ysize * zsize; i > 0; i --)
putlong(0, sgip->file);
sgip->firstrow = ftell(sgip->file);
sgip->nextrow = ftell(sgip->file);
sgip->table = calloc(sgip->zsize, sizeof(long *));
sgip->table[0] = calloc(sgip->ysize * sgip->zsize, sizeof(long));
for (i = 1; i < sgip->zsize; i ++)
sgip->table[i] = sgip->table[0] + i * sgip->ysize;
sgip->length = calloc(sgip->zsize, sizeof(long *));
sgip->length[0] = calloc(sgip->ysize * sgip->zsize, sizeof(long));
for (i = 1; i < sgip->zsize; i ++)
sgip->length[i] = sgip->length[0] + i * sgip->ysize;
break;
}
break;
default :
free(sgip);
return (NULL);
}
return (sgip);
}
/*
* 'sgiPutRow()' - Put a row of image data to a file.
*/
int
sgiPutRow(sgi_t *sgip, /* I - SGI image */
unsigned short *row, /* I - Row to write */
int y, /* I - Line to write */
int z) /* I - Channel to write */
{
int x; /* X coordinate */
long offset; /* File offset */
if (sgip == NULL ||
row == NULL ||
y < 0 || y >= sgip->ysize ||
z < 0 || z >= sgip->zsize)
return (-1);
switch (sgip->comp)
{
case SGI_COMP_NONE :
/*
* Seek to the image row - optimize buffering by only seeking if
* necessary...
*/
offset = 512 + (y + z * sgip->ysize) * sgip->xsize * sgip->bpp;
if (offset != ftell(sgip->file))
fseek(sgip->file, offset, SEEK_SET);
if (sgip->bpp == 1)
{
for (x = sgip->xsize; x > 0; x --, row ++)
putc(*row, sgip->file);
}
else
{
for (x = sgip->xsize; x > 0; x --, row ++)
putshort(*row, sgip->file);
}
break;
case SGI_COMP_ARLE :
if (sgip->table[z][y] != 0)
return (-1);
/*
* First check the last row written...
*/
if (sgip->arle_offset > 0)
{
for (x = 0; x < sgip->xsize; x ++)
if (row[x] != sgip->arle_row[x])
break;
if (x == sgip->xsize)
{
sgip->table[z][y] = sgip->arle_offset;
sgip->length[z][y] = sgip->arle_length;
return (0);
}
}
/*
* If that didn't match, search all the previous rows...
*/
fseek(sgip->file, sgip->firstrow, SEEK_SET);
if (sgip->bpp == 1)
{
for (;;)
{
sgip->arle_offset = ftell(sgip->file);
if ((sgip->arle_length = read_rle8(sgip->file, sgip->arle_row, sgip->xsize)) < 0)
{
x = 0;
break;
}
if (memcmp(row, sgip->arle_row, sgip->xsize * sizeof(unsigned short)) == 0)
{
x = sgip->xsize;
break;
}
}
}
else
{
for (;;)
{
sgip->arle_offset = ftell(sgip->file);
if ((sgip->arle_length = read_rle16(sgip->file, sgip->arle_row, sgip->xsize)) < 0)
{
x = 0;
break;
}
if (memcmp(row, sgip->arle_row, sgip->xsize * sizeof(unsigned short)) == 0)
{
x = sgip->xsize;
break;
}
}
}
if (x == sgip->xsize)
{
sgip->table[z][y] = sgip->arle_offset;
sgip->length[z][y] = sgip->arle_length;
return (0);
}
else
fseek(sgip->file, 0, SEEK_END); /* Clear EOF */
case SGI_COMP_RLE :
if (sgip->table[z][y] != 0)
return (-1);
offset = sgip->table[z][y] = sgip->nextrow;
if (offset != ftell(sgip->file))
fseek(sgip->file, offset, SEEK_SET);
if (sgip->bpp == 1)
x = write_rle8(sgip->file, row, sgip->xsize);
else
x = write_rle16(sgip->file, row, sgip->xsize);
if (sgip->comp == SGI_COMP_ARLE)
{
sgip->arle_offset = offset;
sgip->arle_length = x;
memcpy(sgip->arle_row, row, sgip->xsize * sizeof(unsigned short));
}
sgip->nextrow = ftell(sgip->file);
sgip->length[z][y] = x;
return (x);
}
return (0);
}
/*
* 'getlong()' - Get a 32-bit big-endian integer.
*/
static int
getlong(FILE *fp) /* I - File to read from */
{
unsigned char b[4];
fread(b, 4, 1, fp);
return ((b[0] << 24) | (b[1] << 16) | (b[2] << 8) | b[3]);
}
/*
* 'getshort()' - Get a 16-bit big-endian integer.
*/
static int
getshort(FILE *fp) /* I - File to read from */
{
unsigned char b[2];
fread(b, 2, 1, fp);
return ((b[0] << 8) | b[1]);
}
/*
* 'putlong()' - Put a 32-bit big-endian integer.
*/
static int
putlong(long n, /* I - Long to write */
FILE *fp) /* I - File to write to */
{
if (putc(n >> 24, fp) == EOF)
return (EOF);
if (putc(n >> 16, fp) == EOF)
return (EOF);
if (putc(n >> 8, fp) == EOF)
return (EOF);
if (putc(n, fp) == EOF)
return (EOF);
else
return (0);
}
/*
* 'putshort()' - Put a 16-bit big-endian integer.
*/
static int
putshort(unsigned short n, /* I - Short to write */
FILE *fp) /* I - File to write to */
{
if (putc(n >> 8, fp) == EOF)
return (EOF);
if (putc(n, fp) == EOF)
return (EOF);
else
return (0);
}
/*
* 'read_rle8()' - Read 8-bit RLE data.
*/
static int
read_rle8(FILE *fp, /* I - File to read from */
unsigned short *row, /* O - Data */
int xsize) /* I - Width of data in pixels */
{
int i, /* Looping var */
ch, /* Current character */
count, /* RLE count */
length; /* Number of bytes read... */
length = 0;
while (xsize > 0)
{
if ((ch = getc(fp)) == EOF)
return (-1);
length ++;
count = ch & 127;
if (count == 0)
break;
if (ch & 128)
{
for (i = 0; i < count; i ++, row ++, xsize --, length ++)
*row = getc(fp);
}
else
{
ch = getc(fp);
length ++;
for (i = 0; i < count; i ++, row ++, xsize --)
*row = ch;
}
}
return (xsize > 0 ? -1 : length);
}
/*
* 'read_rle16()' - Read 16-bit RLE data.
*/
static int
read_rle16(FILE *fp, /* I - File to read from */
unsigned short *row, /* O - Data */
int xsize)/* I - Width of data in pixels */
{
int i, /* Looping var */
ch, /* Current character */
count, /* RLE count */
length; /* Number of bytes read... */
length = 0;
while (xsize > 0)
{
if ((ch = getshort(fp)) == EOF)
return (-1);
length ++;
count = ch & 127;
if (count == 0)
break;
if (ch & 128)
{
for (i = 0; i < count; i ++, row ++, xsize --, length ++)
*row = getshort(fp);
}
else
{
ch = getshort(fp);
length ++;
for (i = 0; i < count; i ++, row ++, xsize --)
*row = ch;
}
}
return (xsize > 0 ? -1 : length * 2);
}
/*
* 'write_rle8()' - Write 8-bit RLE data.
*/
static int
write_rle8(FILE *fp, /* I - File to write to */
unsigned short *row, /* I - Data */
int xsize)/* I - Width of data in pixels */
{
int length,
count,
i,
x;
unsigned short *start,
repeat;
for (x = xsize, length = 0; x > 0;)
{
start = row;
row += 2;
x -= 2;
while (x > 0 && (row[-2] != row[-1] || row[-1] != row[0]))
{
row ++;
x --;
}
row -= 2;
x += 2;
count = row - start;
while (count > 0)
{
i = count > 126 ? 126 : count;
count -= i;
if (putc(128 | i, fp) == EOF)
return (-1);
length ++;
while (i > 0)
{
if (putc(*start, fp) == EOF)
return (-1);
start ++;
i --;
length ++;
}
}
if (x <= 0)
break;
start = row;
repeat = row[0];
row ++;
x --;
while (x > 0 && *row == repeat)
{
row ++;
x --;
}
count = row - start;
while (count > 0)
{
i = count > 126 ? 126 : count;
count -= i;
if (putc(i, fp) == EOF)
return (-1);
length ++;
if (putc(repeat, fp) == EOF)
return (-1);
length ++;
}
}
length ++;
if (putc(0, fp) == EOF)
return (-1);
else
return (length);
}
/*
* 'write_rle16()' - Write 16-bit RLE data.
*/
static int
write_rle16(FILE *fp, /* I - File to write to */
unsigned short *row, /* I - Data */
int xsize)/* I - Width of data in pixels */
{
int length,
count,
i,
x;
unsigned short *start,
repeat;
for (x = xsize, length = 0; x > 0;)
{
start = row;
row += 2;
x -= 2;
while (x > 0 && (row[-2] != row[-1] || row[-1] != row[0]))
{
row ++;
x --;
}
row -= 2;
x += 2;
count = row - start;
while (count > 0)
{
i = count > 126 ? 126 : count;
count -= i;
if (putshort(128 | i, fp) == EOF)
return (-1);
length ++;
while (i > 0)
{
if (putshort(*start, fp) == EOF)
return (-1);
start ++;
i --;
length ++;
}
}
if (x <= 0)
break;
start = row;
repeat = row[0];
row ++;
x --;
while (x > 0 && *row == repeat)
{
row ++;
x --;
}
count = row - start;
while (count > 0)
{
i = count > 126 ? 126 : count;
count -= i;
if (putshort(i, fp) == EOF)
return (-1);
length ++;
if (putshort(repeat, fp) == EOF)
return (-1);
length ++;
}
}
length ++;
if (putshort(0, fp) == EOF)
return (-1);
else
return (2 * length);
}
/*
* End of "$Id$".
*/
+376
Ver Arquivo
@@ -0,0 +1,376 @@
/*
* "$Id$"
*
* Sun Raster image file routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ImageReadSunRaster() - Read a SunRaster image file.
* read_unsigned() - Read a 32-bit unsigned integer.
*/
/*
* Include necessary headers...
*/
#include "image.h"
#define RAS_MAGIC 0x59a66a95
/* Sun supported ras_type's */
#define RT_OLD 0 /* Raw pixrect image in 68000 byte order */
#define RT_STANDARD 1 /* Raw pixrect image in 68000 byte order */
#define RT_BYTE_ENCODED 2 /* Run-length compression of bytes */
#define RT_FORMAT_RGB 3 /* XRGB or RGB instead of XBGR or BGR */
#define RT_EXPERIMENTAL 0xffff /* Reserved for testing */
/* Sun registered ras_maptype's */
#define RMT_RAW 2
/* Sun supported ras_maptype's */
#define RMT_NONE 0 /* ras_maplength is expected to be 0 */
#define RMT_EQUAL_RGB 1 /* red[ras_maplength/3],green[],blue[] */
#define RAS_RLE 0x80
/*
* NOTES:
* Each line of the image is rounded out to a multiple of 16 bits.
* This corresponds to the rounding convention used by the memory pixrect
* package (/usr/include/pixrect/memvar.h) of the SunWindows system.
* The ras_encoding field (always set to 0 by Sun's supported software)
* was renamed to ras_length in release 2.0. As a result, rasterfiles
* of type 0 generated by the old software claim to have 0 length; for
* compatibility, code reading rasterfiles must be prepared to compute the
* true length from the width, height, and depth fields.
*/
/*
* Local functions...
*/
static unsigned read_unsigned(FILE *fp);
/*
* 'ImageReadSunRaster()' - Read a SunRaster image file.
*/
int /* O - Read status */
ImageReadSunRaster(image_t *img, /* IO - Image */
FILE *fp, /* I - Image file */
int primary, /* I - Primary choice for colorspace */
int secondary,/* I - Secondary choice for colorspace */
int saturation,/* I - Color saturation (%) */
int hue, /* I - Color hue (degrees) */
const ib_t *lut) /* I - Lookup table for gamma/brightness */
{
int i, x, y,
bpp, /* Bytes per pixel */
scanwidth,
run_count,
run_value;
ib_t *in,
*out,
*scanline,
*scanptr,
*p,
bit;
unsigned ras_depth, /* depth (1, 8, or 24 bits) of pixel */
ras_type, /* type of file; see RT_* below */
ras_maplength; /* length (bytes) of following map */
unsigned char cmap[3][256]; /* colormap */
/*
* Read the header; we already know that this is a raster file (ImageOpen
* checks this) so we don't need to check the magic number again.
*/
read_unsigned(fp); /* Skip magic */
img->xsize = read_unsigned(fp);
img->ysize = read_unsigned(fp);
ras_depth = read_unsigned(fp);
/* ras_length */read_unsigned(fp);
ras_type = read_unsigned(fp);
/* ras_maptype*/read_unsigned(fp);
ras_maplength = read_unsigned(fp);
if (ras_maplength > 0)
{
fread(cmap[0], 1, ras_maplength / 3, fp);
fread(cmap[1], 1, ras_maplength / 3, fp);
fread(cmap[2], 1, ras_maplength / 3, fp);
}
/*
* Compute the width of each line and allocate memory as needed...
*/
scanwidth = (img->xsize * ras_depth + 7) / 8;
if (scanwidth & 1)
scanwidth ++;
if (ras_depth < 24 && ras_maplength == 0)
{
img->colorspace = secondary;
in = malloc(img->xsize + 1);
}
else
{
img->colorspace = primary;
in = malloc(img->xsize * 3 + 1);
}
bpp = ImageGetDepth(img);
out = malloc(img->xsize * bpp);
scanline = malloc(scanwidth);
run_count = 0;
for (y = 0; y < img->ysize; y ++)
{
if (ras_depth != 8 || ras_maplength > 0)
p = scanline;
else
p = in;
if (ras_type != RT_BYTE_ENCODED)
fread(p, scanwidth, 1, fp);
else
{
for (i = scanwidth; i > 0; i --, p ++)
{
if (run_count > 0)
{
*p = run_value;
run_count --;
}
else
{
run_value = getc(fp);
if (run_value == RAS_RLE)
{
run_count = getc(fp);
if (run_count == 0)
*p = RAS_RLE;
else
run_value = *p = getc(fp);
}
else
*p = run_value;
}
}
}
if (ras_depth == 1 && ras_maplength == 0)
{
/*
* 1-bit B&W image...
*/
for (x = img->xsize, bit = 128, scanptr = scanline, p = in;
x > 0;
x --, p ++)
{
if (*scanptr & bit)
*p = 255;
else
*p = 0;
if (bit > 1)
{
bit = 128;
scanptr ++;
}
else
bit >>= 1;
}
}
else if (ras_depth == 1)
{
/*
* 1-bit colormapped image...
*/
for (x = img->xsize, bit = 128, scanptr = scanline, p = in;
x > 0;
x --)
{
if (*scanptr & bit)
{
*p++ = cmap[0][1];
*p++ = cmap[1][1];
*p++ = cmap[2][1];
}
else
{
*p++ = cmap[0][0];
*p++ = cmap[1][0];
*p++ = cmap[2][0];
}
if (bit > 1)
{
bit = 128;
scanptr ++;
}
else
bit >>= 1;
}
}
else if (ras_depth == 8 && ras_maplength > 0)
{
/*
* 8-bit colormapped image.
*/
for (x = img->xsize, scanptr = scanline, p = in;
x > 0;
x --)
{
*p++ = cmap[0][*scanptr];
*p++ = cmap[1][*scanptr];
*p++ = cmap[2][*scanptr++];
}
}
else if (ras_depth == 24 && ras_type != RT_FORMAT_RGB)
{
/*
* Convert BGR to RGB...
*/
for (x = img->xsize, scanptr = scanline, p = in;
x > 0;
x --, scanptr += 3)
{
*p++ = scanptr[2];
*p++ = scanptr[1];
*p++ = scanptr[0];
}
}
if (bpp == 1)
{
if (img->colorspace == IMAGE_WHITE)
{
if (lut)
ImageLut(in, img->xsize, lut);
ImagePutRow(img, 0, y, img->xsize, in);
}
else
{
switch (img->colorspace)
{
case IMAGE_RGB :
ImageWhiteToRGB(in, out, img->xsize);
break;
case IMAGE_BLACK :
ImageWhiteToBlack(in, out, img->xsize);
break;
case IMAGE_CMY :
ImageWhiteToCMY(in, out, img->xsize);
break;
case IMAGE_CMYK :
ImageWhiteToCMYK(in, out, img->xsize);
break;
}
if (lut)
ImageLut(out, img->xsize * bpp, lut);
ImagePutRow(img, 0, y, img->xsize, out);
}
}
else
{
if (img->colorspace == IMAGE_RGB)
{
if (saturation != 100 || hue != 0)
ImageRGBAdjust(in, img->xsize, saturation, hue);
if (lut)
ImageLut(in, img->xsize * 3, lut);
ImagePutRow(img, 0, y, img->xsize, in);
}
else
{
if ((saturation != 100 || hue != 0) && bpp > 1)
ImageRGBAdjust(in, img->xsize, saturation, hue);
switch (img->colorspace)
{
case IMAGE_WHITE :
ImageRGBToWhite(in, out, img->xsize);
break;
case IMAGE_BLACK :
ImageRGBToBlack(in, out, img->xsize);
break;
case IMAGE_CMY :
ImageRGBToCMY(in, out, img->xsize);
break;
case IMAGE_CMYK :
ImageRGBToCMYK(in, out, img->xsize);
break;
}
if (lut)
ImageLut(out, img->xsize * bpp, lut);
ImagePutRow(img, 0, y, img->xsize, out);
}
}
}
free(scanline);
free(in);
free(out);
fclose(fp);
return (0);
}
/*
* 'read_unsigned()' - Read a 32-bit unsigned integer.
*/
static unsigned /* O - Integer from file */
read_unsigned(FILE *fp) /* I - File to read from */
{
unsigned v; /* Integer from file */
v = getc(fp);
v = (v << 8) | getc(fp);
v = (v << 8) | getc(fp);
v = (v << 8) | getc(fp);
return (v);
}
/*
* End of "$Id$".
*/
Diferenças do arquivo suprimidas por serem muito extensas Carregar Diff
+310
Ver Arquivo
@@ -0,0 +1,310 @@
/*
* "$Id$"
*
* Image zoom routines for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ImageZoomAlloc() - Allocate a pixel zoom record...
* ImageZoomFill() - Fill a zoom record with image data utilizing bilinear
* interpolation.
* ImageZoomQFill() - Fill a zoom record quickly using nearest-neighbor
* sampling.
* ImageZoomFree() - Free a zoom record...
*/
/*
* Include necessary headers...
*/
#include "image.h"
/*
* 'ZoomAlloc()' - Allocate a pixel zoom record...
*/
izoom_t *
ImageZoomAlloc(image_t *img, /* I - Image to zoom */
int x0, /* I - Upper-lefthand corner */
int y0, /* I - ... */
int x1, /* I - Lower-righthand corner */
int y1, /* I - ... */
int xsize, /* I - Final width of image */
int ysize, /* I - Final height of image */
int rotated) /* I - Non-zero if image is rotated 90 degs */
{
izoom_t *z; /* New zoom record */
if ((z = (izoom_t *)calloc(1, sizeof(izoom_t))) == NULL)
return (NULL);
z->img = img;
z->row = 0;
z->depth = ImageGetDepth(img);
z->rotated = rotated;
if (rotated)
{
z->xorig = x1;
z->yorig = y0;
z->width = y1 - y0 + 1;
z->height = x1 - x0 + 1;
z->xsize = xsize;
z->ysize = ysize;
z->xmod = z->width % z->xsize;
z->xstep = z->width / z->xsize;
z->xincr = 1;
z->ymod = z->height % z->ysize;
z->ystep = z->height / z->ysize;
z->yincr = 1;
z->instep = z->xstep * z->depth;
z->inincr = z->xincr * z->depth;
if (z->width < img->ysize)
z->xmax = z->width;
else
z->xmax = z->width - 1;
if (z->height < img->xsize)
z->ymax = z->height;
else
z->ymax = z->height - 1;
}
else
{
z->xorig = x0;
z->yorig = y0;
z->width = x1 - x0 + 1;
z->height = y1 - y0 + 1;
z->xsize = xsize;
z->ysize = ysize;
z->xmod = z->width % z->xsize;
z->xstep = z->width / z->xsize;
z->xincr = 1;
z->ymod = z->height % z->ysize;
z->ystep = z->height / z->ysize;
z->yincr = 1;
z->instep = z->xstep * z->depth;
z->inincr = z->xincr * z->depth;
if (z->width < img->xsize)
z->xmax = z->width;
else
z->xmax = z->width - 1;
if (z->height < img->ysize)
z->ymax = z->height;
else
z->ymax = z->height - 1;
}
if ((z->rows[0] = (ib_t *)malloc(z->xsize * z->depth)) == NULL)
{
free(z);
return (NULL);
}
if ((z->rows[1] = (ib_t *)malloc(z->xsize * z->depth)) == NULL)
{
free(z->rows[0]);
free(z);
return (NULL);
}
if ((z->in = (ib_t *)malloc(z->width * z->depth)) == NULL)
{
free(z->rows[0]);
free(z->rows[1]);
free(z);
return (NULL);
}
return (z);
}
/*
* 'ImageZoomFill()' - Fill a zoom record with image data utilizing bilinear
* interpolation.
*/
void
ImageZoomFill(izoom_t *z, /* I - Zoom record to fill */
int iy) /* I - Zoom image row */
{
ib_t *r, /* Row pointer */
*inptr; /* Pixel pointer */
int xerr0, /* X error counter */
xerr1; /* ... */
int ix,
x,
count,
z_depth,
z_xstep,
z_xincr,
z_instep,
z_inincr,
z_xmax,
z_xmod,
z_xsize;
if (iy > z->ymax)
iy = z->ymax;
z->row ^= 1;
z_depth = z->depth;
z_xsize = z->xsize;
z_xmax = z->xmax;
z_xmod = z->xmod;
z_xstep = z->xstep;
z_xincr = z->xincr;
z_instep = z->instep;
z_inincr = z->inincr;
if (z->rotated)
ImageGetCol(z->img, z->xorig - iy, z->yorig, z->width, z->in);
else
ImageGetRow(z->img, z->xorig, z->yorig + iy, z->width, z->in);
if (z_inincr < 0)
inptr = z->in + (z->width - 1) * z_depth;
else
inptr = z->in;
for (x = z_xsize, xerr0 = z_xsize, xerr1 = 0, ix = 0, r = z->rows[z->row];
x > 0;
x --)
{
if (ix < z_xmax)
{
for (count = 0; count < z_depth; count ++)
*r++ = (inptr[count] * xerr0 + inptr[z_depth + count] * xerr1) / z_xsize;
}
else
{
for (count = 0; count < z_depth; count ++)
*r++ = inptr[count];
}
ix += z_xstep;
inptr += z_instep;
xerr0 -= z_xmod;
xerr1 += z_xmod;
if (xerr0 <= 0)
{
xerr0 += z_xsize;
xerr1 -= z_xsize;
ix += z_xincr;
inptr += z_inincr;
}
}
}
/*
* 'ImageZoomQFill()' - Fill a zoom record quickly using nearest-neighbor sampling.
*/
void
ImageZoomQFill(izoom_t *z, /* I - Zoom record to fill */
int iy) /* I - Zoom image row */
{
ib_t *r, /* Row pointer */
*inptr; /* Pixel pointer */
int xerr0; /* X error counter */
int ix,
x,
count,
z_depth,
z_xstep,
z_xincr,
z_instep,
z_inincr,
z_xmod,
z_xsize;
if (iy > z->ymax)
iy = z->ymax;
z->row ^= 1;
z_depth = z->depth;
z_xsize = z->xsize;
z_xmod = z->xmod;
z_xstep = z->xstep;
z_xincr = z->xincr;
z_instep = z->instep;
z_inincr = z->inincr;
if (z->rotated)
ImageGetCol(z->img, z->xorig - iy, z->yorig, z->width, z->in);
else
ImageGetRow(z->img, z->xorig, z->yorig + iy, z->width, z->in);
if (z_inincr < 0)
inptr = z->in + (z->width - 1) * z_depth;
else
inptr = z->in;
for (x = z_xsize, xerr0 = z_xsize, ix = 0, r = z->rows[z->row];
x > 0;
x --)
{
for (count = 0; count < z_depth; count ++)
*r++ = inptr[count];
ix += z_xstep;
inptr += z_instep;
xerr0 -= z_xmod;
if (xerr0 <= 0)
{
xerr0 += z_xsize;
ix += z_xincr;
inptr += z_inincr;
}
}
}
/*
* 'ImageZoomFree()' - Free a zoom record...
*/
void
ImageZoomFree(izoom_t *z) /* I - Zoom record to free */
{
free(z->rows[0]);
free(z->rows[1]);
free(z->in);
free(z);
}
/*
* End of "$Id$".
*/
+759
Ver Arquivo
@@ -0,0 +1,759 @@
/*
* "$Id$"
*
* Base image support for the Common UNIX Printing System (CUPS).
*
* Copyright 1993-1999 by Easy Software Products.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
* copyright law. Distribution and use rights are outlined in the file
* "LICENSE.txt" which should have been included with this file. If this
* file is missing or damaged please contact Easy Software Products
* at:
*
* Attn: CUPS Licensing Information
* Easy Software Products
* 44141 Airport View Drive, Suite 204
* Hollywood, Maryland 20636-3111 USA
*
* Voice: (301) 373-9603
* EMail: cups-info@cups.org
* WWW: http://www.cups.org
*
* Contents:
*
* ImageOpen() - Open an image file and read it into memory.
* ImageClose() - Close an image file.
* ImageSetMaxTiles() - Set the maximum number of tiles to cache.
* ImageSetProfile() - Set the device color profile.
* ImageGetCol() - Get a column of pixels from an image.
* ImageGetRow() - Get a row of pixels from an image.
* ImagePutCol() - Put a column of pixels to an image.
* ImagePutRow() - Put a row of pixels to an image.
* get_tile() - Get a cached tile.
* flush_tile() - Flush the least-recently-used tile in the cache.
*/
/*
* Include necessary headers...
*/
#include "image.h"
#include <unistd.h>
#include <ctype.h>
#include <math.h>
/*
* Globals...
*/
int ImageHaveProfile = 0; /* Do we have a color profile? */
int ImageDensity[256]; /* Ink/marker density LUT */
int ImageMatrix[3][3][256]; /* Color transform matrix LUT */
/*
* Local functions...
*/
static ib_t *get_tile(image_t *img, int x, int y);
static void flush_tile(image_t *img);
/*
* 'ImageOpen()' - Open an image file and read it into memory.
*/
image_t * /* O - New image */
ImageOpen(char *filename, /* I - Filename of image */
int primary, /* I - Primary colorspace needed */
int secondary, /* I - Secondary colorspace if primary no good */
int saturation,/* I - Color saturation level */
int hue, /* I - Color hue adjustment */
const ib_t *lut) /* I - RGB gamma/brightness LUT */
{
FILE *fp; /* File pointer */
unsigned char header[16], /* First 16 bytes of file */
header2[16]; /* Bytes 2048-2064 (PhotoCD) */
image_t *img; /* New image buffer */
int status; /* Status of load... */
/*
* Range check...
*/
if (filename == NULL)
return (NULL);
/*
* Figure out the file type...
*/
if ((fp = fopen(filename, "r")) == NULL)
return (NULL);
if (fread(header, 1, sizeof(header), fp) == 0)
{
fclose(fp);
return (NULL);
}
fseek(fp, 2048, SEEK_SET);
memset(header2, 0, sizeof(header2));
fread(header2, 1, sizeof(header2), fp);
fseek(fp, 0, SEEK_SET);
/*
* Allocate memory...
*/
img = calloc(sizeof(image_t), 1);
if (img == NULL)
{
fclose(fp);
return (NULL);
}
/*
* Load the image as appropriate...
*/
img->max_ics = TILE_MINIMUM;
img->xppi = 128;
img->yppi = 128;
if (memcmp(header, "GIF87a", 6) == 0 ||
memcmp(header, "GIF89a", 6) == 0)
status = ImageReadGIF(img, fp, primary, secondary, saturation, hue, lut);
else if (header[0] == 0x01 && header[1] == 0xda)
status = ImageReadSGI(img, fp, primary, secondary, saturation, hue, lut);
else if (header[0] == 0x59 && header[1] == 0xa6 &&
header[2] == 0x6a && header[3] == 0x95)
status = ImageReadSunRaster(img, fp, primary, secondary, saturation, hue, lut);
else if (header[0] == 'P' && header[1] >= '1' && header[1] <= '6')
status = ImageReadPNM(img, fp, primary, secondary, saturation, hue, lut);
else if (memcmp(header2, "PCD_IPI", 7) == 0)
status = ImageReadPhotoCD(img, fp, primary, secondary, saturation, hue, lut);
#if defined(HAVE_LIBPNG) && defined(HAVE_LIBZ)
else if (memcmp(header, "\211PNG", 4) == 0)
status = ImageReadPNG(img, fp, primary, secondary, saturation, hue, lut);
#endif /* HAVE_LIBPNG && HAVE_LIBZ */
#ifdef HAVE_LIBJPEG
else if (memcmp(header + 6, "JFIF", 4) == 0)
status = ImageReadJPEG(img, fp, primary, secondary, saturation, hue, lut);
#endif /* HAVE_LIBJPEG */
#ifdef HAVE_LIBTIFF
else if (memcmp(header, "MM", 2) == 0 ||
memcmp(header, "II", 2) == 0)
status = ImageReadTIFF(img, fp, primary, secondary, saturation, hue, lut);
#endif /* HAVE_LIBTIFF */
else
{
fclose(fp);
status = -1;
}
if (status)
{
free(img);
return (NULL);
}
else
return (img);
}
/*
* 'ImageClose()' - Close an image file.
*/
void
ImageClose(image_t *img) /* I - Image to close */
{
ic_t *current, /* Current cached tile */
*next; /* Next cached tile */
/*
* Wipe the tile cache file (if any)...
*/
if (img->cachefile != NULL)
{
fprintf(stderr, "DEBUG: Closing and removing swap file \"%s\"...\n",
img->cachename);
fclose(img->cachefile);
unlink(img->cachename);
}
/*
* Free the image cache...
*/
fputs("DEBUG: Freeing memory...\n", stderr);
for (current = img->first; current != NULL; current = next)
{
fprintf(stderr, "DEBUG: Freeing cache (%08lx, next = %08lx)...\n",
current, next);
next = current->next;
free(current);
}
/*
* Free the rest of memory...
*/
if (img->tiles != NULL)
{
fprintf(stderr, "DEBUG: Freeing tiles (%08lx)...\n", img->tiles[0]);
free(img->tiles[0]);
fprintf(stderr, "DEBUG: Freeing tile pointers (%08lx)...\n", img->tiles);
free(img->tiles);
}
free(img);
}
/*
* 'ImageSetMaxTiles()' - Set the maximum number of tiles to cache.
*
* If the "max_tiles" argument is 0 then the maximum number of tiles is
* computed from the image size or the RIP_CACHE environment variable.
*/
void
ImageSetMaxTiles(image_t *img, /* I - Image to set */
int max_tiles) /* I - Number of tiles to cache */
{
int cache_size, /* Size of tile cache in bytes */
min_tiles, /* Minimum number of tiles to cache */
max_size; /* Maximum cache size in bytes */
char *cache_env, /* Cache size environment variable */
cache_units[255]; /* Cache size units */
min_tiles = max(TILE_MINIMUM,
1 + max((img->xsize + TILE_SIZE - 1) / TILE_SIZE,
(img->ysize + TILE_SIZE - 1) / TILE_SIZE));
if (max_tiles == 0)
max_tiles = ((img->xsize + TILE_SIZE - 1) / TILE_SIZE) *
((img->ysize + TILE_SIZE - 1) / TILE_SIZE);
cache_size = max_tiles * TILE_SIZE * TILE_SIZE * ImageGetDepth(img);
if ((cache_env = getenv("RIP_MAX_CACHE")) != NULL)
{
switch (sscanf(cache_env, "%d%s", &max_size, cache_units))
{
case 0 :
max_size = 32 * 1024 * 1024;
break;
case 1 :
max_size *= 4 * TILE_SIZE * TILE_SIZE;
break;
case 2 :
if (tolower(cache_units[0]) == 'g')
max_size *= 1024 * 1024 * 1024;
else if (tolower(cache_units[0]) == 'm')
max_size *= 1024 * 1024;
else if (tolower(cache_units[0]) == 'k')
max_size *= 1024;
else if (tolower(cache_units[0]) == 't')
max_size *= 4 * TILE_SIZE * TILE_SIZE;
break;
}
}
else
max_size = 32 * 1024 * 1024;
if (cache_size > max_size)
max_tiles = max_size / TILE_SIZE / TILE_SIZE / ImageGetDepth(img);
if (max_tiles < min_tiles)
max_tiles = min_tiles;
img->max_ics = max_tiles;
fprintf(stderr, "DEBUG: max_ics=%d...\n", img->max_ics);
}
/*
* 'ImageSetProfile()' - Set the device color profile.
*/
void
ImageSetProfile(float d, /* I - Ink/marker density */
float g, /* I - Ink/marker gamma */
float matrix[3][3]) /* I - Color transform matrix */
{
int i, j, k; /* Looping vars */
float m; /* Current matrix value */
int *im; /* Pointer into ImageMatrix */
ImageHaveProfile = 1;
for (i = 0, im = ImageMatrix[0][0]; i < 3; i ++)
for (j = 0; j < 3; j ++)
for (k = 0, m = matrix[i][j]; k < 256; k ++)
*im++ = (int)(k * m + 0.5);
for (k = 0, im = ImageDensity; k < 256; k ++)
*im++ = 255.0 * d * pow((float)k / 255.0, g) + 0.5;
}
/*
* 'ImageGetCol()' - Get a column of pixels from an image.
*/
int /* O - -1 on error, 0 on success */
ImageGetCol(image_t *img, /* I - Image */
int x, /* I - Column */
int y, /* I - Start row */
int height, /* I - Column height */
ib_t *pixels) /* O - Pixel data */
{
int bpp, /* Bytes per pixel */
twidth, /* Tile width */
count; /* Number of pixels to get */
const ib_t *ib; /* Pointer into tile */
if (img == NULL || x < 0 || x >= img->xsize || y >= img->ysize)
return (-1);
if (y < 0)
{
height += y;
y = 0;
}
if ((y + height) > img->ysize)
height = img->ysize - y;
if (height < 1)
return (-1);
bpp = ImageGetDepth(img);
twidth = bpp * (TILE_SIZE - 1);
while (height > 0)
{
ib = get_tile(img, x, y);
if (ib == NULL)
return (-1);
count = TILE_SIZE - (y & (TILE_SIZE - 1));
if (count > height)
count = height;
y += count;
height -= count;
for (; count > 0; count --, ib += twidth)
switch (bpp)
{
case 4 :
*pixels++ = *ib++;
case 3 :
*pixels++ = *ib++;
*pixels++ = *ib++;
case 1 :
*pixels++ = *ib++;
break;
}
}
return (0);
}
/*
* 'ImageGetRow()' - Get a row of pixels from an image.
*/
int /* O - -1 on error, 0 on success */
ImageGetRow(image_t *img, /* I - Image */
int x, /* I - Start column */
int y, /* I - Row */
int width, /* I - Width of row */
ib_t *pixels) /* O - Pixel data */
{
int bpp, /* Bytes per pixel */
count; /* Number of pixels to get */
const ib_t *ib; /* Pointer to pixels */
if (img == NULL || y < 0 || y >= img->ysize || x >= img->xsize)
return (-1);
if (x < 0)
{
width += x;
x = 0;
}
if ((x + width) > img->xsize)
width = img->xsize - x;
if (width < 1)
return (-1);
bpp = img->colorspace < 0 ? -img->colorspace : img->colorspace;
while (width > 0)
{
ib = get_tile(img, x, y);
if (ib == NULL)
return (-1);
count = TILE_SIZE - (x & (TILE_SIZE - 1));
if (count > width)
count = width;
memcpy(pixels, ib, count * bpp);
pixels += count * bpp;
x += count;
width -= count;
}
return (0);
}
/*
* 'ImagePutCol()' - Put a column of pixels to an image.
*/
int /* O - -1 on error, 0 on success */
ImagePutCol(image_t *img, /* I - Image */
int x, /* I - Column */
int y, /* I - Start row */
int height, /* I - Column height */
const ib_t *pixels) /* I - Pixels to put */
{
int bpp, /* Bytes per pixel */
twidth, /* Width of tile */
count; /* Number of pixels to put */
int tilex, /* Column within tile */
tiley; /* Row within tile */
ib_t *ib; /* Pointer to pixels in tile */
if (img == NULL || x < 0 || x >= img->xsize || y >= img->ysize)
return (-1);
if (y < 0)
{
height += y;
y = 0;
}
if ((y + height) > img->ysize)
height = img->ysize - y;
if (height < 1)
return (-1);
bpp = ImageGetDepth(img);
twidth = bpp * (TILE_SIZE - 1);
tilex = x / TILE_SIZE;
tiley = y / TILE_SIZE;
while (height > 0)
{
ib = get_tile(img, x, y);
if (ib == NULL)
return (-1);
img->tiles[tiley][tilex].dirty = 1;
tiley ++;
count = TILE_SIZE - (y & (TILE_SIZE - 1));
if (count > height)
count = height;
y += count;
height -= count;
for (; count > 0; count --, ib += twidth)
switch (bpp)
{
case 4 :
*ib++ = *pixels++;
case 3 :
*ib++ = *pixels++;
*ib++ = *pixels++;
case 1 :
*ib++ = *pixels++;
break;
}
}
return (0);
}
/*
* 'ImagePutRow()' - Put a row of pixels to an image.
*/
int /* O - -1 on error, 0 on success */
ImagePutRow(image_t *img, /* I - Image */
int x, /* I - Start column */
int y, /* I - Row */
int width, /* I - Row width */
const ib_t *pixels) /* I - Pixel data */
{
int bpp, /* Bytes per pixel */
count; /* Number of pixels to put */
int tilex, /* Column within tile */
tiley; /* Row within tile */
ib_t *ib; /* Pointer to pixels in tile */
if (img == NULL || y < 0 || y >= img->ysize || x >= img->xsize)
return (-1);
if (x < 0)
{
width += x;
x = 0;
}
if ((x + width) > img->xsize)
width = img->xsize - x;
if (width < 1)
return (-1);
bpp = img->colorspace < 0 ? -img->colorspace : img->colorspace;
tilex = x / TILE_SIZE;
tiley = y / TILE_SIZE;
while (width > 0)
{
ib = get_tile(img, x, y);
if (ib == NULL)
return (-1);
img->tiles[tiley][tilex].dirty = 1;
count = TILE_SIZE - (x & (TILE_SIZE - 1));
if (count > width)
count = width;
memcpy(ib, pixels, count * bpp);
pixels += count * bpp;
x += count;
width -= count;
tilex ++;
}
return (0);
}
/*
* 'get_tile()' - Get a cached tile.
*/
static ib_t * /* O - Pointer to tile or NULL */
get_tile(image_t *img, /* I - Image */
int x, /* I - Column in image */
int y) /* I - Row in image */
{
int bpp, /* Bytes per pixel */
tilex, /* Column within tile */
tiley, /* Row within tile */
xtiles, /* Number of tiles horizontally */
ytiles; /* Number of tiles vertically */
ic_t *ic; /* Cache pointer */
itile_t *tile; /* Tile pointer */
if (x >= img->xsize || y >= img->ysize)
{
fprintf(stderr, "ERROR: Internal image RIP error - %d,%d is outside of %dx%d\n",
x, y, img->xsize, img->ysize);
return (NULL);
}
if (img->tiles == NULL)
{
xtiles = (img->xsize + TILE_SIZE - 1) / TILE_SIZE;
ytiles = (img->ysize + TILE_SIZE - 1) / TILE_SIZE;
fprintf(stderr, "DEBUG: Creating tile array (%dx%d)\n", xtiles, ytiles);
img->tiles = calloc(sizeof(itile_t *), ytiles);
tile = calloc(sizeof(itile_t), xtiles * ytiles);
for (tiley = 0; tiley < ytiles; tiley ++)
{
img->tiles[tiley] = tile;
for (tilex = xtiles; tilex > 0; tilex --, tile ++)
tile->pos = -1;
}
}
bpp = ImageGetDepth(img);
tilex = x / TILE_SIZE;
tiley = y / TILE_SIZE;
x &= (TILE_SIZE - 1);
y &= (TILE_SIZE - 1);
tile = img->tiles[tiley] + tilex;
if ((ic = tile->ic) == NULL)
{
if (img->num_ics < img->max_ics)
{
ic = calloc(sizeof(ic_t) + bpp * TILE_SIZE * TILE_SIZE, 1);
ic->pixels = ((ib_t *)ic) + sizeof(ic_t);
img->num_ics ++;
fprintf(stderr, "DEBUG: Allocated cache tile %d (%08lx)...\n",
img->num_ics, ic);
}
else
{
fprintf(stderr, "DEBUG: Flushing old cache tile (%08lx)...\n",
img->first);
flush_tile(img);
ic = img->first;
}
ic->tile = tile;
tile->ic = ic;
if (tile->pos >= 0)
{
fprintf(stderr, "DEBUG: Loading cache tile from file position %d...\n",
tile->pos);
if (ftell(img->cachefile) != tile->pos)
if (fseek(img->cachefile, tile->pos, SEEK_SET))
perror("get_tile:");
fread(ic->pixels, bpp, TILE_SIZE * TILE_SIZE, img->cachefile);
}
else
{
fputs("DEBUG: Clearing cache tile...\n", stderr);
memset(ic->pixels, 0, bpp * TILE_SIZE * TILE_SIZE);
}
}
if (ic == img->first)
img->first = ic->next;
else if (img->first == NULL)
img->first = ic;
if (ic != img->last)
{
if (img->last != NULL)
img->last->next = ic;
ic->prev = img->last;
img->last = ic;
}
ic->next = NULL;
return (ic->pixels + bpp * (y * TILE_SIZE + x));
}
/*
* 'flush_tile()' - Flush the least-recently-used tile in the cache.
*/
static void
flush_tile(image_t *img) /* I - Image */
{
int bpp; /* Bytes per pixel */
itile_t *tile; /* Pointer to tile */
bpp = ImageGetDepth(img);
tile = img->first->tile;
if (!tile->dirty)
{
tile->ic = NULL;
return;
}
if (img->cachefile == NULL)
{
cupsTempFile(img->cachename, sizeof(img->cachename));
fprintf(stderr, "DEBUG: Creating swap file \"%s\"...\n", img->cachename);
if ((img->cachefile = fopen(img->cachename, "wb+")) == NULL)
{
perror("ERROR: Unable to create image swap file");
tile->ic = NULL;
tile->dirty = 0;
return;
}
}
if (tile->pos >= 0)
{
if (ftell(img->cachefile) != tile->pos)
if (fseek(img->cachefile, tile->pos, SEEK_SET))
{
perror("ERROR: Unable to seek in swap file");
tile->ic = NULL;
tile->dirty = 0;
return;
}
}
else
{
if (fseek(img->cachefile, 0, SEEK_END))
{
perror("ERROR: Unable to append to swap file");
tile->ic = NULL;
tile->dirty = 0;
return;
}
tile->pos = ftell(img->cachefile);
}
if (fwrite(tile->ic->pixels, bpp, TILE_SIZE * TILE_SIZE, img->cachefile) < 1)
perror("ERROR: Unable to write tile to swap file");
else
fprintf(stderr, "DEBUG: Wrote tile at position %d...\n", tile->pos);
tile->ic = NULL;
tile->dirty = 0;
}
/*
* End of "$Id$".
*/

Alguns arquivos não foram exibidos porque demasiados arquivos foram alterados neste diff Mostrar Mais