--- /dev/null
+<HTML>
+<!-- SECTION: References -->
+<HEAD>
+ <TITLE>PPD Compiler Driver Information File Reference</TITLE>
+</HEAD>
+<BODY>
+
+<p>The CUPS PPD compiler reads meta files that contain descriptions
+of one or more PPD files to be generated by
+<a href="man-ppdc.html">ppdc(1)</a> or the corresponding driver interface
+program <a href="man-drv.html">drv(1)</a>. The source file format is plain
+ASCII text that can be edited using your favorite text editor.</p>
+
+<p>Directives may be placed anywhere on a line and are followed by
+zero or more values.</p>
+
+<p>Comments are supported using the C (/* ... */) and C++ (// ...) comment
+mechanisms.</p>
+
+<p>Directives that accept expressions look for sequences of the form:</p>
+
+<dl>
+
+ <dt>NAME</dt>
+ <dd>Evaluates to 1 if NAME is defined, otherwise 0.</dd>
+
+ <dt>number</dt>
+
+ <dd>Evaluates to the specified integer; the number can be preceded by
+ a leading sign (+/-) followed by a decimal number (1234), octal number
+ (01234), or hexidecimal number (0x1234) using the same rules as C and
+ C++.</dd>
+
+ <dt>(NAME NAME ... number number ...)</dt>
+ <dd>Evaluates to the bitwise OR of each named #define constant or
+ number.</dd>
+
+ <dt>(NAME == OTHERNAME)</dt>
+ <dt>(NAME == number)</dt>
+ <dd>Evaluates to 1 if NAME is equal to the other named constant or
+ number, otherwise 0.</dd>
+
+ <dt>(NAME != OTHERNAME)</dt>
+ <dt>(NAME != number)</dt>
+ <dd>Evaluates to 1 if NAME is not equal to the other named constant or
+ number, otherwise 0.</dd>
+
+ <dt>(NAME < OTHERNAME)</dt>
+ <dt>(NAME < number)</dt>
+ <dd>Evaluates to 1 if NAME is less than to the other named constant or
+ number, otherwise 0.</dd>
+
+ <dt>(NAME <= OTHERNAME)</dt>
+ <dt>(NAME <= number)</dt>
+ <dd>Evaluates to 1 if NAME is less than or equal to the other named
+ constant or number, otherwise 0.</dd>
+
+ <dt>(NAME > OTHERNAME)</dt>
+ <dt>(NAME > number)</dt>
+ <dd>Evaluates to 1 if NAME is greater than to the other named constant
+ or number, otherwise 0.</dd>
+
+ <dt>(NAME >= OTHERNAME)</dt>
+ <dt>(NAME >= number)</dt>
+ <dd>Evaluates to 1 if NAME is greater than or equal to the other named
+ constant or number, otherwise 0.</dd>
+
+</dl>
+
+<p>Printer driver information can be grouped and shared using
+curley braces ({ ... }); PPD files are written when a close
+brace or end-of-file is seen and a <a href="#PCFileName">PCFileName</a>
+directive has been defined.</p>
+
+
+<h2 class="title"><a name='_define'>#define</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+#define <i>name expression</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+#define FOO 100
+#define BAR "Bar, Inc."
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>#define</code> directive assigns a value to a name
+which can be later referenced using <code>$name</code>. The name is
+case-insensitive and can be any sequence of letters, numbers,
+and the underscore. The value can be any valid expression.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#_include'><code>#include</code></a></p>
+
+
+<h2 class="title"><a name='_elif'>#elif</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+#elif <i>expression</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+#if HAVE_FOO
+...
+#elif (HAVE_BAR >= 999)
+...
+#else
+...
+#endif
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>#elif</code> directive allows portions of a driver information file
+to be used conditionally. <code>#elif</code> directives must appear after a
+corresponding <a href="#_if"><code>#if</code></a> directive.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#_else'><code>#else</code></a>,
+<a href='#_endif'><code>#endif</code></a>,
+<a href='#_if'><code>#if</code></a></p>
+
+
+<h2 class="title"><a name='_else'>#else</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+#else
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+#if HAVE_FOO
+...
+#elif (HAVE_BAR >= 999)
+...
+#else
+...
+#endif
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>#else</code> directive allows portions of a driver information file
+to be used conditionally when the corresponding
+<a href="#_if"><code>#if</code></a> and <a href="#_elif"><code>#elif</code></a>
+expressions are non-zero.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#_elif'><code>#elif</code></a>,
+<a href='#_endif'><code>#endif</code></a>,
+<a href='#_if'><code>#if</code></a></p>
+
+
+<h2 class="title"><a name='_endif'>#endif</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+#endif
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+#if HAVE_FOO
+...
+#elif (HAVE_BAR >= 999)
+...
+#else
+...
+#endif
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>#endif</code> directive ends a conditional block of a driver
+information file. It must appear after all of the
+<a href="#_if"><code>#if</code></a>, <a href="#_elif"><code>#elif</code></a>,
+and <a href="#_else"><code>#else</code></a> directives for the current
+conditional block.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#_elif'><code>#elif</code></a>,
+<a href='#_else'><code>#else</code></a>,
+<a href='#_if'><code>#if</code></a></p>
+
+
+<h2 class="title"><a name='_font'>#font</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+#font <i>name encoding "version" charset status</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+#font Courier Standard "(1.05)" Standard ROM
+#font Symbol Special "(001.005)" Special ROM
+#font Barcode-Foo Special "(1.0)" Special Disk
+#font Unicode-Foo Expert "(2.0)" Adobe-Identity ROM
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>#font</code> directive defines a "base font" for all
+printer drivers. The name is the PostScript font name.</p>
+
+<p>The encoding is the default encoding of the font, usually
+<code>Standard</code>, <code>Expert</code>, or <code>Special</code>, as
+defined in the Adobe PPD file specification.</p>
+
+<p>The version is the PostScript string definition that
+corresponds to the font version number.</p>
+
+<p>The charset defines the available characters in the font,
+usually <code>Standard</code> or <code>Special</code>, as defined in the
+Adobe PPD file specification.</p>
+
+<p>The status is the installation status of the font and must be
+either the word <code>ROM</code> or <code>Disk</code>.
+
+<p>Base fonts differ from fonts defined using the <a
+href='#Font'><code>Font</code></a> directive in that they are not
+automatically associated with all drivers - you must use the
+special <code>Font *</code> directive to include them in a
+driver.</p>
+
+<p>Currently the <code>#font</code> directive is used mainly for
+defining the standard raster fonts in the
+<code><font.defs></code> include file.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#_include'><code>#include</code></a>,
+<a href='#Font'><code>Font</code></a></p>
+
+
+<h2 class="title"><a name='_if'>#if</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+#if <i>name or expression</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+#if HAVE_FOO
+...
+#elif (HAVE_BAR >= 999)
+...
+#else
+...
+#endif
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>#if</code> directive allows portions of a driver information file
+to be used conditionally. When followed by a name, the data that follows is
+used only when the name is defined, otherwise the data is ignored.
+<code>#if</code> directives can be nested up to 100 times.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#_elif'><code>#elif</code></a>,
+<a href='#_else'><code>#else</code></a>,
+<a href='#_endif'><code>#endif</code></a></p>
+
+
+<h2 class="title"><a name='_include'>#include</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+#include <<i>filename</i>>
+#include "<i>filename</i>"
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+#include <font.defs>
+#include "myfile.h"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>#include</code> directive reads the named driver
+information file. If the filename is included inside angle
+brackets (<code><filename></code>), then the PPD compiler will
+look for the file in all of the include directories it knows
+about. Otherwise, the file is opened in the current directory
+relative to the current driver information file, and if that
+fails then it looks in the include directories for the file.</p>
+
+<p>The <code>#include</code> directive can be nested to as many
+files as are allowed by the host operating system, typically at
+least 100 files.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#_define'><code>#define</code></a>,
+<a href='#_font'><code>#font</code></a>,
+<a href='#_media'><code>#media</code></a></p>
+
+
+<h2 class="title"><a name='_media'>#media</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+#media <i>name width length</i>
+#media <i>"name/text" width length</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+#media "Letter/Letter - 8.5x11in" 8.5in 11in
+#media "A4/A4 - 210x297mm" 210mm 297mm
+#media "w936h1368/Super B/A3 - 13x19in" 936 1368
+#media Photo 4in 6in
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>#media</code> directive defines a named media size for
+inclusion in a driver. The name with optional user text defines
+the name for the media size and is used with the <a
+href='#MediaSize'><code>MediaSize</code></a> directive to associate
+the media size with the driver. The name may only contain
+letters, numbers, and the underscore and may not exceed 40
+characters in length. The user text, if supplied, may not exceed
+80 characters in length.</p>
+
+<p>The width and length define the dimensions of the media. Each
+number is optionally followed by one of the following unit
+suffixes:</p>
+
+<ul>
+
+ <li><code>cm</code> - centimeters</li>
+
+ <li><code>ft</code> - feet</li>
+
+ <li><code>in</code> - inches</li>
+
+ <li><code>m</code> - meters</li>
+
+ <li><code>mm</code> - millimeters</li>
+
+ <li><code>pt</code> - points (72 points = 1 inch)</li>
+
+</ul>
+
+<p>Points are assumed if no units are specified.
+
+<h3>See Also</h3>
+
+<p><a href='#_include'><code>#include</code></a>,
+<a href='#CustomMedia'><code>CustomMedia</code></a>,
+<a href='#MediaSize'><code>MediaSize</code></a></p>
+
+
+<h2 class="title"><a name='_po'>#po</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+#po <i>locale filename</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+#po es "es.po"
+#po fr_CA "mydriver-fr_CA.po"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>#po</code> directive defines a message catalog to use for the
+given POSIX language abbreviation. Multiple <code>#po</code> directives can be
+specified to list multiple catalogs. The filename can be an absolute path or
+relative to the driver information file. GNU gettext and Mac OS X .strings
+files are supported.</p>
+
+
+<h2 class="title"><a name='Attribute'>Attribute</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Attribute <i>name "" value</i>
+Attribute <i>name keyword value</i>
+Attribute <i>name "keyword/text" value</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Attribute cupsInkChannels "" 1
+Attribute cupsAllDither 600dpi "1.0"
+Attribute fooProfile "Photo/Photographic Profile" "photopro.icc"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Attribute</code> directive creates a PPD attribute. The
+name is any combination of letters, numbers, and the underscore
+and can be up to 40 characters in length.</p>
+
+<p>The selector can be the empty string (<code>""</code>), a keyword
+consisting of up to 40 letters, numbers, and the underscore, or
+a string composed of a keyword and user text of up to 80
+characters.</p>
+
+<p>The value is any string or number; the string may contain
+multiple lines, however no one line may exceed 255
+characters.</p>
+
+<h3>See Also</h3>
+
+<p><a href="#LocAttribute"><code>LocAttribute</code></a></p>
+
+
+<h2 class="title"><a name='Choice'>Choice</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Choice <i>name "code"</i>
+Choice <i>"name/text" "code"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Choice None "<</MediaType (None)>>setpagedevice"
+Choice "False/No" "<</cupsCompression 0>>setpagedevice"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Choice</code> directive adds a single choice to the
+current option. The name is any combination of letters, numbers,
+and the underscore and can be up to 40 characters in length.</p>
+
+<p>If provided, the text can be any string up to 80 characters
+in length. If no text is provided, the name is used.</p>
+
+<p>The code is any string and may contain multiple lines,
+however no one line may exceed 255 characters.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><a name='ColorDevice'>ColorDevice</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+ColorDevice <i>boolean-value</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+ColorDevice no
+ColorDevice yes
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>ColorDevice</code> directive tells the application if
+the printer supports color. It is typically used in conjunction
+with the <a href='#ColorModel'><code>ColorModel</code></a> directive
+to provide color printing support.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#ColorModel'><code>ColorModel</code></a></p>
+
+
+<h2 class="title"><span class="info">Deprecated</span><a name='ColorModel'>ColorModel</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+ColorModel <i>name colorspace colororder compression</i>
+ColorModel <i>"name/text" colorspace colororder compression</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+ColorModel Gray/Grayscale w chunky 0
+ColorModel RGB/Color rgb chunky 0
+ColorModel CMYK cmyk chunky 0
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>ColorModel</code> directive is a convenience directive
+which creates a ColorModel option and choice for the current
+printer driver. The name is any combination of letters, numbers,
+and the underscore and can be up to 40 characters in length.</p>
+
+<p>If provided, the text can be any string up to 80 characters
+in length. If no text is provided, the name is used.</p>
+
+<p>The colorspace argument is one of the standard colorspace
+keywords defined later in this appendix in the section titled,
+"<a href='#REF_COLOR_SPACE'>Colorspace Keywords</a>".</p>
+
+<P>The colororder argument is one of the standard color order
+keywords defined later in this appendix in the section titled,
+"<a href='#REF_COLOR_ORDER'>Color Order Keywords</a>".</p>
+
+<p>The compression argument is any number and is assigned to the
+<code>cupsCompression</code> attribute in the PostScript page device
+dictionary.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorDevice'><code>ColorDevice</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><span class="info">Deprecated</span><a name='ColorProfile'>ColorProfile</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+ColorProfile <i>resolution/mediatype gamma density matrix</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+ColorProfile -/- 1.7 1.0
+ 1.0 0.0 0.0
+ 0.0 1.0 0.0
+ 0.0 0.0 1.0
+
+ColorProfile 360dpi/- 1.6 1.0
+ 1.0 -0.05 -0.3
+ -0.35 1.0 -0.15
+ -0.095 -0.238 0.95
+
+ColorProfile 720dpi/Special 1.5 1.0
+ 1.0 0.0 -0.38
+ -0.4 1.0 0.0
+ 0.0 -0.38 0.9
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>ColorProfile</code> directive defines a CMY
+transform-based color profile. The resolution and mediatype
+arguments specify the <code>Resolution</code> and <code>MediaType</code>
+choices which use the profile; the hyphen (<code>-</code>) is used to
+specify that any resolution or mediatype can be used with the
+profile.</p>
+
+<p>The gamma argument specifies the gamma correction to apply to
+the color values (P = p<sup>g</sup>) and is a real number
+greater than 0. Values larger than 1 cause a general lightening
+of the print while values smaller than 1 cause a general
+darkening of the print. A value of 1 disables gamma
+correction.</p>
+
+<p>The density argument specifies the linear density correction
+to apply to the color values (P = d * p<sup>g</sup>) and is a
+real number greater than 0 and less than or equal to 1. A value
+1 of disables density correction while lower values produce
+proportionately lighter output.</p>
+
+<p>The matrix argument specifies a 3x3 linear transformation
+matrix in row-major order. The matrix is applied only to the CMY
+component of a RGB to CMYK transformation and is not used when
+printing in grayscale or CMYK mode unless the printer only
+supports printing with 3 colors.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#SimpleColorProfile'><code>SimpleColorProfile</code></a></p>
+
+
+<h2 class="title"><a name='Copyright'>Copyright</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Copyright <i>"text"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Copyright "Copyright 2008 by Foo Enterprises"
+
+Copyright
+"This software is free software; you can redistribute it and/or
+modify it under the terms of the GNU General Public License as
+published by the Free Software Foundation; either version 2 of
+the License, or (at your option) any later version.
+
+This software is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public
+License along with this software; if not, write to the Free
+Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+MA 02111 USA"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Copyright</code> directive adds text comments to the
+top of a PPD file, typically for use in copyright notices. The
+text argument can contain multiple lines of text, but no line
+may exceed 255 characters.</p>
+
+
+<h2 class="title"><a name='CustomMedia'>CustomMedia</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+CustomMedia <i>name width length left bottom right top
+ "size-code" "region-code"</i>
+
+CustomMedia <i>"name/text" width length left bottom right top
+ "size-code" "region-code"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+CustomMedia Letter 8.5in 11in 0.25in 0.46in 0.25in 0.04in
+ "<</PageSize[612 792]/ImagingBBox null/ManualFeed false>>
+ setpagedevice"
+ "<</PageSize[612 792]/ImagingBBox null/ManualFeed true>>
+ setpagedevice"
+
+CustomMedia "A4/A4 - 210x297mm" 210mm 297mm 12 12 12 12
+ "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
+ "<</PageSize[595 842]/ImagingBBox null>>setpagedevice"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>CustomMedia</code> directive adds a custom media size to
+the driver. The name is any combination of letters, numbers,
+and the underscore and can be up to 40 characters in length.</p>
+
+<p>If provided, the text can be any string up to 80 characters
+in length. If no text is provided, the name is used.</p>
+
+<p>The width and length arguments specify the dimensions of the
+media as defined for the <a href="#_media"><code>#media</code></a>
+directive.</p>
+
+<p>The left, bottom, right, and top arguments specify the
+printable margins of the media.</p>
+
+<p>The size-code and region-code arguments specify the
+PostScript commands to run for the <code>PageSize</code> and
+<code>PageRegion</code> options, respectively. The commands can
+contain multiple lines, however no line may be more than 255
+characters in length.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#_media'><code>#media</code></a>,
+<a href='#MediaSize'><code>MediaSize</code></a></p>
+
+
+<h2 class="title"><a name='Cutter'>Cutter</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Cutter <i>boolean-value</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Cutter yes
+Cutter no
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Cutter</code> directive specifies whether the printer
+has a built-in media cutter. When a cutter is present, the
+printer's PPD file will contain a <code>CutMedia</code> option that
+allows the user to control whether the media is cut at the end
+of the job.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><span class="info">Deprecated</span><a name='Darkness'>Darkness</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Darkness <i>temperature name</i>
+Darkness <i>temperature "name/text"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Darkness 0 Light
+Darkness 2 "Normal/Standard"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Darkness</code> directive defines a choice for the
+<code>cupsDarkness</code> option which sets the
+<code>cupsCompression</code> attribute in the PostScript page device
+dictionary. It is used with the CUPS <VAR>rastertolabel</VAR>
+sample driver to control the print head temperature and
+therefore the darkness of the print.</p>
+
+<p>The temperature argument specifies a temperature value for
+the Dymo driver from 0 (lowest) to 3 (highest), with 2
+representing the normal setting.</p>
+
+<p>The name is any combination of letters, numbers, and the
+underscore and can be up to 40 characters in length.</p>
+
+<p>If provided, the text can be any string up to 80 characters
+in length. If no text is provided, the name is used.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><a name='DriverType'>DriverType</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+DriverType <i>type</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+DriverType custom
+DriverType escp
+DriverType pcl
+DriverType ps
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>DriverType</code> directive tells the PPD compiler
+which DDK filters to include in the PPD file. The following
+types are supported:</p>
+
+<ul>
+
+ <li><code>custom</code> - Use only those filters that are
+ defined in the driver information file</li>
+
+ <li><code>epson</code> - Use the CUPS sample Epson driver filter
+ <var>rastertoepson</var></li>
+
+ <li><code>escp</code> - Use the ESC/P DDK driver filters
+ <var>commandtoescpx</var> and
+ <var>rastertoescpx</var></li>
+
+ <li><code>hp</code> - Use the CUPS sample HP driver filter
+ <var>rastertohp</var></li>
+
+ <li><code>label</code> - Use the CUPS sample label driver filter <var>rastertolabel</var></li>
+
+ <li><code>pcl</code> - Use the HP-PCL DDK driver filters
+ <var>commandtopclx</var> and
+ <var>rastertopclx</var></li>
+
+ <li><code>ps</code> - Use no filters; this driver is for a
+ standard PostScript device</li>
+
+</ul>
+
+<h3>See Also</h3>
+
+<p><a href='#Filter'><code>Filter</code></a>,
+<a href='#ModelNumber'><code>ModelNumber</code></a></p>
+
+
+<h2 class="title"><a name='Duplex'>Duplex</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Duplex <i>type</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Duplex none
+Duplex normal
+Duplex flip
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Duplex</code> directive determines whether double-sided printing
+is supported in the current driver. The type argument specifies the type
+of duplexing that is supported:</p>
+
+<ul>
+
+ <li><code>none</code> - double-sided printing is not
+ supported</li>
+
+ <li><code>normal</code> - double-sided printing is
+ supported</li>
+
+ <li><code>flip</code> - double-sided printing is supported,
+ but the back side image needs to be flipped vertically
+ (used primarily with inkjet printers)</li>
+
+</ul>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><a name='FileName'>FileName</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+FileName <i>"filename"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+FileName "Acme Laser Printer 2000"
+FileName "Acme Ink Waster 1000"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>FileName</code> attribute specifies the "long" name of the
+PPD file for the current driver.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Manufacturer'><code>Manufacturer</code></a>,
+<a href='#ModelName'><code>ModelName</code></a>,
+<a href="#PCFileName"><code>PCFileName</code></a>,
+<a href='#Version'><code>Version</code></a></p>
+
+
+<h2 class="title"><a name='Filter'>Filter</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Filter <i>mime-type cost program</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Filter application/vnd.cups-raster 50 rastertofoo
+Filter application/vnd.hp-HPGL 25 /usr/foo/filter/hpgltofoo
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Filter</code> directive adds a filter for the current
+driver. The mime-type argument is a valid MIME media type name
+as defined in a CUPS <var>mime.types</var> file.</p>
+
+<p>The cost argument specifies the relative cost of the filter.
+In general, use a number representing the average percentage of
+CPU time that is used when printing the specified MIME media
+type.</p>
+
+<p>The program argument specifies the program to run; if the
+program is not an absolute filename, then CUPS will look for the
+program in the CUPS filter directory.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#DriverType'><code>DriverType</code></a></p>
+
+
+<h2 class="title"><span class="info">Deprecated</span><a name='Finishing'>Finishing</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Finishing <i>name</i>
+Finishing <i>"name/text"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Finishing None
+Finishing "Glossy/Photo Overcoat"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Finishing</code> directive adds a choice to the
+<code>cupsFinishing</code> option. The name is any combination of
+letters, numbers, and the underscore and can be up to 40
+characters in length. The name is stored in the
+<code>OutputType</code> attribute in the PostScript page device
+dictionary.</p>
+
+<p>If provided, the text can be any string up to 80 characters
+in length. If no text is provided, the name is used.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><a name='Font'>Font</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Font <i>name encoding "version" charset status</i>
+Font *
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Font *
+Font Courier Standard "(1.05)" Standard ROM
+Font Symbol Special "(001.005)" Special ROM
+Font Barcode-Foo Special "(1.0)" Special Disk
+Font Unicode-Foo Expert "(2.0)" Adobe-Identity ROM
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Font</code> directive defines a "device font" for the
+current printer driver. The name is the PostScript font
+name.</p>
+
+<p>The encoding is the default encoding of the font, usually
+<code>Standard</code>, <code>Expert</code>, or <code>Special</code>, as
+defined in the Adobe PPD file specification.</p>
+
+<p>The version is the PostScript string definition that
+corresponds to the font version number.</p>
+
+<p>The charset defines the available characters in the font,
+usually <code>Standard</code> or <code>Special</code>, as defined in the
+Adobe PPD file specification.</p>
+
+<p>The status is the installation status of the font and must be
+either the word <code>ROM</code> or <code>Disk</code>.</p>
+
+<p>Device fonts differ from fonts defined using the <a
+href='#_font'><code>#font</code></a> directive in that they are
+automatically associated with the current driver. Fonts defined
+using <code>#font</code> may be imported into the current driver
+using the <code>Font *</code> form of this directive.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#_font'><code>#font</code></a></p>
+
+
+<h2 class="title"><a name='Group'>Group</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Group <i>name</i>
+Group <i>"name/text"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Group General
+Group "InstallableOptions/Options Installed"
+Group "Special/Vendor Options"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Group</code> directive specifies the group for new
+<code>Option</code> directives. The name is any combination of
+letters, numbers, and the underscore and can be up to 40
+characters in length. The names <code>General</code> and
+<code>InstallableOptions</code> are predefined for the standard
+Adobe UI keywords and for installable options, respectively.</p>
+
+<p>If provided, the text can be any string up to 40 characters
+in length. If no text is provided, the name is used.</p>
+
+<center><table width='80%' border='1' bgcolor='#cccccc' cellpadding='5' cellspacing='0'>
+<tr>
+ <td align='justify'><b>Note:</b>
+
+ <p>Because of certain API binary compatibility issues,
+ CUPS limits the length of PPD group translation strings
+ (text) to 40 characters, while the PPD specification
+ allows for up to 80 characters.</p>
+
+ </td>
+</tr>
+</table></center>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><a name='HWMargins'>HWMargins</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+HWMargins <i>left bottom right top</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+HWMargins 18 36 18 36
+HWMargins 0.25in 0.5in 0.25in 0.5in
+HWMargins 0.6cm 1.2cm 0.6cm 1.2cm
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>HWMargins</code> directive specifies the current
+margins for <a href='#MediaSize'><code>MediaSize</code></a> that
+follow. The left, bottom, right, and top margin values specify
+the printable margins.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#MediaSize'><code>MediaSize</code></a></p>
+
+
+<h2 class="title"><a name='InputSlot'>InputSlot</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+InputSlot <i>position name</i>
+InputSlot <i>position "name/text"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+InputSlot 0 Auto
+InputSlot 1 "Upper/Tray 1"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>InputSlot</code> directive adds a new choice to the
+<code>InputSlot</code> option. The position argument is a number
+from 0 to 2<sup>32</sup>-1 specifying the value that is placed
+in the <code>MediaPosition</code> attribute in the PostScript page
+device dictionary.</p>
+
+<p>The name is any combination of letters, numbers, and the
+underscore and can be up to 40 characters in length.</p>
+
+<p>If provided, the text can be any string up to 80 characters
+in length. If no text is provided, the name is used.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><a name='Installable'>Installable</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Installable <i>name</i>
+Installable <i>"name/text"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Installable EnvTray
+Installable "Option1/Duplexer Installed"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Installable</code> directive adds a new boolean option
+to the <code>InstallableOptions</code> group with a default value of
+<code>False</code>. The name is any combination of letters, numbers,
+and the underscore and can be up to 40 characters in length.</p>
+
+<p>If provided, the text can be any string up to 80 characters
+in length. If no text is provided, the name is used.</p>
+
+
+<h2 class="title"><a name='LocAttribute'>LocAttribute</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+LocAttribute <i>name "keyword/text" value</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+LocAttribute fooProfile "Photo/Photographic Profile" "photopro.icc"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>LocAttribute</code> directive creates a localized PPD
+attribute. The name is any combination of letters, numbers, and the
+underscore and can be up to 40 characters in length.</p>
+
+<p>The selector can be the empty string (<code>""</code>), a keyword
+consisting of up to 40 letters, numbers, and the underscore, or
+a string composed of a keyword and user text of up to 80
+characters.</p>
+
+<p>The value is any string or number; the string may contain
+multiple lines, however no one line may exceed 255
+characters.</p>
+
+<h3>See Also</h3>
+
+<p><a href="#Attribute"><code>Attribute</code></a></p>
+
+
+<h2 class="title"><a name='ManualCopies'>ManualCopies</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+ManualCopies <i>boolean-value</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+ManualCopies no
+ManualCopies yes
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>ManualCopies</code> directive specifies whether copies
+need to be produced by the RIP filters. The default is
+<code>no</code>.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><a name='Manufacturer'>Manufacturer</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Manufacturer <i>"name"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Manufacturer "Foo"
+Manufacturer "HP"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Manufacturer</code> directive specifies the
+manufacturer name for the current driver. The name argument must
+conform to the manufacturer name requirements in the Adobe PPD
+file specification.</p>
+
+<h3>See Also</h3>
+
+<p><a href="#FileName"><code>FileName</code></a>,
+<a href='#ModelName'><code>ModelName</code></a>,
+<a href='#PCFileName'><code>PCFileName</code></a>,
+<a href='#Version'><code>Version</code></a></p>
+
+
+<h2 class="title"><a name='MaxSize'>MaxSize</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+MaxSize <i>width length</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+MaxSize 36in 100ft
+MaxSize 300cm 30m
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>MaxSize</code> directive specifies the maximum width
+and length that is supported for custom page sizes.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#MinSize'><code>MinSize</code></a>,
+<a href='#VariablePaperSize'><code>VariablePaperSize</code></a></p>
+
+
+<h2 class="title"><a name='MediaSize'>MediaSize</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+MediaSize <i>name</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+MediaSize Letter
+MediaSize A4
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>MediaSize</code> directive adds the named size to the
+current printer driver using the current margins defined with
+the <a href="#HWMargins"><code>HWMargins</code></a> directive. The
+name argument must match a media size defined using the <a
+href="#_media"><code>#media</code></a> directive.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#_media'><code>#media</code></a>,
+<a href='#HWMargins'><code>HWMargins</code></a></p>
+
+
+<h2 class="title"><a name='MediaType'>MediaType</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+MediaType <i>type name</i>
+MediaType <i>type "name/text"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+MediaType 0 Auto
+MediaType 1 "Plain/Plain Paper"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>MediaType</code> directive adds a new choice to the
+<code>MediaType</code> option. The type argument is a number
+from 0 to 2<sup>32</sup>-1 specifying the value that is placed
+in the <code>cupsMediaType</code> attribute in the PostScript page
+device dictionary.</p>
+
+<p>The name is any combination of letters, numbers, and the
+underscore and can be up to 40 characters in length. The name is
+placed in the <code>MediaType</code> attribute in the PostScript
+page device dictionary.</p>
+
+<p>If provided, the text can be any string up to 80 characters
+in length. If no text is provided, the name is used.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><a name='MinSize'>MinSize</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+MinSize <i>width length</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+MinSize 4in 8in
+MinSize 10cm 20cm
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>MinSize</code> directive specifies the minimum width
+and length that is supported for custom page sizes.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#MaxSize'><code>MaxSize</code></a>,
+<a href='#VariablePaperSize'><code>VariablePaperSize</code></a></p>
+
+
+<h2 class="title"><a name='ModelName'>ModelName</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+ModelName <i>"name"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+ModelName "Foo Laser Printer 2000"
+ModelName "Colorific 123"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>ModelName</code> directive sets the printer name for
+the <code>ModelName</code>, <code>NickName</code>, and
+<code>ShortNickName</code> attributes for the printer driver. The
+name is any string of letters, numbers, spaces, and the
+characters ".", "/", "-", and "+" and should not begin with the
+manufacturer name since the PPD compiler will add this
+automatically for you. The maximum length of the name string is
+31 characters to conform to the Adobe limits on the length of
+<code>ShortNickName</code>.</p>
+
+<h3>See Also</h3>
+
+<p><a href="#FileName"><code>FileName</code></a>,
+<a href='#Manufacturer'><code>Manufacturer</code></a>,
+<a href='#PCFileName'><code>PCFileName</code></a>,
+<a href='#Version'><code>Version</code></a></p>
+
+
+<h2 class="title"><a name='ModelNumber'>ModelNumber</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+ModelNumber <i>expression</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+ModelNumber 123
+ModelNumber ($PCL_PAPER_SIZE $PCL_PJL)
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>ModelNumber</code> directive sets the
+<code>cupsModelNumber</code> attribute for the printer driver, which
+is often used by the printer driver filter to tailor its output
+for the current device. The number is any integer or bitwise OR
+of integers and constants that is appropriate for the printer
+driver filters.<p>
+
+<p>A complete list of printer driver model number constants is
+available later in this appendix in the section titled, "<a
+href='#REF_MODEL_NUMBER'>Printer Driver ModelNumber
+Constants</a>".</p>
+
+<h3>See Also</h3>
+
+<p><a href='#DriverType'><code>DriverType</code></a>,
+<a href='#Filter'><code>Filter</code></a></p>
+
+
+<h2 class="title"><a name='Option'>Option</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Option <i>name type section order</i>
+Option <i>"name/text" type section order</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Option Punch Boolean AnySetup 10
+Option "fooFinish/Finishing Option" PickOne DocumentSetup 10
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Option</code> directive creates a new option in the
+current group, by default the <code>General</code> group. The name
+is any combination of letters, numbers, and the underscore and
+can be up to 40 characters in length.</p>
+
+<p>If provided, the text can be any string up to 80 characters
+in length. If no text is provided, the name is used.</p>
+
+<p>The type argument is one of the following keywords:</p>
+
+<ul>
+
+ <li><code>Boolean</code> - a true/false option</li>
+
+ <li><code>PickOne</code> - allows the user to pick one
+ choice from a list</li>
+
+ <li><code>PickMany</code> - allows the user to pick zero or
+ more choices from a list</li>
+
+</ul>
+
+<p>The section argument is one of the following keywords:</p>
+
+<ul>
+
+ <li><code>AnySetup</code> - The option can be placed in
+ either the DocumentSetup or PageSetup sections of the
+ PostScript document</li>
+
+ <li><code>DocumentSetup</code> - The option must be placed
+ in the DocumentSetup section of the PostScript document;
+ this does not allow the option to be overridden on
+ individual pages</li>
+
+ <li><code>ExitServer</code> - The option must be placed in a
+ separate initialization job prior to the document (not
+ used for raster printer drivers)</li>
+
+ <li><code>JCLSetup</code> - The option contains job control
+ language commands and must be sent prior to the document
+ using the <code>JCLBegin</code> and
+ <code>JCLToPSInterpreter</code> attributes (not used for
+ raster printer drivers)</li>
+
+ <li><code>PageSetup</code> - The option must be placed at the
+ beginning of each page in the PostScript document</li>
+
+ <li><code>Prolog</code> - The option must be placed in the
+ prolog section of the PostScript document; this is
+ typically used to add special comments for high-end
+ typesetters, but can also be used to add CUPS PostScript
+ job ticket comments.</li>
+
+</ul>
+
+<p>The order argument is a real number greater than or equal to
+0.0 and is used to sort the printer commands from many options
+before sending them to the printer or RIP filter.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Resolution'><code>Resolution</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><a name='PCFileName'>PCFileName</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+PCFileName <i>"filename.ppd"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+PCFileName "foljt2k1.ppd"
+PCFileName "deskjet.ppd"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>PCFileName</code> attribute specifies the name of the
+PPD file for the current driver. The filename argument must
+conform to the Adobe PPD file specification and can be no more
+than 8 filename characters plus the extension ".ppd".</p>
+
+<h3>See Also</h3>
+
+<p><a href="#FileName"><code>FileName</code></a>,
+<a href='#Manufacturer'><code>Manufacturer</code></a>,
+<a href='#ModelName'><code>ModelName</code></a>,
+<a href='#Version'><code>Version</code></a></p>
+
+
+<h2 class="title"><span class="info">Deprecated</span><a name='Resolution'>Resolution</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Resolution <i>colorspace bits-per-color row-count row-feed row-step name</i>
+Resolution <i>colorspace bits-per-color row-count row-feed row-step "name/text"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Resolution - 8 0 0 0 300dpi
+Resolution k 8 0 0 0 "600x300dpi/600 DPI Grayscale"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Resolution</code> directive creates a new
+<code>Resolution</code> option choice which sets the
+<code>HWResolution</code>, <code>cupsBitsPerColor</code>,
+<code>cupsRowCount</code>, <code>cupsRowFeed</code>,
+<code>cupsRowStep</code>, and optionally the <code>cupsColorSpace</code>
+page device dictionary attributes. The colorspace argument
+specifies a colorspace to use for the specified resolution and
+can be the hyphen (<code>-</code>) character to make no change to
+the selected color model or any keyword listed in the section
+titled, "<a href='#REF_COLOR_SPACE'>Colorspace Keywords</a>", to
+force the named colorspace.</p>
+
+<p>The bits-per-color argument specifies the number of bits per
+color to generate when RIP'ing a job. The values 1, 2, 4, and 8
+are currently supported by CUPS.</p>
+
+<p>The row-count, row-feed, and row-step argument specify the
+driver-dependent values for the <code>cupsRowCount</code>,
+<code>cupsRowFeed</code>, and <code>cupsRowStep</code> attributes,
+respectively. Most drivers leave these attributes set to 0, but
+any number from 0 to 2<sup>32</sup>-1 is allowed.</p>
+
+<p>The name argument must conform to the resolution naming
+conventions in the Adobe PPD file specification, either
+<code>HHHdpi</code> for symmetric resolutions or <code>HHHxVVVdpi</code>
+for asymmetric resolutions. The <code>HHH</code> and <code>VVV</code> in
+the examples represent the horizontal and vertical resolutions
+which must be positive integer values.</p>
+
+<p>If provided, the text can be any string up to 80 characters
+in length. If no text is provided, the name is used.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#UIConstraints'><code>UIConstraints</code></a></p>
+
+
+<h2 class="title"><span class="info">Deprecated</span><a name='SimpleColorProfile'>SimpleColorProfile</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+SimpleColorProfile <i>resolution/mediatype density
+ yellow-density red-density gamma
+ red-adjust green-adjust blue-adjust</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+SimpleColorProfile -/- 100 100 200 1.0 0 0 0
+
+SimpleColorProfile 360dpi/- 100 95 150 1.2 5 10 15
+
+SimpleColorProfile 720dpi/Glossy 100 90 120 1.5 -5 5 10
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>SimpleColorProfile</code> directive creates a
+matrix-based <a href="#ColorProfile"><code>ColorProfile</code></a>
+using values chosen with the <code>cupsprofile(1)</code> utility.
+The resolution and mediatype arguments specify the
+<code>Resolution</code> and <code>MediaType</code> choices which use the
+profile; the hyphen (<code>-</code>) is used to specify that any
+resolution or mediatype can be used with the profile.</p>
+
+<p>The density argument specifies the linear density correction
+to apply to the color values (P = d * 0.01 * p<sup>g</sup>) and
+is an integer greater than 0 and less than or equal to 100. A
+value 100 of disables density correction while lower values
+produce proportionately lighter output. The density value
+adjusts all color channels equally in all color modes.</p>
+
+<p>The yellow-density argument specifies the density of the
+yellow channel when printing in grayscale or RGB mode and is an
+integer greater than 0 and less then or equal to 100. A value of
+100 disables yellow density correction while lower values
+produce proportionately lighter output.</p>
+
+<P>The red-density argument specifies the two-color density
+limit (e.g. C + M, C + Y, M + Y) when printing in grayscale or
+RGB mode and is an integer greater than 0 and less then or equal
+to 200. A value of 200 disables two-color density correction
+while lower values produce proportionately lighter output.</p>
+
+<p>The gamma argument specifies the gamma correction to apply to
+the color values (P = p<sup>g</sup>) and is a real number
+greater than 0. Values larger than 1 cause a general lightening
+of the print while values smaller than 1 cause a general
+darkening of the print. A value of 1 disables gamma
+correction.</p>
+
+<p>The red-adjust, green-adjust, blue-adjust arguments specify
+the percentage of color to add or remove. Positive red-adjust
+values add magenta and negative values add yellow. Positive
+green-adjust values add cyan and negative values add yellow.
+Positive blue-adjust values add cyan and negative values add
+magenta. Values of 0 disable color adjustments.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#ColorProfile'><code>ColorProfile</code></a></p>
+
+
+<h2 class="title"><a name='Throughput'>Throughput</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Throughput <i>pages-per-minute</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Throughput 1
+Throughput 10
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Througput</code> directive sets the <code>Troughput</code>
+attribute for the current printer driver. The pages-per-minute
+argument is a positive integer representing the peak number of
+pages per minute that the printer is capable of producing. Use a
+value of 1 for printers that produce less than 1 page per
+minute.</p>
+
+
+<h2 class="title"><a name='UIConstraints'>UIConstraints</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+UIConstraints <i>"*Option1 *Option2"</i>
+UIConstraints <i>"*Option1 Choice1 *Option2"</i>
+UIConstraints <i>"*Option1 *Option2 Choice2"</i>
+UIConstraints <i>"*Option1 Choice1 *Option2 Choice2"</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+UIConstraints "*Finishing *MediaType"
+UIConstraints "*Option1 False *Duplex"
+UIConstraints "*Duplex *MediaType Transparency"
+UIConstraints "*Resolution 600dpi *ColorModel RGB"
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>UIConstraints</code> directive adds a constraint
+between two options. Constraints inform the application when a
+user has chosen incompatible options. Each option name is
+preceded by the asterisk (<code>*</code>). If no choice is given for
+an option, then all choices <i>except</i> <code>False</code> and
+<code>None</code> will conflict with the other option and choice(s).
+Since the PPD compiler automatically adds reciprocal constraints
+(option A conflicts with option B, so therefore option B
+conflicts with option A), you need only specify the constraint
+once.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Choice'><code>Choice</code></a>,
+<a href='#ColorModel'><code>ColorModel</code></a>,
+<a href='#Cutter'><code>Cutter</code></a>,
+<a href='#Darkness'><code>Darkness</code></a>,
+<a href='#Duplex'><code>Duplex</code></a>,
+<a href='#Finishing'><code>Finishing</code></a>,
+<a href='#Group'><code>Group</code></a>,
+<a href='#InputSlot'><code>InputSlot</code></a>,
+<a href='#Installable'><code>Installable</code></a>,
+<a href='#MediaType'><code>MediaType</code></a>,
+<a href='#Option'><code>Option</code></a>,
+<a href='#Resolution'><code>Resolution</code></a></p>
+
+
+<h2 class="title"><a name='VariablePaperSize'>VariablePaperSize</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+VariablePaperSize <i>boolean-value</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+VariablePaperSize yes
+VariablePaperSize no
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>VariablePaperSize</code> directive specifies whether
+the current printer supports variable (custom) page sizes. When
+<code>yes</code> is specified, the PPD compiler will include the
+standard PPD attributes required to support custom page
+sizes.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#MaxSize'><code>MaxSize</code></a>,
+<a href='#MinSize'><code>MinSize</code></a></p>
+
+
+<h2 class="title"><a name='Version'>Version</a></h2>
+
+<h3>Syntax</h3>
+
+<pre>
+Version <i>number</i>
+</pre>
+
+<h3>Examples</h3>
+
+<pre>
+Version 1.0
+Version 3.7
+</pre>
+
+<h3>Description</h3>
+
+<p>The <code>Version</code> directive sets the <code>FileVersion</code>
+attribute in the PPD file and is also used for the
+<code>NickName</code> attribute. The number argument is a positive
+real number.</p>
+
+<h3>See Also</h3>
+
+<p><a href='#Manufacturer'><code>Manufacturer</code></a>,
+<a href='#ModelName'><code>ModelName</code></a>,
+<a href='#PCFileName'><code>PCFileName</code></a></p>
+
+
+<h2 class="title"><a name='REF_INCLUDE'>Standard Include Files</h2>
+
+<p><a href='#TABLEB-1'>Table B-1</a> shows the standard include
+files which are provided with the DDK.</p>
+
+<center><table border='1' cellpadding='5' cellspacing='0' width='80%'>
+<caption align='bottom'><a name='TABLEB-1'><i>Table B-1,
+Standard Include Files</i></a></caption>
+<tr bgcolor='#cccccc'>
+ <th>Include File</th>
+ <th>Description</th>
+</tr>
+<tr>
+ <td valign='top'><code><font.defs></code></td>
+ <td align='justify' valign='top'>Defines all of the
+ standard fonts which are included with ESP Ghostscript
+ and the Apple PDF RIP.</td>
+</tr>
+<tr>
+ <td valign='top'><code><epson.h></code></td>
+ <td align='justify' valign='top'>Defines all of the
+ CUPS ESC/P sample driver constants.</td>
+</tr>
+<tr>
+ <td valign='top'><code><escp.h></code></td>
+ <td align='justify' valign='top'>Defines all of the
+ DDK ESC/P driver constants.</td>
+</tr>
+<tr>
+ <td valign='top'><code><hp.h></code></td>
+ <td align='justify' valign='top'>Defines all of the
+ CUPS HP-PCL sample driver constants.</td>
+</tr>
+<tr>
+ <td valign='top'><code><label.h></code></td>
+ <td align='justify' valign='top'>Defines all of the
+ CUPS label sample driver constants.</td>
+</tr>
+<tr>
+ <td valign='top'><code><media.defs></code></td>
+ <td align='justify' valign='top'>Defines all of the
+ standard media sizes listed in Appendix B of the Adobe
+ PostScript Printer Description File Format
+ Specification.</td>
+</tr>
+<tr>
+ <td valign='top'><code><pcl.h></code></td>
+ <td align='justify' valign='top'>Defines all of the
+ DDK HP-PCL driver constants.</td>
+</tr>
+<tr>
+ <td valign='top'><code><raster.defs></code></td>
+ <td align='justify' valign='top'>Defines all of the CUPS
+ raster format constants.</td>
+</tr>
+</table></center>
+
+<h2 class="title"><a name='REF_MODEL_NUMBER'>Printer Driver ModelNumber Constants</a></h2>
+
+<p>The CUPS DDK and sample drivers use the
+<code>cupsModelNumber</code> attribute in the PPD file to tailor
+their output to the printer. The following sections describe the
+constants for each driver.</p>
+
+<h3><a name='REF_MODEL_EPSON'>The CUPS ESC/P Sample Driver (epson)</a></h3>
+
+<p>The <code>epson</code> driver supports Epson and Okidata
+dot-matrix, Epson Stylus Color, and Epson Stylus Photo printers.
+<a href='#TABLEB-2'>Table B-2</a> lists the constants for the <a
+href='#ModelNumber'><code>ModelNumber</code></a> directive.
+<code>ModelNumber</code> values should be inserted by referencing
+only one of these constants.</p>
+
+<!-- NEED 20 -->
+<center><table border='1' cellpadding='5' cellspacing='0' width='80%'>
+<caption align='bottom'><a name='TABLEB-2'><i>Table B-2, <code>epson</code> driver
+constants</i></a></caption>
+<tr bgcolor='#cccccc'>
+ <th>Constant</th>
+ <th>Description</th>
+</tr>
+<tr>
+ <td valign='top'><code>EPSON_9PIN</code></td>
+ <td align='justify' valign='top'>Epson and Okidata 9-pin
+ dot-matrix printers</td>
+</tr>
+<tr>
+ <td valign='top'><code>EPSON_24PIN</code></td>
+ <td align='justify' valign='top'>Epson and Okidata 24-pin
+ dot-matrix printers</td>
+</tr>
+<tr>
+ <td valign='top'><code>EPSON_COLOR</code></td>
+ <td align='justify' valign='top'>Older Epson Stylus Color
+ printers that use the <code>ESC .</code> graphics command</td>
+</tr>
+<tr>
+ <td valign='top'><code>EPSON_PHOTO</code></td>
+ <td align='justify' valign='top'>Older Epson Stylus Photo
+ printers that use the <code>ESC .</code> graphics command</td>
+</tr>
+<tr>
+ <td valign='top'><code>EPSON_ICOLOR</code></td>
+ <td align='justify' valign='top'>Newer Epson Stylus Color
+ printers that use the <code>ESC i</code> graphics command</td>
+</tr>
+<tr>
+ <td valign='top'><code>EPSON_IPHOTO</code></td>
+ <td align='justify' valign='top'>Newer Epson Stylus Photo
+ printers that use the <code>ESC i</code> graphics command</td>
+</tr>
+</table></center>
+
+<h3><a name='REF_MODEL_HP'>The CUPS HP-PCL Sample Driver (hp)</a></h3>
+
+<p>The <code>hp</code> driver supports HP LaserJet and DeskJet
+printers. <a href='#TABLEB-3'>Table B-3</a> lists the constants
+for the <a href='#ModelNumber'><code>ModelNumber</code></a>
+directive. <code>ModelNumber</code> values should be inserted by
+referencing only one of these constants.</p>
+
+<center><table border='1' cellpadding='5' cellspacing='0' width='80%'>
+<caption align='bottom'><a name='TABLEB-3'><i>Table B-3, <code>hp</code> driver
+constants</i></a></caption>
+<tr bgcolor='#cccccc'>
+ <th>Constant</th>
+ <th>Description</th>
+</tr>
+<tr>
+ <td valign='top'><code>HP_LASERJET</code></td>
+ <td align='justify' valign='top'>HP LaserJet printers supporting
+ PCL 3, 4, or 5</td>
+</tr>
+<tr>
+ <td valign='top'><code>HP_DESKJET</code></td>
+ <td align='justify' valign='top'>HP DeskJet printers
+ supporting PCL 3 and using the simple color graphics
+ command (<code>ESC * r # U</code>)</td>
+</tr>
+<tr>
+ <td valign='top'><code>HP_DESKJET2</code></td>
+ <td align='justify' valign='top'>HP DeskJet printers
+ supporting PCL3GUI and using the configure raster graphics
+ command (<code>ESC * g # W</code>)</td>
+</tr>
+</table></center>
+
+<h3><a name='REF_MODEL_LABEL'>The CUPS Label Sample Driver (label)</a></h3>
+
+<p>The <code>label</code> driver supports the Dymo Labelwriter, Zebra CPCL, Zebra EPL, and Zebra ZPL, and Intellitech PCL label printers. <a href='#TABLEB-4'>Table B-4</a>
+lists the constants for the <a
+href='#ModelNumber'><code>ModelNumber</code></a> directive.
+<code>ModelNumber</code> values should be inserted by referencing
+only one of these constants.</p>
+
+<center><table border='1' cellpadding='5' cellspacing='0' width='80%'>
+<caption align='bottom'><a name='TABLEB-4'><i>Table B-4, <code>label</code> driver
+constants</i></a></caption>
+<tr bgcolor='#cccccc'>
+ <th>Constant</th>
+ <th>Description</th>
+</tr>
+<tr>
+ <td valign='top'><code>DYMO_3x0</code></td>
+ <td align='justify' valign='top'>Format output for the
+ Dymo Labelwriter 300, 330, or 330 Turbo.</td>
+</tr>
+<tr>
+ <td valign='top'><code>INTELLITECH_PCL</code></td>
+ <td align='justify' valign='top'>Format output for the Intellitech PCL printers.</td>
+</tr>
+<tr>
+ <td valign='top'><code>ZEBRA_CPCL</code></td>
+ <td align='justify' valign='top'>Format output for the Zebra CPCL printers.</td>
+</tr>
+<tr>
+ <td valign='top'><code>ZEBRA_EPL_LINE</code></td>
+ <td align='justify' valign='top'>Format output for the Zebra EPL line mode (EPL 1) printers.</td>
+</tr>
+<tr>
+ <td valign='top'><code>ZEBRA_EPL_PAGE</code></td>
+ <td align='justify' valign='top'>Format output for the Zebra EPL page mode (EPL 2) printers.</td>
+</tr>
+<tr>
+ <td valign='top'><code>ZEBRA_ZPL</code></td>
+ <td align='justify' valign='top'>Format output for the Zebra ZPL printers.</td>
+</tr>
+</table></center>
+
+<h3><a name='REF_MODEL_ESCP'>The DDK ESC/P Driver (escp)</a></h3>
+
+<p>The <code>escp</code> driver supports all Epson inkjet printers.
+<a href='#TABLEB-6'>Table B-6</a> lists the constants for the <a
+href='#ModelNumber'><code>ModelNumber</code></a> directive.
+<code>ModelNumber</code> values should be specified as the bitwise
+OR of one or more of these constants.</p>
+
+<center><table border='1' cellpadding='5' cellspacing='0' width='80%'>
+<caption align='bottom'><a name='TABLEB-6'><i>Table B-6, <code>escp</code> driver
+constants</i></a></caption>
+<tr bgcolor='#cccccc'>
+ <th>Constant</th>
+ <th>Description</th>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_MICROWEAVE</code></td>
+ <td align='justify' valign='top'>Use microweave command?</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_STAGGER</code></td>
+ <td align='justify' valign='top'>Are color jets staggered?</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_ESCK</code></td>
+ <td align='justify' valign='top'>Use print mode command?</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_EXT_UNITS</code></td>
+ <td align='justify' valign='top'>Use extended unit commands?</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_EXT_MARGINS</code></td>
+ <td align='justify' valign='top'>Use extended margin command?</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_USB</code></td>
+ <td align='justify' valign='top'>Send USB packet mode escape</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_PAGE_SIZE</code></td>
+ <td align='justify' valign='top'>Use page size command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_RASTER_ESCI</code></td>
+ <td align='justify' valign='top'>Use <code>ESC i</code> graphics command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE</code></td>
+ <td align='justify' valign='top'>Use remote mode commands</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_AC</code></td>
+ <td align='justify' valign='top'>Use auto-cutter command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_CO</code></td>
+ <td align='justify' valign='top'>Use cutter-operation command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_EX</code></td>
+ <td align='justify' valign='top'>Use media-position command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_MS</code></td>
+ <td align='justify' valign='top'>Use media-size command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_MT</code></td>
+ <td align='justify' valign='top'>Use media-type command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_PC</code></td>
+ <td align='justify' valign='top'>Use paper-check command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_PH</code></td>
+ <td align='justify' valign='top'>Use paper-thickness command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_PP</code></td>
+ <td align='justify' valign='top'>Use paper-path command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_SN0</code></td>
+ <td align='justify' valign='top'>Use feed-sequence-0 command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_SN1</code></td>
+ <td align='justify' valign='top'>Use platten-gap command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_SN2</code></td>
+ <td align='justify' valign='top'>Use feed-sequence-2 command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_SN6</code></td>
+ <td align='justify' valign='top'>Use eject-delay command</td>
+</tr>
+<tr>
+ <td valign='top'><code>ESCP_REMOTE_FP</code></td>
+ <td align='justify' valign='top'>Use print-position command</td>
+</tr>
+</table></center>
+
+<h3><a name='REF_MODEL_PCL'>The DDK HP-PCL Driver (pcl)</a></h3>
+
+<p>The <code>pcl</code> driver supports all HP LaserJet, DeskJet,
+and DesignJet printers. <a href='#TABLEB-5'>Table B-5</a> lists
+the constants for the <a
+href='#ModelNumber'><code>ModelNumber</code></a> directive.
+<code>ModelNumber</code> values should be specified as the bitwise
+OR of one or more of these constants.</p>
+
+<center><table border='1' cellpadding='5' cellspacing='0' width='80%'>
+<caption align='bottom'><a name='TABLEB-5'><i>Table B-5, <code>pcl</code> driver
+constants</i></a></caption>
+<tr bgcolor='#cccccc'>
+ <th>Constant</th>
+ <th>Description</th>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_PAPER_SIZE</code></td>
+ <td align='justify' valign='top'>Use paper size command (<code>ESC & l # A</code>)</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_INKJET</code></td>
+ <td align='justify' valign='top'>Use inkjet commands</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_RASTER_END_COLOR</code></td>
+ <td align='justify' valign='top'>Use new end-raster command (<code>ESC * r C</code>)</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_RASTER_CID</code></td>
+ <td align='justify' valign='top'>Use configure-image-data command (<code>ESC * v # W</code>)</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_RASTER_CRD</code></td>
+ <td align='justify' valign='top'>Use configure-raster-data command (<code>ESC * g # W</code>)</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_RASTER_SIMPLE</code></td>
+ <td align='justify' valign='top'>Use simple-raster-color command (<code>ESC * r # U</code>)</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_RASTER_RGB24</code></td>
+ <td align='justify' valign='top'>Use 24-bit RGB mode</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_PJL</code></td>
+ <td align='justify' valign='top'>Use PJL commands</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_PJL_PAPERWIDTH</code></td>
+ <td align='justify' valign='top'>Use PJL PAPERWIDTH/LENGTH commands</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_PJL_HPGL2</code></td>
+ <td align='justify' valign='top'>Use PJL ENTER HPGL2 command</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_PJL_PCL3GUI</code></td>
+ <td align='justify' valign='top'>Use PJL ENTER PCL3GUI command</td>
+</tr>
+<tr>
+ <td valign='top'><code>PCL_PJL_RESOLUTION</code></td>
+ <td align='justify' valign='top'>Use PJL SET RESOLUTION command</td>
+</tr>
+</table></center>
+
+<H2><A NAME="REF_COLOR">Color Keywords</A></H2>
+
+<p>The PPD compiler defines two types of color keywords:
+colorspace and color order. The following sections list the
+supported keywords for each type.</p>
+
+<H3><A NAME="REF_COLOR_SPACE">Colorspace Keywords</A></H3>
+
+<P>The following colorspace keywords are recognized:</P>
+
+<UL>
+
+ <LI><TT>cielab</TT> - CIE Lab <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>ciexyz</TT> - CIE XYZ <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>cmy</TT> - Cyan, magenta, yellow</LI>
+
+ <LI><TT>cmyk</TT> - Cyan, magenta, yellow, black</LI>
+
+ <LI><TT>gmck</TT> - Gold, magenta, yellow, black <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>gmcs</TT> - Gold, magenta, yellow, silver <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>gold</TT> - Gold foil <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icc1</TT> - ICC-based, 1 color <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icc2</TT> - ICC-based, 2 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icc3</TT> - ICC-based, 3 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icc4</TT> - ICC-based, 4 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icc5</TT> - ICC-based, 5 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icc6</TT> - ICC-based, 6 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icc7</TT> - ICC-based, 7 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icc8</TT> - ICC-based, 8 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icc9</TT> - ICC-based, 9 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icca</TT> - ICC-based, 10 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>iccb</TT> - ICC-based, 11 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>iccc</TT> - ICC-based, 12 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>iccd</TT> - ICC-based, 13 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>icce</TT> - ICC-based, 14 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>iccf</TT> - ICC-based, 15 colors <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>k</TT> - Black</LI>
+
+ <LI><TT>kcmy</TT> - Black, cyan, magenta, yellow <A HREF="#REF_COLOR_APPLE">*</A></LI>
+
+ <LI><TT>kcmycm</TT> - Black, cyan, magenta, yellow, light-cyan, light-magenta <A HREF="#REF_COLOR_APPLE">*</A></LI>
+
+ <LI><TT>rgb</TT> - Red, green, blue</LI>
+
+ <LI><TT>rgba</TT> - Red, green, blue, alpha</LI>
+
+ <LI><TT>rgbw</TT> - Red, green, blue, luminance <A HREF="#REF_COLOR_APPLE">*</A></LI>
+
+ <LI><TT>silver</TT> - Silver foil <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>w</TT> - Luminance</LI>
+
+ <LI><TT>white</TT> - White ink (as black) <A HREF="#REF_COLOR_APPLE2">**</A></LI>
+
+ <LI><TT>ymc</TT> - Yellow, magenta, cyan <A HREF="#REF_COLOR_APPLE">*</A></LI>
+
+ <LI><TT>ymck</TT> - Yellow, magenta, cyan, black <A HREF="#REF_COLOR_APPLE">*</A>
+
+ <BR>
+
+ <BR><A NAME="REF_COLOR_APPLE">*</A> = This colorspace is not supported on Mac OS X prior to 10.4.
+ <BR><A NAME="REF_COLOR_APPLE2">**</A> = This colorspace is not supported on Mac OS X.</LI>
+
+</UL>
+
+<H3><A NAME="REF_COLOR_ORDER">Color Order Keywords</A></H3>
+
+<P>The following color order keywords are recognized:</P>
+
+<UL>
+
+ <LI><TT>chunked</TT> or <TT>chunky</TT> - Color values
+ are passed together on a line as RGB RGB RGB RGB</LI>
+
+ <LI><TT>banded</TT> - Color values are passed separately
+ on a line as RRRR GGGG BBBB <A
+ HREF="#REF_COLOR_APPLE2">*</A></LI>
+
+ <LI><TT>planar</TT> - Color values are passed separately
+ on a page as RRRR RRRR RRRR ... GGGG GGGG GGGG ... BBBB
+ BBBB BBBB <A HREF="#REF_COLOR_APPLE2">*</A>
+
+ <BR>
+
+ <BR><A NAME="REF_COLOR_APPLE2">*</A> = This color order
+ is not supported by the current Apple RIP filters and
+ should not be used when developing printer drivers for
+ MacOS X 10.2 or 10.3.</LI>
+
+</UL>
+
+</BODY>
+</HTML>
ppdcSource::ppdcSource(const char *f) // I - File to read
{
- filename = new ppdcString(f);
- base_fonts = new ppdcArray();
- drivers = new ppdcArray();
- po_files = new ppdcArray();
- sizes = new ppdcArray();
- vars = new ppdcArray();
+ filename = new ppdcString(f);
+ base_fonts = new ppdcArray();
+ drivers = new ppdcArray();
+ po_files = new ppdcArray();
+ sizes = new ppdcArray();
+ vars = new ppdcArray();
+ cond_state = PPDC_COND_NORMAL;
+ cond_current = cond_stack;
+ cond_stack[0] = PPDC_COND_NORMAL;
if (f)
read_file(f);
//
ppdcAttr * // O - Attribute
-ppdcSource::get_attr(ppdcFile *fp) // I - File to read
+ppdcSource::get_attr(ppdcFile *fp, // I - File to read
+ bool loc) // I - Localize this attribute?
{
char name[1024], // Name string
selector[1024], // Selector string
// Attribute name selector value
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected name after Attribute on line %d of %s!\n",
- fp->line, fp->filename);
+ fprintf(stderr, "ppdc: Expected name after %sAttribute on line %d of %s!\n",
+ loc ? "Loc" : "", fp->line, fp->filename);
return (0);
}
if (!get_token(fp, selector, sizeof(selector)))
{
- fprintf(stderr, "ppdc: Expected selector after Attribute on line %d of %s!\n",
- fp->line, fp->filename);
+ fprintf(stderr,
+ "ppdc: Expected selector after %sAttribute on line %d of %s!\n",
+ loc ? "Loc" : "", fp->line, fp->filename);
return (0);
}
if (!get_token(fp, value, sizeof(value)))
{
- fprintf(stderr, "ppdc: Expected value after Attribute on line %d of %s!\n",
- fp->line, fp->filename);
+ fprintf(stderr,
+ "ppdc: Expected value after %sAttribute on line %d of %s!\n",
+ loc ? "Loc" : "", fp->line, fp->filename);
return (0);
}
// printf("name=\"%s\", selector=\"%s\", value=\"%s\"\n", name, selector, value);
- return (new ppdcAttr(name, selector, text, value));
+ return (new ppdcAttr(name, selector, text, value, loc));
}
return;
}
+ if (cond_state)
+ return;
+
if (!strcasecmp(temp, "none") || !strcasecmp(temp, "false") ||
!strcasecmp(temp, "no") || !strcasecmp(temp, "off"))
{
{
// Nope, add a new one...
g = new ppdcGroup(name, text);
- d->add_group(g);
}
return (g);
// 'ppdcSource::get_integer()' - Get an integer value from a string.
//
+#define PPDC_XX -1 // Bad
+#define PPDC_EQ 0 // ==
+#define PPDC_NE 1 // !=
+#define PPDC_LT 2 // <
+#define PPDC_LE 3 // <=
+#define PPDC_GT 4 // >
+#define PPDC_GE 5 // >=
+
int // O - Integer value
ppdcSource::get_integer(const char *v) // I - Value string
{
- long val; // Value
- long temp; // Temporary value
- char *newv; // New value string pointer
+ long val; // Value
+ long temp, // Temporary value
+ temp2; // Second temporary value
+ char *newv, // New value string pointer
+ ch; // Temporary character
+ ppdcVariable *var; // #define variable
+ int compop; // Comparison operator
// Parse the value string...
if (!v)
return (-1);
- if (isdigit(*v) || *v == '-' || *v == '+')
+ if (isdigit(*v & 255) || *v == '-' || *v == '+')
{
// Return a simple integer value
val = strtol(v, (char **)&v, 0);
}
else if (*v == '(')
{
- // Return the bitwise OR of each integer in parenthesis...
+ // Evaluate and expression in any of the following formats:
+ //
+ // (number number ... number) Bitwise OR of all numbers
+ // (NAME == value) 1 if equal, 0 otherwise
+ // (NAME != value) 1 if not equal, 0 otherwise
+ // (NAME < value) 1 if less than, 0 otherwise
+ // (NAME <= value) 1 if less than or equal, 0 otherwise
+ // (NAME > value) 1 if greater than, 0 otherwise
+ // (NAME >= value) 1 if greater than or equal, 0 otherwise
+
v ++;
val = 0;
while (*v && *v != ')')
{
- temp = strtol(v, &newv, 0);
+ // Skip leading whitespace...
+ while (*v && isspace(*v & 255));
+ v ++;
+
+ if (!*v || *v == ')')
+ break;
+
+ if (isdigit(*v & 255) || *v == '-' || *v == '+')
+ {
+ // Bitwise OR a number...
+ temp = strtol(v, &newv, 0);
+
+ if (!*newv || newv == v || !(isspace(*newv) || *newv == ')') ||
+ temp == LONG_MIN)
+ return (-1);
+ }
+ else
+ {
+ // NAME logicop value
+ for (newv = (char *)v + 1;
+ *newv && (isalnum(*newv & 255) || *newv == '_');
+ newv ++);
+
+ ch = *newv;
+ *newv = '\0';
+
+ if ((var = find_variable(v)) != NULL)
+ {
+ if (!var->value || !var->value->value || !var->value->value[0])
+ temp = 0;
+ else if (isdigit(var->value->value[0] & 255) ||
+ var->value->value[0] == '-' ||
+ var->value->value[0] == '+')
+ temp = strtol(var->value->value, NULL, 0);
+ else
+ temp = 1;
+ }
+ else
+ temp = 0;
+
+ *newv = ch;
+ while (isspace(*newv & 255))
+ newv ++;
+
+ if (strncmp(newv, "==", 2))
+ {
+ compop = PPDC_EQ;
+ newv += 2;
+ }
+ else if (strncmp(newv, "!=", 2))
+ {
+ compop = PPDC_NE;
+ newv += 2;
+ }
+ else if (strncmp(newv, "<=", 2))
+ {
+ compop = PPDC_LE;
+ newv += 2;
+ }
+ else if (*newv == '<')
+ {
+ compop = PPDC_LT;
+ newv ++;
+ }
+ else if (strncmp(newv, ">=", 2))
+ {
+ compop = PPDC_GE;
+ newv += 2;
+ }
+ else if (*newv == '>')
+ {
+ compop = PPDC_GT;
+ newv ++;
+ }
+ else
+ compop = PPDC_XX;
+
+ if (compop != PPDC_XX)
+ {
+ while (isspace(*newv & 255))
+ newv ++;
+
+ if (*newv == ')' || !*newv)
+ return (-1);
+
+ if (isdigit(*v & 255) || *v == '-' || *v == '+')
+ {
+ // Get the second number...
+ temp2 = strtol(newv, &newv, 0);
+ if (!*newv || newv == v || !(isspace(*newv) || *newv == ')') ||
+ temp == LONG_MIN)
+ return (-1);
+ }
+ else
+ {
+ // Lookup the second name...
+ for (v = newv, newv ++;
+ *newv && (isalnum(*newv & 255) || *newv == '_');
+ newv ++);
- if (!*newv || newv == v || !(isspace(*newv) || *newv == ')') ||
- temp == LONG_MIN)
- return (-1);
+ ch = *newv;
+ *newv = '\0';
+
+ if ((var = find_variable(v)) != NULL)
+ {
+ if (!var->value || !var->value->value || !var->value->value[0])
+ temp2 = 0;
+ else if (isdigit(var->value->value[0] & 255) ||
+ var->value->value[0] == '-' ||
+ var->value->value[0] == '+')
+ temp2 = strtol(var->value->value, NULL, 0);
+ else
+ temp2 = 1;
+ }
+ else
+ temp2 = 0;
+
+ *newv = ch;
+ }
+
+ // Do the comparison...
+ switch (compop)
+ {
+ case PPDC_EQ :
+ temp = temp == temp2;
+ break;
+ case PPDC_NE :
+ temp = temp != temp2;
+ break;
+ case PPDC_LT :
+ temp = temp < temp2;
+ break;
+ case PPDC_LE :
+ temp = temp <= temp2;
+ break;
+ case PPDC_GT :
+ temp = temp > temp2;
+ break;
+ case PPDC_GE :
+ temp = temp >= temp2;
+ break;
+ }
+ }
+ }
val |= temp;
v = newv;
}
- if (*v == ')')
+ if (*v == ')' && !v[1])
return ((int)val);
else
return (-1);
}
+ else if ((var = find_variable(v)) != NULL)
+ {
+ // NAME by itself returns 1 if the #define variable is not blank and
+ // not "0"...
+ return (var->value->value && var->value->value[0] &&
+ strcmp(var->value->value, "0"));
+ }
else
+ {
+ // Anything else is an error...
return (-1);
+ }
}
{
// Nope, add a new one...
o = new ppdcOption(ot, name, text, section, order);
- g->add_option(o);
}
else if (o->type != ot)
{
// printf("o=%p, o->type=%d, o->name=%s, ot=%d, name=%s\n",
// o, o->type, o->name->value, ot, name);
- fprintf(stderr, "ppdc: Option already defined with a different type on line %d of %s!\n",
+ fprintf(stderr,
+ "ppdc: Option redefined with a different type on line %d of %s!\n",
fp->line, fp->filename);
return (NULL);
}
ppdcFile *fp = new ppdcFile(f);
scan_file(fp);
delete fp;
+
+ if (cond_current != cond_stack)
+ fprintf(stderr, "ppdc: Missing #endif at end of \"%s\"!\n", f);
}
// Loop until EOF or }
o = 0;
g = general;
+
while (get_token(fp, temp, sizeof(temp)))
{
if (temp[0] == '*')
// Open a new child...
scan_file(fp, d);
}
+ else if (!strcasecmp(temp, "#if"))
+ {
+ if ((cond_current - cond_stack) >= 100)
+ {
+ fprintf(stderr, "ppdc: Too many nested #if's on line %d of %s!\n",
+ fp->line, fp->filename);
+ break;
+ }
+
+ cond_current ++;
+ if (get_integer(fp))
+ *cond_current = PPDC_COND_SATISFIED;
+ else
+ {
+ *cond_current = PPDC_COND_SKIP;
+ cond_state |= PPDC_COND_SKIP;
+ }
+ }
+ else if (!strcasecmp(temp, "#elif"))
+ {
+ if (cond_current == cond_stack)
+ {
+ fprintf(stderr, "ppdc: Missing #if on line %d of %s!\n", fp->line,
+ fp->filename);
+ break;
+ }
+
+ if (*cond_current & PPDC_COND_SATISFIED)
+ {
+ get_integer(fp);
+ *cond_current |= PPDC_COND_SKIP;
+ }
+ else if (get_integer(fp))
+ {
+ *cond_current |= PPDC_COND_SATISFIED;
+ *cond_current &= ~PPDC_COND_SKIP;
+ }
+ else
+ *cond_current |= PPDC_COND_SKIP;
+
+ // Update the current state
+ int *cond_temp = cond_current; // Temporary stack pointer
+
+ cond_state = PPDC_COND_NORMAL;
+ while (cond_temp > cond_stack)
+ if (*cond_temp & PPDC_COND_SKIP)
+ {
+ cond_state = PPDC_COND_SKIP;
+ break;
+ }
+ else
+ cond_temp --;
+ }
+ else if (!strcasecmp(temp, "#else"))
+ {
+ if (cond_current == cond_stack)
+ {
+ fprintf(stderr, "ppdc: Missing #if on line %d of %s!\n", fp->line,
+ fp->filename);
+ break;
+ }
+
+ if (*cond_current & PPDC_COND_SATISFIED)
+ *cond_current |= PPDC_COND_SKIP;
+ else
+ {
+ *cond_current |= PPDC_COND_SATISFIED;
+ *cond_current &= ~PPDC_COND_SKIP;
+ }
+
+ // Update the current state
+ int *cond_temp = cond_current; // Temporary stack pointer
+
+ cond_state = PPDC_COND_NORMAL;
+ while (cond_temp > cond_stack)
+ if (*cond_temp & PPDC_COND_SKIP)
+ {
+ cond_state = PPDC_COND_SKIP;
+ break;
+ }
+ else
+ cond_temp --;
+ }
+ else if (!strcasecmp(temp, "#endif"))
+ {
+ if (cond_current == cond_stack)
+ {
+ fprintf(stderr, "ppdc: Missing #if on line %d of %s!\n", fp->line,
+ fp->filename);
+ break;
+ }
+
+ cond_current --;
+
+ // Update the current state
+ int *cond_temp = cond_current; // Temporary stack pointer
+
+ cond_state = PPDC_COND_NORMAL;
+ while (cond_temp > cond_stack)
+ if (*cond_temp & PPDC_COND_SKIP)
+ {
+ cond_state = PPDC_COND_SKIP;
+ break;
+ }
+ else
+ cond_temp --;
+ }
else if (!strcasecmp(temp, "#define"))
{
// Get the variable...
inctemp[1024], // Initial filename
incname[1024]; // Include filename
ppdcFile *incfile; // Include file
+ int *old_current = cond_current;
+ // Previous current stack
// Get the include name...
break;
}
+ if (cond_state)
+ continue;
+
// Figure out the current directory...
strlcpy(basedir, fp->filename, sizeof(basedir));
if ((baseptr = strrchr(basedir, '/')) != NULL)
- *baseptr = '\0';
+ *baseptr = '\0';
else
- strcpy(basedir, ".");
+ strcpy(basedir, ".");
// Find the include file...
if (find_include(inctemp, basedir, incname, sizeof(incname)))
incfile = new ppdcFile(incname);
scan_file(incfile, d, true);
delete incfile;
+
+ if (cond_current != old_current)
+ fprintf(stderr, "ppdc: Missing #endif at end of \"%s\"!\n", incname);
}
else
{
- // Can't find it!
+ // Can't find it!
fprintf(stderr,
- "ppdc: Unable to find include file \"%s\" on line %d of %s!\n",
- inctemp, fp->line, fp->filename);
+ "ppdc: Unable to find include file \"%s\" on line %d of %s!\n",
+ inctemp, fp->line, fp->filename);
break;
}
}
// Get a media size...
m = get_size(fp);
if (m)
- sizes->add(m);
+ {
+ if (cond_state)
+ m->release();
+ else
+ sizes->add(m);
+ }
}
else if (!strcasecmp(temp, "#po"))
{
// Get a message catalog...
cat = get_po(fp);
if (cat)
- po_files->add(cat);
+ {
+ if (cond_state)
+ cat->release();
+ else
+ po_files->add(cat);
+ }
}
- else if (!strcasecmp(temp, "Attribute"))
+ else if (!strcasecmp(temp, "Attribute") ||
+ !strcasecmp(temp, "LocAttribute"))
{
ppdcAttr *a; // Attribute
// Get an attribute...
- a = get_attr(fp);
+ a = get_attr(fp, !strcasecmp(temp, "LocAttribute"));
if (a)
- d->add_attr(a);
+ {
+ if (cond_state)
+ a->release();
+ else
+ d->add_attr(a);
+ }
}
else if (!strcasecmp(temp, "Choice"))
{
// Get a choice...
+ c = get_choice(fp);
+ if (!c)
+ break;
+
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
+ // Add it to the current option...
if (!o)
{
fprintf(stderr, "ppdc: Choice found on line %d of %s with no Option!\n",
break;
}
- c = get_choice(fp);
- if (!c)
- break;
-
- // Add it to the current option...
o->add_choice(c);
if (isdefault)
else if (!strcasecmp(temp, "ColorDevice"))
{
// ColorDevice boolean
- d->color_device = get_boolean(fp);
+ if (cond_state)
+ get_boolean(fp);
+ else
+ d->color_device = get_boolean(fp);
}
else if (!strcasecmp(temp, "ColorModel"))
{
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the ColorModel option...
if ((o = d->find_option("ColorModel")) == NULL)
{
p = get_color_profile(fp);
if (p)
- d->profiles->add(p);
+ {
+ if (cond_state)
+ p->release();
+ else
+ d->profiles->add(p);
+ }
}
else if (!strcasecmp(temp, "Copyright"))
{
break;
}
+ if (cond_state)
+ continue;
+
// Break it up into individual lines...
for (copyptr = copytemp; copyptr; copyptr = copyend)
{
// Get a custom media size...
m = get_custom_size(fp);
+
+ if (cond_state)
+ {
+ m->release();
+ continue;
+ }
+
if (m)
d->sizes->add(m);
have_cutter = get_boolean(fp);
- if (have_cutter <= 0)
+ if (have_cutter <= 0 || cond_state)
continue;
if ((o = d->find_option("CutMedia")) == NULL)
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the cupsDarkness option...
if ((o = d->find_option("cupsDarkness")) == NULL)
{
continue;
}
+ if (cond_state)
+ continue;
+
for (i = 0; i < (int)(sizeof(driver_types) / sizeof(driver_types[0])); i ++)
if (!strcasecmp(temp, driver_types[i]))
break;
// Get the filter value...
f = get_filter(fp);
if (f)
- d->filters->add(f);
+ {
+ if (cond_state)
+ f->release();
+ else
+ d->filters->add(f);
+ }
}
else if (!strcasecmp(temp, "Finishing"))
{
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the cupsFinishing option...
if ((o = d->find_option("cupsFinishing")) == NULL)
{
f = get_font(fp);
if (f)
{
- if (!strcasecmp(temp, "#font"))
- base_fonts->add(f);
- else
- d->add_font(f);
+ if (cond_state)
+ f->release();
+ else
+ {
+ if (!strcasecmp(temp, "#font"))
+ base_fonts->add(f);
+ else
+ d->add_font(f);
- if (isdefault)
- d->set_default_font(f);
+ if (isdefault)
+ d->set_default_font(f);
+ }
}
}
else if (!strcasecmp(temp, "Group"))
{
// Get a group...
- g = get_group(fp, d);
- if (!g)
+ ppdcGroup *tempg = get_group(fp, d);
+
+ if (!tempg)
break;
+
+ if (cond_state)
+ {
+ if (!d->find_group(tempg->name->value))
+ tempg->release();
+ }
+ else
+ {
+ if (!d->find_group(tempg->name->value))
+ d->add_group(tempg);
+
+ g = tempg;
+ }
}
else if (!strcasecmp(temp, "HWMargins"))
{
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the InputSlot option...
if ((o = d->find_option("InputSlot")) == NULL)
{
// Add it as needed...
if (o)
{
- install->add_option(o);
+ if (cond_state)
+ o->release();
+ else
+ install->add_option(o);
+
o = NULL;
}
}
else if (!strcasecmp(temp, "ManualCopies"))
{
// ManualCopies boolean
- d->manual_copies = get_boolean(fp);
+ if (cond_state)
+ get_boolean(fp);
+ else
+ d->manual_copies = get_boolean(fp);
}
else if (!strcasecmp(temp, "Manufacturer"))
{
break;
}
- d->set_manufacturer(name);
+ if (!cond_state)
+ d->set_manufacturer(name);
}
else if (!strcasecmp(temp, "MaxSize"))
{
// MaxSize width length
- d->max_width = get_measurement(fp);
- d->max_length = get_measurement(fp);
+ if (cond_state)
+ {
+ get_measurement(fp);
+ get_measurement(fp);
+ }
+ else
+ {
+ d->max_width = get_measurement(fp);
+ d->max_length = get_measurement(fp);
+ }
}
else if (!strcasecmp(temp, "MediaSize"))
{
if (get_token(fp, name, sizeof(name)) == NULL)
{
- fprintf(stderr, "ppdc: Expected name after MediaSize on line %d of %s!\n",
+ fprintf(stderr,
+ "ppdc: Expected name after MediaSize on line %d of %s!\n",
fp->line, fp->filename);
break;
}
+ if (cond_state)
+ continue;
+
m = find_size(name);
if (!m)
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the MediaType option...
if ((o = d->find_option("MediaType")) == NULL)
{
else if (!strcasecmp(temp, "MinSize"))
{
// MinSize width length
- d->min_width = get_measurement(fp);
- d->min_length = get_measurement(fp);
+ if (cond_state)
+ {
+ get_measurement(fp);
+ get_measurement(fp);
+ }
+ else
+ {
+ d->min_width = get_measurement(fp);
+ d->min_length = get_measurement(fp);
+ }
}
else if (!strcasecmp(temp, "ModelName"))
{
break;
}
- d->set_model_name(name);
+ if (!cond_state)
+ d->set_model_name(name);
}
else if (!strcasecmp(temp, "ModelNumber"))
{
// ModelNumber number
- d->model_number = get_integer(fp);
+ if (cond_state)
+ get_integer(fp);
+ else
+ d->model_number = get_integer(fp);
}
else if (!strcasecmp(temp, "Option"))
{
// Get an option...
- o = get_option(fp, d, g);
- if (!o)
+ ppdcOption *tempo = get_option(fp, d, g);
+
+ if (!tempo)
break;
+
+ if (cond_state)
+ {
+ if (!g->find_option(tempo->name->value))
+ tempo->release();
+ }
+ else
+ {
+ if (!g->find_option(tempo->name->value))
+ g->add_option(tempo);
+
+ o = tempo;
+ }
+ }
+ else if (!strcasecmp(temp, "FileName"))
+ {
+ // FileName name
+ char name[256]; // Filename string
+
+
+ if (!get_token(fp, name, sizeof(name)))
+ {
+ fprintf(stderr,
+ "ppdc: Expected name after FileName on line %d of %s!\n",
+ fp->line, fp->filename);
+ break;
+ }
+
+ if (!cond_state)
+ d->set_file_name(name);
}
else if (!strcasecmp(temp, "PCFileName"))
{
// PCFileName name
- char name[256]; // Model name string
+ char name[256]; // PC filename string
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected name after PCFileName on line %d of %s!\n",
+ fprintf(stderr,
+ "ppdc: Expected name after PCFileName on line %d of %s!\n",
fp->line, fp->filename);
break;
}
- d->set_pc_file_name(name);
+ if (!cond_state)
+ d->set_pc_file_name(name);
}
else if (!strcasecmp(temp, "Resolution"))
{
if (!c)
continue;
+ if (cond_state)
+ {
+ c->release();
+ continue;
+ }
+
// Add the choice to the Resolution option...
if ((o = d->find_option("Resolution")) == NULL)
{
// Create the Resolution option...
- o = new ppdcOption(PPDC_PICKONE, "Resolution", NULL, PPDC_SECTION_ANY, 10.0f);
+ o = new ppdcOption(PPDC_PICKONE, "Resolution", NULL, PPDC_SECTION_ANY,
+ 10.0f);
g = general;
g->add_option(o);
}
p = get_simple_profile(fp);
if (p)
- d->profiles->add(p);
+ {
+ if (cond_state)
+ p->release();
+ else
+ d->profiles->add(p);
+ }
}
else if (!strcasecmp(temp, "Throughput"))
{
// Throughput number
- d->throughput = get_integer(fp);
+ if (cond_state)
+ get_integer(fp);
+ else
+ d->throughput = get_integer(fp);
}
else if (!strcasecmp(temp, "UIConstraints"))
{
con = get_constraint(fp);
if (con)
- d->constraints->add(con);
+ {
+ if (cond_state)
+ con->release();
+ else
+ d->constraints->add(con);
+ }
}
else if (!strcasecmp(temp, "VariablePaperSize"))
{
// VariablePaperSize boolean
- d->variable_paper_size = get_boolean(fp);
+ if (cond_state)
+ get_boolean(fp);
+ else
+ d->variable_paper_size = get_boolean(fp);
}
else if (!strcasecmp(temp, "Version"))
{
if (!get_token(fp, name, sizeof(name)))
{
- fprintf(stderr, "ppdc: Expected string after Version on line %d of %s!\n",
+ fprintf(stderr,
+ "ppdc: Expected string after Version on line %d of %s!\n",
fp->line, fp->filename);
break;
}
- d->set_version(name);
+ if (!cond_state)
+ d->set_version(name);
}
else
{
quotef(fp, " Manufacturer \"%s\"\n", d->manufacturer->value);
if (d->model_name->value)
quotef(fp, " ModelName \"%s\"\n", d->model_name->value);
+ if (d->file_name->value)
+ quotef(fp, " FileName \"%s\"\n", d->file_name->value);
if (d->pc_file_name->value)
quotef(fp, " PCFileName \"%s\"\n", d->pc_file_name->value);
if (d->version->value)