xref: /plan9/sys/src/cmd/gs/doc/Develop.htm (revision 593dc095aefb2a85c828727bbfa9da139a49bdf4)
13ff48bf5SDavid du Colombier<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
23ff48bf5SDavid du Colombier<html>
33ff48bf5SDavid du Colombier<head>
43ff48bf5SDavid du Colombier<title>Information for Ghostscript developers</title>
53ff48bf5SDavid du Colombier<link rel="stylesheet" type="text/css" href="gs.css" title="Ghostscript Style">
6*593dc095SDavid du Colombier<!-- $Id: Develop.htm,v 1.159 2005/10/20 19:46:23 ray Exp $ -->
73ff48bf5SDavid du Colombier</head>
83ff48bf5SDavid du Colombier
93ff48bf5SDavid du Colombier<body>
103ff48bf5SDavid du Colombier<!-- [1.0 begin visible header] ============================================ -->
113ff48bf5SDavid du Colombier
123ff48bf5SDavid du Colombier<!-- [1.1 begin headline] ================================================== -->
133ff48bf5SDavid du Colombier
143ff48bf5SDavid du Colombier<h1>Information for Ghostscript developers</h1>
153ff48bf5SDavid du Colombier
163ff48bf5SDavid du Colombier<!-- [1.1 end headline] ==================================================== -->
173ff48bf5SDavid du Colombier
183ff48bf5SDavid du Colombier<!-- [1.2 begin table of contents] ========================================= -->
193ff48bf5SDavid du Colombier
203ff48bf5SDavid du Colombier<h2>Table of contents</h2>
213ff48bf5SDavid du Colombier
223ff48bf5SDavid du Colombier<blockquote><ul>
233ff48bf5SDavid du Colombier<li><a href="#Introduction">Introduction</a>
243ff48bf5SDavid du Colombier<li><a href="#Architecture">Architecture</a>
253ff48bf5SDavid du Colombier<ul>
263ff48bf5SDavid du Colombier<li><a href="#Design_goals">Design goals</a>
273ff48bf5SDavid du Colombier<li><a href="#Design_principles">Design principles</a>
283ff48bf5SDavid du Colombier<li><a href="#Large_scale_structure">Large-scale structure</a>
293ff48bf5SDavid du Colombier<li><a href="#Object_oriented_constructs">Object-oriented constructs</a>
303ff48bf5SDavid du Colombier</ul>
313ff48bf5SDavid du Colombier<li><a href="#File_roadmap">File roadmap</a>
323ff48bf5SDavid du Colombier<ul>
333ff48bf5SDavid du Colombier<li><a href="#Substrate">Substrate</a>
343ff48bf5SDavid du Colombier<li><a href="#Graphics_library">Graphics library</a>
353ff48bf5SDavid du Colombier<ul>
363ff48bf5SDavid du Colombier<li><a href="#Library_support">Support</a>,
373ff48bf5SDavid du Colombier    <a href="#Paths">Paths</a>,
383ff48bf5SDavid du Colombier    <a href="#Text">Text</a>,
393ff48bf5SDavid du Colombier    <a href="#Images">Images</a>,
403ff48bf5SDavid du Colombier    <a href="#Paint">Paint</a>,
413ff48bf5SDavid du Colombier    <a href="#Clipping">Clipping</a>,
423ff48bf5SDavid du Colombier    <a href="#Other_graphics">Other graphics</a>,
43*593dc095SDavid du Colombier    <a href="#Driver_support">Driver support</a>,
44*593dc095SDavid du Colombier    <a href="#FAPI_support_gx">Font API support</a>
45*593dc095SDavid du Colombier    <a href="#Visual_trace">Visual Trace</a>
463ff48bf5SDavid du Colombier</ul>
473ff48bf5SDavid du Colombier<li><a href="#Device_drivers">Device drivers</a>
483ff48bf5SDavid du Colombier<ul>
493ff48bf5SDavid du Colombier<li><a href="#Internal_devices">Internal devices</a>,
503ff48bf5SDavid du Colombier    <a href="#PS_and_PDF_writers">PostScript and PDF writers</a>,
513ff48bf5SDavid du Colombier    <a href="#High_level_devices">Other high-level devices</a>,
523ff48bf5SDavid du Colombier    <a href="#Other_maintained_drivers">Other maintained drivers</a>,
533ff48bf5SDavid du Colombier    <a href="#Contributed_drivers">Contributed drivers</a>
543ff48bf5SDavid du Colombier</ul>
553ff48bf5SDavid du Colombier<li><a href="#PostScript_interpreter">PostScript interpreter</a>
563ff48bf5SDavid du Colombier<ul>
573ff48bf5SDavid du Colombier<li><a href="#Main_program">Main program</a>,
583ff48bf5SDavid du Colombier    <a href="#Data_structures">Data structures</a>,
59*593dc095SDavid du Colombier    <a href="#Stacks">Stacks</a>,
603ff48bf5SDavid du Colombier    <a href="#Interpreter_loop">Interpreter loop</a>,
613ff48bf5SDavid du Colombier    <a href="#Scanning_parsing">Scanning/parsing</a>,
623ff48bf5SDavid du Colombier    <a href="#Standard_operators">Standard operators</a>,
633ff48bf5SDavid du Colombier    <a href="#Non_standard_operators">Non-standard operators</a>,
643ff48bf5SDavid du Colombier    <a href="#Interpreter_support">Interpreter support</a>,
653ff48bf5SDavid du Colombier    <a href="#PostScript_code">PostScript code</a>
663ff48bf5SDavid du Colombier</ul>
673ff48bf5SDavid du Colombier<li><a href="#PDF_interpreter">PDF interpreter</a>
68*593dc095SDavid du Colombier<li><a href="#PPD">PostScript Printer Description</a>
693ff48bf5SDavid du Colombier<li><a href="#Build_process">Build process</a>
703ff48bf5SDavid du Colombier<ul>
713ff48bf5SDavid du Colombier<li><a href="#Makefile_structure">Makefile structure</a>,
723ff48bf5SDavid du Colombier    <a href="#dev_files">.dev files</a>,
733ff48bf5SDavid du Colombier    <a href="#Generators">Generators</a>,
743ff48bf5SDavid du Colombier    <a href="#Build_support">Support</a>
753ff48bf5SDavid du Colombier</ul>
763ff48bf5SDavid du Colombier<li><a href="#Utilities">Utilities</a>
773ff48bf5SDavid du Colombier<ul>
783ff48bf5SDavid du Colombier<li><a href="#Utilities_in_PostScript">Utilities in PostScript</a>
793ff48bf5SDavid du Colombier<li><a href="#Utility_scripts">Utility scripts</a>
803ff48bf5SDavid du Colombier</ul>
813ff48bf5SDavid du Colombier</ul>
823ff48bf5SDavid du Colombier<li><a href="#Memory_management">Memory management</a>
833ff48bf5SDavid du Colombier<ul>
843ff48bf5SDavid du Colombier<li><a href="#Memory_manager_architecture">Memory manager architecture</a>
853ff48bf5SDavid du Colombier<ul>
863ff48bf5SDavid du Colombier<li><a href="#Objects_vs_strings">Objects vs strings</a>,
873ff48bf5SDavid du Colombier    <a href="#Structure_descriptors">Structure descriptors</a>,
883ff48bf5SDavid du Colombier    <a href="#Garbage_collection">Garbage collection</a>,
893ff48bf5SDavid du Colombier    <a href="#Movability">Movability</a>,
903ff48bf5SDavid du Colombier    <a href="#Parent_hierarchy">Parent hierarchy</a>,
913ff48bf5SDavid du Colombier    <a href="#Allocator_API">Allocator API</a>
923ff48bf5SDavid du Colombier</ul>
933ff48bf5SDavid du Colombier<li><a href="#Freeing_storage">Freeing storage</a>
943ff48bf5SDavid du Colombier<ul>
953ff48bf5SDavid du Colombier<li><a href="#Explicit_freeing">Explicit freeing</a>,
963ff48bf5SDavid du Colombier    <a href="#Reference_counting">Reference counting</a>,
973ff48bf5SDavid du Colombier    <a href="#Real_garbage_collection">(Real) garbage collection</a>
983ff48bf5SDavid du Colombier</ul>
993ff48bf5SDavid du Colombier<li><a href="#Special_implementations">Special implementations</a>
1003ff48bf5SDavid du Colombier<ul>
1013ff48bf5SDavid du Colombier<li><a href="#malloc">malloc</a>,
1023ff48bf5SDavid du Colombier    <a href="#Locking">Locking</a>,
1033ff48bf5SDavid du Colombier    <a href="#Retrying">Retrying</a>
1043ff48bf5SDavid du Colombier</ul>
1053ff48bf5SDavid du Colombier<li><a href="#Standard_implementation">Standard implementation</a>
1063ff48bf5SDavid du Colombier<li><a href="#PostScript_interpreter_extensions">PostScript interpreter extensions</a>
1073ff48bf5SDavid du Colombier<ul>
1083ff48bf5SDavid du Colombier<li><a href="#Refs">Refs (PostScript "objects")</a>,
1093ff48bf5SDavid du Colombier    <a href="#save_forgetsave_restore">save/.forgetsave/restore</a>,
1103ff48bf5SDavid du Colombier    <a href="#Stable_allocators">Stable allocators</a>,
1113ff48bf5SDavid du Colombier    <a href="#Interpreter_GC">Garbage collection</a>
1123ff48bf5SDavid du Colombier</ul>
1133ff48bf5SDavid du Colombier</ul>
1143ff48bf5SDavid du Colombier<li><a href="#Portability">Portability</a>
1153ff48bf5SDavid du Colombier<ul>
1163ff48bf5SDavid du Colombier<li><a href="#Structural">Structural</a>
1173ff48bf5SDavid du Colombier<ul>
1183ff48bf5SDavid du Colombier<li><a href="#CPU_and_compiler">CPU and compiler</a>,
1193ff48bf5SDavid du Colombier    <a href="#Library_headers">Library headers</a>,
1203ff48bf5SDavid du Colombier    <a href="#Cross_platform_APIs">Cross-platform APIs</a>,
1213ff48bf5SDavid du Colombier    <a href="#Makefiles">Makefiles</a>
1223ff48bf5SDavid du Colombier</ul>
1233ff48bf5SDavid du Colombier<li><a href="#Coding">Coding</a>
1243ff48bf5SDavid du Colombier<ul>
1253ff48bf5SDavid du Colombier<li><a href="#Explicit_dependencies">Explicit dependencies</a>,
1263ff48bf5SDavid du Colombier    <a href="#Implicit_dependencies">Implicit dependencies</a>
1273ff48bf5SDavid du Colombier</ul>
1283ff48bf5SDavid du Colombier<li><a href="#Platform_specific_code">Platform-specific code</a>
1293ff48bf5SDavid du Colombier</ul>
1303ff48bf5SDavid du Colombier<li><a href="#Adding_features_and_options">Adding features and options</a>
1313ff48bf5SDavid du Colombier<li><a href="#Troubleshooting">Troubleshooting</a>
1323ff48bf5SDavid du Colombier</ul></blockquote>
1333ff48bf5SDavid du Colombier
1343ff48bf5SDavid du Colombier<!-- [1.2 end table of contents] =========================================== -->
1353ff48bf5SDavid du Colombier
1363ff48bf5SDavid du Colombier<!-- [1.3 begin hint] ====================================================== -->
1373ff48bf5SDavid du Colombier
1383ff48bf5SDavid du Colombier<p>For other information, see the <a href="Readme.htm">Ghostscript
1393ff48bf5SDavid du Colombieroverview</a> and the documentation related to <a
1403ff48bf5SDavid du Colombierhref="Maintain.htm">maintaining Ghostscript</a>.
1413ff48bf5SDavid du Colombier
1423ff48bf5SDavid du Colombier<!-- [1.3 end hint] ======================================================== -->
1433ff48bf5SDavid du Colombier
1443ff48bf5SDavid du Colombier<hr>
1453ff48bf5SDavid du Colombier
1463ff48bf5SDavid du Colombier<!-- [1.0 end visible header] ============================================== -->
1473ff48bf5SDavid du Colombier
1483ff48bf5SDavid du Colombier<!-- [2.0 begin contents] ================================================== -->
1493ff48bf5SDavid du Colombier
1503ff48bf5SDavid du Colombier<h2><a name="Introduction"></a>Introduction</h2>
1513ff48bf5SDavid du Colombier
1523ff48bf5SDavid du Colombier<p>
1533ff48bf5SDavid du ColombierThis document provides a wealth of information about Ghostscript's
1543ff48bf5SDavid du Colombierinternals, primarily for developers actively working on Ghostscript.  It is
1553ff48bf5SDavid du Colombierprimarily <strong>descriptive</strong>, documenting the way things are; the
1563ff48bf5SDavid du Colombiercompanion <a href="C-style.htm">C style guide</a> is primarily
1573ff48bf5SDavid du Colombier<strong>prescriptive</strong>, documenting what developers should do when
1583ff48bf5SDavid du Colombierwriting new code.
1593ff48bf5SDavid du Colombier
1603ff48bf5SDavid du Colombier<p>
1613ff48bf5SDavid du ColombierTHIS FILE IS A WORK IN PROGRESS.  MANY SECTIONS ARE PLACE-HOLDERS.
1623ff48bf5SDavid du Colombier
1633ff48bf5SDavid du Colombier<h2><a name="Architecture"></a>Architecture</h2>
1643ff48bf5SDavid du Colombier
1653ff48bf5SDavid du Colombier<h3><a name="Design_goals"></a>Design goals</h3>
1663ff48bf5SDavid du Colombier
1673ff48bf5SDavid du Colombier<p>
1683ff48bf5SDavid du ColombierGhostscript has the following high-level design goals (not listed in order
1693ff48bf5SDavid du Colombierof importance):
1703ff48bf5SDavid du Colombier
1713ff48bf5SDavid du Colombier<ul>
1723ff48bf5SDavid du Colombier<li>Functionality
1733ff48bf5SDavid du Colombier<ul>
1743ff48bf5SDavid du Colombier<li>Ability to interpret the current PostScript and PDF languages, as
1753ff48bf5SDavid du Colombierdefined (and occasionally, in the case of conflict, as implemented) by
1763ff48bf5SDavid du ColombierAdobe.
1773ff48bf5SDavid du Colombier<li>Ability to convert PostScript to and from PDF, comparable to
1783ff48bf5SDavid du ColombierAdobe products.
1793ff48bf5SDavid du Colombier<li>Ability to produce output for a wide range of resolutions (from
1803ff48bf5SDavid du ColombierTV-resolution displays to imagesetters) and color models (black and white,
1813ff48bf5SDavid du Colombiermultilevel gray, bilevel or multi-level RGB and CMYK, 6- or 8-color
1823ff48bf5SDavid du Colombierinkjet printers, spot color).
1833ff48bf5SDavid du Colombier</ul>
1843ff48bf5SDavid du Colombier<li>Performance
1853ff48bf5SDavid du Colombier<ul>
1863ff48bf5SDavid du Colombier<li>Ability to render PostScript and PDF with commercial-quality performance
1873ff48bf5SDavid du Colombier(memory usage, speed, and output quality) on all platforms.
1883ff48bf5SDavid du Colombier<li>Specifically, ability to render PostScript effectively in embedded
1893ff48bf5SDavid du Colombierenvironments with constrained RAM, including the ability to put the code and
1903ff48bf5SDavid du Colombiersupporting data in ROM.
1913ff48bf5SDavid du Colombier</ul>
1923ff48bf5SDavid du Colombier<li>Licensing
1933ff48bf5SDavid du Colombier<ul>
1943ff48bf5SDavid du Colombier<li>Licensing that supports both the Open Source / Free software communities
1953ff48bf5SDavid du Colombierand a commercial licensing business.
1963ff48bf5SDavid du Colombier<li>Freedom from licensing restrictions or fees imposed by third parties.
1973ff48bf5SDavid du Colombier</ul>
1983ff48bf5SDavid du Colombier<li>Other
1993ff48bf5SDavid du Colombier<ul>
2003ff48bf5SDavid du Colombier<li>Easy source portability to any platform (CPU, operating system, and
201*593dc095SDavid du Colombierdevelopment tools) that has an ANSI C compiler.
2023ff48bf5SDavid du Colombier<li>Support for writing new interpreters and new drivers with no change to
2033ff48bf5SDavid du Colombierany existing code; specifically, ability to support PCL 5e, PCL 5c, and PCL
2043ff48bf5SDavid du ColombierXL interpreters, and the ever-changing roster of inkjet printers.
2053ff48bf5SDavid du Colombier</ul>
2063ff48bf5SDavid du Colombier</ul>
2073ff48bf5SDavid du Colombier
2083ff48bf5SDavid du Colombier<p>
2093ff48bf5SDavid du ColombierThese goals often conflict: part of Ghostscript's claim to quality is that
2103ff48bf5SDavid du Colombierthe conflicts have been resolved well.
2113ff48bf5SDavid du Colombier
2123ff48bf5SDavid du Colombier<h3><a name="Design_principles"></a>Design principles</h3>
2133ff48bf5SDavid du Colombier
2143ff48bf5SDavid du Colombier<p>
2153ff48bf5SDavid du ColombierPart of what has kept Ghostscript healthy through many years of major code
2163ff48bf5SDavid du Colombierrevisions and functional expansion is consistent and conscientious adherence
2173ff48bf5SDavid du Colombierto a set of design principles.  We hope the following list captures the most
2183ff48bf5SDavid du Colombierimportant ones.
2193ff48bf5SDavid du Colombier
2203ff48bf5SDavid du Colombier<h4>Non-preemption</h4>
2213ff48bf5SDavid du Colombier
2223ff48bf5SDavid du Colombier<p>
2233ff48bf5SDavid du ColombierGhostscript is designed to be used as a component.  As such, it must share
2243ff48bf5SDavid du Colombierits environment with other components.  Therefore, it must not require
2253ff48bf5SDavid du Colombierownership of, or make decisions about, inherently shared resources.
2263ff48bf5SDavid du ColombierSpecifically, it must not assume that it can "own" either the locus of
2273ff48bf5SDavid du Colombiercontrol or the management of the address space.
2283ff48bf5SDavid du Colombier
2293ff48bf5SDavid du Colombier<p>
2303ff48bf5SDavid du ColombierNot owning control means that whenever Ghostscript passes control to its
2313ff48bf5SDavid du Colombiercaller, it must do so in a way that doesn't constrain what the caller can do
2323ff48bf5SDavid du Colombiernext.  The caller must be able to call any other piece of software, wait for
2333ff48bf5SDavid du Colombieran external event, execute another task, etc., without having to worry about
2343ff48bf5SDavid du ColombierGhostscript being in an unknown state.  While this is easy to arrange in a
2353ff48bf5SDavid du Colombiermulti-threaded environment (by running Ghostscript in a separate thread),
2363ff48bf5SDavid du Colombiermulti-threading APIs are not well standardized at this time (December 2000),
2373ff48bf5SDavid du Colombierand may not be implemented efficiently, or at all, on some platforms.
2383ff48bf5SDavid du ColombierTherefore, Ghostscript must choose between only two options for interacting
2393ff48bf5SDavid du Colombierwith its caller: to <em>return</em>, preserving its own state in data
2403ff48bf5SDavid du Colombierstructures, or to <em>call back</em> through a caller-supplied procedure.
2413ff48bf5SDavid du ColombierCalling back constrains the client program unacceptably: the callback
2423ff48bf5SDavid du Colombierprocedure only has the options of either returning, or aborting Ghostscript.
2433ff48bf5SDavid du ColombierIn particular, if it wants (for whatever reason) to multi-task Ghostscript
2443ff48bf5SDavid du Colombierwith another program, it cannot do so in general, especially if the other
2453ff48bf5SDavid du Colombierprogram also uses callback rather than suspension.  Therefore, Ghostscript
2463ff48bf5SDavid du Colombiertries extremely hard to return, rather than calling back, for all caller
2473ff48bf5SDavid du Colombierinteraction.  In particular:
2483ff48bf5SDavid du Colombier
2493ff48bf5SDavid du Colombier<ul>
2503ff48bf5SDavid du Colombier
2513ff48bf5SDavid du Colombier<li>For callers that want to pass input to Ghostscript piece by piece,
2523ff48bf5SDavid du ColombierGhostscript returns with an <b><tt>e_NeedInput</tt></b> code rather than
2533ff48bf5SDavid du Colombierusing a callback.  This allows the caller complete flexibility in its
2543ff48bf5SDavid du Colombiercontrol structure for managing the source of input.  (It might, for example,
2553ff48bf5SDavid du Colombierbe generating the input dynamically.)
2563ff48bf5SDavid du Colombier
2573ff48bf5SDavid du Colombier<li>In the future, the same arrangement should be used for input from
2583ff48bf5SDavid du Colombier<b><tt>stdin</tt></b> and output to <b><tt>stdout</tt></b> and
2593ff48bf5SDavid du Colombier<b><tt>stderr</tt></b>.
2603ff48bf5SDavid du Colombier
2613ff48bf5SDavid du Colombier<li>Likewise, scheduling of Ghostscript's own threads (contexts), currently
2623ff48bf5SDavid du Colombierdone with a callback, should be done with suspension.  The Display
2633ff48bf5SDavid du ColombierGhostscript project (GNU DGS) is working on this.
2643ff48bf5SDavid du Colombier
2653ff48bf5SDavid du Colombier</ul>
2663ff48bf5SDavid du Colombier
2673ff48bf5SDavid du Colombier<p>
2683ff48bf5SDavid du ColombierThe one area where suspension is not feasible with Ghostscript's current
2693ff48bf5SDavid du Colombierarchitecture is device output.  Device drivers are called from deep within
2703ff48bf5SDavid du Colombierthe graphics library.  (If Ghostscript were being redesigned from scratch,
2713ff48bf5SDavid du Colombierwe might try to do this with suspension as well, or at least optional
2723ff48bf5SDavid du Colombiersuspension.)
2733ff48bf5SDavid du Colombier
2743ff48bf5SDavid du Colombier<p>
2753ff48bf5SDavid du ColombierNot owning management of the address space means that even though
2763ff48bf5SDavid du ColombierGhostscript supports garbage collection for its own data, it must not do any
2773ff48bf5SDavid du Colombierof the things that garbage collection schemes for C often require: it must
2783ff48bf5SDavid du Colombiernot replace 'malloc' and 'free', must not require its clients to use its own
2793ff48bf5SDavid du Colombierallocator, must not rely on manipulating the read/write status of memory
2803ff48bf5SDavid du Colombierpages, must not require special compiler or run-time support (e.g., APIs for
2813ff48bf5SDavid du Colombierscanning the C stack), must not depend on the availability of
2823ff48bf5SDavid du Colombiermulti-threading, and must not take possession of one of a limited number of
2833ff48bf5SDavid du Colombiertimer interrupts.  However, in order not to constrain its own code unduly,
2843ff48bf5SDavid du Colombierit must also not require using special macros or calls to enter or leave
2853ff48bf5SDavid du Colombierprocedures or assign pointers, and must not constrain the variety of C data
2863ff48bf5SDavid du Colombierstructures any more than absolutely necessary.  It achieves all of these
2873ff48bf5SDavid du Colombiergoals, at the expense of some complexity, some performance cost (mostly for
2883ff48bf5SDavid du Colombiergarbage collection), and some extra manual work required for each structure
2893ff48bf5SDavid du Colombiertype allocated by its allocator.  The details appear in the <a
2903ff48bf5SDavid du Colombierhref="#Memory_management">Memory management</a> section below.
2913ff48bf5SDavid du Colombier
2923ff48bf5SDavid du Colombier<h4>Multi-instantiability</h4>
2933ff48bf5SDavid du Colombier
2943ff48bf5SDavid du Colombier<p>
2953ff48bf5SDavid du ColombierFrom many years of experience with the benefits of object-oriented design,
2963ff48bf5SDavid du Colombierwe have learned that when the word "the" appears in a software design --
2973ff48bf5SDavid du Colombier"the" process scheduler, "the" memory manager, "the" output device, "the"
2983ff48bf5SDavid du Colombierinterpreter, "the" stack -- it often flags an area in which the software
2993ff48bf5SDavid du Colombierwill have difficulty adapting to future needs.  For this reason, Ghostscript
3003ff48bf5SDavid du Colombierattempts to make every internal structure capable of existing in multiple
3013ff48bf5SDavid du Colombierinstances.  For example, Ghostscript's memory manager is not a one-of-a-kind
3023ff48bf5SDavid du Colombierentity with global state and procedures: it is (or rather they are, since
3033ff48bf5SDavid du ColombierGhostscript has multiple memory managers, some of which have multiple
3043ff48bf5SDavid du Colombierinstances) objects with their own state and (virtual) procedures.
3053ff48bf5SDavid du ColombierGhostscript's PostScript interpreter has no writable non-local data
3063ff48bf5SDavid du Colombier(necessary, but not sufficient, to allow multiple instances), and in the
3073ff48bf5SDavid du Colombierfuture will be extended to be completely reentrant and instantiable.  The
3083ff48bf5SDavid du Colombierdevice driver API is designed to make this easy for drivers as well.  The
3093ff48bf5SDavid du Colombiergraphics library is currently not completely reentrant or instantiable: we
3103ff48bf5SDavid du Colombierhope this will occur in the future.
3113ff48bf5SDavid du Colombier
3123ff48bf5SDavid du Colombier<h4>Late configuration binding</h4>
3133ff48bf5SDavid du Colombier
3143ff48bf5SDavid du Colombier<p>
3153ff48bf5SDavid du ColombierGhostscript is designed to make configuration choices as late as possible,
3163ff48bf5SDavid du Colombiersubject to simplicity and performance considerations.  The major binding
3173ff48bf5SDavid du Colombiertimes for such choices are compilation, linking, startup, and dynamic.
3183ff48bf5SDavid du Colombier
3193ff48bf5SDavid du Colombier<ul>
3203ff48bf5SDavid du Colombier
3213ff48bf5SDavid du Colombier<li>Compilation binds only CPU and compiler characteristics (including data
3223ff48bf5SDavid du Colombiertype size, presence of floating point hardware, and data alignment), and
3233ff48bf5SDavid du Colombierwhether the code will be used for production, debugging, or profiling.
3243ff48bf5SDavid du Colombier
3253ff48bf5SDavid du Colombier<li>Linking binds the choice of what features and device drivers will be
3263ff48bf5SDavid du Colombierincluded in the executable.  (Work is underway to make the choice of drivers
3273ff48bf5SDavid du Colombierdynamic.)
3283ff48bf5SDavid du Colombier
3293ff48bf5SDavid du Colombier<li>Startup binds essentially nothing.  Almost every option and parameter
3303ff48bf5SDavid du Colombierthat can appear on the command line can also be changed dynamically.
3313ff48bf5SDavid du Colombier
3323ff48bf5SDavid du Colombier<li>The selection of output device, all parameters associated with the
3333ff48bf5SDavid du Colombierdevice, the selection of debugging printout and self-checking (in debugging
3343ff48bf5SDavid du Colombierconfigurations), the macro-allocation of memory, and almost all other
3353ff48bf5SDavid du Colombieroperational parameters are dynamic.
3363ff48bf5SDavid du Colombier
3373ff48bf5SDavid du Colombier</ul>
3383ff48bf5SDavid du Colombier
3393ff48bf5SDavid du Colombier<p>
3403ff48bf5SDavid du ColombierIn addition, a number of major implementation decisions are made dynamically
3413ff48bf5SDavid du Colombierdepending on the availability of resources.  For example, Ghostscript
3423ff48bf5SDavid du Colombierchooses between banded and non-banded rendering depending on memory
3433ff48bf5SDavid du Colombieravailability.
3443ff48bf5SDavid du Colombier
3453ff48bf5SDavid du Colombier<h3><a name="Large_scale_structure"></a>Large-scale structure</h3>
3463ff48bf5SDavid du Colombier
3473ff48bf5SDavid du Colombier<p>
3483ff48bf5SDavid du ColombierAt the largest design scale, Ghostscript consists of 4 layers.  Layer N
3493ff48bf5SDavid du Colombieris allowed to use the facilities of all layers M &lt;= N.
3503ff48bf5SDavid du Colombier
3513ff48bf5SDavid du Colombier<ol>
3523ff48bf5SDavid du Colombier
3533ff48bf5SDavid du Colombier<li>The bottom layer is called the <a href="#Substrate">substrate</a>.  It
3543ff48bf5SDavid du Colombierincludes facilities like memory management, streams, fixed-point arithmetic,
3553ff48bf5SDavid du Colombierand low-level interfaces to the operating system.  The substrate is written
3563ff48bf5SDavid du Colombierin C, with a little C++ and/or assembler code for some platforms.
3573ff48bf5SDavid du Colombier
3583ff48bf5SDavid du Colombier<li>The layer above the substrate is the graphics layer.  It consists of two
3593ff48bf5SDavid du Colombierseparate sub-parts.  The graphics layer is written in C.
3603ff48bf5SDavid du Colombier
3613ff48bf5SDavid du Colombier<ul>
3623ff48bf5SDavid du Colombier
3633ff48bf5SDavid du Colombier<li>The <a href="#Graphics_library">graphics library</a> manages graphics
3643ff48bf5SDavid du Colombierstate information for, and decomposes and renders 2-D images described
3653ff48bf5SDavid du Colombierusing, a graphics model that is approximately the union of those of
3663ff48bf5SDavid du ColombierPostScript, PDF, and PCL 5e/5c/XL.
3673ff48bf5SDavid du Colombier
3683ff48bf5SDavid du Colombier<li>The <a href="#Device_drivers">device drivers</a> are called by the
3693ff48bf5SDavid du Colombiergraphics library to produce actual output.  The graphics library, and all
3703ff48bf5SDavid du Colombierhigher layers, call device driver procedures only through virtual functions.
3713ff48bf5SDavid du Colombier
3723ff48bf5SDavid du Colombier</ul>
3733ff48bf5SDavid du Colombier
3743ff48bf5SDavid du Colombier<li>The principal clients of the graphics layer are language interpreters.
3753ff48bf5SDavid du ColombierGhostscript as distributed includes the <a
3763ff48bf5SDavid du Colombierhref="#PostScript_interpreter">PostScript interpreter</a>; there are also
3773ff48bf5SDavid du Colombierinterpreters for PCL 5e, PCL 5c, and PCL XL, which are not currently freely
3783ff48bf5SDavid du Colombierredistributable and are not included in the standard Ghostscript package.
3793ff48bf5SDavid du ColombierThe PostScript interpreter is written partly in C and partly in PostScript.
3803ff48bf5SDavid du Colombier
3813ff48bf5SDavid du Colombier<li>The <a href="#PDF_interpreter">PDF interpreter</a> is actually a client
3823ff48bf5SDavid du Colombierof the PostScript interpreter: it is written entirely in PostScript.
3833ff48bf5SDavid du Colombier
3843ff48bf5SDavid du Colombier</ol>
3853ff48bf5SDavid du Colombier
3863ff48bf5SDavid du Colombier<p>
3873ff48bf5SDavid du ColombierThe most important interface in Ghostscript is the API between the graphics
3883ff48bf5SDavid du Colombierlibrary and the device drivers: new printers (and, to a lesser extent,
3893ff48bf5SDavid du Colombierwindow systems, displays, plotters, film recorders, and graphics file
3903ff48bf5SDavid du Colombierformats) come on the scene frequently, and it must be possible to produce
3913ff48bf5SDavid du Colombieroutput for them with a minimum of effort and distruption.  This API is the
3923ff48bf5SDavid du Colombieronly one that is extensively documented (see <a
3933ff48bf5SDavid du Colombierhref="Drivers.htm">Drivers.htm</a>) and kept stringently backward-compatible
3943ff48bf5SDavid du Colombierthrough successive releases.
3953ff48bf5SDavid du Colombier
3963ff48bf5SDavid du Colombier<h3><a name="Object_oriented_constructs"></a>Object-oriented constructs</h3>
3973ff48bf5SDavid du Colombier
3983ff48bf5SDavid du Colombier<p>
3993ff48bf5SDavid du ColombierGhostscript makes heavy use of object-oriented constructs, including
4003ff48bf5SDavid du Colombieranalogues of classes, instances, subclassing, and class-associated
4013ff48bf5SDavid du Colombierprocedures.  Since Ghostscript is written in C, not C++, implementing these
4023ff48bf5SDavid du Colombierconstructs requires following coding conventions.  The <a
4033ff48bf5SDavid du Colombierhref="C-style.htm#Objects">"Objects"</a> section of the C style guide
4043ff48bf5SDavid du Colombierexplains these.
4053ff48bf5SDavid du Colombier
4063ff48bf5SDavid du Colombier<p>
4073ff48bf5SDavid du ColombierThe memory manager API provides run-time type information about each class,
4083ff48bf5SDavid du Colombierbut this information does not include anything about subclassing.  See under
4093ff48bf5SDavid du Colombier<a href="#Structure_descriptors">Structure descriptors</a> below.
4103ff48bf5SDavid du Colombier
4113ff48bf5SDavid du Colombier<hr>
4123ff48bf5SDavid du Colombier
4133ff48bf5SDavid du Colombier<h2><a name="File_roadmap"></a>File roadmap</h2>
4143ff48bf5SDavid du Colombier
4153ff48bf5SDavid du Colombier<p>
4163ff48bf5SDavid du ColombierThis section of the document provides a roadmap to all of the Ghostscript
4173ff48bf5SDavid du Colombiersource files.
4183ff48bf5SDavid du Colombier
4193ff48bf5SDavid du Colombier<h3><a name="Substrate"></a>Substrate</h3>
4203ff48bf5SDavid du Colombier
421*593dc095SDavid du Colombier<h4>Runtime Context</h4>
422*593dc095SDavid du Colombier
423*593dc095SDavid du Colombier<dl>
424*593dc095SDavid du Colombier<dt>
425*593dc095SDavid du ColombierThe libctx provides pointers to memory, stdio, and various other runtime
426*593dc095SDavid du Colombierportablility services.
427*593dc095SDavid du Colombier<dd>
428*593dc095SDavid du Colombier<a href="../src/gslibctx.h">src/gslibctx.h</a>,
429*593dc095SDavid du Colombier<a href="../src/gslibctx.c">src/gslibctx.c</a>.
430*593dc095SDavid du Colombier</dl>
431*593dc095SDavid du Colombier
4323ff48bf5SDavid du Colombier<h4>Memory manager</h4>
4333ff48bf5SDavid du Colombier
4343ff48bf5SDavid du Colombier<p>
4353ff48bf5SDavid du ColombierSee <a href="#Memory_management">below</a>.
4363ff48bf5SDavid du Colombier
4373ff48bf5SDavid du Colombier<h4>Streams</h4>
4383ff48bf5SDavid du Colombier
4393ff48bf5SDavid du Colombier<dl>
4403ff48bf5SDavid du Colombier
4413ff48bf5SDavid du Colombier<dt>
4423ff48bf5SDavid du ColombierFramework, file and string streams:
4433ff48bf5SDavid du Colombier<dd>
4443ff48bf5SDavid du Colombier<a href="../src/gsdsrc.c">src/gsdsrc.c</a>,
4453ff48bf5SDavid du Colombier<a href="../src/gsdsrc.h">src/gsdsrc.h</a>,
4463ff48bf5SDavid du Colombier<a href="../src/scommon.h">src/scommon.h</a>,
4473ff48bf5SDavid du Colombier<a href="../src/sfxboth.c">src/sfxboth.c</a>,
4483ff48bf5SDavid du Colombier<a href="../src/sfxfd.c">src/sfxfd.c</a>,
4493ff48bf5SDavid du Colombier<a href="../src/sfxstdio.c">src/sfxstdio.c</a>,
4503ff48bf5SDavid du Colombier<a href="../src/stream.h">src/stream.h</a>,
4513ff48bf5SDavid du Colombier<a href="../src/stream.c">src/stream.c</a>,
4523ff48bf5SDavid du Colombier<a href="../src/strimpl.h">src/strimpl.h</a>.
4533ff48bf5SDavid du Colombier
4543ff48bf5SDavid du Colombier<dt>
4553ff48bf5SDavid du ColombierStandard filters:
4563ff48bf5SDavid du Colombier<dd>
4573ff48bf5SDavid du Colombier
4583ff48bf5SDavid du Colombier<dl>
4593ff48bf5SDavid du Colombier
4603ff48bf5SDavid du Colombier<dt>
4613ff48bf5SDavid du ColombierCCITTFax:
4623ff48bf5SDavid du Colombier<dd>
4633ff48bf5SDavid du Colombier<a href="../src/scf.h">src/scf.h</a>,
4643ff48bf5SDavid du Colombier<a href="../src/scfd.c">src/scfd.c</a>,
4653ff48bf5SDavid du Colombier<a href="../src/scfdgen.c">src/scfdgen.c</a>,
4663ff48bf5SDavid du Colombier<a href="../src/scfdtab.c">src/scfdtab.c</a>,
4673ff48bf5SDavid du Colombier<a href="../src/scfe.c">src/scfe.c</a>,
4683ff48bf5SDavid du Colombier<a href="../src/scfetab.c">src/scfetab.c</a>,
4693ff48bf5SDavid du Colombier<a href="../src/scfparam.c">src/scfparam.c</a>,
4703ff48bf5SDavid du Colombier<a href="../src/scfx.h">src/scfx.h</a>.
4713ff48bf5SDavid du Colombier
4723ff48bf5SDavid du Colombier<dt>
4733ff48bf5SDavid du ColombierDCT (JPEG):
4743ff48bf5SDavid du Colombier<dd>
4753ff48bf5SDavid du Colombier<a href="../src/gsjconf.h">src/gsjconf.h</a>,
4763ff48bf5SDavid du Colombier<a href="../src/gsjmorec.h">src/gsjmorec.h</a>,
4773ff48bf5SDavid du Colombier<a href="../src/sdcparam.c">src/sdcparam.c</a>,
4783ff48bf5SDavid du Colombier<a href="../src/sdcparam.h">src/sdcparam.h</a>,
4793ff48bf5SDavid du Colombier<a href="../src/sdct.h">src/sdct.h</a>,
4803ff48bf5SDavid du Colombier<a href="../src/sdctc.c">src/sdctc.c</a>,
4813ff48bf5SDavid du Colombier<a href="../src/sdctd.c">src/sdctd.c</a>,
4823ff48bf5SDavid du Colombier<a href="../src/sdcte.c">src/sdcte.c</a>,
4833ff48bf5SDavid du Colombier<a href="../src/sddparam.c">src/sddparam.c</a>,
4843ff48bf5SDavid du Colombier<a href="../src/sdeparam.c">src/sdeparam.c</a>,
4853ff48bf5SDavid du Colombier<a href="../src/sjpeg.h">src/sjpeg.h</a>,
4863ff48bf5SDavid du Colombier<a href="../src/sjpegc.c">src/sjpegc.c</a>,
4873ff48bf5SDavid du Colombier<a href="../src/sjpegd.c">src/sjpegd.c</a>,
4883ff48bf5SDavid du Colombier<a href="../src/sjpege.c">src/sjpege.c</a>.
4893ff48bf5SDavid du Colombier
4903ff48bf5SDavid du Colombier<dt>
491*593dc095SDavid du ColombierJBIG2:
492*593dc095SDavid du Colombier<a href="../src/sjbig2.h">src/sjbig2.h</a>,
493*593dc095SDavid du Colombier<a href="../src/sjbig2.c">src/sjbig2.c</a>.
494*593dc095SDavid du Colombier
495*593dc095SDavid du Colombier<dt>
496*593dc095SDavid du ColombierJPX (JPEG 2000):
497*593dc095SDavid du Colombier<a href="../src/sjpx.h">src/sjpx.h</a>,
498*593dc095SDavid du Colombier<a href="../src/sjpx.c">src/sjpx.c</a>.
499*593dc095SDavid du Colombier<dt>
5003ff48bf5SDavid du ColombierOther compression/decompression:
5013ff48bf5SDavid du Colombier<dd>
5023ff48bf5SDavid du Colombier<a href="../src/slzwc.c">src/slzwc.c</a>,
5033ff48bf5SDavid du Colombier<a href="../src/slzwd.c">src/slzwd.c</a>,
504*593dc095SDavid du Colombier<a href="../src/slzwe.c">src/slzwe.c</a>,
5053ff48bf5SDavid du Colombier<a href="../src/slzwx.h">src/slzwx.h</a>,
5063ff48bf5SDavid du Colombier<a href="../src/srld.c">src/srld.c</a>,
5073ff48bf5SDavid du Colombier<a href="../src/srle.c">src/srle.c</a>,
5083ff48bf5SDavid du Colombier<a href="../src/srlx.h">src/srlx.h</a>.
5093ff48bf5SDavid du Colombier
5103ff48bf5SDavid du Colombier<dt>
5113ff48bf5SDavid du ColombierOther:
5123ff48bf5SDavid du Colombier<dd>
5133ff48bf5SDavid du Colombier<a href="../src/sa85d.c">src/sa85d.c</a>,
5143ff48bf5SDavid du Colombier<a href="../src/sa85d.h">src/sa85d.h</a>,
5153ff48bf5SDavid du Colombier<a href="../src/sa85x.h">src/sa85x.h</a>,
5163ff48bf5SDavid du Colombier<a href="../src/sfilter1.c">src/sfilter1.c</a>,
5173ff48bf5SDavid du Colombier<a href="../src/sfilter2.c">src/sfilter2.c</a>,
5183ff48bf5SDavid du Colombier<a href="../src/sstring.c">src/sstring.c</a>,
5193ff48bf5SDavid du Colombier<a href="../src/sstring.h">src/sstring.h</a>.
5203ff48bf5SDavid du Colombier
5213ff48bf5SDavid du Colombier</dl>
5223ff48bf5SDavid du Colombier
5233ff48bf5SDavid du Colombier<dt>
5243ff48bf5SDavid du ColombierNon-standard filters used to implement standard filters:
5253ff48bf5SDavid du Colombier<dd>
5263ff48bf5SDavid du Colombier<a href="../src/seexec.c">src/seexec.c</a>,
5273ff48bf5SDavid du Colombier<a href="../src/sfilter.h">src/sfilter.h</a>,
5283ff48bf5SDavid du Colombier<a href="../src/shc.c">src/shc.c</a>,
5293ff48bf5SDavid du Colombier<a href="../src/shc.h">src/shc.h</a>,
5303ff48bf5SDavid du Colombier<a href="../src/shcgen.c">src/shcgen.c</a>,
5313ff48bf5SDavid du Colombier<a href="../src/shcgen.h">src/shcgen.h</a>,
5323ff48bf5SDavid du Colombier<a href="../src/spdiff.c">src/spdiff.c</a>,
5333ff48bf5SDavid du Colombier<a href="../src/spdiffx.h">src/spdiffx.h</a>,
5343ff48bf5SDavid du Colombier<a href="../src/spngp.c">src/spngp.c</a>,
5353ff48bf5SDavid du Colombier<a href="../src/spngpx.h">src/spngpx.h</a>,
5363ff48bf5SDavid du Colombier<a href="../src/szlibc.c">src/szlibc.c</a>,
5373ff48bf5SDavid du Colombier<a href="../src/szlibd.c">src/szlibd.c</a>,
5383ff48bf5SDavid du Colombier<a href="../src/szlibe.c">src/szlibe.c</a>,
5393ff48bf5SDavid du Colombier<a href="../src/szlibx.h">src/szlibx.h</a>,
5403ff48bf5SDavid du Colombier<a href="../src/szlibxx.h">src/szlibxx.h</a>.
5413ff48bf5SDavid du Colombier
5423ff48bf5SDavid du Colombier<dt>
5433ff48bf5SDavid du ColombierNon-standard filters:
5443ff48bf5SDavid du Colombier<dd>
5453ff48bf5SDavid du Colombier<a href="../src/sbcp.c">src/sbcp.c</a>,
5463ff48bf5SDavid du Colombier<a href="../src/sbcp.h">src/sbcp.h</a>,
5473ff48bf5SDavid du Colombier<a href="../src/sbhc.c">src/sbhc.c</a>,
5483ff48bf5SDavid du Colombier<a href="../src/sbhc.h">src/sbhc.h</a>,
5493ff48bf5SDavid du Colombier<a href="../src/sbtx.h">src/sbtx.h</a>,
5503ff48bf5SDavid du Colombier<a href="../src/sbwbs.c">src/sbwbs.c</a>,
5513ff48bf5SDavid du Colombier<a href="../src/sbwbs.h">src/sbwbs.h</a>,
5523ff48bf5SDavid du Colombier<a href="../src/smd5.c">src/smd5.c</a>,
5533ff48bf5SDavid du Colombier<a href="../src/smd5.h">src/smd5.h</a>,
5543ff48bf5SDavid du Colombier<a href="../src/sarc4.c">src/sarc4.c</a>,
5553ff48bf5SDavid du Colombier<a href="../src/sarc4.h">src/sarc4.h</a>,
5563ff48bf5SDavid du Colombier<a href="../src/smtf.c">src/smtf.c</a>,
5573ff48bf5SDavid du Colombier<a href="../src/smtf.h">src/smtf.h</a>.
5583ff48bf5SDavid du Colombier
5593ff48bf5SDavid du Colombier<dt>
5603ff48bf5SDavid du ColombierInternal filters:
5613ff48bf5SDavid du Colombier<dd>
5623ff48bf5SDavid du Colombiera<a href="../src/siinterp.c">src/siinterp.c</a>,
5633ff48bf5SDavid du Colombier<a href="../src/siinterp.h">src/siinterp.h</a>,
5643ff48bf5SDavid du Colombier<a href="../src/siscale.c">src/siscale.c</a>,
5653ff48bf5SDavid du Colombier<a href="../src/siscale.h">src/siscale.h</a>,
5663ff48bf5SDavid du Colombier<a href="../src/sisparam.h">src/sisparam.h</a>.
5673ff48bf5SDavid du Colombier
5683ff48bf5SDavid du Colombier<dt>
5693ff48bf5SDavid du ColombierHigher-level stream support:
5703ff48bf5SDavid du Colombier<dd>
5713ff48bf5SDavid du Colombier<a href="../src/spprint.c">src/spprint.c</a>,
5723ff48bf5SDavid du Colombier<a href="../src/spprint.h">src/spprint.h</a>,
5733ff48bf5SDavid du Colombier<a href="../src/spsdf.c">src/spsdf.c</a>,
5743ff48bf5SDavid du Colombier<a href="../src/spsdf.h">src/spsdf.h</a>,
5753ff48bf5SDavid du Colombier<a href="../src/srdline.h">src/srdline.h</a>.
5763ff48bf5SDavid du Colombier
5773ff48bf5SDavid du Colombier</dl>
5783ff48bf5SDavid du Colombier
5793ff48bf5SDavid du Colombier<h4>Platform-specific code</h4>
5803ff48bf5SDavid du Colombier
5813ff48bf5SDavid du ColombierSee <a href="#Cross_platform_APIs">below</a>.
5823ff48bf5SDavid du Colombier
5833ff48bf5SDavid du Colombier<h4>Miscellaneous</h4>
5843ff48bf5SDavid du Colombier
5853ff48bf5SDavid du Colombier<dl>
5863ff48bf5SDavid du Colombier
5873ff48bf5SDavid du Colombier<dt>
5883ff48bf5SDavid du ColombierLibrary top level:
5893ff48bf5SDavid du Colombier<dd>
5903ff48bf5SDavid du Colombier<a href="../src/gsinit.c">src/gsinit.c</a>,
5913ff48bf5SDavid du Colombier<a href="../src/gslib.h">src/gslib.h</a>.
5923ff48bf5SDavid du Colombier
5933ff48bf5SDavid du Colombier<dt>
5943ff48bf5SDavid du ColombierConfiguration-related:
5953ff48bf5SDavid du Colombier<dd>
5963ff48bf5SDavid du Colombier<a href="../src/gconf.c">src/gconf.c</a>,
5973ff48bf5SDavid du Colombier<a href="../src/gconf.h">src/gconf.h</a>,
5983ff48bf5SDavid du Colombier<a href="../src/gscdef.c">src/gscdef.c</a>,
5993ff48bf5SDavid du Colombier<a href="../src/gscdefs.h">src/gscdefs.h</a>.
6003ff48bf5SDavid du Colombier
6013ff48bf5SDavid du Colombier<dt>
6023ff48bf5SDavid du ColombierArithmetic:
6033ff48bf5SDavid du Colombier<dd>
6043ff48bf5SDavid du Colombier<a href="../src/gsfemu.c">src/gsfemu.c</a>,
6053ff48bf5SDavid du Colombier<a href="../src/gxarith.h">src/gxarith.h</a>,
6063ff48bf5SDavid du Colombier<a href="../src/gxdda.h">src/gxdda.h</a>,
6073ff48bf5SDavid du Colombier<a href="../src/gxfarith.h">src/gxfarith.h</a>,
6083ff48bf5SDavid du Colombier<a href="../src/gxfixed.h">src/gxfixed.h</a>,
6093ff48bf5SDavid du Colombier<a href="../src/gxfrac.h">src/gxfrac.h</a>.
6103ff48bf5SDavid du Colombier
6113ff48bf5SDavid du Colombier<dt>
6123ff48bf5SDavid du ColombierOperating system interface:
6133ff48bf5SDavid du Colombier<dd>
6143ff48bf5SDavid du Colombier<a href="../src/gserror.h">src/gserror.h</a>,
6153ff48bf5SDavid du Colombier<a href="../src/gsexit.h">src/gsexit.h</a>,
6163ff48bf5SDavid du Colombier<a href="../src/gxstdio.h">src/gxstdio.h</a>,
6173ff48bf5SDavid du Colombier<a href="../src/gxsync.c">src/gxsync.c</a>,
6183ff48bf5SDavid du Colombier<a href="../src/gxsync.h">src/gxsync.h</a>.
6193ff48bf5SDavid du Colombier
6203ff48bf5SDavid du Colombier<dt>
6213ff48bf5SDavid du ColombierOther:
6223ff48bf5SDavid du Colombier<dd>
6233ff48bf5SDavid du Colombier<a href="../src/gsargs.c">src/gsargs.c</a>,
6243ff48bf5SDavid du Colombier<a href="../src/gsargs.h">src/gsargs.h</a>,
6253ff48bf5SDavid du Colombier<a href="../src/gserrors.h">src/gserrors.h</a>,
6263ff48bf5SDavid du Colombier<a href="../src/gsnotify.c">src/gsnotify.c</a>,
6273ff48bf5SDavid du Colombier<a href="../src/gsnotify.h">src/gsnotify.h</a>,
6283ff48bf5SDavid du Colombier<a href="../src/gsrect.h">src/gsrect.h</a>,
6293ff48bf5SDavid du Colombier<a href="../src/gstypes.h">src/gstypes.h</a>,
6303ff48bf5SDavid du Colombier<a href="../src/gsuid.h">src/gsuid.h</a>,
6313ff48bf5SDavid du Colombier<a href="../src/gsutil.h">src/gsutil.h</a>,
6323ff48bf5SDavid du Colombier<a href="../src/gsutil.c">src/gsutil.c</a>,
6333ff48bf5SDavid du Colombier<a href="../src/gx.h">src/gx.h</a>,
6343ff48bf5SDavid du Colombier<a href="../src/md5.c">src/md5.c</a>,
635*593dc095SDavid du Colombier<a href="../src/md5.h">src/md5.h</a>,
636*593dc095SDavid du Colombier<a href="../src/md5main.c">src/md5main.c</a>.
6373ff48bf5SDavid du Colombier
6383ff48bf5SDavid du Colombier</dl>
6393ff48bf5SDavid du Colombier
6403ff48bf5SDavid du Colombier<h3><a name="Graphics_library"></a>Graphics library</h3>
6413ff48bf5SDavid du Colombier
6423ff48bf5SDavid du Colombier<h4><a name="Library_support"></a>Support</h4>
6433ff48bf5SDavid du Colombier
6443ff48bf5SDavid du Colombier<dl>
6453ff48bf5SDavid du Colombier
6463ff48bf5SDavid du Colombier<dt>
6473ff48bf5SDavid du ColombierBitmap processing:
6483ff48bf5SDavid du Colombier<dd>
6493ff48bf5SDavid du Colombier<a href="../src/gsbitcom.c">src/gsbitcom.c</a>,
6503ff48bf5SDavid du Colombier<a href="../src/gsbitmap.h">src/gsbitmap.h</a>,
6513ff48bf5SDavid du Colombier<a href="../src/gsbitops.c">src/gsbitops.c</a>,
6523ff48bf5SDavid du Colombier<a href="../src/gsbitops.h">src/gsbitops.h</a>,
6533ff48bf5SDavid du Colombier<a href="../src/gsbittab.c">src/gsbittab.c</a>,
6543ff48bf5SDavid du Colombier<a href="../src/gsbittab.h">src/gsbittab.h</a>,
6553ff48bf5SDavid du Colombier<a href="../src/gsflip.c">src/gsflip.c</a>,
6563ff48bf5SDavid du Colombier<a href="../src/gsflip.h">src/gsflip.h</a>,
6573ff48bf5SDavid du Colombier<a href="../src/gxbitmap.h">src/gxbitmap.h</a>,
6583ff48bf5SDavid du Colombier<a href="../src/gxbitops.h">src/gxbitops.h</a>,
6593ff48bf5SDavid du Colombier<a href="../src/gxsample.c">src/gxsample.c</a>,
6603ff48bf5SDavid du Colombier<a href="../src/gxsample.h">src/gxsample.h</a>.
661*593dc095SDavid du Colombier<a href="../src/gxsamplp.h">src/gxsamplp.h</a>.
6623ff48bf5SDavid du Colombier
6633ff48bf5SDavid du Colombier<dt>
6643ff48bf5SDavid du ColombierFunctions:
6653ff48bf5SDavid du Colombier<dd>
6663ff48bf5SDavid du Colombier<a href="../src/gsfunc.c">src/gsfunc.c</a>,
6673ff48bf5SDavid du Colombier<a href="../src/gsfunc.h">src/gsfunc.h</a>,
6683ff48bf5SDavid du Colombier<a href="../src/gsfunc0.c">src/gsfunc0.c</a>,
6693ff48bf5SDavid du Colombier<a href="../src/gsfunc0.h">src/gsfunc0.h</a>,
6703ff48bf5SDavid du Colombier<a href="../src/gsfunc3.c">src/gsfunc3.c</a>,
6713ff48bf5SDavid du Colombier<a href="../src/gsfunc3.h">src/gsfunc3.h</a>,
6723ff48bf5SDavid du Colombier<a href="../src/gsfunc4.c">src/gsfunc4.c</a>,
6733ff48bf5SDavid du Colombier<a href="../src/gsfunc4.h">src/gsfunc4.h</a>,
6743ff48bf5SDavid du Colombier<a href="../src/gxfunc.h">src/gxfunc.h</a>.
6753ff48bf5SDavid du Colombier
6763ff48bf5SDavid du Colombier<dt>
6773ff48bf5SDavid du ColombierParameter lists:
6783ff48bf5SDavid du Colombier<dd>
6793ff48bf5SDavid du Colombier<a href="../src/gscparam.c">src/gscparam.c</a>,
6803ff48bf5SDavid du Colombier<a href="../src/gsparam.c">src/gsparam.c</a>,
6813ff48bf5SDavid du Colombier<a href="../src/gsparam.h">src/gsparam.h</a>,
6823ff48bf5SDavid du Colombier<a href="../src/gsparam2.c">src/gsparam2.c</a> (not used),
6833ff48bf5SDavid du Colombier<a href="../src/gsparams.c">src/gsparams.c</a>,
6843ff48bf5SDavid du Colombier<a href="../src/gsparams.h">src/gsparams.h</a>,
6853ff48bf5SDavid du Colombier<a href="../src/gsparamx.c">src/gsparamx.c</a>,
6863ff48bf5SDavid du Colombier<a href="../src/gsparamx.h">src/gsparamx.h</a>.
6873ff48bf5SDavid du Colombier
6883ff48bf5SDavid du Colombier<dt>
6893ff48bf5SDavid du ColombierI/O-related:
6903ff48bf5SDavid du Colombier<dd>
6913ff48bf5SDavid du Colombier<a href="../src/gdevpipe.c">src/gdevpipe.c</a>,
6923ff48bf5SDavid du Colombier<a href="../src/gsfname.c">src/gsfname.c</a>,
6933ff48bf5SDavid du Colombier<a href="../src/gsfname.h">src/gsfname.h</a>,
6943ff48bf5SDavid du Colombier<a href="../src/gsio.h">src/gsio.h</a>,
6953ff48bf5SDavid du Colombier<a href="../src/gsiodev.c">src/gsiodev.c</a>,
6963ff48bf5SDavid du Colombier<a href="../src/gsiodevs.c">src/gsiodevs.c</a>,
697*593dc095SDavid du Colombier<a href="../src/gsiodisk.c">src/gsiodisk.c</a>,
698*593dc095SDavid du Colombier<a href="../src/gsiorom.c">src/gsiorom.c</a>.
6993ff48bf5SDavid du Colombier<a href="../src/gxiodev.h">src/gxiodev.h</a>.
7003ff48bf5SDavid du Colombier
7013ff48bf5SDavid du Colombier</dl>
7023ff48bf5SDavid du Colombier
7033ff48bf5SDavid du Colombier<h4><a name="Paths"></a>Paths</h4>
7043ff48bf5SDavid du Colombier
7053ff48bf5SDavid du Colombier<dl>
7063ff48bf5SDavid du Colombier
7073ff48bf5SDavid du Colombier<dt>
7083ff48bf5SDavid du ColombierCoordinate transformation:
7093ff48bf5SDavid du Colombier<dd>
7103ff48bf5SDavid du Colombier<a href="../src/gscoord.c">src/gscoord.c</a>,
7113ff48bf5SDavid du Colombier<a href="../src/gscoord.h">src/gscoord.h</a>,
7123ff48bf5SDavid du Colombier<a href="../src/gsmatrix.c">src/gsmatrix.c</a>,
7133ff48bf5SDavid du Colombier<a href="../src/gsmatrix.h">src/gsmatrix.h</a>,
7143ff48bf5SDavid du Colombier<a href="../src/gxcoord.h">src/gxcoord.h</a>,
7153ff48bf5SDavid du Colombier<a href="../src/gxmatrix.h">src/gxmatrix.h</a>.
7163ff48bf5SDavid du Colombier
7173ff48bf5SDavid du Colombier<dt>
7183ff48bf5SDavid du ColombierPath building:
7193ff48bf5SDavid du Colombier<dd>
7203ff48bf5SDavid du Colombier<a href="../src/gsdps1.c">src/gsdps1.c</a>,
7213ff48bf5SDavid du Colombier<a href="../src/gspath.c">src/gspath.c</a>,
7223ff48bf5SDavid du Colombier<a href="../src/gspath.h">src/gspath.h</a>,
7233ff48bf5SDavid du Colombier<a href="../src/gspath1.c">src/gspath1.c</a>,
7243ff48bf5SDavid du Colombier<a href="../src/gspath2.h">src/gspath2.h</a>,
7253ff48bf5SDavid du Colombier<a href="../src/gxpath.c">src/gxpath.c</a>,
7263ff48bf5SDavid du Colombier<a href="../src/gxpath.h">src/gxpath.h</a>,
7273ff48bf5SDavid du Colombier<a href="../src/gxpath2.c">src/gxpath2.c</a>,
7283ff48bf5SDavid du Colombier<a href="../src/gxpcopy.c">src/gxpcopy.c</a>,
7293ff48bf5SDavid du Colombier<a href="../src/gxpdash.c">src/gxpdash.c</a>,
7303ff48bf5SDavid du Colombier<a href="../src/gxpflat.c">src/gxpflat.c</a>,
7313ff48bf5SDavid du Colombier<a href="../src/gzpath.h">src/gzpath.h</a>.
7323ff48bf5SDavid du Colombier
7333ff48bf5SDavid du Colombier<dt>
7343ff48bf5SDavid du ColombierPath rendering:
7353ff48bf5SDavid du Colombier<dd>
7363ff48bf5SDavid du Colombier<a href="../src/gdevddrw.c">src/gdevddrw.c</a>,
737*593dc095SDavid du Colombier<a href="../src/gdevddrw.h">src/gdevddrw.h</a>,
738*593dc095SDavid du Colombier<a href="../src/gxdtfill.h">src/gxdtfill.h</a>,
7393ff48bf5SDavid du Colombier<a href="../src/gsdps1.c">src/gsdps1.c</a>,
7403ff48bf5SDavid du Colombier<a href="../src/gspaint.c">src/gspaint.c</a>,
7413ff48bf5SDavid du Colombier<a href="../src/gspaint.h">src/gspaint.h</a>,
7423ff48bf5SDavid du Colombier<a href="../src/gspenum.h">src/gspenum.h</a>,
7433ff48bf5SDavid du Colombier<a href="../src/gxfill.c">src/gxfill.c</a>,
744*593dc095SDavid du Colombier<a href="../src/gxfill.h">src/gxfill.h</a>,
745*593dc095SDavid du Colombier<a href="../src/gxfillsl.h">src/gxfills1.h</a>,
746*593dc095SDavid du Colombier<a href="../src/gxfilltr.h">src/gxfilltr.h</a>,
747*593dc095SDavid du Colombier<a href="../src/gxfillts.h">src/gxfillts.h</a>,
748*593dc095SDavid du Colombier<a href="../src/gxfdrop.c">src/gxdrop.c</a>,
749*593dc095SDavid du Colombier<a href="../src/gxfdrop.h">src/gxdrop.h</a>,
7503ff48bf5SDavid du Colombier<a href="../src/gxpaint.c">src/gxpaint.c</a>,
7513ff48bf5SDavid du Colombier<a href="../src/gxpaint.h">src/gxpaint.h</a>,
752*593dc095SDavid du Colombier<a href="../src/gxstroke.c">src/gxstroke.c</a>,
753*593dc095SDavid du Colombier<a href="../src/gzspotan.c">src/gzspotan.c</a>,
754*593dc095SDavid du Colombier<a href="../src/gzspotan.h">src/gzspotan.h</a>.
7553ff48bf5SDavid du Colombier
7563ff48bf5SDavid du Colombier<dt>
7573ff48bf5SDavid du ColombierClipping:
7583ff48bf5SDavid du Colombier<dd>
7593ff48bf5SDavid du ColombierSee under <a href="#Clipping">Clipping</a> below.
7603ff48bf5SDavid du Colombier
7613ff48bf5SDavid du Colombier</dl>
7623ff48bf5SDavid du Colombier
7633ff48bf5SDavid du Colombier<h4><a name="Text"></a>Text</h4>
7643ff48bf5SDavid du Colombier
7653ff48bf5SDavid du Colombier<dl>
7663ff48bf5SDavid du Colombier
7673ff48bf5SDavid du Colombier<dt>
7683ff48bf5SDavid du ColombierFonts, generic:
7693ff48bf5SDavid du Colombier<dd>
7703ff48bf5SDavid du Colombier<a href="../src/gsfont.c">src/gsfont.c</a>,
7713ff48bf5SDavid du Colombier<a href="../src/gsfont.h">src/gsfont.h</a>,
772*593dc095SDavid du Colombier<a href="../src/gxfcopy.c">src/gxfcopy.c</a>,
773*593dc095SDavid du Colombier<a href="../src/gxfcopy.h">src/gxfcopy.h</a>,
7743ff48bf5SDavid du Colombier<a href="../src/gxfont.h">src/gxfont.h</a>.
7753ff48bf5SDavid du Colombier
7763ff48bf5SDavid du Colombier<dt>
7773ff48bf5SDavid du ColombierFonts, specific FontTypes:
7783ff48bf5SDavid du Colombier<dd>
7793ff48bf5SDavid du Colombier<a href="../src/gsfcid.c">src/gsfcid.c</a>,
780*593dc095SDavid du Colombier<a href="../src/gsfcid2.c">src/gsfcid.c</a>,
7813ff48bf5SDavid du Colombier<a href="../src/gsfcmap.c">src/gsfcmap.c</a>,
782*593dc095SDavid du Colombier<a href="../src/gsfcmap1.c">src/gsfcmap1.c</a>,
7833ff48bf5SDavid du Colombier<a href="../src/gsfcmap.h">src/gsfcmap.h</a>,
7843ff48bf5SDavid du Colombier<a href="../src/gsfont0.c">src/gsfont0.c</a>,
785*593dc095SDavid du Colombier<a href="../src/gsfont0c.c">src/gsfont0.c</a>,
7863ff48bf5SDavid du Colombier<a href="../src/gxcid.h">src/gxcid.h</a>,
7873ff48bf5SDavid du Colombier<a href="../src/gxfcid.h">src/gxfcid.h</a>,
7883ff48bf5SDavid du Colombier<a href="../src/gxfcmap.h">src/gxfcmap.h</a>,
789*593dc095SDavid du Colombier<a href="../src/gxfcmap1.h">src/gxfcmap1.h</a>,
7903ff48bf5SDavid du Colombier<a href="../src/gxfont0.h">src/gxfont0.h</a>,
791*593dc095SDavid du Colombier<a href="../src/gxfont0c.h">src/gxfont0c.h</a>,
7923ff48bf5SDavid du Colombier<a href="../src/gxfont1.h">src/gxfont1.h</a>,
7933ff48bf5SDavid du Colombier<a href="../src/gxfont42.h">src/gxfont42.h</a>,
7943ff48bf5SDavid du Colombier<a href="../src/gxftype.h">src/gxftype.h</a>,
7953ff48bf5SDavid du Colombier<a href="../src/gxttf.h">src/gxttf.h</a>.
7963ff48bf5SDavid du Colombier
7973ff48bf5SDavid du Colombier<dt>
7983ff48bf5SDavid du ColombierCharacter rendering + font cache, generic:
7993ff48bf5SDavid du Colombier<dd>
8003ff48bf5SDavid du Colombier<a href="../src/gsccode.h">src/gsccode.h</a>,
8013ff48bf5SDavid du Colombier<a href="../src/gschar.c">src/gschar.c</a>,
8023ff48bf5SDavid du Colombier<a href="../src/gschar.h">src/gschar.h</a>,
8033ff48bf5SDavid du Colombier<a href="../src/gscpm.h">src/gscpm.h</a>,
804*593dc095SDavid du Colombier<a href="../src/gsgdata.c">src/gsgdata.c</a>,
805*593dc095SDavid du Colombier<a href="../src/gsgdata.h">src/gsgdata.h</a>,
806*593dc095SDavid du Colombier<a href="../src/gsgcache.c">src/gsgcache.c</a>,
807*593dc095SDavid du Colombier<a href="../src/gsgcache.h">src/gsgcache.h</a>,
8083ff48bf5SDavid du Colombier<a href="../src/gstext.c">src/gstext.c</a>,
8093ff48bf5SDavid du Colombier<a href="../src/gstext.h">src/gstext.h</a>,
8103ff48bf5SDavid du Colombier<a href="../src/gxbcache.c">src/gxbcache.c</a>,
8113ff48bf5SDavid du Colombier<a href="../src/gxbcache.h">src/gxbcache.h</a>,
8123ff48bf5SDavid du Colombier<a href="../src/gxccache.c">src/gxccache.c</a>,
8133ff48bf5SDavid du Colombier<a href="../src/gxccman.c">src/gxccman.c</a>,
8143ff48bf5SDavid du Colombier<a href="../src/gxchar.c">src/gxchar.c</a>,
8153ff48bf5SDavid du Colombier<a href="../src/gxchar.h">src/gxchar.h</a>,
8163ff48bf5SDavid du Colombier<a href="../src/gxfcache.h">src/gxfcache.h</a>,
8173ff48bf5SDavid du Colombier<a href="../src/gxtext.h">src/gxtext.h</a>.
8183ff48bf5SDavid du Colombier
8193ff48bf5SDavid du Colombier<dt>
8203ff48bf5SDavid du ColombierCharacter rendering, specific FontTypes:
8213ff48bf5SDavid du Colombier<dd>
8223ff48bf5SDavid du Colombier<a href="../src/gschar0.c">src/gschar0.c</a>,
8233ff48bf5SDavid du Colombier<a href="../src/gscrypt1.c">src/gscrypt1.c</a>,
8243ff48bf5SDavid du Colombier<a href="../src/gscrypt1.h">src/gscrypt1.h</a>,
8253ff48bf5SDavid du Colombier<a href="../src/gstype1.c">src/gstype1.c</a>,
8263ff48bf5SDavid du Colombier<a href="../src/gstype1.h">src/gstype1.h</a>,
8273ff48bf5SDavid du Colombier<a href="../src/gstype2.c">src/gstype2.c</a>,
8283ff48bf5SDavid du Colombier<a href="../src/gstype42.c">src/gstype42.c</a>,
8293ff48bf5SDavid du Colombier<a href="../src/gxchrout.c">src/gxchrout.c</a>,
8303ff48bf5SDavid du Colombier<a href="../src/gxchrout.h">src/gxchrout.h</a>,
8313ff48bf5SDavid du Colombier<a href="../src/gxhint1.c">src/gxhint1.c</a>,
8323ff48bf5SDavid du Colombier<a href="../src/gxhint2.c">src/gxhint2.c</a>,
8333ff48bf5SDavid du Colombier<a href="../src/gxhint3.c">src/gxhint3.c</a>,
834*593dc095SDavid du Colombier<a href="../src/gxhintn.h">src/gxhintn.h</a>,
835*593dc095SDavid du Colombier<a href="../src/gxhintn.c">src/gxhintn.c</a>,
8363ff48bf5SDavid du Colombier<a href="../src/gxop1.h">src/gxop1.h</a>,
8373ff48bf5SDavid du Colombier<a href="../src/gxtype1.c">src/gxtype1.c</a>,
8383ff48bf5SDavid du Colombier<a href="../src/gxtype1.h">src/gxtype1.h</a>.
8393ff48bf5SDavid du Colombier
8403ff48bf5SDavid du Colombier</dl>
8413ff48bf5SDavid du Colombier
8423ff48bf5SDavid du Colombier<h4><a name="Images"></a>Images</h4>
8433ff48bf5SDavid du Colombier
8443ff48bf5SDavid du Colombier<dl>
8453ff48bf5SDavid du Colombier
8463ff48bf5SDavid du Colombier<dt>
8473ff48bf5SDavid du ColombierBuffered API (mostly for PostScript interpreter):
8483ff48bf5SDavid du Colombier<dd>
8493ff48bf5SDavid du Colombier<a href="../src/gsimage.c">src/gsimage.c</a>,
8503ff48bf5SDavid du Colombier<a href="../src/gsimage.h">src/gsimage.h</a>.
8513ff48bf5SDavid du Colombier
8523ff48bf5SDavid du Colombier<dt>
8533ff48bf5SDavid du ColombierGeneric support:
8543ff48bf5SDavid du Colombier<dd>
8553ff48bf5SDavid du Colombier<a href="../src/gsiparam.h">src/gsiparam.h</a>,
8563ff48bf5SDavid du Colombier<a href="../src/gxiclass.h">src/gxiclass.h</a>,
8573ff48bf5SDavid du Colombier<a href="../src/gximage.c">src/gximage.c</a>,
8583ff48bf5SDavid du Colombier<a href="../src/gximage.h">src/gximage.h</a>,
8593ff48bf5SDavid du Colombier<a href="../src/gxiparam.h">src/gxiparam.h</a>.
8603ff48bf5SDavid du Colombier
8613ff48bf5SDavid du Colombier<dt>
8623ff48bf5SDavid du ColombierType 1 and 4 images:
8633ff48bf5SDavid du Colombier<dd>
8643ff48bf5SDavid du Colombier
8653ff48bf5SDavid du Colombier<dl>
8663ff48bf5SDavid du Colombier
8673ff48bf5SDavid du Colombier<dt>
8683ff48bf5SDavid du ColombierSetup:
8693ff48bf5SDavid du Colombier<dd>
8703ff48bf5SDavid du Colombier<a href="../src/gsiparm4.h">src/gsiparm4.h</a>,
8713ff48bf5SDavid du Colombier<a href="../src/gximage1.c">src/gximage1.c</a>,
8723ff48bf5SDavid du Colombier<a href="../src/gximage4.c">src/gximage4.c</a>.
8733ff48bf5SDavid du Colombier
8743ff48bf5SDavid du Colombier<dt>
8753ff48bf5SDavid du ColombierRendering:
8763ff48bf5SDavid du Colombier<dd>
8773ff48bf5SDavid du Colombier<a href="../src/gxi12bit.c">src/gxi12bit.c</a>,
878*593dc095SDavid du Colombier<a href="../src/gxi16bit.c">src/gxi16bit.c</a>,
8793ff48bf5SDavid du Colombier<a href="../src/gxicolor.c">src/gxicolor.c</a>,
8803ff48bf5SDavid du Colombier<a href="../src/gxidata.c">src/gxidata.c</a>,
8813ff48bf5SDavid du Colombier<a href="../src/gxifast.c">src/gxifast.c</a>,
8823ff48bf5SDavid du Colombier<a href="../src/gximono.c">src/gximono.c</a>,
8833ff48bf5SDavid du Colombier<a href="../src/gxino12b.c">src/gxino12b.c</a>,
884*593dc095SDavid du Colombier<a href="../src/gxino16b.c">src/gxino16b.c</a>,
8853ff48bf5SDavid du Colombier<a href="../src/gxipixel.c">src/gxipixel.c</a>,
8863ff48bf5SDavid du Colombier<a href="../src/gxiscale.c">src/gxiscale.c</a>.
8873ff48bf5SDavid du Colombier
8883ff48bf5SDavid du Colombier</dl>
8893ff48bf5SDavid du Colombier
8903ff48bf5SDavid du Colombier<dt>
8913ff48bf5SDavid du ColombierType 2 images (Display PostScript):
8923ff48bf5SDavid du Colombier<dd>
8933ff48bf5SDavid du Colombier<a href="../src/gsiparm2.h">src/gsiparm2.h</a>,
8943ff48bf5SDavid du Colombier<a href="../src/gximage2.c">src/gximage2.c</a>.
8953ff48bf5SDavid du Colombier
8963ff48bf5SDavid du Colombier<dt>
8973ff48bf5SDavid du ColombierType 3 images:
8983ff48bf5SDavid du Colombier<dd>
8993ff48bf5SDavid du Colombier<a href="../src/gsipar3x.h">src/gsipar3x.h</a>,
9003ff48bf5SDavid du Colombier<a href="../src/gsiparm3.h">src/gsiparm3.h</a>,
9013ff48bf5SDavid du Colombier<a href="../src/gximag3x.c">src/gximag3x.c</a>,
9023ff48bf5SDavid du Colombier<a href="../src/gximag3x.h">src/gximag3x.h</a>,
9033ff48bf5SDavid du Colombier<a href="../src/gximage3.c">src/gximage3.c</a>,
9043ff48bf5SDavid du Colombier<a href="../src/gximage3.h">src/gximage3.h</a>.
9053ff48bf5SDavid du Colombier
9063ff48bf5SDavid du Colombier<dt>
9073ff48bf5SDavid du ColombierOther:
9083ff48bf5SDavid du Colombier<dd>
9093ff48bf5SDavid du Colombier<a href="../src/gsimpath.c">src/gsimpath.c</a>.
9103ff48bf5SDavid du Colombier
9113ff48bf5SDavid du Colombier</dl>
9123ff48bf5SDavid du Colombier
9133ff48bf5SDavid du Colombier<h4><a name="Paint"></a>Paint</h4>
9143ff48bf5SDavid du Colombier
9153ff48bf5SDavid du Colombier<p>
9163ff48bf5SDavid du ColombierGhostscript uses 4 internal representations of color.  We list them here in
9173ff48bf5SDavid du Colombierthe order in which they occur in the rendering pipeline.
9183ff48bf5SDavid du Colombier
9193ff48bf5SDavid du Colombier<ol>
9203ff48bf5SDavid du Colombier
9213ff48bf5SDavid du Colombier<li>Clients of the graphics library normally specify colors using the
9223ff48bf5SDavid du Colombier<em>client color</em> structure (<b><tt>gs_client_color</tt></b>, defined in
9233ff48bf5SDavid du Colombier<a href="../src/gsccolor.h">src/gsccolor.h</a>), consisting of one or more
9243ff48bf5SDavid du Colombiernumeric values and/or a pointer to a Pattern instance.  This corresponds
9253ff48bf5SDavid du Colombierdirectly to the values that would be passed to the PostScript
9263ff48bf5SDavid du Colombier<b><tt>setcolor</tt></b> operator: one or more (floating-point) numeric
9273ff48bf5SDavid du Colombiercomponents and/or a Pattern.  Client colors are interpreted relative to a
9283ff48bf5SDavid du Colombiercolor space (<b><tt>gs_color_space</tt></b>, defined in <a
9293ff48bf5SDavid du Colombierhref="../src/gscspace.h">src/gscspace.h</a> and <a
9303ff48bf5SDavid du Colombierhref="../src/gxcspace.h">src/gxcspace.h</a>, with specific color spaces
9313ff48bf5SDavid du Colombierdefined in other files).  Client colors do not explicitly reference the
9323ff48bf5SDavid du Colombiercolor space in which they are are interpreted: <b><tt>setcolor</tt></b> uses
9333ff48bf5SDavid du Colombierthe color space in the graphics state, while images and shadings explicitly
9343ff48bf5SDavid du Colombierspecify the color space to be used.
9353ff48bf5SDavid du Colombier
9363ff48bf5SDavid du Colombier<li>For ordinary non-Pattern colors, the first step in color rendering
9373ff48bf5SDavid du Colombierreduces a client color to a <em>concrete</em> color -- a set of values in a
9383ff48bf5SDavid du Colombiercolor space that corresponds to the device's color model (except for
9393ff48bf5SDavid du Colombierpossible conversions between DeviceGray, DeviceRGB, and DeviceCMYK),
9403ff48bf5SDavid du Colombiertogether with an identification of the associated color space.  (The
9413ff48bf5SDavid du Colombierconfusion here between color spaces and color models will have to be cleaned
9423ff48bf5SDavid du Colombierup when we implement native Separation/DeviceN colors.)  Concrete colors are
9433ff48bf5SDavid du Colombierlike the numeric values in a client color, except that they are represented
9443ff48bf5SDavid du Colombierby arrays of <b><tt>frac</tt></b> values (defined in <a
9453ff48bf5SDavid du Colombierhref="../src/gxfrac.h">src/gxfrac.h</a>) rather than floats.  The procedure
9463ff48bf5SDavid du Colombierfor this step is the virtual <b><tt>concretize_color</tt></b> and
9473ff48bf5SDavid du Colombier<b><tt>concrete_space</tt></b> procedures in the (original) color space.
9483ff48bf5SDavid du ColombierThis step reduces Indexed colors, CIEBased colors, and Separation and
9493ff48bf5SDavid du ColombierDeviceN colors that use the alternate space.
9503ff48bf5SDavid du Colombier
9513ff48bf5SDavid du Colombier<li>The final step requires mapping a concrete color to the device's color
9523ff48bf5SDavid du Colombiermodel, done by procedures in <a href="../src/gxcmap.c">src/gxcmap.c</a>.
9533ff48bf5SDavid du ColombierThese procedures combine the following three conceptual sub-steps:
9543ff48bf5SDavid du Colombier
9553ff48bf5SDavid du Colombier<ul>
9563ff48bf5SDavid du Colombier
9573ff48bf5SDavid du Colombier<li>A possible mapping between Device color spaces, possibly involving black
9583ff48bf5SDavid du Colombiergeneration and undercolor removal.  The non-trivial cases are implemented in
9593ff48bf5SDavid du Colombier<a href="../src/gxdcconv.c">src/gxdcconv.c</a>.
9603ff48bf5SDavid du Colombier
9613ff48bf5SDavid du Colombier<li>Application of the transfer function(s) (done in-line).
9623ff48bf5SDavid du Colombier
9633ff48bf5SDavid du Colombier<li>Halftoning if necessary: see below.
9643ff48bf5SDavid du Colombier
9653ff48bf5SDavid du Colombier</ul>
9663ff48bf5SDavid du Colombier
9673ff48bf5SDavid du ColombierThe result is called (inappropriately) a <em>device color</em>
9683ff48bf5SDavid du Colombier(<b><tt>gx_device_color</tt></b>, defined in <a
9693ff48bf5SDavid du Colombierhref="../src/gsdcolor.h">src/gsdcolor.h</a> and <a
9703ff48bf5SDavid du Colombierhref="../src/gxdcolor.h">src/gxdcolor.h</a>).  For ordinary non-Pattern
9713ff48bf5SDavid du Colombiercolors, a device color is either a pure color, or a halftone.  The device
9723ff48bf5SDavid du Colombierand color model associated with a device color are implicit.  The procedure
9733ff48bf5SDavid du Colombierfor this step is the virtual <b><tt>remap_concrete_color</tt></b> procedure
9743ff48bf5SDavid du Colombierin the color space.
9753ff48bf5SDavid du Colombier
9763ff48bf5SDavid du Colombier<li>The pure colors that underlie a device color are opaque <em>pixel
9773ff48bf5SDavid du Colombiervalues</em> defined by the device (misnamed <b><tt>gx_color_index</tt></b>,
9783ff48bf5SDavid du Colombierdefined in <a href="../src/gscindex.h">src/gscindex.h</a>).  The device with
9793ff48bf5SDavid du Colombierwhich they are associated is implicit.  Although the format and
9803ff48bf5SDavid du Colombierinterpretation of a pixel value are known only to the device, the device's
9813ff48bf5SDavid du Colombiercolor model and color representation capabilities are public, defined by a
9823ff48bf5SDavid du Colombier<b><tt>gx_color_info</tt></b> structure stored in the device (defined in <a
9833ff48bf5SDavid du Colombierhref="../src/gxdevcli.h">src/gxdevcli.h</a>).  Virtual procedures of the
9843ff48bf5SDavid du Colombierdevice driver map between pixel values and RGB or CMYK.  (This area is
9853ff48bf5SDavid du Colombieruntidy and will need to be cleaned up when we implement native
9863ff48bf5SDavid du ColombierSeparation/DeviceN colors.)
9873ff48bf5SDavid du Colombier
9883ff48bf5SDavid du Colombier</ol>
9893ff48bf5SDavid du Colombier
9903ff48bf5SDavid du Colombier<p>
9913ff48bf5SDavid du ColombierSteps 2 and 3 are normally combined into a single step for efficiency, as
9923ff48bf5SDavid du Colombierthe <b><tt>remap_color</tt></b> virtual procedure in a color space.
9933ff48bf5SDavid du Colombier
9943ff48bf5SDavid du Colombier<p>
9953ff48bf5SDavid du ColombierUsing a device color to actually paint pixels requires a further step called
9963ff48bf5SDavid du Colombier<em>color loading</em>, implemented by the <b><tt>load</tt></b> virtual
9973ff48bf5SDavid du Colombierprocedure in the device color.  This does nothing for pure colors, but loads
9983ff48bf5SDavid du Colombierthe caches for halftones and Patterns.
9993ff48bf5SDavid du Colombier
10003ff48bf5SDavid du Colombier<p>
10013ff48bf5SDavid du ColombierAll of the above steps -- concretizing, mapping to a device color, and color
10023ff48bf5SDavid du Colombierloading -- are done as late as possible, normally not until the color is
10033ff48bf5SDavid du Colombieractually needed for painting.
10043ff48bf5SDavid du Colombier
10053ff48bf5SDavid du Colombier<p>
10063ff48bf5SDavid du ColombierAll painting operations (fill, stroke, imagemask/show) eventually call a
10073ff48bf5SDavid du Colombiervirtual procedure in the device color, either <b><tt>fill_rectangle</tt></b>
10083ff48bf5SDavid du Colombieror <b><tt>fill_mask</tt></b> to actually paint pixels.  For rectangle fills,
10093ff48bf5SDavid du Colombierpure colors call the device's <b><tt>fill_rectangle</tt></b> procedure;
10103ff48bf5SDavid du Colombierhalftones and tiled Patterns call the device's
10113ff48bf5SDavid du Colombier<b><tt>tile_rectangle</tt></b>; shaded Patterns, and painting operations
10123ff48bf5SDavid du Colombierthat involve a RasterOp, do something more complicated.
10133ff48bf5SDavid du Colombier
10143ff48bf5SDavid du Colombier<dl>
10153ff48bf5SDavid du Colombier
10163ff48bf5SDavid du Colombier<dt>
10173ff48bf5SDavid du ColombierColor specification:
10183ff48bf5SDavid du Colombier<dd>
10193ff48bf5SDavid du Colombier<a href="../src/gsccolor.h">src/gsccolor.h</a>,
10203ff48bf5SDavid du Colombier<a href="../src/gscolor.c">src/gscolor.c</a>,
10213ff48bf5SDavid du Colombier<a href="../src/gscolor.h">src/gscolor.h</a>,
10223ff48bf5SDavid du Colombier<a href="../src/gscolor1.c">src/gscolor1.c</a>,
10233ff48bf5SDavid du Colombier<a href="../src/gscolor1.h">src/gscolor1.h</a>,
10243ff48bf5SDavid du Colombier<a href="../src/gscolor2.c">src/gscolor2.c</a>,
10253ff48bf5SDavid du Colombier<a href="../src/gscolor2.h">src/gscolor2.h</a>,
10263ff48bf5SDavid du Colombier<a href="../src/gscolor3.c">src/gscolor3.c</a>,
10273ff48bf5SDavid du Colombier<a href="../src/gscolor3.h">src/gscolor3.h</a>,
10283ff48bf5SDavid du Colombier<a href="../src/gshsb.c">src/gshsb.c</a>,
10293ff48bf5SDavid du Colombier<a href="../src/gshsb.h">src/gshsb.h</a>,
10303ff48bf5SDavid du Colombier<a href="../src/gxcolor2.h">src/gxcolor2.h</a>,
10313ff48bf5SDavid du Colombier<a href="../src/gxcvalue.h">src/gxcvalue.h</a>.
10323ff48bf5SDavid du Colombier
10333ff48bf5SDavid du Colombier<dt>
10343ff48bf5SDavid du ColombierColor spaces:
10353ff48bf5SDavid du Colombier<dd>
10363ff48bf5SDavid du Colombier<a href="../src/gscdevn.c">src/gscdevn.c</a>,
10373ff48bf5SDavid du Colombier<a href="../src/gscdevn.h">src/gscdevn.h</a>,
10383ff48bf5SDavid du Colombier<a href="../src/gscie.c">src/gscie.c</a>,
10393ff48bf5SDavid du Colombier<a href="../src/gscie.h">src/gscie.h</a>,
10403ff48bf5SDavid du Colombier<a href="../src/gscpixel.c">src/gscpixel.c</a>,
10413ff48bf5SDavid du Colombier<a href="../src/gscpixel.h">src/gscpixel.h</a>,
10423ff48bf5SDavid du Colombier<a href="../src/gscscie.c">src/gscscie.c</a>,
10433ff48bf5SDavid du Colombier<a href="../src/gscsepnm.h">src/gscsepnm.h</a>,
10443ff48bf5SDavid du Colombier<a href="../src/gscsepr.c">src/gscsepr.c</a>,
10453ff48bf5SDavid du Colombier<a href="../src/gscsepr.h">src/gscsepr.h</a>,
10463ff48bf5SDavid du Colombier<a href="../src/gscspace.c">src/gscspace.c</a>,
10473ff48bf5SDavid du Colombier<a href="../src/gscspace.h">src/gscspace.h</a>,
10483ff48bf5SDavid du Colombier<a href="../src/gscssub.c">src/gscssub.c</a>,
10493ff48bf5SDavid du Colombier<a href="../src/gscssub.h">src/gscssub.h</a>,
10503ff48bf5SDavid du Colombier<a href="../src/gxcdevn.h">src/gxcdevn.h</a>,
10513ff48bf5SDavid du Colombier<a href="../src/gxcie.h">src/gxcie.h</a>,
10523ff48bf5SDavid du Colombier<a href="../src/gxcspace.h">src/gxcspace.h</a>.
10533ff48bf5SDavid du Colombier
10543ff48bf5SDavid du Colombier<dt>
10553ff48bf5SDavid du ColombierColor mapping:
10563ff48bf5SDavid du Colombier<dd>
10573ff48bf5SDavid du Colombier<a href="../src/gsciemap.c">src/gsciemap.c</a>,
10583ff48bf5SDavid du Colombier<a href="../src/gscindex.h">src/gscindex.h</a>,
10593ff48bf5SDavid du Colombier<a href="../src/gscrd.c">src/gscrd.c</a>,
10603ff48bf5SDavid du Colombier<a href="../src/gscrd.h">src/gscrd.h</a>,
10613ff48bf5SDavid du Colombier<a href="../src/gscrdp.c">src/gscrdp.c</a>,
10623ff48bf5SDavid du Colombier<a href="../src/gscrdp.h">src/gscrdp.h</a>,
10633ff48bf5SDavid du Colombier<a href="../src/gscsel.h">src/gscsel.h</a>,
10643ff48bf5SDavid du Colombier<a href="../src/gsdcolor.h">src/gsdcolor.h</a>,
10653ff48bf5SDavid du Colombier<a href="../src/gxcindex.h">src/gxcindex.h</a>,
10663ff48bf5SDavid du Colombier<a href="../src/gxcmap.c">src/gxcmap.c</a>,
10673ff48bf5SDavid du Colombier<a href="../src/gxcmap.h">src/gxcmap.h</a>,
10683ff48bf5SDavid du Colombier<a href="../src/gxctable.c">src/gxctable.c</a>,
10693ff48bf5SDavid du Colombier<a href="../src/gxctable.h">src/gxctable.h</a>,
10703ff48bf5SDavid du Colombier<a href="../src/gxdcconv.c">src/gxdcconv.c</a>,
10713ff48bf5SDavid du Colombier<a href="../src/gxdcconv.h">src/gxdcconv.h</a>,
10723ff48bf5SDavid du Colombier<a href="../src/gxdcolor.c">src/gxdcolor.c</a>,
10733ff48bf5SDavid du Colombier<a href="../src/gxdcolor.h">src/gxdcolor.h</a>,
1074*593dc095SDavid du Colombier<a href="../src/gxdevndi.c">src/gevndi.c</a>,
1075*593dc095SDavid du Colombier<a href="../src/gxdevndi.h">src/gxdevndi.h</a>,
10763ff48bf5SDavid du Colombier<a href="../src/gxdither.h">src/gxdither.h</a>,
10773ff48bf5SDavid du Colombier<a href="../src/gxfmap.h">src/gxfmap.h</a>,
10783ff48bf5SDavid du Colombier<a href="../src/gxlum.h">src/gxlum.h</a>,
10793ff48bf5SDavid du Colombier<a href="../src/gxtmap.h">src/gxtmap.h</a>.
10803ff48bf5SDavid du Colombier
10813ff48bf5SDavid du Colombier<p>
10823ff48bf5SDavid du ColombierICC profiles are in some ways a special case of color mapping, but are
10833ff48bf5SDavid du Colombiernot standard in PostScript.
10843ff48bf5SDavid du Colombier
10853ff48bf5SDavid du Colombier<dt>
10863ff48bf5SDavid du ColombierColor mapping:
10873ff48bf5SDavid du Colombier<dd>
10883ff48bf5SDavid du Colombier<a href="../src/gsicc.c">src/gsicc.c</a>,
10893ff48bf5SDavid du Colombier<a href="../src/gsicc.h">src/gsicc.h</a>,
10903ff48bf5SDavid du Colombier
10913ff48bf5SDavid du Colombier</dl>
10923ff48bf5SDavid du Colombier
10933ff48bf5SDavid du Colombier<p>
10943ff48bf5SDavid du ColombierGhostscript represents halftones internally by "whitening orders" --
10953ff48bf5SDavid du Colombieressentially, arrays of arrays of bit coordinates within a halftone cell,
10963ff48bf5SDavid du Colombierspecifying which bits are inverted to get from halftone level K to level
10973ff48bf5SDavid du ColombierK+1.  The code does support all of the PostScript halftone types, but they
10983ff48bf5SDavid du Colombierare all ultimately reduced to whitening orders.
10993ff48bf5SDavid du Colombier
11003ff48bf5SDavid du Colombier<p>
11013ff48bf5SDavid du ColombierThreshold arrays, the more conventional representation of halftones, can be
11023ff48bf5SDavid du Colombiermapped to whitening orders straightforwardly; however, whitening orders can
11033ff48bf5SDavid du Colombierrepresent non-monotonic halftones (halftones where the bits turned on for
11043ff48bf5SDavid du Colombierlevel K+1 don't necessarily include all the bits turned on for level K),
11053ff48bf5SDavid du Colombierwhile threshold arrays cannot.  On the other hand, threshold arrays allow
11063ff48bf5SDavid du Colombierrapid conversion of images (using a threshold comparison for each pixel)
11073ff48bf5SDavid du Colombierwith no additional space, while whitening orders do not: they require
11083ff48bf5SDavid du Colombierstoring the rendered halftone cell for each possible level as a bitmap.
11093ff48bf5SDavid du Colombier
11103ff48bf5SDavid du Colombier<p>
11113ff48bf5SDavid du ColombierGhostscript uses two distinct types of rendered halftones -- that is, the
11123ff48bf5SDavid du Colombierbitmap(s) that represent a particular level.
11133ff48bf5SDavid du Colombier
11143ff48bf5SDavid du Colombier<ul>
11153ff48bf5SDavid du Colombier
11163ff48bf5SDavid du Colombier<li>Binary halftones.  The rendered halftone is a single bit plane; each bit
11173ff48bf5SDavid du Colombierselects one of two pure colors.  These are fast but limited: they are used
11183ff48bf5SDavid du Colombierfor monochrome output devices, or for color devices in those cases where
11193ff48bf5SDavid du Colombieronly two distinct colors are involved in a halftone (e.g., a pure cyan shade
11203ff48bf5SDavid du Colombieron a CMYK device).  The device color for a binary halftone stores a pointer
11213ff48bf5SDavid du Colombierto the halftone bitmap, and the two pure colors.
11223ff48bf5SDavid du Colombier
11233ff48bf5SDavid du Colombier<li>Multi-plane halftones.  Internally, each plane is rendered individually.
11243ff48bf5SDavid du ColombierSince there isn't enough room to store all 2^N pure colors, multi-plane
11253ff48bf5SDavid du Colombierhalftones only store the scaled values for the individual components; the
11263ff48bf5SDavid du Colombierhalftone renderer maps these to the pure colors on the fly, then combines
11273ff48bf5SDavid du Colombierthe planes to assemble an N-bit index into the list of colors for each
11283ff48bf5SDavid du Colombierpixel, and stores the color into the fully rendered halftone.
11293ff48bf5SDavid du Colombier
11303ff48bf5SDavid du Colombier</ul>
11313ff48bf5SDavid du Colombier
11323ff48bf5SDavid du Colombier<p>
11333ff48bf5SDavid du ColombierThe halftone level for rendering a color is computed in <a
1134*593dc095SDavid du Colombierhref="../src/gxdevndi.c">src/gxdevndi.c</a>; the actual halftone mask or
11353ff48bf5SDavid du Colombiertile is computed either in <a href="../src/gxcht.c">src/gxcht.c</a> (for
11363ff48bf5SDavid du Colombiermulti-plane halftones), or in <a href="../src/gxht.c">src/gxht.c</a> and <a
11373ff48bf5SDavid du Colombierhref="../src/gxhtbit.c">src/gxhtbit.c</a> (for binary halftones).
11383ff48bf5SDavid du Colombier
11393ff48bf5SDavid du Colombier<dl>
11403ff48bf5SDavid du Colombier
11413ff48bf5SDavid du Colombier<dt>
11423ff48bf5SDavid du ColombierHalftoning:
11433ff48bf5SDavid du Colombier<dd>
11443ff48bf5SDavid du Colombier<a href="../src/gsht.c">src/gsht.c</a>,
11453ff48bf5SDavid du Colombier<a href="../src/gsht.h">src/gsht.h</a>,
11463ff48bf5SDavid du Colombier<a href="../src/gsht1.c">src/gsht1.c</a>,
11473ff48bf5SDavid du Colombier<a href="../src/gsht1.h">src/gsht1.h</a>,
11483ff48bf5SDavid du Colombier<a href="../src/gshtscr.c">src/gshtscr.c</a>,
11493ff48bf5SDavid du Colombier<a href="../src/gshtx.c">src/gshtx.c</a>,
11503ff48bf5SDavid du Colombier<a href="../src/gshtx.h">src/gshtx.h</a>,
11513ff48bf5SDavid du Colombier<a href="../src/gxcht.c">src/gxcht.c</a>,
11523ff48bf5SDavid du Colombier<a href="../src/gxdht.h">src/gxdht.h</a>,
11533ff48bf5SDavid du Colombier<a href="../src/gxdhtres.h">src/gxdhtres.h</a>,
11543ff48bf5SDavid du Colombier<a href="../src/gxht.c">src/gxht.c</a>,
11553ff48bf5SDavid du Colombier<a href="../src/gxht.h">src/gxht.h</a>,
11563ff48bf5SDavid du Colombier<a href="../src/gxhtbit.c">src/gxhtbit.c</a>,
11573ff48bf5SDavid du Colombier<a href="../src/gxhttile.h">src/gxhttile.h</a>,
11583ff48bf5SDavid du Colombier<a href="../src/gxhttype.h">src/gxhttype.h</a>,
11593ff48bf5SDavid du Colombier<a href="../src/gzht.h">src/gzht.h</a>.
11603ff48bf5SDavid du Colombier
1161*593dc095SDavid du Colombier<dt>
1162*593dc095SDavid du ColombierWell tempered screening:
1163*593dc095SDavid du Colombier<dd>
1164*593dc095SDavid du Colombier<a href="../src/gswts.h">src/gswts.h</a>,
1165*593dc095SDavid du Colombier<a href="../src/gswts.c">src/gswts.c</a>,
1166*593dc095SDavid du Colombier<a href="../src/gxwts.h">src/gxwts.h</a>,
1167*593dc095SDavid du Colombier<a href="../src/gxwts.c">src/gxwts.c</a>.
1168*593dc095SDavid du Colombier
11693ff48bf5SDavid du Colombier</dl>
11703ff48bf5SDavid du Colombier
11713ff48bf5SDavid du Colombier<p>
11723ff48bf5SDavid du ColombierPattern colors (tiled patterns and shadings) each use a slightly different
11733ff48bf5SDavid du Colombierapproach from solid colors.
11743ff48bf5SDavid du Colombier
11753ff48bf5SDavid du Colombier<p>
11763ff48bf5SDavid du ColombierThe device color for a tiled (PatternType 1) pattern contains a pointer to a
11773ff48bf5SDavid du Colombierpattern instance, plus (for uncolored patterns) the device color to be
11783ff48bf5SDavid du Colombiermasked.  The pattern instance includes a procedure that actually paints the
11793ff48bf5SDavid du Colombierpattern if the pattern is not in the cache.  For the PostScript interpreter,
11803ff48bf5SDavid du Colombierthis procedure returns an <b><tt>e_RemapColor</tt></b> exception code: this
11813ff48bf5SDavid du Colombiereventually causes the interpreter to run the pattern's PaintProc, loading
11823ff48bf5SDavid du Colombierthe rendering into the cache, and then re-execute the original drawing
11833ff48bf5SDavid du Colombieroperator.
11843ff48bf5SDavid du Colombier
11853ff48bf5SDavid du Colombier<dl>
11863ff48bf5SDavid du Colombier
11873ff48bf5SDavid du Colombier<dt>
11883ff48bf5SDavid du ColombierPatterns:
11893ff48bf5SDavid du Colombier<dd>
11903ff48bf5SDavid du Colombier<a href="../src/gspcolor.c">src/gspcolor.c</a>,
11913ff48bf5SDavid du Colombier<a href="../src/gspcolor.h">src/gspcolor.h</a>,
11923ff48bf5SDavid du Colombier<a href="../src/gsptype1.c">src/gsptype1.c</a>,
11933ff48bf5SDavid du Colombier<a href="../src/gsptype1.h">src/gsptype1.h</a>,
11943ff48bf5SDavid du Colombier<a href="../src/gxp1fill.c">src/gxp1fill.c</a>,
11953ff48bf5SDavid du Colombier<a href="../src/gxp1impl.h">src/gxp1impl.h</a>,
11963ff48bf5SDavid du Colombier<a href="../src/gxpcache.h">src/gxpcache.h</a>,
11973ff48bf5SDavid du Colombier<a href="../src/gxpcmap.c">src/gxpcmap.c</a>,
11983ff48bf5SDavid du Colombier<a href="../src/gxpcolor.h">src/gxpcolor.h</a>.
11993ff48bf5SDavid du Colombier
12003ff48bf5SDavid du Colombier</dl>
12013ff48bf5SDavid du Colombier
12023ff48bf5SDavid du Colombier<p>
12033ff48bf5SDavid du ColombierThe device color for a shading (PatternType 2) pattern also contains a
12043ff48bf5SDavid du Colombierpointer to a pattern instance.  Shadings are not cached: painting with a
12053ff48bf5SDavid du Colombiershading runs the shading algorithm every time.
12063ff48bf5SDavid du Colombier
12073ff48bf5SDavid du Colombier<dl>
12083ff48bf5SDavid du Colombier
12093ff48bf5SDavid du Colombier<dt>
12103ff48bf5SDavid du ColombierShading:
12113ff48bf5SDavid du Colombier<dd>
12123ff48bf5SDavid du Colombier<a href="../src/gsptype2.c">src/gsptype2.c</a>,
12133ff48bf5SDavid du Colombier<a href="../src/gsptype2.h">src/gsptype2.h</a>,
12143ff48bf5SDavid du Colombier<a href="../src/gsshade.c">src/gsshade.c</a>,
12153ff48bf5SDavid du Colombier<a href="../src/gsshade.h">src/gsshade.h</a>,
12163ff48bf5SDavid du Colombier<a href="../src/gxshade.c">src/gxshade.c</a>,
12173ff48bf5SDavid du Colombier<a href="../src/gxshade.h">src/gxshade.h</a>,
12183ff48bf5SDavid du Colombier<a href="../src/gxshade1.c">src/gxshade1.c</a>,
12193ff48bf5SDavid du Colombier<a href="../src/gxshade4.c">src/gxshade4.c</a>,
12203ff48bf5SDavid du Colombier<a href="../src/gxshade4.h">src/gxshade4.h</a>,
12213ff48bf5SDavid du Colombier<a href="../src/gxshade6.c">src/gxshade6.c</a>.
12223ff48bf5SDavid du Colombier
12233ff48bf5SDavid du Colombier</dl>
12243ff48bf5SDavid du Colombier
1225*593dc095SDavid du Colombier<p> In addition to the PostScript graphics model, Ghostscript supports RasterOp,
1226*593dc095SDavid du Colombier  a weak form of alpha channel, and eventually the full PDF 1.4 transparency model.
1227*593dc095SDavid du Colombier  The implemention of these facilities is quite slipshod and scattered: only RasterOp
1228*593dc095SDavid du Colombier  is really implemented fully. There is a general compositing architecture, but
1229*593dc095SDavid du Colombier  it is hardly used at all, and in particular is not used for RasterOp. It is
1230*593dc095SDavid du Colombier  used for implementation of the general support for overprint and overprint mode.
12313ff48bf5SDavid du Colombier<dl>
12323ff48bf5SDavid du Colombier
12333ff48bf5SDavid du Colombier<dt>
12343ff48bf5SDavid du ColombierCompositing architecture:
12353ff48bf5SDavid du Colombier<dd>
12363ff48bf5SDavid du Colombier<a href="../src/gscompt.h">src/gscompt.h</a>,
12373ff48bf5SDavid du Colombier<a href="../src/gxcomp.h">src/gxcomp.h</a>.
12383ff48bf5SDavid du Colombier
12393ff48bf5SDavid du Colombier<dt>
12403ff48bf5SDavid du ColombierRasterOp:
12413ff48bf5SDavid du Colombier<dd>
12423ff48bf5SDavid du Colombier<a href="../src/gdevdrop.c">src/gdevdrop.c</a>,
12433ff48bf5SDavid du Colombier<a href="../src/gdevrops.c">src/gdevrops.c</a>,
12443ff48bf5SDavid du Colombier<a href="../src/gsnorop.c">src/gsnorop.c</a>,
12453ff48bf5SDavid du Colombier<a href="../src/gsrop.c">src/gsrop.c</a>,
12463ff48bf5SDavid du Colombier<a href="../src/gsrop.h">src/gsrop.h</a>,
12473ff48bf5SDavid du Colombier<a href="../src/gsropc.c">src/gsropc.c</a>,
12483ff48bf5SDavid du Colombier<a href="../src/gsropc.h">src/gsropc.h</a>,
12493ff48bf5SDavid du Colombier<a href="../src/gsropt.h">src/gsropt.h</a>,
12503ff48bf5SDavid du Colombier<a href="../src/gsroptab.c">src/gsroptab.c</a>,
12513ff48bf5SDavid du Colombier<a href="../src/gxdevrop.h">src/gxdevrop.h</a>,
12523ff48bf5SDavid du Colombier<a href="../src/gxropc.h">src/gxropc.h</a>.
12533ff48bf5SDavid du Colombier
12543ff48bf5SDavid du Colombier<dt>
12553ff48bf5SDavid du ColombierAlpha channel and compositing:
12563ff48bf5SDavid du Colombier<dd>
12573ff48bf5SDavid du Colombier<a href="../src/gsalpha.c">src/gsalpha.c</a>,
12583ff48bf5SDavid du Colombier<a href="../src/gsalpha.h">src/gsalpha.h</a>,
12593ff48bf5SDavid du Colombier<a href="../src/gsalphac.c">src/gsalphac.c</a>,
12603ff48bf5SDavid du Colombier<a href="../src/gsalphac.h">src/gsalphac.h</a>,
12613ff48bf5SDavid du Colombier<a href="../src/gsdpnext.h">src/gsdpnext.h</a>,
12623ff48bf5SDavid du Colombier<a href="../src/gxalpha.h">src/gxalpha.h</a>.
12633ff48bf5SDavid du Colombier
12643ff48bf5SDavid du Colombier<dt>
12653ff48bf5SDavid du ColombierAdvanced transparency:
12663ff48bf5SDavid du Colombier<dd>
12673ff48bf5SDavid du Colombier<a href="../src/gstparam.h">src/gstparam.h</a>,
12683ff48bf5SDavid du Colombier<a href="../src/gstrans.c">src/gstrans.c</a>,
12693ff48bf5SDavid du Colombier<a href="../src/gstrans.h">src/gstrans.h</a>,
12703ff48bf5SDavid du Colombier<a href="../src/gxblend.c">src/gxblend.c</a>,
12713ff48bf5SDavid du Colombier<a href="../src/gxblend.h">src/gxblend.h</a>,
1272*593dc095SDavid du Colombier<a href="../src/gdevp14.c">src/gdevp14.c</a>,
1273*593dc095SDavid du Colombier<a href="../src/gdevp14.h">src/gdevp14.h</a>,
12743ff48bf5SDavid du Colombier<a href="../src/gdevpnga.c">src/gdevpnga.c</a>.
12753ff48bf5SDavid du Colombier
1276*593dc095SDavid du Colombier<dt>
1277*593dc095SDavid du ColombierOverprint and Overprint mode:
1278*593dc095SDavid du Colombier<dd>
1279*593dc095SDavid du Colombier<a href="../src/gsovrc.c">src/gsovrc.c</a>,
1280*593dc095SDavid du Colombier<a href="../src/gsovrc.h">src/gsovrc.h</a>,
1281*593dc095SDavid du Colombier<a href="../src/gxoprect.c">src/gxoprect.c</a>,
1282*593dc095SDavid du Colombier<a href="../src/gxoprect.h">src/gxoprect.h</a>.
1283*593dc095SDavid du ColombierThere is support for both overprint and overprint mode. There is a general
1284*593dc095SDavid du Colombiercompositor based implementation of these features for all devices. In addition,
1285*593dc095SDavid du Colombierthe memory devices implement a higher speed set of special fill routines to
1286*593dc095SDavid du Colombierimprove performance for printer based devices.
1287*593dc095SDavid du Colombier
12883ff48bf5SDavid du Colombier</dl>
12893ff48bf5SDavid du Colombier
12903ff48bf5SDavid du Colombier<h4><a name="Clipping"></a>Clipping</h4>
12913ff48bf5SDavid du Colombier
12923ff48bf5SDavid du Colombier<p>
12933ff48bf5SDavid du ColombierThe Ghostscript graphics library implements clipping by inserting a clipping
12943ff48bf5SDavid du Colombierdevice in the device pipeline.  The clipping device modifies all drawing
12953ff48bf5SDavid du Colombieroperations to confine them to the clipping region.
12963ff48bf5SDavid du Colombier
12973ff48bf5SDavid du Colombier<p>
12983ff48bf5SDavid du ColombierThe library supports three different kinds of clipping:
12993ff48bf5SDavid du Colombier
13003ff48bf5SDavid du Colombier<dl>
13013ff48bf5SDavid du Colombier
13023ff48bf5SDavid du Colombier<dt>
13033ff48bf5SDavid du ColombierRegion/path clipping
13043ff48bf5SDavid du Colombier<dd>
13053ff48bf5SDavid du ColombierThis corresponds to the PostScript concept of a clipping path.  The clipping
13063ff48bf5SDavid du Colombierregion is specified either by a list of rectangles (subject to the
13073ff48bf5SDavid du Colombierconstraints documented in <a href="../src/gxcpath.h">src/gxcpath.h</a>), or
13083ff48bf5SDavid du Colombierby a path that is converted to such a list of rectangles.
13093ff48bf5SDavid du Colombier
13103ff48bf5SDavid du Colombier<dt>
13113ff48bf5SDavid du ColombierStationary mask clipping
13123ff48bf5SDavid du Colombier<dd>
13133ff48bf5SDavid du ColombierThis corresponds to the mask operand of a PostScript ImageType 3 image.  The
13143ff48bf5SDavid du Colombierclipping region is specified by a bitmap and an (X,Y) offset in the
13153ff48bf5SDavid du Colombiercoordinate space.
13163ff48bf5SDavid du Colombier
13173ff48bf5SDavid du Colombier<dt>
13183ff48bf5SDavid du ColombierTiled mask clipping
13193ff48bf5SDavid du Colombier<dd>
13203ff48bf5SDavid du ColombierThis corresponds to the region painted by a PostScript Pattern, for the case
13213ff48bf5SDavid du Colombierwhere the Pattern does not completely cover its bounding box but the
13223ff48bf5SDavid du Colombiercombined transformation matrix has no skew or non-orthogonal rotation (i.e.,
13233ff48bf5SDavid du ColombierXStep and YStep map respectively to (X,0) and (0,Y) or vice versa).  The
13243ff48bf5SDavid du Colombierclipping region is specified by a bitmap and an (X,Y) offset in the
13253ff48bf5SDavid du Colombiercoordinate space, and is replicated indefinitely in both X and Y.
13263ff48bf5SDavid du Colombier
13273ff48bf5SDavid du Colombier</dl>
13283ff48bf5SDavid du Colombier
13293ff48bf5SDavid du Colombier<p>
13303ff48bf5SDavid du ColombierNote that simply scan-converting a clipping path in the usual way does not
13313ff48bf5SDavid du Colombierproduce a succession of rectangles that can simply be stored as the list for
13323ff48bf5SDavid du Colombierregion-based clipping: in general, the rectangles do not satisfy the
13333ff48bf5SDavid du Colombierconstraint for rectangle lists specified in <a
13343ff48bf5SDavid du Colombierhref="../src/gxcpath.h">src/gxcpath.h</a>, since they may overlap in X, Y,
13353ff48bf5SDavid du Colombieror both.  A non-trivial "clipping list accumulator" device is needed to
13363ff48bf5SDavid du Colombierproduce a rectangle list that does satisfy the constraint.
13373ff48bf5SDavid du Colombier
13383ff48bf5SDavid du Colombier<dl>
13393ff48bf5SDavid du Colombier
13403ff48bf5SDavid du Colombier<dt>
13413ff48bf5SDavid du ColombierClipping support:
13423ff48bf5SDavid du Colombier<dd>
13433ff48bf5SDavid du Colombier<a href="../src/gxclip.c">src/gxclip.c</a>,
13443ff48bf5SDavid du Colombier<a href="../src/gxclip.h">src/gxclip.h</a>.
13453ff48bf5SDavid du Colombier
13463ff48bf5SDavid du Colombier<dt>
13473ff48bf5SDavid du ColombierRegion/path clipping:
13483ff48bf5SDavid du Colombier<dd>
13493ff48bf5SDavid du Colombier<a href="../src/gxcpath.c">src/gxcpath.c</a>,
13503ff48bf5SDavid du Colombier<a href="../src/gxcpath.h">src/gxcpath.h</a>,
13513ff48bf5SDavid du Colombier<a href="../src/gzcpath.h">src/gzcpath.h</a>.
13523ff48bf5SDavid du Colombier
13533ff48bf5SDavid du Colombier<dt>
13543ff48bf5SDavid du ColombierClipping list accumulator:
13553ff48bf5SDavid du Colombier<dd>
13563ff48bf5SDavid du Colombier<a href="../src/gxacpath.c">src/gxacpath.c</a>,
13573ff48bf5SDavid du Colombier<a href="../src/gzacpath.h">src/gzacpath.h</a>.
13583ff48bf5SDavid du Colombier
13593ff48bf5SDavid du Colombier<dt>
13603ff48bf5SDavid du ColombierMask clipping support:
13613ff48bf5SDavid du Colombier<dd>
13623ff48bf5SDavid du Colombier<a href="../src/gxmclip.c">src/gxmclip.c</a>,
13633ff48bf5SDavid du Colombier<a href="../src/gxmclip.h">src/gxmclip.h</a>.
13643ff48bf5SDavid du Colombier
13653ff48bf5SDavid du Colombier<dt>
13663ff48bf5SDavid du ColombierStationary mask clipping:
13673ff48bf5SDavid du Colombier<dd>
13683ff48bf5SDavid du Colombier<a href="../src/gxclipm.c">src/gxclipm.c</a>,
13693ff48bf5SDavid du Colombier<a href="../src/gxclipm.h">src/gxclipm.h</a>.
13703ff48bf5SDavid du Colombier
13713ff48bf5SDavid du Colombier<dt>
13723ff48bf5SDavid du ColombierTiled mask clipping:
13733ff48bf5SDavid du Colombier<dd>
13743ff48bf5SDavid du Colombier<a href="../src/gxclip2.c">src/gxclip2.c</a>,
13753ff48bf5SDavid du Colombier<a href="../src/gxclip2.h">src/gxclip2.h</a>.
13763ff48bf5SDavid du Colombier
13773ff48bf5SDavid du Colombier</dl>
13783ff48bf5SDavid du Colombier
13793ff48bf5SDavid du Colombier<h4><a name="Other_graphics"></a>Other graphics</h4>
13803ff48bf5SDavid du Colombier
13813ff48bf5SDavid du Colombier<dl>
13823ff48bf5SDavid du Colombier
13833ff48bf5SDavid du Colombier<dt>
13843ff48bf5SDavid du ColombierMiscellaneous graphics state:
13853ff48bf5SDavid du Colombier<dd>
13863ff48bf5SDavid du Colombier<a href="../src/gsclipsr.c">src/gsclipsr.c</a>,
13873ff48bf5SDavid du Colombier<a href="../src/gsclipsr.h">src/gsclipsr.h</a>,
13883ff48bf5SDavid du Colombier<a href="../src/gsdps.c">src/gsdps.c</a>,
13893ff48bf5SDavid du Colombier<a href="../src/gsdps.h">src/gsdps.h</a>,
13903ff48bf5SDavid du Colombier<a href="../src/gsdps1.c">src/gsdps1.c</a>,
13913ff48bf5SDavid du Colombier<a href="../src/gsistate.c">src/gsistate.c</a>,
13923ff48bf5SDavid du Colombier<a href="../src/gsline.c">src/gsline.c</a>,
13933ff48bf5SDavid du Colombier<a href="../src/gsline.h">src/gsline.h</a>,
13943ff48bf5SDavid du Colombier<a href="../src/gslparam.h">src/gslparam.h</a>,
13953ff48bf5SDavid du Colombier<a href="../src/gsstate.c">src/gsstate.c</a>,
13963ff48bf5SDavid du Colombier<a href="../src/gsstate.h">src/gsstate.h</a>,
13973ff48bf5SDavid du Colombier<a href="../src/gstrap.c">src/gstrap.c</a>,
13983ff48bf5SDavid du Colombier<a href="../src/gstrap.h">src/gstrap.h</a>,
13993ff48bf5SDavid du Colombier<a href="../src/gxclipsr.h">src/gxclipsr.h</a>,
14003ff48bf5SDavid du Colombier<a href="../src/gxistate.h">src/gxistate.h</a>,
14013ff48bf5SDavid du Colombier<a href="../src/gxline.h">src/gxline.h</a>,
14023ff48bf5SDavid du Colombier<a href="../src/gxstate.h">src/gxstate.h</a>,
14033ff48bf5SDavid du Colombier<a href="../src/gzline.h">src/gzline.h</a>,
14043ff48bf5SDavid du Colombier<a href="../src/gzstate.h">src/gzstate.h</a>.
14053ff48bf5SDavid du Colombier
14063ff48bf5SDavid du Colombier</dl>
14073ff48bf5SDavid du Colombier
1408*593dc095SDavid du Colombier<h4><a name="FAPI_support_gx"></a>Font API support</h4>
1409*593dc095SDavid du Colombier
1410*593dc095SDavid du Colombier<dl>
1411*593dc095SDavid du Colombier
1412*593dc095SDavid du Colombier<dt>
1413*593dc095SDavid du ColombierUFST bridge:
1414*593dc095SDavid du Colombier<dd>
1415*593dc095SDavid du Colombier<a href="../src/gxfapi.c">src/gxfapi.c</a>,
1416*593dc095SDavid du Colombier<a href="../src/gxfapi.h">src/gxfapi.h</a>.
1417*593dc095SDavid du Colombier</dl>
1418*593dc095SDavid du Colombier
1419*593dc095SDavid du Colombier
14203ff48bf5SDavid du Colombier<h4><a name="Driver_support"></a>Driver support</h4>
14213ff48bf5SDavid du Colombier
14223ff48bf5SDavid du Colombier<dl>
14233ff48bf5SDavid du Colombier
14243ff48bf5SDavid du Colombier<dt>
14253ff48bf5SDavid du ColombierGeneric driver support:
14263ff48bf5SDavid du Colombier<dd>
14273ff48bf5SDavid du Colombier<a href="../src/gdevdcrd.c">src/gdevdcrd.c</a>,
14283ff48bf5SDavid du Colombier<a href="../src/gdevdcrd.h">src/gdevdcrd.h</a>,
1429*593dc095SDavid du Colombier<a href="../src/gdevdsha.c">src/gdevdsha.c</a>,
14303ff48bf5SDavid du Colombier<a href="../src/gdevemap.c">src/gdevemap.c</a>,
14313ff48bf5SDavid du Colombier<a href="../src/gsdevice.c">src/gsdevice.c</a>,
14323ff48bf5SDavid du Colombier<a href="../src/gsdevice.h">src/gsdevice.h</a>,
14333ff48bf5SDavid du Colombier<a href="../src/gsdparam.c">src/gsdparam.c</a>,
14343ff48bf5SDavid du Colombier<a href="../src/gsxfont.h">src/gsxfont.h</a>,
14353ff48bf5SDavid du Colombier<a href="../src/gxdevbuf.h">src/gxdevbuf.h</a>,
14363ff48bf5SDavid du Colombier<a href="../src/gxdevcli.h">src/gxdevcli.h</a>,
14373ff48bf5SDavid du Colombier<a href="../src/gxdevice.h">src/gxdevice.h</a>,
14383ff48bf5SDavid du Colombier<a href="../src/gxrplane.h">src/gxrplane.h</a>,
14393ff48bf5SDavid du Colombier<a href="../src/gxxfont.h">src/gxxfont.h</a>.
14403ff48bf5SDavid du Colombier
14413ff48bf5SDavid du Colombier<dt>
14423ff48bf5SDavid du ColombierAccessing rendered bits:
14433ff48bf5SDavid du Colombier<dd>
14443ff48bf5SDavid du Colombier<a href="../src/gdevdbit.c">src/gdevdbit.c</a>,
14453ff48bf5SDavid du Colombier<a href="../src/gdevdgbr.c">src/gdevdgbr.c</a>,
14463ff48bf5SDavid du Colombier<a href="../src/gxbitfmt.h">src/gxbitfmt.h</a>,
14473ff48bf5SDavid du Colombier<a href="../src/gxgetbit.h">src/gxgetbit.h</a>.
14483ff48bf5SDavid du Colombier
14493ff48bf5SDavid du Colombier<dt>
14503ff48bf5SDavid du Colombier"Printer" driver support:
14513ff48bf5SDavid du Colombier<dd>
14523ff48bf5SDavid du Colombier<a href="../src/gdevmeds.c">src/gdevmeds.c</a>,
14533ff48bf5SDavid du Colombier<a href="../src/gdevmeds.h">src/gdevmeds.h</a>,
14543ff48bf5SDavid du Colombier<a href="../src/gdevppla.c">src/gdevppla.c</a>,
14553ff48bf5SDavid du Colombier<a href="../src/gdevppla.h">src/gdevppla.h</a>,
14563ff48bf5SDavid du Colombier<a href="../src/gdevprn.c">src/gdevprn.c</a>,
14573ff48bf5SDavid du Colombier<a href="../src/gdevprn.h">src/gdevprn.h</a>,
14583ff48bf5SDavid du Colombier<a href="../src/gdevprna.c">src/gdevprna.c</a>,
14593ff48bf5SDavid du Colombier<a href="../src/gdevprna.h">src/gdevprna.h</a>,
14603ff48bf5SDavid du Colombier<a href="../src/gxband.h">src/gxband.h</a>,
14613ff48bf5SDavid du Colombier<a href="../src/gxpageq.c">src/gxpageq.c</a>,
14623ff48bf5SDavid du Colombier<a href="../src/gxpageq.h">src/gxpageq.h</a>.
14633ff48bf5SDavid du Colombier
14643ff48bf5SDavid du Colombier<dt>
14653ff48bf5SDavid du ColombierHigh-level device support:
14663ff48bf5SDavid du Colombier<dd>
14673ff48bf5SDavid du Colombier<a href="../src/gdevvec.c">src/gdevvec.c</a>,
1468*593dc095SDavid du Colombier<a href="../src/gdevvec.h">src/gdevvec.h</a>,
1469*593dc095SDavid du Colombier<a href="../src/gxhldevc.c">src/gxhldevc.c</a>,
1470*593dc095SDavid du Colombier<a href="../src/gxhldevc.h">src/gxhldevc.h</a>.
14713ff48bf5SDavid du Colombier
14723ff48bf5SDavid du Colombier<dt>
14733ff48bf5SDavid du ColombierBanding:
14743ff48bf5SDavid du Colombier<dd>
14753ff48bf5SDavid du Colombier<a href="../src/gxclbits.c">src/gxclbits.c</a>,
14763ff48bf5SDavid du Colombier<a href="../src/gxcldev.h">src/gxcldev.h</a>,
14773ff48bf5SDavid du Colombier<a href="../src/gxclfile.c">src/gxclfile.c</a>,
14783ff48bf5SDavid du Colombier<a href="../src/gxclimag.c">src/gxclimag.c</a>,
14793ff48bf5SDavid du Colombier<a href="../src/gxclio.h">src/gxclio.h</a>,
14803ff48bf5SDavid du Colombier<a href="../src/gxclist.c">src/gxclist.c</a>,
14813ff48bf5SDavid du Colombier<a href="../src/gxclist.h">src/gxclist.h</a>,
14823ff48bf5SDavid du Colombier<a href="../src/gxcllzw.c">src/gxcllzw.c</a>,
14833ff48bf5SDavid du Colombier<a href="../src/gxclmem.c">src/gxclmem.c</a>,
14843ff48bf5SDavid du Colombier<a href="../src/gxclmem.h">src/gxclmem.h</a>,
14853ff48bf5SDavid du Colombier<a href="../src/gxclpage.c">src/gxclpage.c</a>,
14863ff48bf5SDavid du Colombier<a href="../src/gxclpage.h">src/gxclpage.h</a>,
14873ff48bf5SDavid du Colombier<a href="../src/gxclpath.c">src/gxclpath.c</a>,
14883ff48bf5SDavid du Colombier<a href="../src/gxclpath.h">src/gxclpath.h</a>,
14893ff48bf5SDavid du Colombier<a href="../src/gxclrast.c">src/gxclrast.c</a>,
14903ff48bf5SDavid du Colombier<a href="../src/gxclread.c">src/gxclread.c</a>,
14913ff48bf5SDavid du Colombier<a href="../src/gxclrect.c">src/gxclrect.c</a>,
14923ff48bf5SDavid du Colombier<a href="../src/gxclutil.c">src/gxclutil.c</a>,
1493*593dc095SDavid du Colombier<a href="../src/gxclzlib.c">src/gxclzlib.c</a>,
1494*593dc095SDavid du Colombier<a href="../src/gxdhtserial.c">src/gxdhtserial.c</a>,
1495*593dc095SDavid du Colombier<a href="../src/gxdhtserial.h">src/gxdhtserial.h</a>,
1496*593dc095SDavid du Colombier<a href="../src/gsserial.c">src/gsserial.c</a>,
1497*593dc095SDavid du Colombier<a href="../src/gsserial.h">src/gsserial.h</a>.
14983ff48bf5SDavid du Colombier
14993ff48bf5SDavid du Colombier</dl>
15003ff48bf5SDavid du Colombier
1501*593dc095SDavid du Colombier<h4><a name="Visual_trace"></a>Visual Trace</h4>
1502*593dc095SDavid du Colombier
1503*593dc095SDavid du Colombier<dl>
1504*593dc095SDavid du Colombier
1505*593dc095SDavid du Colombier<dt>
1506*593dc095SDavid du ColombierVisual Trace support :
1507*593dc095SDavid du Colombier<dd>
1508*593dc095SDavid du Colombier<a href="../src/vdtrace.h">src/vdtrace.h</a>,
1509*593dc095SDavid du Colombier<a href="../src/vdtrace.c">src/vdtrace.c</a>.
1510*593dc095SDavid du Colombier</dl>
1511*593dc095SDavid du Colombier
1512*593dc095SDavid du ColombierSee <a href="Lib.htm">doc/Lib.htm</a> for extensive documentation on
1513*593dc095SDavid du ColombierVisual Trace instructions.
1514*593dc095SDavid du Colombier
1515*593dc095SDavid du Colombier
15163ff48bf5SDavid du Colombier<h3><a name="Device_drivers"></a>Device drivers</h3>
15173ff48bf5SDavid du Colombier
15183ff48bf5SDavid du Colombier<p>
15193ff48bf5SDavid du ColombierSee <a href="Drivers.htm">doc/Drivers.htm</a> for extensive documentation on
15203ff48bf5SDavid du Colombierthe interface between the core code and drivers.
15213ff48bf5SDavid du Colombier
15223ff48bf5SDavid du Colombier<p>
15233ff48bf5SDavid du ColombierThe driver API includes high-level (path / image / text), mid-level
15243ff48bf5SDavid du Colombier(polygon), and low-level (rectangle / raster) operations.  Most devices
15253ff48bf5SDavid du Colombierimplement only the low-level operations, and let generic code break down the
15263ff48bf5SDavid du Colombierhigh-level operations.  However, some devices produce high-level output, and
15273ff48bf5SDavid du Colombiertherefore must implement the high-level operations.
15283ff48bf5SDavid du Colombier
15293ff48bf5SDavid du Colombier<h4><a name="Internal_devices"></a>Internal devices</h4>
15303ff48bf5SDavid du Colombier
15313ff48bf5SDavid du Colombier<p>
15323ff48bf5SDavid du ColombierThere are a number of "devices" that serve internal purposes.  Some of these
15333ff48bf5SDavid du Colombierare meant to be real rendering targets; others are intended for use in
15343ff48bf5SDavid du Colombierdevice pipelines.  The rendering targets are:
15353ff48bf5SDavid du Colombier
15363ff48bf5SDavid du Colombier<dl>
15373ff48bf5SDavid du Colombier
15383ff48bf5SDavid du Colombier<dt>
15393ff48bf5SDavid du ColombierMemory devices, depth-independent:
15403ff48bf5SDavid du Colombier<dd>
15413ff48bf5SDavid du Colombier<a href="../src/gdevmem.c">src/gdevmem.c</a>,
15423ff48bf5SDavid du Colombier<a href="../src/gdevmem.h">src/gdevmem.h</a>,
15433ff48bf5SDavid du Colombier<a href="../src/gdevmpla.c">src/gdevmpla.c</a>,
15443ff48bf5SDavid du Colombier<a href="../src/gdevmpla.h">src/gdevmpla.h</a>,
15453ff48bf5SDavid du Colombier<a href="../src/gdevmrop.h">src/gdevmrop.h</a>,
15463ff48bf5SDavid du Colombier<a href="../src/gsdevmem.c">src/gsdevmem.c</a>,
15473ff48bf5SDavid du Colombier<a href="../src/gxdevmem.h">src/gxdevmem.h</a>.
15483ff48bf5SDavid du Colombier
15493ff48bf5SDavid du Colombier<dt>
15503ff48bf5SDavid du ColombierMemory devices, specific depths:
15513ff48bf5SDavid du Colombier<dd>
15523ff48bf5SDavid du Colombier<a href="../src/gdevm1.c">src/gdevm1.c</a>,
15533ff48bf5SDavid du Colombier<a href="../src/gdevm2.c">src/gdevm2.c</a>,
15543ff48bf5SDavid du Colombier<a href="../src/gdevm4.c">src/gdevm4.c</a>,
15553ff48bf5SDavid du Colombier<a href="../src/gdevm8.c">src/gdevm8.c</a>,
15563ff48bf5SDavid du Colombier<a href="../src/gdevm16.c">src/gdevm16.c</a>,
15573ff48bf5SDavid du Colombier<a href="../src/gdevm24.c">src/gdevm24.c</a>,
15583ff48bf5SDavid du Colombier<a href="../src/gdevm32.c">src/gdevm32.c</a>,
1559*593dc095SDavid du Colombier<a href="../src/gdevm40.c">src/gdevm40.c</a>,
1560*593dc095SDavid du Colombier<a href="../src/gdevm48.c">src/gdevm48.c</a>,
1561*593dc095SDavid du Colombier<a href="../src/gdevm56.c">src/gdevm56.c</a>,
1562*593dc095SDavid du Colombier<a href="../src/gdevm64.c">src/gdevm64.c</a>,
15633ff48bf5SDavid du Colombier<a href="../src/gdevmr1.c">src/gdevmr1.c</a>,
15643ff48bf5SDavid du Colombier<a href="../src/gdevmr2n.c">src/gdevmr2n.c</a>,
15653ff48bf5SDavid du Colombier<a href="../src/gdevmr8n.c">src/gdevmr8n.c</a>.
15663ff48bf5SDavid du Colombier
15673ff48bf5SDavid du Colombier<dt>
15683ff48bf5SDavid du ColombierAlpha-related devices:
15693ff48bf5SDavid du Colombier<dd>
1570*593dc095SDavid du Colombier<a href="../src/gdevabuf.c">src/gdevabuf.c</a>.
15713ff48bf5SDavid du Colombier
15723ff48bf5SDavid du Colombier<dt>
15733ff48bf5SDavid du ColombierOther devices:
15743ff48bf5SDavid du Colombier<dd>
15753ff48bf5SDavid du Colombier<a href="../src/gdevdflt.c">src/gdevdflt.c</a>,
15763ff48bf5SDavid du Colombier<a href="../src/gdevhit.c">src/gdevhit.c</a>,
15773ff48bf5SDavid du Colombier<a href="../src/gdevmrun.c">src/gdevmrun.c</a>,
15783ff48bf5SDavid du Colombier<a href="../src/gdevmrun.h">src/gdevmrun.h</a>,
15793ff48bf5SDavid du Colombier<a href="../src/gdevplnx.c">src/gdevplnx.c</a>,
1580*593dc095SDavid du Colombier<a href="../src/gdevplnx.h">src/gdevplnx.h</a>.
15813ff48bf5SDavid du Colombier</dl>
15823ff48bf5SDavid du Colombier
15833ff48bf5SDavid du Colombier<p>
15843ff48bf5SDavid du ColombierThe forwarding devices meant for use in pipelines are:
15853ff48bf5SDavid du Colombier
15863ff48bf5SDavid du Colombier<dl>
15873ff48bf5SDavid du Colombier
15883ff48bf5SDavid du Colombier<dt>
15893ff48bf5SDavid du ColombierThe bounding box device:
15903ff48bf5SDavid du Colombier<dd>
15913ff48bf5SDavid du Colombier<a href="../src/gdevbbox.h">src/gdevbbox.h</a>,
15923ff48bf5SDavid du Colombier<a href="../src/gdevbbox.c">src/gdevbbox.c</a>.
15933ff48bf5SDavid du Colombier
15943ff48bf5SDavid du Colombier<dt>
15953ff48bf5SDavid du ColombierClipping devices:
15963ff48bf5SDavid du Colombier<dd>
15973ff48bf5SDavid du ColombierSee under <a href="#Clipping">Clipping</a> above.
15983ff48bf5SDavid du Colombier
15993ff48bf5SDavid du Colombier<dt>
16003ff48bf5SDavid du ColombierDevice filter stack:
16013ff48bf5SDavid du Colombier<dd>
16023ff48bf5SDavid du Colombier<a href="../src/gsdfilt.c">src/gsdfilt.c</a>,
1603*593dc095SDavid du Colombier<a href="../src/gsdfilt.h">src/gsdfilt.h</a>.
16043ff48bf5SDavid du Colombier
16053ff48bf5SDavid du Colombier<dt>
16063ff48bf5SDavid du ColombierOther devices:
16073ff48bf5SDavid du Colombier<dd>
16083ff48bf5SDavid du Colombier<a href="../src/gdevcmap.c">src/gdevcmap.c</a>,
16093ff48bf5SDavid du Colombier<a href="../src/gdevcmap.h">src/gdevcmap.h</a>,
16103ff48bf5SDavid du Colombier<a href="../src/gdevnfwd.c">src/gdevnfwd.c</a>.
16113ff48bf5SDavid du Colombier
16123ff48bf5SDavid du Colombier</dl>
16133ff48bf5SDavid du Colombier
16143ff48bf5SDavid du Colombier<h4><a name="PS_and_PDF_writers"></a>PostScript and PDF writers</h4>
16153ff48bf5SDavid du Colombier
16163ff48bf5SDavid du Colombier<p>
16173ff48bf5SDavid du ColombierBecause PostScript and PDF have the same graphics model, lexical syntax, and
16183ff48bf5SDavid du Colombierstack-based execution model, the drivers that produce PostScript and PDF
16193ff48bf5SDavid du Colombieroutput share a significant amount of support code.  In the future, the
16203ff48bf5SDavid du ColombierPostScript output driver should be replaced with a slightly modified version
16213ff48bf5SDavid du Colombierof the PDF driver, since the latter is far more sophisticated (in
16223ff48bf5SDavid du Colombierparticular, it has extensive facilities for image compression and for
16233ff48bf5SDavid du Colombierhandling text and fonts).
16243ff48bf5SDavid du Colombier
1625*593dc095SDavid du Colombier<p>
1626*593dc095SDavid du ColombierThe PDF code for handling text and fonts is complex and fragile.  A major
1627*593dc095SDavid du Colombierrewrite in June 2002 was intended to make it more robust and somewhat easier
1628*593dc095SDavid du Colombierto understand, but also increased its size by about 40%, contrary to the
1629*593dc095SDavid du Colombierexpectation that it would shrink.  Currently both sets of code are in the
1630*593dc095SDavid du Colombiercode base, with compatible APIs, selected by a line in <a
1631*593dc095SDavid du Colombierhref="../src/devs.mak">src/devs.mak</a>.
1632*593dc095SDavid du Colombier
16333ff48bf5SDavid du Colombier<dl>
16343ff48bf5SDavid du Colombier
16353ff48bf5SDavid du Colombier<dt>
16363ff48bf5SDavid du ColombierShared support:
16373ff48bf5SDavid du Colombier<dd>
16383ff48bf5SDavid du Colombier
16393ff48bf5SDavid du Colombier<dl>
16403ff48bf5SDavid du ColombierWriting fonts:
16413ff48bf5SDavid du Colombier<dd>
16423ff48bf5SDavid du Colombier<a href="../src/gdevpsf.h">src/gdevpsf.h</a>,
16433ff48bf5SDavid du Colombier<a href="../src/gdevpsf1.c">src/gdevpsf1.c</a>,
16443ff48bf5SDavid du Colombier<a href="../src/gdevpsf2.c">src/gdevpsf2.c</a>,
16453ff48bf5SDavid du Colombier<a href="../src/gdevpsfm.c">src/gdevpsfm.c</a>,
16463ff48bf5SDavid du Colombier<a href="../src/gdevpsft.c">src/gdevpsft.c</a>,
16473ff48bf5SDavid du Colombier<a href="../src/gdevpsfu.c">src/gdevpsfu.c</a>,
1648*593dc095SDavid du Colombier<a href="../src/gdevpsfx.c">src/gdevpsfx.c</a>,
1649*593dc095SDavid du Colombier<a href="../src/gscedata.c">src/gscedata.c</a>,
1650*593dc095SDavid du Colombier<a href="../src/gscedata.h">src/gscedata.h</a>,
1651*593dc095SDavid du Colombier<a href="../src/gscencs.c">src/gscencs.c</a>,
1652*593dc095SDavid du Colombier<a href="../src/gscencs.h">src/gscencs.h</a>.
16533ff48bf5SDavid du Colombier
16543ff48bf5SDavid du Colombier<dt>
16553ff48bf5SDavid du ColombierOther:
16563ff48bf5SDavid du Colombier<dd>
16573ff48bf5SDavid du Colombier<a href="../src/gdevpsdf.h">src/gdevpsdf.h</a>,
16583ff48bf5SDavid du Colombier<a href="../src/gdevpsdi.c">src/gdevpsdi.c</a>,
16593ff48bf5SDavid du Colombier<a href="../src/gdevpsdp.c">src/gdevpsdp.c</a>,
16603ff48bf5SDavid du Colombier<a href="../src/gdevpsds.c">src/gdevpsds.c</a>,
16613ff48bf5SDavid du Colombier<a href="../src/gdevpsds.h">src/gdevpsds.h</a>,
16623ff48bf5SDavid du Colombier<a href="../src/gdevpsdu.c">src/gdevpsdu.c</a>.
16633ff48bf5SDavid du Colombier
16643ff48bf5SDavid du Colombier</dl>
16653ff48bf5SDavid du Colombier
16663ff48bf5SDavid du Colombier<dt>
16673ff48bf5SDavid du ColombierPostScript output driver ([e]pswrite):
16683ff48bf5SDavid du Colombier<dd>
16693ff48bf5SDavid du Colombier<a href="../src/gdevps.c">src/gdevps.c</a>,
16703ff48bf5SDavid du Colombier<a href="../src/gdevpsu.c">src/gdevpsu.c</a>,
16713ff48bf5SDavid du Colombier<a href="../src/gdevpsu.h">src/gdevpsu.h</a>.
16723ff48bf5SDavid du Colombier
16733ff48bf5SDavid du Colombier<dt>
16743ff48bf5SDavid du ColombierPDF output driver (pdfwrite):
16753ff48bf5SDavid du Colombier<dd>
16763ff48bf5SDavid du Colombier<dl>
16773ff48bf5SDavid du Colombier
16783ff48bf5SDavid du Colombier<dt>
16793ff48bf5SDavid du ColombierSubstrate:
16803ff48bf5SDavid du Colombier<dd>
16813ff48bf5SDavid du Colombier<a href="../src/gdevpdfo.c">src/gdevpdfo.c</a>,
16823ff48bf5SDavid du Colombier<a href="../src/gdevpdfo.h">src/gdevpdfo.h</a>,
16833ff48bf5SDavid du Colombier<a href="../src/gdevpdfr.c">src/gdevpdfr.c</a>,
16843ff48bf5SDavid du Colombier<a href="../src/gdevpdfu.c">src/gdevpdfu.c</a>.
16853ff48bf5SDavid du Colombier
16863ff48bf5SDavid du Colombier<dt>
1687*593dc095SDavid du ColombierOld text and fonts:
16883ff48bf5SDavid du Colombier<dd>
16893ff48bf5SDavid du Colombier<a href="../src/gdevpdfe.c">src/gdevpdfe.c</a>,
16903ff48bf5SDavid du Colombier<a href="../src/gdevpdff.c">src/gdevpdff.c</a>,
16913ff48bf5SDavid du Colombier<a href="../src/gdevpdff.h">src/gdevpdff.h</a>,
16923ff48bf5SDavid du Colombier<a href="../src/gdevpdfs.c">src/gdevpdfs.c</a>,
16933ff48bf5SDavid du Colombier<a href="../src/gdevpdft.c">src/gdevpdft.c</a>,
1694*593dc095SDavid du Colombier<a href="../src/gdevpdft.h">src/gdevpdft.h</a>,
16953ff48bf5SDavid du Colombier<a href="../src/gdevpdfw.c">src/gdevpdfw.c</a>.
16963ff48bf5SDavid du Colombier
16973ff48bf5SDavid du Colombier<dt>
1698*593dc095SDavid du ColombierNew text and fonts:
1699*593dc095SDavid du Colombier<dd>
1700*593dc095SDavid du Colombier<a href="../src/gdevpdt.c">src/gdevpdt.c</a>,
1701*593dc095SDavid du Colombier<a href="../src/gdevpdt.h">src/gdevpdt.h</a>,
1702*593dc095SDavid du Colombier<a href="../src/gdevpdtb.c">src/gdevpdtb.c</a>,
1703*593dc095SDavid du Colombier<a href="../src/gdevpdtb.h">src/gdevpdtb.h</a>,
1704*593dc095SDavid du Colombier<a href="../src/gdevpdtc.c">src/gdevpdtc.c</a>,
1705*593dc095SDavid du Colombier<a href="../src/gdevpdtd.c">src/gdevpdtd.c</a>,
1706*593dc095SDavid du Colombier<a href="../src/gdevpdtd.h">src/gdevpdtd.h</a>,
1707*593dc095SDavid du Colombier<a href="../src/gdevpdte.c">src/gdevpdte.c</a>,
1708*593dc095SDavid du Colombier<a href="../src/gdevpdtf.c">src/gdevpdtf.c</a>,
1709*593dc095SDavid du Colombier<a href="../src/gdevpdtf.h">src/gdevpdtf.h</a>,
1710*593dc095SDavid du Colombier<a href="../src/gdevpdti.c">src/gdevpdti.c</a>,
1711*593dc095SDavid du Colombier<a href="../src/gdevpdti.h">src/gdevpdti.h</a>,
1712*593dc095SDavid du Colombier<a href="../src/gdevpdts.c">src/gdevpdts.c</a>,
1713*593dc095SDavid du Colombier<a href="../src/gdevpdts.h">src/gdevpdts.h</a>,
1714*593dc095SDavid du Colombier<a href="../src/gdevpdtt.c">src/gdevpdtt.c</a>,
1715*593dc095SDavid du Colombier<a href="../src/gdevpdtt.h">src/gdevpdtt.h</a>,
1716*593dc095SDavid du Colombier<a href="../src/gdevpdtv.c">src/gdevpdtv.c</a>,
1717*593dc095SDavid du Colombier<a href="../src/gdevpdtv.h">src/gdevpdtv.h</a>,
1718*593dc095SDavid du Colombier<a href="../src/gdevpdtw.c">src/gdevpdtw.c</a>,
1719*593dc095SDavid du Colombier<a href="../src/gdevpdtw.h">src/gdevpdtw.h</a>,
1720*593dc095SDavid du Colombier<a href="../src/gdevpdtx.h">src/gdevpdtx.h</a>.
1721*593dc095SDavid du Colombier
1722*593dc095SDavid du Colombier<dt>
17233ff48bf5SDavid du ColombierGraphics:
17243ff48bf5SDavid du Colombier<dd>
17253ff48bf5SDavid du Colombier<a href="../src/gdevpdfc.c">src/gdevpdfc.c</a>,
1726*593dc095SDavid du Colombier<a href="../src/gdevpdfc.h">src/gdevpdfc.h</a>,
17273ff48bf5SDavid du Colombier<a href="../src/gdevpdfd.c">src/gdevpdfd.c</a>,
17283ff48bf5SDavid du Colombier<a href="../src/gdevpdfg.c">src/gdevpdfg.c</a>,
17293ff48bf5SDavid du Colombier<a href="../src/gdevpdfg.h">src/gdevpdfg.h</a>,
1730*593dc095SDavid du Colombier<a href="../src/gdevpdfk.c">src/gdevpdfk.c</a>,
1731*593dc095SDavid du Colombier<a href="../src/gdevpdft.c">src/gdevpdft.c</a>.
17323ff48bf5SDavid du Colombier<a href="../src/gdevpdfv.c">src/gdevpdfv.c</a>.
17333ff48bf5SDavid du Colombier
17343ff48bf5SDavid du Colombier<dt>
17353ff48bf5SDavid du ColombierImages:
17363ff48bf5SDavid du Colombier<dd>
17373ff48bf5SDavid du Colombier<a href="../src/gdevpdfb.c">src/gdevpdfb.c</a>,
17383ff48bf5SDavid du Colombier<a href="../src/gdevpdfi.c">src/gdevpdfi.c</a>,
17393ff48bf5SDavid du Colombier<a href="../src/gdevpdfj.c">src/gdevpdfj.c</a>.
17403ff48bf5SDavid du Colombier
17413ff48bf5SDavid du Colombier<dt>
17423ff48bf5SDavid du ColombierOther:
17433ff48bf5SDavid du Colombier<dd>
17443ff48bf5SDavid du Colombier<a href="../src/gdevpdf.c">src/gdevpdf.c</a>,
17453ff48bf5SDavid du Colombier<a href="../src/gdevpdfm.c">src/gdevpdfm.c</a>,
17463ff48bf5SDavid du Colombier<a href="../src/gdevpdfp.c">src/gdevpdfp.c</a>,
17473ff48bf5SDavid du Colombier<a href="../src/gdevpdfx.h">src/gdevpdfx.h</a>.
1748*593dc095SDavid du Colombier<a href="../src/gdevpdfb.h">src/gdevpdfb.h</a>.
17493ff48bf5SDavid du Colombier
17503ff48bf5SDavid du Colombier</dl>
17513ff48bf5SDavid du Colombier
17523ff48bf5SDavid du Colombier</dl>
17533ff48bf5SDavid du Colombier
17543ff48bf5SDavid du Colombier<h4><a name="High_level_devices"></a>Other high-level devices</h4>
17553ff48bf5SDavid du Colombier
17563ff48bf5SDavid du Colombier<p>
17573ff48bf5SDavid du ColombierCurrently, the CGM driver is raster-only.  If anyone cares seriously about
17583ff48bf5SDavid du ColombierCGM in the future, this driver should be upgraded to a higher level.
17593ff48bf5SDavid du Colombier
17603ff48bf5SDavid du Colombier<dl>
17613ff48bf5SDavid du Colombier
17623ff48bf5SDavid du Colombier<dt>
17633ff48bf5SDavid du ColombierPCL XL output device (pxlmono, pxlcolor):
17643ff48bf5SDavid du Colombier<dd>
17653ff48bf5SDavid du Colombier<a href="../src/gdevpx.c">src/gdevpx.c</a>,
17663ff48bf5SDavid du Colombier<a href="../src/gdevpxat.h">src/gdevpxat.h</a>,
17673ff48bf5SDavid du Colombier<a href="../src/gdevpxen.h">src/gdevpxen.h</a>,
17683ff48bf5SDavid du Colombier<a href="../src/gdevpxop.h">src/gdevpxop.h</a>,
17693ff48bf5SDavid du Colombier<a href="../src/gdevpxut.c">src/gdevpxut.c</a>,
17703ff48bf5SDavid du Colombier<a href="../src/gdevpxut.h">src/gdevpxut.h</a>.
17713ff48bf5SDavid du Colombier
17723ff48bf5SDavid du Colombier<dt>
17733ff48bf5SDavid du ColombierOther high-level devices:
17743ff48bf5SDavid du Colombier<dd>
17753ff48bf5SDavid du Colombier<a href="../src/gdevtrac.c">src/gdevtrac.c</a>.
17763ff48bf5SDavid du Colombier
17773ff48bf5SDavid du Colombier</dl>
17783ff48bf5SDavid du Colombier
17793ff48bf5SDavid du Colombier<h4><a name="Other_maintained_drivers"></a>Other maintained drivers</h4>
17803ff48bf5SDavid du Colombier
17813ff48bf5SDavid du Colombier<p>
17823ff48bf5SDavid du ColombierThe standard Ghostscript distribution includes a collection of drivers,
17833ff48bf5SDavid du Colombiermostly written by Aladdin Enterprises, that are "maintained" in the same
17843ff48bf5SDavid du Colombiersense as the Ghostscript core code.
17853ff48bf5SDavid du Colombier
17863ff48bf5SDavid du Colombier<dl>
17873ff48bf5SDavid du Colombier
17883ff48bf5SDavid du Colombier<dt>
17893ff48bf5SDavid du ColombierDisplay drivers:
17903ff48bf5SDavid du Colombier<dd>
17913ff48bf5SDavid du Colombier<a href="../src/gdev8bcm.c">src/gdev8bcm.c</a>,
17923ff48bf5SDavid du Colombier<a href="../src/gdev8bcm.h">src/gdev8bcm.h</a>,
17933ff48bf5SDavid du Colombier<a href="../src/gdevegaa.asm">src/gdevegaa.asm</a>,
17943ff48bf5SDavid du Colombier<a href="../src/gdevevga.c">src/gdevevga.c</a>,
17953ff48bf5SDavid du Colombier<a href="../src/gdevl256.c">src/gdevl256.c</a>,
17963ff48bf5SDavid du Colombier<a href="../src/gdevpccm.c">src/gdevpccm.c</a>,
17973ff48bf5SDavid du Colombier<a href="../src/gdevpccm.h">src/gdevpccm.h</a>,
17983ff48bf5SDavid du Colombier<a href="../src/gdevpcfb.c">src/gdevpcfb.c</a>,
17993ff48bf5SDavid du Colombier<a href="../src/gdevpcfb.h">src/gdevpcfb.h</a>,
18003ff48bf5SDavid du Colombier<a href="../src/gdevs3ga.c">src/gdevs3ga.c</a>,
18013ff48bf5SDavid du Colombier<a href="../src/gdevsco.c">src/gdevsco.c</a>,
18023ff48bf5SDavid du Colombier<a href="../src/gdevsvga.c">src/gdevsvga.c</a>,
18033ff48bf5SDavid du Colombier<a href="../src/gdevsvga.h">src/gdevsvga.h</a>,
18043ff48bf5SDavid du Colombier<a href="../src/gdevvglb.c">src/gdevvglb.c</a>.
18053ff48bf5SDavid du Colombier
18063ff48bf5SDavid du Colombier<dt>
18073ff48bf5SDavid du ColombierWindow system drivers:
18083ff48bf5SDavid du Colombier<dd>
18093ff48bf5SDavid du Colombier
18103ff48bf5SDavid du Colombier<dl>
18113ff48bf5SDavid du Colombier
18123ff48bf5SDavid du Colombier<dt>
18133ff48bf5SDavid du ColombierX Windows:
18143ff48bf5SDavid du Colombier<dd>
18153ff48bf5SDavid du Colombier<a href="../src/gdevx.c">src/gdevx.c</a>,
18163ff48bf5SDavid du Colombier<a href="../src/gdevx.h">src/gdevx.h</a>,
18173ff48bf5SDavid du Colombier<a href="../src/gdevxalt.c">src/gdevxalt.c</a>,
18183ff48bf5SDavid du Colombier<a href="../src/gdevxcmp.c">src/gdevxcmp.c</a>,
18193ff48bf5SDavid du Colombier<a href="../src/gdevxcmp.h">src/gdevxcmp.h</a>,
18203ff48bf5SDavid du Colombier<a href="../src/gdevxini.c">src/gdevxini.c</a>,
18213ff48bf5SDavid du Colombier<a href="../src/gdevxres.c">src/gdevxres.c</a>,
18223ff48bf5SDavid du Colombier<a href="../src/gdevxxf.c">src/gdevxxf.c</a>.
18233ff48bf5SDavid du Colombier
18243ff48bf5SDavid du Colombier<dt>
18253ff48bf5SDavid du ColombierMicrosoft Windows:
18263ff48bf5SDavid du Colombier<dd>
18273ff48bf5SDavid du Colombier<a href="../src/gdevmswn.c">src/gdevmswn.c</a>,
18283ff48bf5SDavid du Colombier<a href="../src/gdevmswn.h">src/gdevmswn.h</a>,
18293ff48bf5SDavid du Colombier<a href="../src/gdevmsxf.c">src/gdevmsxf.c</a>,
18303ff48bf5SDavid du Colombier<a href="../src/gdevwddb.c">src/gdevwddb.c</a>,
18313ff48bf5SDavid du Colombier<a href="../src/gdevwdib.c">src/gdevwdib.c</a>.
18323ff48bf5SDavid du Colombier
18333ff48bf5SDavid du Colombier<dt>
18343ff48bf5SDavid du ColombierOS/2 Presentation Manager:
18353ff48bf5SDavid du Colombier<dd>
18363ff48bf5SDavid du Colombier<a href="../src/gdevpm.c">src/gdevpm.c</a>,
18373ff48bf5SDavid du Colombier<a href="../src/gdevpm.h">src/gdevpm.h</a>,
18383ff48bf5SDavid du Colombier<a href="../src/gspmdrv.c">src/gspmdrv.c</a>,
18393ff48bf5SDavid du Colombier<a href="../src/gspmdrv.h">src/gspmdrv.h</a>.
18403ff48bf5SDavid du Colombier
18413ff48bf5SDavid du Colombier</dl>
18423ff48bf5SDavid du Colombier
18433ff48bf5SDavid du Colombier<dt>
18443ff48bf5SDavid du ColombierRaster file output drivers:
18453ff48bf5SDavid du Colombier<dd>
18463ff48bf5SDavid du Colombier
18473ff48bf5SDavid du Colombier<dl>
18483ff48bf5SDavid du Colombier
18493ff48bf5SDavid du Colombier<dt>
18503ff48bf5SDavid du ColombierFax and TIFF:
18513ff48bf5SDavid du Colombier<dd>
18523ff48bf5SDavid du Colombier<a href="../src/gdevfax.c">src/gdevfax.c</a>,
18533ff48bf5SDavid du Colombier<a href="../src/gdevfax.h">src/gdevfax.h</a>,
18543ff48bf5SDavid du Colombier<a href="../src/gdevtfax.c">src/gdevtfax.c</a>,
18553ff48bf5SDavid du Colombier<a href="../src/gdevtfax.h">src/gdevtfax.h</a>,
18563ff48bf5SDavid du Colombier<a href="../src/gdevtifs.c">src/gdevtifs.c</a>,
18573ff48bf5SDavid du Colombier<a href="../src/gdevtifs.h">src/gdevtifs.h</a>,
18583ff48bf5SDavid du Colombier<a href="../src/gdevtfnx.c">src/gdevtfnx.c</a>.
1859*593dc095SDavid du Colombier<a href="../src/gdevtsep.c">src/gdevtsep.c</a>.
18603ff48bf5SDavid du Colombier
18613ff48bf5SDavid du Colombier<dt>
18623ff48bf5SDavid du Colombier(Low-level) CGM:
18633ff48bf5SDavid du Colombier<dd>
18643ff48bf5SDavid du Colombier<a href="../src/gdevcgm.c">src/gdevcgm.c</a>,
18653ff48bf5SDavid du Colombier<a href="../src/gdevcgml.c">src/gdevcgml.c</a>,
18663ff48bf5SDavid du Colombier<a href="../src/gdevcgml.h">src/gdevcgml.h</a>,
18673ff48bf5SDavid du Colombier<a href="../src/gdevcgmx.h">src/gdevcgmx.h</a>.
18683ff48bf5SDavid du Colombier
18693ff48bf5SDavid du Colombier<dt>
1870*593dc095SDavid du ColombierExample DeviceN devices:
1871*593dc095SDavid du Colombier<dd>
1872*593dc095SDavid du Colombier<a href="../src/gdevdevn.c">src/gdevdevn.c</a>,
1873*593dc095SDavid du Colombier<a href="../src/gdevdevn.h">src/gdevdevn.h</a>,
1874*593dc095SDavid du Colombier<a href="../src/gdevxcf.c">src/gdevxcf.c</a>,
1875*593dc095SDavid du Colombier<a href="../src/gdevpsd.c">src/gdevpsd.c</a>,
1876*593dc095SDavid du Colombier<a href="../src/gdevperm.c">src/gdevperm.c</a>.
1877*593dc095SDavid du Colombier
1878*593dc095SDavid du Colombier<dt>
18793ff48bf5SDavid du ColombierOther raster file formats:
18803ff48bf5SDavid du Colombier<dd>
18813ff48bf5SDavid du Colombier<a href="../src/gdevbit.c">src/gdevbit.c</a>,
18823ff48bf5SDavid du Colombier<a href="../src/gdevbmp.c">src/gdevbmp.c</a>,
18833ff48bf5SDavid du Colombier<a href="../src/gdevbmp.h">src/gdevbmp.h</a>,
18843ff48bf5SDavid du Colombier<a href="../src/gdevbmpa.c">src/gdevbmpa.c</a>,
18853ff48bf5SDavid du Colombier<a href="../src/gdevbmpc.c">src/gdevbmpc.c</a>,
18863ff48bf5SDavid du Colombier<a href="../src/gdevjpeg.c">src/gdevjpeg.c</a>,
18873ff48bf5SDavid du Colombier<a href="../src/gdevmiff.c">src/gdevmiff.c</a>,
18883ff48bf5SDavid du Colombier<a href="../src/gdevp2up.c">src/gdevp2up.c</a>,
18893ff48bf5SDavid du Colombier<a href="../src/gdevpcx.c">src/gdevpcx.c</a>,
18903ff48bf5SDavid du Colombier<a href="../src/gdevpbm.c">src/gdevpbm.c</a>,
18913ff48bf5SDavid du Colombier<a href="../src/gdevpng.c">src/gdevpng.c</a>,
18923ff48bf5SDavid du Colombier<a href="../src/gdevpsim.c">src/gdevpsim.c</a>.
18933ff48bf5SDavid du Colombier
18943ff48bf5SDavid du Colombier</dl>
18953ff48bf5SDavid du Colombier
18963ff48bf5SDavid du Colombier<dt>
18973ff48bf5SDavid du ColombierPrinter drivers:
18983ff48bf5SDavid du Colombier<dd>
18993ff48bf5SDavid du Colombier
19003ff48bf5SDavid du Colombier<dl>
19013ff48bf5SDavid du Colombier
19023ff48bf5SDavid du Colombier<dt>
19033ff48bf5SDavid du ColombierOperating system printer services:
19043ff48bf5SDavid du Colombier<dd>
19053ff48bf5SDavid du Colombier<a href="../src/gdevos2p.c">src/gdevos2p.c</a>,
19063ff48bf5SDavid du Colombier<a href="../src/gdevwpr2.c">src/gdevwpr2.c</a>,
19073ff48bf5SDavid du Colombier<a href="../src/gdevwprn.c">src/gdevwprn.c</a>.
19083ff48bf5SDavid du Colombier
19093ff48bf5SDavid du Colombier<dt>
19103ff48bf5SDavid du ColombierH-P monochrome printers:
19113ff48bf5SDavid du Colombier<dd>
19123ff48bf5SDavid du Colombier<a href="../src/gdevdljm.c">src/gdevdljm.c</a>,
19133ff48bf5SDavid du Colombier<a href="../src/gdevdljm.h">src/gdevdljm.h</a>,
19143ff48bf5SDavid du Colombier<a href="../src/gdevdjet.c">src/gdevdjet.c</a>,
19153ff48bf5SDavid du Colombier<a href="../src/gdevlj56.c">src/gdevlj56.c</a>.
19163ff48bf5SDavid du Colombier
19173ff48bf5SDavid du Colombier<dt>
19183ff48bf5SDavid du ColombierOther printers:
19193ff48bf5SDavid du Colombier<dd>
19203ff48bf5SDavid du Colombier<a href="../src/gdevatx.c">src/gdevatx.c</a>.
19213ff48bf5SDavid du Colombier
19223ff48bf5SDavid du Colombier</dl>
19233ff48bf5SDavid du Colombier
19243ff48bf5SDavid du Colombier</dl>
19253ff48bf5SDavid du Colombier
19263ff48bf5SDavid du Colombier<h4><a name="Contributed_drivers"></a>Contributed drivers</h4>
19273ff48bf5SDavid du Colombier
19283ff48bf5SDavid du Colombier<p>
19293ff48bf5SDavid du ColombierThis list is likely to be incomplete and inaccurate: see <a
19303ff48bf5SDavid du Colombierhref="../src/contrib.mak">src/contrib.mak</a> for the real one.
19313ff48bf5SDavid du Colombier
19323ff48bf5SDavid du Colombier<dl>
19333ff48bf5SDavid du Colombier
19343ff48bf5SDavid du Colombier<dt>
19353ff48bf5SDavid du ColombierDisplay and window system drivers:
19363ff48bf5SDavid du Colombier<dd>
19373ff48bf5SDavid du Colombier<a href="../src/gdev3b1.c">src/gdev3b1.c</a>,
19383ff48bf5SDavid du Colombier<a href="../src/gdevherc.c">src/gdevherc.c</a>,
19393ff48bf5SDavid du Colombier<a href="../src/gdevpe.c">src/gdevpe.c</a>,
19403ff48bf5SDavid du Colombier<a href="../src/gdevsnfb.c">src/gdevsnfb.c</a>,
19413ff48bf5SDavid du Colombier<a href="../src/gdevsun.c">src/gdevsun.c</a>.
19423ff48bf5SDavid du Colombier
19433ff48bf5SDavid du Colombier<dt>
19443ff48bf5SDavid du ColombierRaster file output drivers:
19453ff48bf5SDavid du Colombier<dd>
19463ff48bf5SDavid du Colombier<a href="../src/gdevcfax.c">src/gdevcfax.c</a>,
19473ff48bf5SDavid du Colombier<a href="../src/gdevcif.c">src/gdevcif.c</a>,
19483ff48bf5SDavid du Colombier<a href="../src/gdevdfax.c">src/gdevdfax.c</a>,
19493ff48bf5SDavid du Colombier<a href="../src/gdevifno.c">src/gdevifno.c</a>,
19503ff48bf5SDavid du Colombier<a href="../src/gdevmgr.c">src/gdevmgr.c</a>,
19513ff48bf5SDavid du Colombier<a href="../src/gdevmgr.h">src/gdevmgr.h</a>,
19523ff48bf5SDavid du Colombier<a href="../src/gdevsgi.c">src/gdevsgi.c</a>,
19533ff48bf5SDavid du Colombier<a href="../src/gdevsgi.h">src/gdevsgi.h</a>,
19543ff48bf5SDavid du Colombier<a href="../src/gdevsunr.c">src/gdevsunr.c</a>.
19553ff48bf5SDavid du Colombier
19563ff48bf5SDavid du Colombier<dt>
19573ff48bf5SDavid du ColombierPrinter drivers:
19583ff48bf5SDavid du Colombier<dd>
19593ff48bf5SDavid du Colombier<a href="../lib/bj8.rpd">lib/bj8.rpd</a>,
19603ff48bf5SDavid du Colombier<a href="../lib/cbjc600.ppd">lib/cbjc600.ppd</a>,
19613ff48bf5SDavid du Colombier<a href="../lib/cbjc800.ppd">lib/cbjc800.ppd</a>,
19623ff48bf5SDavid du Colombier<a href="../src/gdev3852.c">src/gdev3852.c</a>,
19633ff48bf5SDavid du Colombier<a href="../src/gdev4081.c">src/gdev4081.c</a>,
19643ff48bf5SDavid du Colombier<a href="../src/gdev4693.c">src/gdev4693.c</a>,
19653ff48bf5SDavid du Colombier<a href="../src/gdev8510.c">src/gdev8510.c</a>,
19663ff48bf5SDavid du Colombier<a href="../src/gdevadmp.c">src/gdevadmp.c</a>,
19673ff48bf5SDavid du Colombier<a href="../src/gdevbj10.c">src/gdevbj10.c</a>,
19683ff48bf5SDavid du Colombier<a href="../src/gdevbjc.h">src/gdevbjc.h</a>,
19693ff48bf5SDavid du Colombier<a href="../src/gdevbjcl.c">src/gdevbjcl.c</a>,
19703ff48bf5SDavid du Colombier<a href="../src/gdevbjcl.h">src/gdevbjcl.h</a>,
19713ff48bf5SDavid du Colombier<a href="../src/gdevccr.c">src/gdevccr.c</a>,
19723ff48bf5SDavid du Colombier<a href="../src/gdevcdj.c">src/gdevcdj.c</a>,
19733ff48bf5SDavid du Colombier<a href="../src/gdevclj.c">src/gdevclj.c</a>,
19743ff48bf5SDavid du Colombier<a href="../src/gdevcljc.c">src/gdevcljc.c</a>,
19753ff48bf5SDavid du Colombier<a href="../src/gdevcp50.c">src/gdevcp50.c</a>,
19763ff48bf5SDavid du Colombier<a href="../src/gdevcslw.c">src/gdevcslw.c</a>,
19773ff48bf5SDavid du Colombier<a href="../src/gdevdjtc.c">src/gdevdjtc.c</a>,
19783ff48bf5SDavid du Colombier<a href="../src/gdevdm24.c">src/gdevdm24.c</a>,
19793ff48bf5SDavid du Colombier<a href="../src/gdevepsc.c">src/gdevepsc.c</a>,
19803ff48bf5SDavid du Colombier<a href="../src/gdevepsn.c">src/gdevepsn.c</a>,
19813ff48bf5SDavid du Colombier<a href="../src/gdevescp.c">src/gdevescp.c</a>,
19823ff48bf5SDavid du Colombier<a href="../src/gdevhl7x.c">src/gdevhl7x.c</a>,
19833ff48bf5SDavid du Colombier<a href="../src/gdevijs.c">src/gdevijs.c</a>,
19843ff48bf5SDavid du Colombier<a href="../src/gdevimgn.c">src/gdevimgn.c</a>,
19853ff48bf5SDavid du Colombier<a href="../src/gdevl31s.c">src/gdevl31s.c</a>,
19863ff48bf5SDavid du Colombier<a href="../src/gdevlbp8.c">src/gdevlbp8.c</a>,
19873ff48bf5SDavid du Colombier<a href="../src/gdevlp8k.c">src/gdevlp8k.c</a>,
19883ff48bf5SDavid du Colombier<a href="../src/gdevlxm.c">src/gdevlxm.c</a>,
19893ff48bf5SDavid du Colombier<a href="../src/gdevn533.c">src/gdevn533.c</a>,
19903ff48bf5SDavid du Colombier<a href="../src/gdevo182.c">src/gdevo182.c</a>,
19913ff48bf5SDavid du Colombier<a href="../src/gdevokii.c">src/gdevokii.c</a>,
19923ff48bf5SDavid du Colombier<a href="../src/gdevpcl.c">src/gdevpcl.c</a>,
19933ff48bf5SDavid du Colombier<a href="../src/gdevpcl.h">src/gdevpcl.h</a>,
19943ff48bf5SDavid du Colombier<a href="../src/gdevphex.c">src/gdevphex.c</a>,
19953ff48bf5SDavid du Colombier<a href="../src/gdevpjet.c">src/gdevpjet.c</a>,
19963ff48bf5SDavid du Colombier<a href="../src/gdevsj48.c">src/gdevsj48.c</a>,
19973ff48bf5SDavid du Colombier<a href="../src/gdevsppr.c">src/gdevsppr.c</a>,
19983ff48bf5SDavid du Colombier<a href="../src/gdevstc.c">src/gdevstc.c</a>,
19993ff48bf5SDavid du Colombier<a href="../src/gdevstc.h">src/gdevstc.h</a>,
20003ff48bf5SDavid du Colombier<a href="../src/gdevstc1.c">src/gdevstc1.c</a>,
20013ff48bf5SDavid du Colombier<a href="../src/gdevstc2.c">src/gdevstc2.c</a>,
20023ff48bf5SDavid du Colombier<a href="../src/gdevstc3.c">src/gdevstc3.c</a>,
20033ff48bf5SDavid du Colombier<a href="../src/gdevstc4.c">src/gdevstc4.c</a>,
20043ff48bf5SDavid du Colombier<a href="../src/gdevtknk.c">src/gdevtknk.c</a>,
20053ff48bf5SDavid du Colombier<a href="../src/gdevupd.c">src/gdevupd.c</a>.
20063ff48bf5SDavid du Colombier
2007*593dc095SDavid du Colombier<dt>
2008*593dc095SDavid du ColombierThe special <tt>rinkj</tt> high-quality inkjet driver:
2009*593dc095SDavid du Colombier<dd>
2010*593dc095SDavid du Colombier<a href="../src/gdevrinkj.c">src/gdevrinkj.c</a>,
2011*593dc095SDavid du Colombier<a href="../src/gsequivc.c">src/gsequivc.c</a>,
2012*593dc095SDavid du Colombier<a href="../src/gsequivc.h">src/gsequivc.h</a>,
2013*593dc095SDavid du Colombier<a href="../src/rinkj/evenbetter-rll.c">src/rinkj/evenbetter-rll.c</a>,
2014*593dc095SDavid du Colombier<a href="../src/rinkj/evenbetter-rll.h">src/rinkj/evenbetter-rll.h</a>,
2015*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-byte-stream.c">src/rinkj/rinkj-byte-stream.c</a>,
2016*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-byte-stream.h">src/rinkj/rinkj-byte-stream.h</a>,
2017*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-config.c">src/rinkj/rinkj-config.c</a>,
2018*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-config.h">src/rinkj/rinkj-config.h</a>,
2019*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-device.c">src/rinkj/rinkj-device.c</a>,
2020*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-device.h">src/rinkj/rinkj-device.h</a>,
2021*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-dither.c">src/rinkj/rinkj-dither.c</a>,
2022*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-dither.h">src/rinkj/rinkj-dither.h</a>,
2023*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-epson870.c">src/rinkj/rinkj-epson870.c</a>,
2024*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-epson870.h">src/rinkj/rinkj-epson870.h</a>,
2025*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-screen-eb.c">src/rinkj/rinkj-screen-eb.c</a>,
2026*593dc095SDavid du Colombier<a href="../src/rinkj/rinkj-screen-eb.h">src/rinkj/rinkj-screen-eb.h</a>,
2027*593dc095SDavid du Colombier<a href="../lib/rinkj-2200-setup">lib/rinkj-2200-setup</a>.
2028*593dc095SDavid du Colombier
20293ff48bf5SDavid du Colombier</dl>
20303ff48bf5SDavid du Colombier
20313ff48bf5SDavid du Colombier<h3><a name="PostScript_interpreter"></a>PostScript interpreter</h3>
20323ff48bf5SDavid du Colombier
20333ff48bf5SDavid du Colombier<p>
20343ff48bf5SDavid du ColombierThe PostScript interpreter is conceptually simple: in fact, an interpreter
20353ff48bf5SDavid du Colombierthat could execute "3 4 add =" and print "7" was running 3 weeks after the
20363ff48bf5SDavid du Colombierfirst line of Ghostscript code was written.  However, a number of
20373ff48bf5SDavid du Colombierconsiderations make the code large and complex.
20383ff48bf5SDavid du Colombier
20393ff48bf5SDavid du Colombier<p>
20403ff48bf5SDavid du ColombierThe interpreter is designed to run in environments with very limited memory.
20413ff48bf5SDavid du ColombierThe main consequence of this is that it cannot allocate its stacks
20423ff48bf5SDavid du Colombier(dictionary, execution, operand) as ordinary arrays, since the
20433ff48bf5SDavid du Colombieruser-specified stack size limit may be very large.  Instead, it allocates
20443ff48bf5SDavid du Colombierthem as a linked list of blocks.  See below for more details.
20453ff48bf5SDavid du Colombier
20463ff48bf5SDavid du Colombier<p>
20473ff48bf5SDavid du ColombierThe interpreter must never cause a C runtime error that it cannot trap.
20483ff48bf5SDavid du ColombierUnfortunately, C implementations almost never provide the ability to trap
20493ff48bf5SDavid du Colombierstack overflow.  In order to put a fixed bound on the C stack size, the
20503ff48bf5SDavid du Colombierinterpreter never implements PostScript recursion by C recursion.  This
20513ff48bf5SDavid du Colombiermeans that any C code that logically needs to call the interpreter must
20523ff48bf5SDavid du Colombierinstead push a continuation (including all necessary state information) on
20533ff48bf5SDavid du Colombierthe PostScript execution stack, followed by the PostScript object to be
2054*593dc095SDavid du Colombierexecuted, and then <em>return</em> to the interpreter.  (See <a
2055*593dc095SDavid du Colombierhref="../src/estack.h">src/estack.h</a> for more details about
2056*593dc095SDavid du Colombiercontinuations.)  Unfortunately, since PostScript Level 2 introduces streams
2057*593dc095SDavid du Colombierwhose data source can be a PostScript procedure, any code that reads or
2058*593dc095SDavid du Colombierwrites stream data must be prepared to suspend itself, storing all necessary
2059*593dc095SDavid du Colombierstate in a continuation.  There are some places where this is extremely
2060*593dc095SDavid du Colombierawkward, such as the scanner/parser.
20613ff48bf5SDavid du Colombier
20623ff48bf5SDavid du Colombier<p>
20633ff48bf5SDavid du ColombierThe use of continuations affects many places in the interpreter, and even
20643ff48bf5SDavid du Colombiersome places in the graphics library.  For example, when processing an image,
20653ff48bf5SDavid du Colombierone may need to call a PostScript procedure as part of mapping a CIE color
20663ff48bf5SDavid du Colombierto a device color.  Ghostscript uses a variety of dodges to handle this: for
20673ff48bf5SDavid du Colombierexample, in the case of CIE color mapping, all of the PostScript procedures
20683ff48bf5SDavid du Colombierare pre-sampled and the results cached.  The Adobe implementation limits
20693ff48bf5SDavid du Colombierthis kind of recursion to a fixed number of levels (5?): this would be
20703ff48bf5SDavid du Colombieranother acceptable approach, but at this point it would require far more
20713ff48bf5SDavid du Colombiercode restructuring than it would be worth.
20723ff48bf5SDavid du Colombier
20733ff48bf5SDavid du Colombier<p>
20743ff48bf5SDavid du ColombierA significant amount of the PostScript language implementation is in fact
20753ff48bf5SDavid du Colombierwritten in PostScript.  Writing in PostScript leverages the C code for
20763ff48bf5SDavid du Colombiermulti-threading, garbage collection, error handling, continuations for
20773ff48bf5SDavid du Colombierstreams, etc., etc.; also, we have found PostScript in general more concise
20783ff48bf5SDavid du Colombierand easier to debug than C, mostly because of memory management issues.  So
20793ff48bf5SDavid du Colombiergiven the choice, we tended to implement a feature in PostScript if it
20803ff48bf5SDavid du Colombierworked primarily with PostScript data structures, wasn't heavily used
20813ff48bf5SDavid du Colombier(example: font loading), or if it interacted with the stream or other
20823ff48bf5SDavid du Colombiercallback machinery (examples: ReusableFileDecode streams, resourceforall).
20833ff48bf5SDavid du ColombierOften we would add non-standard PostScript operators for functions that had
20843ff48bf5SDavid du Colombierto run faster or that did more C-like things, such as the media matching
20853ff48bf5SDavid du Colombieralgorithm for setpagedevice.
20863ff48bf5SDavid du Colombier
2087*593dc095SDavid du Colombier
20883ff48bf5SDavid du Colombier
20893ff48bf5SDavid du Colombier<h4><a name="Main_program"></a>Main program</h4>
20903ff48bf5SDavid du Colombier
20913ff48bf5SDavid du Colombier<p>
20923ff48bf5SDavid du ColombierThe main program of the interpreter is normally invoked from the command
20933ff48bf5SDavid du Colombierline, but it has an API as well.  In fact, it has two APIs: one that
20943ff48bf5SDavid du Colombierrecognizes the existence of multiple "interpreter instances" (although it
20953ff48bf5SDavid du Colombiercurrently provides a default instance, which almost all clients use), and a
20963ff48bf5SDavid du Colombiercompletely different one designed for Windows DLLs.  These should be unified
20973ff48bf5SDavid du Colombieras soon as possible, since there are two steadily growing incompatible
20983ff48bf5SDavid du Colombierbodies of client code.
20993ff48bf5SDavid du Colombier
21003ff48bf5SDavid du Colombier<dl>
21013ff48bf5SDavid du Colombier
21023ff48bf5SDavid du Colombier<dt>
21033ff48bf5SDavid du ColombierFiles:
21043ff48bf5SDavid du Colombier<dd>
21053ff48bf5SDavid du Colombier<a href="../src/gs.c">src/gs.c</a>,
21063ff48bf5SDavid du Colombier<a href="../src/gserver.c">src/gserver.c</a>,
21073ff48bf5SDavid du Colombier<a href="../src/iccinit0.c">src/iccinit0.c</a>,
21083ff48bf5SDavid du Colombier<a href="../src/iinit.c">src/iinit.c</a>,
21093ff48bf5SDavid du Colombier<a href="../src/iinit.h">src/iinit.h</a>,
21103ff48bf5SDavid du Colombier<a href="../src/imain.c">src/imain.c</a>,
21113ff48bf5SDavid du Colombier<a href="../src/imain.h">src/imain.h</a>,
21123ff48bf5SDavid du Colombier<a href="../src/imainarg.c">src/imainarg.c</a>,
21133ff48bf5SDavid du Colombier<a href="../src/imainarg.h">src/imainarg.h</a>,
21143ff48bf5SDavid du Colombier<a href="../src/iminst.h">src/iminst.h</a>,
21153ff48bf5SDavid du Colombier<a href="../src/main.h">src/main.h</a>.
21163ff48bf5SDavid du Colombier
21173ff48bf5SDavid du Colombier</dl>
21183ff48bf5SDavid du Colombier
21193ff48bf5SDavid du Colombier<h4><a name="Data_structures"></a>Data structures</h4>
21203ff48bf5SDavid du Colombier
21213ff48bf5SDavid du Colombier<p>
21223ff48bf5SDavid du ColombierThe main data structures visible to the PostScript programmers are arrays,
21233ff48bf5SDavid du Colombiercontexts, dictionaries, names, and stacks.
21243ff48bf5SDavid du Colombier
21253ff48bf5SDavid du Colombier<p>
21263ff48bf5SDavid du ColombierArrays have no unusual properties.  See under <a href="#Refs">Refs</a> below
21273ff48bf5SDavid du Colombierfor more information about how array elements are stored.
21283ff48bf5SDavid du Colombier
21293ff48bf5SDavid du Colombier<p>
21303ff48bf5SDavid du ColombierContexts are used to hold the interpreter state even in configurations that
21313ff48bf5SDavid du Colombierdon't include the Display PostScript multiple context extension.  Context
21323ff48bf5SDavid du Colombierswitching is implemented by a complex cooperation of C and PostScript code.
21333ff48bf5SDavid du Colombier
21343ff48bf5SDavid du Colombier<p>
21353ff48bf5SDavid du ColombierDictionaries have two special properties worth noting:
21363ff48bf5SDavid du Colombier
21373ff48bf5SDavid du Colombier<ul>
21383ff48bf5SDavid du Colombier
21393ff48bf5SDavid du Colombier<li>They use an optimized storage representation if all the keys are names,
21403ff48bf5SDavid du Colombierwhich is almost always the case.
21413ff48bf5SDavid du Colombier
21423ff48bf5SDavid du Colombier<li>They interact with a caching scheme used to accelerate name lookup in
21433ff48bf5SDavid du Colombierthe interpreter.
21443ff48bf5SDavid du Colombier
21453ff48bf5SDavid du Colombier</ul>
21463ff48bf5SDavid du Colombier
21473ff48bf5SDavid du Colombier<p>
21483ff48bf5SDavid du ColombierNames are allocated in blocks.  The characters and hash chains are stored
21493ff48bf5SDavid du Colombierseparately from the lookup cache information, so that in the future, most of
21503ff48bf5SDavid du Colombierthe former can be compiled into the executable and shared or put in ROM.
21513ff48bf5SDavid du Colombier(This is not actually done yet.)
21523ff48bf5SDavid du Colombier
21533ff48bf5SDavid du Colombier<dl>
21543ff48bf5SDavid du Colombier
21553ff48bf5SDavid du Colombier<dt>
21563ff48bf5SDavid du ColombierContexts:
21573ff48bf5SDavid du Colombier<dd>
21583ff48bf5SDavid du Colombier<a href="../src/icontext.c">src/icontext.c</a>,
21593ff48bf5SDavid du Colombier<a href="../src/icontext.h">src/icontext.h</a>,
21603ff48bf5SDavid du Colombier<a href="../src/icstate.h">src/icstate.h</a>.
21613ff48bf5SDavid du Colombier
21623ff48bf5SDavid du Colombier<dt>
21633ff48bf5SDavid du ColombierDictionaries:
21643ff48bf5SDavid du Colombier<dd>
21653ff48bf5SDavid du Colombier<a href="../src/iddict.h">src/iddict.h</a>,
21663ff48bf5SDavid du Colombier<a href="../src/idict.h">src/idict.h</a>,
21673ff48bf5SDavid du Colombier<a href="../src/idict.c">src/idict.c</a>,
21683ff48bf5SDavid du Colombier<a href="../src/idictdef.h">src/idictdef.h</a>.
21693ff48bf5SDavid du Colombier
21703ff48bf5SDavid du Colombier<dt>
21713ff48bf5SDavid du ColombierNames:
21723ff48bf5SDavid du Colombier<dd>
21733ff48bf5SDavid du Colombier<a href="../src/iname.c">src/iname.c</a>,
21743ff48bf5SDavid du Colombier<a href="../src/iname.h">src/iname.h</a>,
21753ff48bf5SDavid du Colombier<a href="../src/inamedef.h">src/inamedef.h</a>,
21763ff48bf5SDavid du Colombier<a href="../src/inameidx.h">src/inameidx.h</a>,
21773ff48bf5SDavid du Colombier<a href="../src/inames.h">src/inames.h</a>,
21783ff48bf5SDavid du Colombier<a href="../src/inamestr.h">src/inamestr.h</a>.
21793ff48bf5SDavid du Colombier
2180*593dc095SDavid du Colombier</dl>
2181*593dc095SDavid du Colombier
2182*593dc095SDavid du Colombier<h4><a name="Stacks"></a>Stacks</h4>
2183*593dc095SDavid du Colombier
2184*593dc095SDavid du Colombier<p>
2185*593dc095SDavid du ColombierAs mentioned above, each stack is allocated as a linked list of blocks.
2186*593dc095SDavid du ColombierHowever, for reasonable performance, operators must normally be able to
2187*593dc095SDavid du Colombieraccess their operands and produce their results using indexing rather than
2188*593dc095SDavid du Colombieran access procedure.  This is implemented by ensuring that all the operands
2189*593dc095SDavid du Colombierof an operator are in the topmost block of the stack, using guard entries
2190*593dc095SDavid du Colombierthat cause an internal error if the condition isn't met.  See <a
2191*593dc095SDavid du Colombierhref="../src/iostack.h">src/iostack.h</a> for more details.
2192*593dc095SDavid du Colombier
2193*593dc095SDavid du Colombier<dl>
2194*593dc095SDavid du Colombier
21953ff48bf5SDavid du Colombier<dt>
2196*593dc095SDavid du ColombierGeneric stacks:
21973ff48bf5SDavid du Colombier<dd>
21983ff48bf5SDavid du Colombier<a href="../src/isdata.h">src/isdata.h</a>,
21993ff48bf5SDavid du Colombier<a href="../src/istack.c">src/istack.c</a>,
22003ff48bf5SDavid du Colombier<a href="../src/istack.h">src/istack.h</a>,
22013ff48bf5SDavid du Colombier<a href="../src/istkparm.h">src/istkparm.h</a>.
22023ff48bf5SDavid du Colombier
22033ff48bf5SDavid du Colombier<dt>
22043ff48bf5SDavid du ColombierSpecific stacks:
22053ff48bf5SDavid du Colombier<dd>
22063ff48bf5SDavid du Colombier
22073ff48bf5SDavid du Colombier<dl>
22083ff48bf5SDavid du Colombier
22093ff48bf5SDavid du Colombier<dt>
22103ff48bf5SDavid du ColombierDictionary stack:
22113ff48bf5SDavid du Colombier<dd>
22123ff48bf5SDavid du Colombier<a href="../src/dstack.h">src/dstack.h</a>,
22133ff48bf5SDavid du Colombier<a href="../src/iddstack.h">src/iddstack.h</a>,
22143ff48bf5SDavid du Colombier<a href="../src/idsdata.h">src/idsdata.h</a>,
22153ff48bf5SDavid du Colombier<a href="../src/idstack.c">src/idstack.c</a>,
22163ff48bf5SDavid du Colombier<a href="../src/idstack.h">src/idstack.h</a>.
22173ff48bf5SDavid du Colombier
22183ff48bf5SDavid du Colombier<dt>
22193ff48bf5SDavid du ColombierExecution stack:
22203ff48bf5SDavid du Colombier<dd>
2221*593dc095SDavid du Colombier<a href="../src/estack.h">src/estack.h</a>,
22223ff48bf5SDavid du Colombier<a href="../src/iesdata.h">src/iesdata.h</a>,
22233ff48bf5SDavid du Colombier<a href="../src/iestack.h">src/iestack.h</a>.
22243ff48bf5SDavid du Colombier
22253ff48bf5SDavid du Colombier<dt>
22263ff48bf5SDavid du ColombierOperand stack:
22273ff48bf5SDavid du Colombier<dd>
22283ff48bf5SDavid du Colombier<a href="../src/iosdata.h">src/iosdata.h</a>,
22293ff48bf5SDavid du Colombier<a href="../src/iostack.h">src/iostack.h</a>,
22303ff48bf5SDavid du Colombier<a href="../src/ostack.h">src/ostack.h</a>.
22313ff48bf5SDavid du Colombier
22323ff48bf5SDavid du Colombier</dl>
22333ff48bf5SDavid du Colombier
22343ff48bf5SDavid du Colombier</dl>
22353ff48bf5SDavid du Colombier
22363ff48bf5SDavid du Colombier<h4><a name="Interpreter_loop"></a>Interpreter loop</h4>
22373ff48bf5SDavid du Colombier
22383ff48bf5SDavid du Colombier<dl>
22393ff48bf5SDavid du Colombier
22403ff48bf5SDavid du Colombier<dt>
22413ff48bf5SDavid du ColombierFiles:
22423ff48bf5SDavid du Colombier<dd>
22433ff48bf5SDavid du Colombier<a href="../src/interp.c">src/interp.c</a>,
22443ff48bf5SDavid du Colombier<a href="../src/interp.h">src/interp.h</a>.
22453ff48bf5SDavid du Colombier
22463ff48bf5SDavid du Colombier</dl>
22473ff48bf5SDavid du Colombier
22483ff48bf5SDavid du Colombier<h4><a name="Scanning_parsing"></a>Scanning/parsing</h4>
22493ff48bf5SDavid du Colombier
22503ff48bf5SDavid du Colombier<p>
22513ff48bf5SDavid du ColombierPostScript parsing consists essentially of token scanning, and is simple in
22523ff48bf5SDavid du Colombierprinciple.  The scanner is complex because it must be able to suspend its
22533ff48bf5SDavid du Colombieroperation at any time (i.e., between any two input characters) to allow an
22543ff48bf5SDavid du Colombierinterpreter callout, if its input is coming from a procedure-based stream
22553ff48bf5SDavid du Colombierand the procedure must be called to provide more input data.
22563ff48bf5SDavid du Colombier
22573ff48bf5SDavid du Colombier<dl>
22583ff48bf5SDavid du Colombier
22593ff48bf5SDavid du Colombier<dt>
22603ff48bf5SDavid du ColombierMain scanner:
22613ff48bf5SDavid du Colombier<dd>
22623ff48bf5SDavid du Colombier<a href="../src/iscan.c">src/iscan.c</a>,
22633ff48bf5SDavid du Colombier<a href="../src/iscan.h">src/iscan.h</a>,
22643ff48bf5SDavid du Colombier<a href="../src/iscannum.c">src/iscannum.c</a>,
22653ff48bf5SDavid du Colombier<a href="../src/iscannum.h">src/iscannum.h</a>,
22663ff48bf5SDavid du Colombier<a href="../src/scanchar.h">src/scanchar.h</a>,
22673ff48bf5SDavid du Colombier<a href="../src/scantab.c">src/scantab.c</a>.
22683ff48bf5SDavid du Colombier
22693ff48bf5SDavid du Colombier<dt>
22703ff48bf5SDavid du ColombierBinary tokens:
22713ff48bf5SDavid du Colombier<dd>
22723ff48bf5SDavid du Colombier<a href="../src/btoken.h">src/btoken.h</a>,
22733ff48bf5SDavid du Colombier<a href="../src/ibnum.c">src/ibnum.c</a>,
22743ff48bf5SDavid du Colombier<a href="../src/ibnum.h">src/ibnum.h</a>,
22753ff48bf5SDavid du Colombier<a href="../src/inobtokn.c">src/inobtokn.c</a>,
22763ff48bf5SDavid du Colombier<a href="../src/iscanbin.c">src/iscanbin.c</a>,
22773ff48bf5SDavid du Colombier<a href="../src/iscanbin.h">src/iscanbin.h</a>.
22783ff48bf5SDavid du Colombier
22793ff48bf5SDavid du Colombier<dt>
22803ff48bf5SDavid du ColombierDSC parsing:
22813ff48bf5SDavid du Colombier<dd>
22823ff48bf5SDavid du Colombier<a href="../src/dscparse.c">src/dscparse.c</a>,
22833ff48bf5SDavid du Colombier<a href="../src/dscparse.h">src/dscparse.h</a>.
22843ff48bf5SDavid du Colombier
22853ff48bf5SDavid du Colombier</dl>
22863ff48bf5SDavid du Colombier
22873ff48bf5SDavid du Colombier<h4><a name="Standard_operators"></a>Standard operators</h4>
22883ff48bf5SDavid du Colombier
22893ff48bf5SDavid du Colombier<dl>
22903ff48bf5SDavid du Colombier
22913ff48bf5SDavid du Colombier<dt>
22923ff48bf5SDavid du ColombierNon-output-related:
22933ff48bf5SDavid du Colombier<dd>
22943ff48bf5SDavid du Colombier
22953ff48bf5SDavid du Colombier<dl>
22963ff48bf5SDavid du Colombier
22973ff48bf5SDavid du Colombier<dt>
22983ff48bf5SDavid du ColombierFilters:
22993ff48bf5SDavid du Colombier<dd>
23003ff48bf5SDavid du Colombier<a href="../src/ifilter.h">src/ifilter.h</a>,
23013ff48bf5SDavid du Colombier<a href="../src/ifilter2.h">src/ifilter2.h</a>,
23023ff48bf5SDavid du Colombier<a href="../src/ifrpred.h">src/ifrpred.h</a>,
23033ff48bf5SDavid du Colombier<a href="../src/ifwpred.h">src/ifwpred.h</a>,
23043ff48bf5SDavid du Colombier<a href="../src/istream.h">src/istream.h</a>,
23053ff48bf5SDavid du Colombier<a href="../src/zfbcp.c">src/zfbcp.c</a>,
23063ff48bf5SDavid du Colombier<a href="../src/zfdctd.c">src/zfdctd.c</a>,
23073ff48bf5SDavid du Colombier<a href="../src/zfdcte.c">src/zfdcte.c</a>,
23083ff48bf5SDavid du Colombier<a href="../src/zfdecode.c">src/zfdecode.c</a>,
23093ff48bf5SDavid du Colombier<a href="../src/zfilter.c">src/zfilter.c</a>,
23103ff48bf5SDavid du Colombier<a href="../src/zfilter2.c">src/zfilter2.c</a>,
23113ff48bf5SDavid du Colombier<a href="../src/zfilterx.c">src/zfilterx.c</a>,
2312*593dc095SDavid du Colombier<a href="../src/zfjbig2.c">src/zfjbig2.c</a>,
2313*593dc095SDavid du Colombier<a href="../src/zfjpx.c">src/zfjpx.c</a>,
23143ff48bf5SDavid du Colombier<a href="../src/zfmd5.c">src/zfmd5.c</a>,
23153ff48bf5SDavid du Colombier<a href="../src/zfarc4.c">src/zfarc4.c</a>,
23163ff48bf5SDavid du Colombier<a href="../src/zfproc.c">src/zfproc.c</a>,
23173ff48bf5SDavid du Colombier<a href="../src/zfrsd.c">src/zfrsd.c</a>,
23183ff48bf5SDavid du Colombier<a href="../src/zfzlib.c">src/zfzlib.c</a>.
23193ff48bf5SDavid du Colombier
23203ff48bf5SDavid du Colombier<dt>
23213ff48bf5SDavid du ColombierFile and stream I/O:
23223ff48bf5SDavid du Colombier<dd>
23233ff48bf5SDavid du Colombier<a href="../src/files.h">src/files.h</a>,
23243ff48bf5SDavid du Colombier<a href="../src/itoken.h">src/itoken.h</a>,
23253ff48bf5SDavid du Colombier<a href="../src/zbseq.c">src/zbseq.c</a>,
23263ff48bf5SDavid du Colombier<a href="../src/zdscpars.c">src/zdscpars.c</a>,
23273ff48bf5SDavid du Colombier<a href="../src/zfile.c">src/zfile.c</a>,
2328*593dc095SDavid du Colombier<a href="../src/zfile1.c">src/zfile1.c</a>,
23293ff48bf5SDavid du Colombier<a href="../src/zfileio.c">src/zfileio.c</a>,
23303ff48bf5SDavid du Colombier<a href="../src/ztoken.c">src/ztoken.c</a>.
23313ff48bf5SDavid du Colombier
23323ff48bf5SDavid du Colombier<dt>
23333ff48bf5SDavid du ColombierData structures:
23343ff48bf5SDavid du Colombier<dd>
23353ff48bf5SDavid du Colombier<a href="../src/zarray.c">src/zarray.c</a>,
23363ff48bf5SDavid du Colombier<a href="../src/zdict.c">src/zdict.c</a>,
23373ff48bf5SDavid du Colombier<a href="../src/zgeneric.c">src/zgeneric.c</a>,
23383ff48bf5SDavid du Colombier<a href="../src/zpacked.c">src/zpacked.c</a>,
23393ff48bf5SDavid du Colombier<a href="../src/zstring.c">src/zstring.c</a>.
23403ff48bf5SDavid du Colombier
23413ff48bf5SDavid du Colombier<dt>
23423ff48bf5SDavid du ColombierFunctions:
23433ff48bf5SDavid du Colombier<dd>
23443ff48bf5SDavid du Colombier<a href="../src/ifunc.h">src/ifunc.h</a>,
23453ff48bf5SDavid du Colombier<a href="../src/zfunc.c">src/zfunc.c</a>,
23463ff48bf5SDavid du Colombier<a href="../src/zfunc0.c">src/zfunc0.c</a>,
23473ff48bf5SDavid du Colombier<a href="../src/zfunc3.c">src/zfunc3.c</a>,
23483ff48bf5SDavid du Colombier<a href="../src/zfunc4.c">src/zfunc4.c</a>,
23493ff48bf5SDavid du Colombier
23503ff48bf5SDavid du Colombier<dt>
23513ff48bf5SDavid du ColombierOther:
23523ff48bf5SDavid du Colombier<dd>
23533ff48bf5SDavid du Colombier<a href="../src/ivmem2.h">src/ivmem2.h</a>,
23543ff48bf5SDavid du Colombier<a href="../src/zarith.c">src/zarith.c</a>,
23553ff48bf5SDavid du Colombier<a href="../src/zcontext.c">src/zcontext.c</a>,
23563ff48bf5SDavid du Colombier<a href="../src/zcontrol.c">src/zcontrol.c</a>,
23573ff48bf5SDavid du Colombier<a href="../src/zmath.c">src/zmath.c</a>,
23583ff48bf5SDavid du Colombier<a href="../src/zmatrix.c">src/zmatrix.c</a>,
23593ff48bf5SDavid du Colombier<a href="../src/zmisc.c">src/zmisc.c</a>,
23603ff48bf5SDavid du Colombier<a href="../src/zmisc1.c">src/zmisc1.c</a>,
23613ff48bf5SDavid du Colombier<a href="../src/zmisc2.c">src/zmisc2.c</a>,
23623ff48bf5SDavid du Colombier<a href="../src/zmisc3.c">src/zmisc3.c</a>,
23633ff48bf5SDavid du Colombier<a href="../src/zrelbit.c">src/zrelbit.c</a>,
23643ff48bf5SDavid du Colombier<a href="../src/zstack.c">src/zstack.c</a>,
23653ff48bf5SDavid du Colombier<a href="../src/ztype.c">src/ztype.c</a>,
23663ff48bf5SDavid du Colombier<a href="../src/zusparam.c">src/zusparam.c</a>,
23673ff48bf5SDavid du Colombier<a href="../src/zvmem.c">src/zvmem.c</a>,
23683ff48bf5SDavid du Colombier<a href="../src/zvmem2.c">src/zvmem2.c</a>.
23693ff48bf5SDavid du Colombier
23703ff48bf5SDavid du Colombier</dl>
23713ff48bf5SDavid du Colombier
23723ff48bf5SDavid du Colombier<dt>
23733ff48bf5SDavid du ColombierOutput-related:
23743ff48bf5SDavid du Colombier<dd>
23753ff48bf5SDavid du Colombier
23763ff48bf5SDavid du Colombier<dl>
23773ff48bf5SDavid du Colombier
23783ff48bf5SDavid du Colombier<dt>
23793ff48bf5SDavid du ColombierDevice management:
23803ff48bf5SDavid du Colombier<dd>
23813ff48bf5SDavid du Colombier<a href="../src/zdevcal.c">src/zdevcal.c</a>,
23823ff48bf5SDavid du Colombier<a href="../src/zdevice.c">src/zdevice.c</a>,
23833ff48bf5SDavid du Colombier<a href="../src/zdevice2.c">src/zdevice2.c</a>,
23843ff48bf5SDavid du Colombier<a href="../src/ziodev.c">src/ziodev.c</a>,
23853ff48bf5SDavid du Colombier<a href="../src/ziodev2.c">src/ziodev2.c</a>,
23863ff48bf5SDavid du Colombier<a href="../src/ziodevs.c">src/ziodevs.c</a>,
23873ff48bf5SDavid du Colombier<a href="../src/ziodevsc.c">src/ziodevsc.c</a>,
2388*593dc095SDavid du Colombier<a href="../src/ziodevst.c">src/ziodevst.c</a>,
23893ff48bf5SDavid du Colombier<a href="../src/zmedia2.c">src/zmedia2.c</a>,
23903ff48bf5SDavid du Colombier<a href="../src/zdfilter.c">src/zdfilter.c</a>.
23913ff48bf5SDavid du Colombier
23923ff48bf5SDavid du Colombier<dt>
23933ff48bf5SDavid du ColombierFonts and text:
23943ff48bf5SDavid du Colombier<dd>
23953ff48bf5SDavid du Colombier<a href="../src/bfont.h">src/bfont.h</a>,
23963ff48bf5SDavid du Colombier<a href="../src/ccfont.h">src/ccfont.h</a>,
23973ff48bf5SDavid du Colombier<a href="../src/iccfont.c">src/iccfont.c</a>,
23983ff48bf5SDavid du Colombier<a href="../src/icfontab.c">src/icfontab.c</a>,
23993ff48bf5SDavid du Colombier<a href="../src/ichar.h">src/ichar.h</a>,
24003ff48bf5SDavid du Colombier<a href="../src/ichar1.h">src/ichar1.h</a>,
24013ff48bf5SDavid du Colombier<a href="../src/icharout.h">src/icharout.h</a>,
24023ff48bf5SDavid du Colombier<a href="../src/icid.h">src/icid.h</a>,
24033ff48bf5SDavid du Colombier<a href="../src/ifcid.h">src/ifcid.h</a>,
24043ff48bf5SDavid du Colombier<a href="../src/ifont.h">src/ifont.h</a>,
24053ff48bf5SDavid du Colombier<a href="../src/ifont1.h">src/ifont1.h</a>,
24063ff48bf5SDavid du Colombier<a href="../src/ifont2.h">src/ifont2.h</a>,
24073ff48bf5SDavid du Colombier<a href="../src/ifont42.h">src/ifont42.h</a>,
24083ff48bf5SDavid du Colombier<a href="../src/zbfont.c">src/zbfont.c</a>,
24093ff48bf5SDavid du Colombier<a href="../src/zcfont.c">src/zcfont.c</a>,
24103ff48bf5SDavid du Colombier<a href="../src/zchar.c">src/zchar.c</a>,
24113ff48bf5SDavid du Colombier<a href="../src/zchar1.c">src/zchar1.c</a>,
24123ff48bf5SDavid du Colombier<a href="../src/zchar2.c">src/zchar2.c</a>,
24133ff48bf5SDavid du Colombier<a href="../src/zchar32.c">src/zchar32.c</a>,
24143ff48bf5SDavid du Colombier<a href="../src/zchar42.c">src/zchar42.c</a>,
2415*593dc095SDavid du Colombier<a href="../src/zchar42.h">src/zchar42.h</a>,
24163ff48bf5SDavid du Colombier<a href="../src/zcharout.c">src/zcharout.c</a>,
24173ff48bf5SDavid du Colombier<a href="../src/zcharx.c">src/zcharx.c</a>,
24183ff48bf5SDavid du Colombier<a href="../src/zcid.c">src/zcid.c</a>,
2419*593dc095SDavid du Colombier<a href="../src/zcidtest.c">src/zcidtest.c</a>,
24203ff48bf5SDavid du Colombier<a href="../src/zfcid.c">src/zfcid.c</a>,
24213ff48bf5SDavid du Colombier<a href="../src/zfcid0.c">src/zfcid0.c</a>,
24223ff48bf5SDavid du Colombier<a href="../src/zfcid1.c">src/zfcid1.c</a>,
24233ff48bf5SDavid du Colombier<a href="../src/zfcmap.c">src/zfcmap.c</a>,
24243ff48bf5SDavid du Colombier<a href="../src/zfont.c">src/zfont.c</a>,
24253ff48bf5SDavid du Colombier<a href="../src/zfont0.c">src/zfont0.c</a>,
24263ff48bf5SDavid du Colombier<a href="../src/zfont1.c">src/zfont1.c</a>,
24273ff48bf5SDavid du Colombier<a href="../src/zfont2.c">src/zfont2.c</a>,
24283ff48bf5SDavid du Colombier<a href="../src/zfont32.c">src/zfont32.c</a>,
2429*593dc095SDavid du Colombier<a href="../src/zfont42.c">src/zfont42.c</a>,
2430*593dc095SDavid du Colombier<a href="../src/zfontenum.c">src/zfontenum.c</a>.
2431*593dc095SDavid du Colombier
2432*593dc095SDavid du Colombier<dt>
2433*593dc095SDavid du ColombierA bridge to the True Type bytecode interpreter:
2434*593dc095SDavid du Colombier<dd>
2435*593dc095SDavid du Colombier<a href="../src/gxttfb.c">src/gxttfb.c</a>,
2436*593dc095SDavid du Colombier<a href="../src/gxttfb.h">src/gxttfb.h</a>,
2437*593dc095SDavid du Colombier<a href="../src/ttfoutl.h">src/ttfoutl.h</a>,
2438*593dc095SDavid du Colombier<a href="../src/ttfmain.c">src/ttfmain.c</a>,
2439*593dc095SDavid du Colombier<a href="../src/ttfmemd.c">src/ttfmemd.c</a>,
2440*593dc095SDavid du Colombier<a href="../src/ttfmemd.h">src/ttfmemd.h</a>,
2441*593dc095SDavid du Colombier<a href="../src/ttfinp.c">src/ttfinp.c</a>,
2442*593dc095SDavid du Colombier<a href="../src/ttfinp.h">src/ttfinp.h</a>.
2443*593dc095SDavid du Colombier
2444*593dc095SDavid du Colombier<dt>
2445*593dc095SDavid du ColombierA reduced True Type bytecode interpreter:
2446*593dc095SDavid du Colombier<br><em>(this is based in part on the work of the Freetype Team and incorporates some code from
2447*593dc095SDavid du Colombierthe
2448*593dc095SDavid du ColombierFreeType 1 project)</em>
2449*593dc095SDavid du Colombier<dd>
2450*593dc095SDavid du Colombier<a href="../src/ttfsfnt.h">src/ttfsfnt.h</a>,
2451*593dc095SDavid du Colombier<a href="../src/ttcalc.c">src/ttcalc.c</a>,
2452*593dc095SDavid du Colombier<a href="../src/ttcalc.h">src/ttcalc.h</a>,
2453*593dc095SDavid du Colombier<a href="../src/ttcommon.h">src/ttcommon.h</a>,
2454*593dc095SDavid du Colombier<a href="../src/ttconf.h">src/ttconf.h</a>,
2455*593dc095SDavid du Colombier<a href="../src/ttconfig.h">src/ttconfig.h</a>,
2456*593dc095SDavid du Colombier<a href="../src/ttinterp.c">src/ttinterp.c</a>,
2457*593dc095SDavid du Colombier<a href="../src/ttinterp.h">src/ttinterp.h</a>,
2458*593dc095SDavid du Colombier<a href="../src/ttload.c">src/ttload.c</a>,
2459*593dc095SDavid du Colombier<a href="../src/ttload.h">src/ttload.h</a>,
2460*593dc095SDavid du Colombier<a href="../src/ttmisc.h">src/ttmisc.h</a>,
2461*593dc095SDavid du Colombier<a href="../src/ttobjs.c">src/ttobjs.c</a>,
2462*593dc095SDavid du Colombier<a href="../src/ttobjs.h">src/ttobjs.h</a>,
2463*593dc095SDavid du Colombier<a href="../src/tttables.h">src/tttables.h</a>,
2464*593dc095SDavid du Colombier<a href="../src/tttype.h">src/tttype.h</a>,
2465*593dc095SDavid du Colombier<a href="../src/tttypes.h">src/tttypes.h</a>.
24663ff48bf5SDavid du Colombier
24673ff48bf5SDavid du Colombier<dt>
24683ff48bf5SDavid du ColombierColor, pattern, and halftone:
24693ff48bf5SDavid du Colombier<dd>
24703ff48bf5SDavid du Colombier<a href="../src/icie.h">src/icie.h</a>,
24713ff48bf5SDavid du Colombier<a href="../src/icolor.h">src/icolor.h</a>,
24723ff48bf5SDavid du Colombier<a href="../src/icremap.h">src/icremap.h</a>,
24733ff48bf5SDavid du Colombier<a href="../src/icsmap.h">src/icsmap.h</a>,
24743ff48bf5SDavid du Colombier<a href="../src/iht.h">src/iht.h</a>,
24753ff48bf5SDavid du Colombier<a href="../src/ipcolor.h">src/ipcolor.h</a>,
24763ff48bf5SDavid du Colombier<a href="../src/zcie.c">src/zcie.c</a>,
24773ff48bf5SDavid du Colombier<a href="../src/zcolor.c">src/zcolor.c</a>,
24783ff48bf5SDavid du Colombier<a href="../src/zcolor1.c">src/zcolor1.c</a>,
24793ff48bf5SDavid du Colombier<a href="../src/zcolor2.c">src/zcolor2.c</a>,
2480*593dc095SDavid du Colombier<a href="../src/zcolor3.c">src/zcolor3.c</a>,
24813ff48bf5SDavid du Colombier<a href="../src/zcrd.c">src/zcrd.c</a>,
24823ff48bf5SDavid du Colombier<a href="../src/zcsdevn.c">src/zcsdevn.c</a>,
24833ff48bf5SDavid du Colombier<a href="../src/zcsindex.c">src/zcsindex.c</a>,
24843ff48bf5SDavid du Colombier<a href="../src/zcspixel.c">src/zcspixel.c</a>,
24853ff48bf5SDavid du Colombier<a href="../src/zcssepr.c">src/zcssepr.c</a>,
24863ff48bf5SDavid du Colombier<a href="../src/zicc.c">src/zicc.c</a>,
24873ff48bf5SDavid du Colombier<a href="../src/zhsb.c">src/zhsb.c</a>,
24883ff48bf5SDavid du Colombier<a href="../src/zht.c">src/zht.c</a>,
24893ff48bf5SDavid du Colombier<a href="../src/zht1.c">src/zht1.c</a>,
2490*593dc095SDavid du Colombier<a href="../src/zht2.h">src/zht2.h</a>,
24913ff48bf5SDavid du Colombier<a href="../src/zht2.c">src/zht2.c</a>,
24923ff48bf5SDavid du Colombier<a href="../src/zpcolor.c">src/zpcolor.c</a>,
24933ff48bf5SDavid du Colombier<a href="../src/zshade.c">src/zshade.c</a>,
24943ff48bf5SDavid du Colombier<a href="../src/ztrans.c">src/ztrans.c</a>.
24953ff48bf5SDavid du Colombier
24963ff48bf5SDavid du Colombier<dt>
24973ff48bf5SDavid du ColombierImages:
24983ff48bf5SDavid du Colombier<dd>
24993ff48bf5SDavid du Colombier<a href="../src/iimage.h">src/iimage.h</a>,
25003ff48bf5SDavid du Colombier<a href="../src/iimage2.h">src/iimage2.h</a>,
25013ff48bf5SDavid du Colombier<a href="../src/zimage.c">src/zimage.c</a>,
25023ff48bf5SDavid du Colombier<a href="../src/zimage2.c">src/zimage2.c</a>,
25033ff48bf5SDavid du Colombier<a href="../src/zimage3.c">src/zimage3.c</a>.
25043ff48bf5SDavid du Colombier
25053ff48bf5SDavid du Colombier<dt>
25063ff48bf5SDavid du ColombierOther graphics:
25073ff48bf5SDavid du Colombier<dd>
25083ff48bf5SDavid du Colombier<a href="../src/igstate.h">src/igstate.h</a>,
25093ff48bf5SDavid du Colombier<a href="../src/zdpnext.c">src/zdpnext.c</a>,
25103ff48bf5SDavid du Colombier<a href="../src/zdps.c">src/zdps.c</a>,
25113ff48bf5SDavid du Colombier<a href="../src/zdps1.c">src/zdps1.c</a>,
25123ff48bf5SDavid du Colombier<a href="../src/zgstate.c">src/zgstate.c</a>,
25133ff48bf5SDavid du Colombier<a href="../src/zpaint.c">src/zpaint.c</a>,
25143ff48bf5SDavid du Colombier<a href="../src/zpath.c">src/zpath.c</a>,
25153ff48bf5SDavid du Colombier<a href="../src/zpath1.c">src/zpath1.c</a>,
25163ff48bf5SDavid du Colombier<a href="../src/zrop.c">src/zrop.c</a>,
25173ff48bf5SDavid du Colombier<a href="../src/ztrap.c">src/ztrap.c</a>,
25183ff48bf5SDavid du Colombier<a href="../src/zupath.c">src/zupath.c</a>.
25193ff48bf5SDavid du Colombier
25203ff48bf5SDavid du Colombier</dl>
25213ff48bf5SDavid du Colombier
25223ff48bf5SDavid du Colombier<dt>
25233ff48bf5SDavid du ColombierOperator support:
25243ff48bf5SDavid du Colombier<dd>
25253ff48bf5SDavid du Colombier<a href="../src/oparc.h">src/oparc.h</a>,
25263ff48bf5SDavid du Colombier<a href="../src/opcheck.h">src/opcheck.h</a>,
25273ff48bf5SDavid du Colombier<a href="../src/opdef.h">src/opdef.h</a>,
25283ff48bf5SDavid du Colombier<a href="../src/oper.h">src/oper.h</a>,
25293ff48bf5SDavid du Colombier<a href="../src/opextern.h">src/opextern.h</a>.
25303ff48bf5SDavid du Colombier
25313ff48bf5SDavid du Colombier</dl>
25323ff48bf5SDavid du Colombier
25333ff48bf5SDavid du Colombier<h4><a name="Non_standard_operators"></a>Non-standard operators</h4>
25343ff48bf5SDavid du Colombier
25353ff48bf5SDavid du Colombier<p>
25363ff48bf5SDavid du ColombierThe interpreter includes many non-standard operators.  Most of these provide
25373ff48bf5SDavid du Colombiersome part of the function of a standard operator, so that the standard
25383ff48bf5SDavid du Colombieroperator itself can be implemented in PostScript: these are not of interest
25393ff48bf5SDavid du Colombierto users, and their function is usually obvious from the way they are used.
25403ff48bf5SDavid du ColombierHowever, some non-standard operators provide access to additional,
25413ff48bf5SDavid du Colombiernon-standard facilities that users might want to know about, such as
25423ff48bf5SDavid du Colombiertransparency, RasterOp, and in-memory rendering.  These are documented at <a
25433ff48bf5SDavid du Colombierhref="Language.htm#Additional_operators">Language.htm#Additional_operators</a>.
25443ff48bf5SDavid du Colombier
25453ff48bf5SDavid du Colombier<p>
25463ff48bf5SDavid du ColombierWe don't document the complete set of non-standard operators here, because
25473ff48bf5SDavid du Colombierthe set changes frequently.  However, all non-standard operators are
25483ff48bf5SDavid du Colombiersupposed to have names that begin with '.', so you can find them all by
25493ff48bf5SDavid du Colombierexecuting the following (Unix) command:
25503ff48bf5SDavid du Colombier
25513ff48bf5SDavid du Colombier<blockquote><pre>
25523ff48bf5SDavid du Colombiergrep '{".[.]' src/[zi]*.c
25533ff48bf5SDavid du Colombier</pre></blockquote>
25543ff48bf5SDavid du Colombier
25553ff48bf5SDavid du Colombier<p>
25563ff48bf5SDavid du ColombierIn addition to individual non-standard operators implemented in the same
25573ff48bf5SDavid du Colombierfiles as standard ones, there are several independent optional packages of
25583ff48bf5SDavid du Colombiernon-standard operators.  As with other non-standard operators, the names of
25593ff48bf5SDavid du Colombierall the operators in these packages begin with '.'.  We list those packages
25603ff48bf5SDavid du Colombierhere.
25613ff48bf5SDavid du Colombier
25623ff48bf5SDavid du Colombier<dl>
25633ff48bf5SDavid du Colombier
25643ff48bf5SDavid du Colombier<dt>
25653ff48bf5SDavid du Colombier<a href="../src/zdosio.c">src/zdosio.c</a>
25663ff48bf5SDavid du Colombier<dd>
25673ff48bf5SDavid du ColombierProvides access to PC hardware I/O through MS-DOS system calls.  Probably no
25683ff48bf5SDavid du Colombierlonger useful.
25693ff48bf5SDavid du Colombier
25703ff48bf5SDavid du Colombier<dt>
25713ff48bf5SDavid du Colombier<a href="../src/zdouble.c">src/zdouble.c</a>
25723ff48bf5SDavid du Colombier<dd>
25733ff48bf5SDavid du ColombierProvides "double" floating point arithmetic, using 8-byte strings to hold
25743ff48bf5SDavid du Colombiervalues.  Developed under a contract; probably used only by the group that
25753ff48bf5SDavid du Colombierfunded the development.
25763ff48bf5SDavid du Colombier
25773ff48bf5SDavid du Colombier<dt>
2578*593dc095SDavid du Colombier<a href="../src/zfsample.c">src/zfsample.c</a>,
2579*593dc095SDavid du Colombier<dd>
2580*593dc095SDavid du ColombierProvides a special operator to sample a given function and create a new type 0 function.
2581*593dc095SDavid du Colombier
2582*593dc095SDavid du Colombier<dt>
25833ff48bf5SDavid du Colombier<a href="../src/zsysvm.c">src/zsysvm.c</a>
25843ff48bf5SDavid du Colombier<dd>
25853ff48bf5SDavid du ColombierProvides operators for allocating objects in specific VM spaces,
25863ff48bf5SDavid du Colombierdisregarding the current VM mode.
25873ff48bf5SDavid du Colombier
25883ff48bf5SDavid du Colombier</dl>
25893ff48bf5SDavid du Colombier
25903ff48bf5SDavid du Colombier<h4><a name="Interpreter_support"></a>Interpreter support</h4>
25913ff48bf5SDavid du Colombier
25923ff48bf5SDavid du Colombier<p>
25933ff48bf5SDavid du ColombierMemory management (refs, GC, save/restore) -- see <a
25943ff48bf5SDavid du Colombierhref="#PostScript_interpreter_extensions">below</a>.
25953ff48bf5SDavid du Colombier
25963ff48bf5SDavid du Colombier<dl>
2597*593dc095SDavid du Colombier<dt>
2598*593dc095SDavid du ColombierFont API :
2599*593dc095SDavid du Colombier<dd>
2600*593dc095SDavid du Colombier<a href="../src/ifapi.h">src/ifapi.h</a>,
2601*593dc095SDavid du Colombier<a href="../src/zfapi.c">src/zfapi.c</a>,
2602*593dc095SDavid du Colombier<a href="../src/fapiufst.c">src/fapiufst.c</a>,
2603*593dc095SDavid du Colombier<a href="../src/fapi_ft.c">src/fapi_ft.c</a>,
2604*593dc095SDavid du Colombier<a href="../src/wrfont.h">src/wrfont.h</a>,
2605*593dc095SDavid du Colombier<a href="../src/wrfont.c">src/wrfont.c</a>,
2606*593dc095SDavid du Colombier<a href="../src/write_t1.h">src/write_t1.h</a>,
2607*593dc095SDavid du Colombier<a href="../src/write_t1.c">src/write_t1.c</a>,
2608*593dc095SDavid du Colombier<a href="../src/write_t2.h">src/write_t2.h</a>,
2609*593dc095SDavid du Colombier<a href="../src/write_t2.c">src/write_t2.c</a>,
26103ff48bf5SDavid du Colombier
26113ff48bf5SDavid du Colombier<dt>
26123ff48bf5SDavid du ColombierMiscellaneous support:
26133ff48bf5SDavid du Colombier<dd>
2614*593dc095SDavid du Colombier<a href="../src/ierrors.h">src/ierrors.h</a>,
2615*593dc095SDavid du Colombier<a href="../src/errors.h">src/errors.h</a> <em>(deprecated)</em>,
26163ff48bf5SDavid du Colombier<a href="../src/ghost.h">src/ghost.h</a>,
26173ff48bf5SDavid du Colombier<a href="../src/iconf.c">src/iconf.c</a>,
26183ff48bf5SDavid du Colombier<a href="../src/iconf.h">src/iconf.h</a>,
26193ff48bf5SDavid du Colombier<a href="../src/idparam.c">src/idparam.c</a>,
26203ff48bf5SDavid du Colombier<a href="../src/idparam.h">src/idparam.h</a>,
26213ff48bf5SDavid du Colombier<a href="../src/ilevel.h">src/ilevel.h</a>,
26223ff48bf5SDavid du Colombier<a href="../src/inouparm.c">src/inouparm.c</a>,
26233ff48bf5SDavid du Colombier<a href="../src/iparam.c">src/iparam.c</a>,
26243ff48bf5SDavid du Colombier<a href="../src/iparam.h">src/iparam.h</a>,
26253ff48bf5SDavid du Colombier<a href="../src/iparray.h">src/iparray.h</a>,
26263ff48bf5SDavid du Colombier<a href="../src/iutil.c">src/iutil.c</a>,
26273ff48bf5SDavid du Colombier<a href="../src/iutil.h">src/iutil.h</a>,
26283ff48bf5SDavid du Colombier<a href="../src/iutil2.c">src/iutil2.c</a>,
26293ff48bf5SDavid du Colombier<a href="../src/iutil2.h">src/iutil2.h</a>,
2630*593dc095SDavid du Colombier<a href="../src/iutilasm.asm">src/iutilasm.asm</a>,
2631*593dc095SDavid du Colombier<a href="../src/iplugin.c">src/iplugin.c</a>,
2632*593dc095SDavid du Colombier<a href="../src/iplugin.h">src/iplugin.h</a>.
26333ff48bf5SDavid du Colombier
26343ff48bf5SDavid du Colombier</dl>
26353ff48bf5SDavid du Colombier
26363ff48bf5SDavid du Colombier<h4><a name="PostScript_code"></a>PostScript code</h4>
26373ff48bf5SDavid du Colombier
26383ff48bf5SDavid du Colombier<dl>
26393ff48bf5SDavid du Colombier
26403ff48bf5SDavid du Colombier<dt>
26413ff48bf5SDavid du ColombierInitialization and language support:
26423ff48bf5SDavid du Colombier<dd>
26433ff48bf5SDavid du Colombier
26443ff48bf5SDavid du Colombier<dl>
26453ff48bf5SDavid du Colombier
26463ff48bf5SDavid du Colombier<dt>
26473ff48bf5SDavid du ColombierAll configurations:
26483ff48bf5SDavid du Colombier<dd>
26493ff48bf5SDavid du Colombier<a href="../lib/gs_init.ps">lib/gs_init.ps</a>,
26503ff48bf5SDavid du Colombier<a href="../lib/gs_statd.ps">lib/gs_statd.ps</a>.
26513ff48bf5SDavid du Colombier
26523ff48bf5SDavid du Colombier<dt>
26533ff48bf5SDavid du ColombierLevel 2:
26543ff48bf5SDavid du Colombier<dd>
26553ff48bf5SDavid du Colombier<a href="../lib/gs_btokn.ps">lib/gs_btokn.ps</a>,
26563ff48bf5SDavid du Colombier<a href="../lib/gs_dps1.ps">lib/gs_dps1.ps</a>,
26573ff48bf5SDavid du Colombier<a href="../lib/gs_dps2.ps">lib/gs_dps2.ps</a>,
26583ff48bf5SDavid du Colombier<a href="../lib/gs_lev2.ps">lib/gs_lev2.ps</a>,
26593ff48bf5SDavid du Colombier<a href="../lib/gs_res.ps">lib/gs_res.ps</a>,
2660*593dc095SDavid du Colombier<a href="../lib/gs_resmp.ps">lib/gs_resmp.ps</a>,
2661*593dc095SDavid du Colombier<a href="../lib/gs_resst.ps">lib/gs_resst.ps</a>,
2662*593dc095SDavid du Colombier<a href="../lib/gs_stres.ps">lib/gs_stres.ps</a>,
26633ff48bf5SDavid du Colombier<a href="../lib/gs_setpd.ps">lib/gs_setpd.ps</a>.
26643ff48bf5SDavid du Colombier
26653ff48bf5SDavid du Colombier<dt>
26663ff48bf5SDavid du ColombierLanguageLevel 3:
26673ff48bf5SDavid du Colombier<dd>
26683ff48bf5SDavid du Colombier<a href="../lib/gs_frsd.ps">lib/gs_frsd.ps</a>,
26693ff48bf5SDavid du Colombier<a href="../lib/gs_ll3.ps">lib/gs_ll3.ps</a>,
26703ff48bf5SDavid du Colombier<a href="../lib/gs_trap.ps">lib/gs_trap.ps</a>.
26713ff48bf5SDavid du Colombier
26723ff48bf5SDavid du Colombier<dt>
26733ff48bf5SDavid du ColombierDisplay PostScript:
26743ff48bf5SDavid du Colombier<dd>
26753ff48bf5SDavid du Colombier<a href="../lib/gs_dpnxt.ps">lib/gs_dpnxt.ps</a>,
26763ff48bf5SDavid du Colombier<a href="../lib/gs_dps.ps">lib/gs_dps.ps</a>.
26773ff48bf5SDavid du Colombier
2678*593dc095SDavid du Colombier</dl>
2679*593dc095SDavid du Colombier
2680*593dc095SDavid du Colombier<dt>
2681*593dc095SDavid du ColombierColor Spaces and support:
2682*593dc095SDavid du Colombier<dd>
2683*593dc095SDavid du Colombier
2684*593dc095SDavid du Colombier<dl>
2685*593dc095SDavid du Colombier
2686*593dc095SDavid du Colombier<dt>
2687*593dc095SDavid du ColombierColor Space Loading:
2688*593dc095SDavid du Colombier<dd>
2689*593dc095SDavid du Colombier<a href="../lib/gs_ciecs2.ps">lib/gs_ciecs2.ps</a>,
2690*593dc095SDavid du Colombier<a href="../lib/gs_ciecs3.ps">lib/gs_ciecs3.ps</a>,
2691*593dc095SDavid du Colombier<a href="../lib/gs_cspace.ps">lib/gs_cspace.ps</a>,
2692*593dc095SDavid du Colombier<a href="../lib/gs_devcs.ps">lib/gs_devcs.ps</a>,
2693*593dc095SDavid du Colombier<a href="../lib/gs_devn.ps">lib/gs_devn.ps</a>,
2694*593dc095SDavid du Colombier<a href="../lib/gs_devpxl.ps">lib/gs_devpxl.ps</a>,
2695*593dc095SDavid du Colombier<a href="../lib/gs_indxd.ps">lib/gs_indxd.ps</a>,
2696*593dc095SDavid du Colombier<a href="../lib/gs_patrn.ps">lib/gs_patrn.ps</a>,
2697*593dc095SDavid du Colombier<a href="../lib/gs_sepr.ps">lib/gs_sepr.ps</a>.
2698*593dc095SDavid du Colombier
26993ff48bf5SDavid du Colombier<dt>
27003ff48bf5SDavid du ColombierICC color profiles:
27013ff48bf5SDavid du Colombier<dd>
27023ff48bf5SDavid du Colombier<a href="../lib/gs_icc.ps">lib/gs_icc.ps</a>.
27033ff48bf5SDavid du Colombier
27043ff48bf5SDavid du Colombier</dl>
27053ff48bf5SDavid du Colombier
27063ff48bf5SDavid du Colombier<dt>
27073ff48bf5SDavid du ColombierFont loading and support:
27083ff48bf5SDavid du Colombier<dd>
27093ff48bf5SDavid du Colombier
27103ff48bf5SDavid du Colombier<dl>
27113ff48bf5SDavid du Colombier
27123ff48bf5SDavid du Colombier<dt>
27133ff48bf5SDavid du ColombierFont name mapping:
27143ff48bf5SDavid du Colombier<dd>
27153ff48bf5SDavid du Colombier<a href="../lib/Fontmap">lib/Fontmap</a>,
27163ff48bf5SDavid du Colombier<a href="../lib/Fontmap.ATB">lib/Fontmap.ATB</a>,
27173ff48bf5SDavid du Colombier<a href="../lib/Fontmap.ATM">lib/Fontmap.ATM</a>,
27183ff48bf5SDavid du Colombier<a href="../lib/Fontmap.GS">lib/Fontmap.GS</a>,
27193ff48bf5SDavid du Colombier<a href="../lib/Fontmap.OS2">lib/Fontmap.OS2</a>,
27203ff48bf5SDavid du Colombier<a href="../lib/Fontmap.OSF">lib/Fontmap.OSF</a>,
27213ff48bf5SDavid du Colombier<a href="../lib/Fontmap.SGI">lib/Fontmap.SGI</a>,
27223ff48bf5SDavid du Colombier<a href="../lib/Fontmap.Sol">lib/Fontmap.Sol</a>,
27233ff48bf5SDavid du Colombier<a href="../lib/Fontmap.Ult">lib/Fontmap.Ult</a>,
2724*593dc095SDavid du Colombier<a href="../lib/Fontmap.VMS">lib/Fontmap.VMS</a>,
2725*593dc095SDavid du Colombier<a href="../lib/cidfmap">lib/cidfmap</a>,
2726*593dc095SDavid du Colombier<a href="../lib/FAPIcidfmap">lib/FAPIcidfmap</a>,
2727*593dc095SDavid du Colombier<a href="../lib/FAPIfontmap">lib/FAPIfontmap</a>.
27283ff48bf5SDavid du Colombier
27293ff48bf5SDavid du Colombier<dt>
27303ff48bf5SDavid du ColombierGeneric:
27313ff48bf5SDavid du Colombier<dd>
27323ff48bf5SDavid du Colombier<a href="../lib/gs_ccfnt.ps">lib/gs_ccfnt.ps</a>,
2733*593dc095SDavid du Colombier<a href="../lib/gs_fonts.ps">lib/gs_fonts.ps</a>,
2734*593dc095SDavid du Colombier<a href="../lib/gs_fntem.ps">lib/gs_fntem.ps</a>.
27353ff48bf5SDavid du Colombier
27363ff48bf5SDavid du Colombier<dt>
27373ff48bf5SDavid du ColombierType 1 and CFF:
27383ff48bf5SDavid du Colombier<dd>
27393ff48bf5SDavid du Colombier<a href="../lib/gs_cff.ps">lib/gs_cff.ps</a>,
27403ff48bf5SDavid du Colombier<a href="../lib/gs_diskf.ps">lib/gs_diskf.ps</a>,
27413ff48bf5SDavid du Colombier<a href="../lib/gs_type1.ps">lib/gs_type1.ps</a>.
27423ff48bf5SDavid du Colombier
27433ff48bf5SDavid du Colombier<dt>
27443ff48bf5SDavid du ColombierTrueType:
27453ff48bf5SDavid du Colombier<dd>
27463ff48bf5SDavid du Colombier<a href="../lib/gs_ttf.ps">lib/gs_ttf.ps</a>,
27473ff48bf5SDavid du Colombier<a href="../lib/gs_typ42.ps">lib/gs_typ42.ps</a>.
27483ff48bf5SDavid du Colombier
27493ff48bf5SDavid du Colombier<dt>
27503ff48bf5SDavid du ColombierCID-keyed:
27513ff48bf5SDavid du Colombier<dd>
27523ff48bf5SDavid du Colombier<a href="../lib/gs_cidcm.ps">lib/gs_cidcm.ps</a>,
27533ff48bf5SDavid du Colombier<a href="../lib/gs_cidfn.ps">lib/gs_cidfn.ps</a>,
2754*593dc095SDavid du Colombier<a href="../lib/gs_cmap.ps">lib/gs_cmap.ps</a>,
2755*593dc095SDavid du Colombier<a href="../lib/gs_ciddc.ps">lib/gs_ciddc.ps</a>,
2756*593dc095SDavid du Colombier<a href="../lib/gs_cidfm.ps">lib/gs_cidfm.ps</a>,
2757*593dc095SDavid du Colombier<a href="../lib/gs_cidtt.ps">lib/gs_cidtt.ps</a>.
2758*593dc095SDavid du Colombier
2759*593dc095SDavid du Colombier<dt>
2760*593dc095SDavid du ColombierFont API:
2761*593dc095SDavid du Colombier<dd>
2762*593dc095SDavid du Colombier<a href="../lib/gs_fapi.ps">lib/gs_fapi.ps</a>,
2763*593dc095SDavid du Colombier<a href="../lib/FAPIconfig">lib/FAPIconfig</a>,
2764*593dc095SDavid du Colombier<a href="../lib/xlatmap">lib/xlatmap</a>.
27653ff48bf5SDavid du Colombier
27663ff48bf5SDavid du Colombier<dt>
27673ff48bf5SDavid du ColombierOther:
27683ff48bf5SDavid du Colombier<dd>
27693ff48bf5SDavid du Colombier<a href="../lib/gs_kanji.ps">lib/gs_kanji.ps</a>,
27703ff48bf5SDavid du Colombier<a href="../lib/gs_pfile.ps">lib/gs_pfile.ps</a>,
27713ff48bf5SDavid du Colombier<a href="../lib/gs_typ32.ps">lib/gs_typ32.ps</a>.
27723ff48bf5SDavid du Colombier
27733ff48bf5SDavid du Colombier</dl>
27743ff48bf5SDavid du Colombier
27753ff48bf5SDavid du Colombier<dt>
27763ff48bf5SDavid du ColombierEncodings:
27773ff48bf5SDavid du Colombier<dd>
27783ff48bf5SDavid du Colombier
27793ff48bf5SDavid du Colombier<dl>
27803ff48bf5SDavid du Colombier
27813ff48bf5SDavid du Colombier<dt>
27823ff48bf5SDavid du ColombierAdobe-specified:
27833ff48bf5SDavid du Colombier<dd>
27843ff48bf5SDavid du Colombier<a href="../lib/gs_ce_e.ps">lib/gs_ce_e.ps</a>,
27853ff48bf5SDavid du Colombier<a href="../lib/gs_dbt_e.ps">lib/gs_dbt_e.ps</a>,
27863ff48bf5SDavid du Colombier<a href="../lib/gs_il1_e.ps">lib/gs_il1_e.ps</a>,
27873ff48bf5SDavid du Colombier<a href="../lib/gs_mex_e.ps">lib/gs_mex_e.ps</a>,
27883ff48bf5SDavid du Colombier<a href="../lib/gs_mro_e.ps">lib/gs_mro_e.ps</a>,
27893ff48bf5SDavid du Colombier<a href="../lib/gs_pdf_e.ps">lib/gs_pdf_e.ps</a>,
27903ff48bf5SDavid du Colombier<a href="../lib/gs_std_e.ps">lib/gs_std_e.ps</a>,
27913ff48bf5SDavid du Colombier<a href="../lib/gs_sym_e.ps">lib/gs_sym_e.ps</a>,
27923ff48bf5SDavid du Colombier<a href="../lib/gs_wan_e.ps">lib/gs_wan_e.ps</a>.
27933ff48bf5SDavid du Colombier
27943ff48bf5SDavid du Colombier<dt>
27953ff48bf5SDavid du ColombierAdditional:
27963ff48bf5SDavid du Colombier<dd>
27973ff48bf5SDavid du Colombier<a href="../lib/gs_il2_e.ps">lib/gs_il2_e.ps</a>,
27983ff48bf5SDavid du Colombier<a href="../lib/gs_ksb_e.ps">lib/gs_ksb_e.ps</a>,
27993ff48bf5SDavid du Colombier<a href="../lib/gs_wl1_e.ps">lib/gs_wl1_e.ps</a>,
28003ff48bf5SDavid du Colombier<a href="../lib/gs_wl2_e.ps">lib/gs_wl2_e.ps</a>,
28013ff48bf5SDavid du Colombier<a href="../lib/gs_wl5_e.ps">lib/gs_wl5_e.ps</a>.
28023ff48bf5SDavid du Colombier
28033ff48bf5SDavid du Colombier<dt>
28043ff48bf5SDavid du ColombierPseudo-encodings for internal use:
28053ff48bf5SDavid du Colombier<dd>
28063ff48bf5SDavid du Colombier<a href="../lib/gs_css_e.ps">lib/gs_css_e.ps</a>,
28073ff48bf5SDavid du Colombier<a href="../lib/gs_lgo_e.ps">lib/gs_lgo_e.ps</a>,
28083ff48bf5SDavid du Colombier<a href="../lib/gs_lgx_e.ps">lib/gs_lgx_e.ps</a>,
28093ff48bf5SDavid du Colombier<a href="../lib/gs_mgl_e.ps">lib/gs_mgl_e.ps</a>.
28103ff48bf5SDavid du Colombier
28113ff48bf5SDavid du Colombier</dl>
28123ff48bf5SDavid du Colombier
28133ff48bf5SDavid du Colombier<dt>
28143ff48bf5SDavid du ColombierMiscellaneous:
28153ff48bf5SDavid du Colombier<dd>
28163ff48bf5SDavid du Colombier
28173ff48bf5SDavid du Colombier<dl>
28183ff48bf5SDavid du Colombier
28193ff48bf5SDavid du Colombier<dt>
2820*593dc095SDavid du ColombierImage support:
2821*593dc095SDavid du Colombier<dd>
2822*593dc095SDavid du Colombier<a href="../lib/gs_img.ps">lib/gs_img.ps</a>,
2823*593dc095SDavid du Colombier
2824*593dc095SDavid du Colombier<dt>
2825*593dc095SDavid du ColombierEmulation of %disk IODevice:
2826*593dc095SDavid du Colombier<dd>
2827*593dc095SDavid du Colombier<a href="../lib/gs_diskn.ps">lib/gs_diskn.ps</a>,
2828*593dc095SDavid du Colombier
2829*593dc095SDavid du Colombier<dt>
28303ff48bf5SDavid du ColombierOther support:
28313ff48bf5SDavid du Colombier<dd>
28323ff48bf5SDavid du Colombier<a href="../lib/gs_agl.ps">lib/gs_agl.ps</a>,
28333ff48bf5SDavid du Colombier<a href="../lib/gs_dscp.ps">lib/gs_dscp.ps</a>,
28343ff48bf5SDavid du Colombier<a href="../lib/gs_epsf.ps">lib/gs_epsf.ps</a>,
28353ff48bf5SDavid du Colombier<a href="../lib/gs_pdfwr.ps">lib/gs_pdfwr.ps</a>,
28363ff48bf5SDavid du Colombier<a href="../lib/gs_rdlin.ps">lib/gs_rdlin.ps</a>.
28373ff48bf5SDavid du Colombier
28383ff48bf5SDavid du Colombier<dt>
28393ff48bf5SDavid du ColombierX Windows icon bitmaps:
28403ff48bf5SDavid du Colombier<dd>
28413ff48bf5SDavid du Colombier<a href="../lib/gs_l.xbm">lib/gs_l.xbm</a>,
28423ff48bf5SDavid du Colombier<a href="../lib/gs_l.xpm">lib/gs_l.xpm</a>,
28433ff48bf5SDavid du Colombier<a href="../lib/gs_l_m.xbm">lib/gs_l_m.xbm</a>,
28443ff48bf5SDavid du Colombier<a href="../lib/gs_m.xbm">lib/gs_m.xbm</a>,
28453ff48bf5SDavid du Colombier<a href="../lib/gs_m.xpm">lib/gs_m.xpm</a>,
28463ff48bf5SDavid du Colombier<a href="../lib/gs_m_m.xbm">lib/gs_m_m.xbm</a>,
28473ff48bf5SDavid du Colombier<a href="../lib/gs_s.xbm">lib/gs_s.xbm</a>,
28483ff48bf5SDavid du Colombier<a href="../lib/gs_s.xpm">lib/gs_s.xpm</a>,
28493ff48bf5SDavid du Colombier<a href="../lib/gs_s_m.xbm">lib/gs_s_m.xbm</a>,
28503ff48bf5SDavid du Colombier<a href="../lib/gs_t.xbm">lib/gs_t.xbm</a>,
28513ff48bf5SDavid du Colombier<a href="../lib/gs_t.xpm">lib/gs_t.xpm</a>,
28523ff48bf5SDavid du Colombier<a href="../lib/gs_t_m.xbm">lib/gs_t_m.xbm</a>.
28533ff48bf5SDavid du Colombier
28543ff48bf5SDavid du Colombier<dt>
2855*593dc095SDavid du ColombierPDF/X-3 definition file sample :
2856*593dc095SDavid du Colombier<dd>
2857*593dc095SDavid du Colombier<a href="../lib/PDFX_def.ps">lib/PDFX_def.ps</a>,
2858*593dc095SDavid du Colombier
2859*593dc095SDavid du Colombier<dt>
28603ff48bf5SDavid du ColombierNot currently used:
28613ff48bf5SDavid du Colombier<dd>
28623ff48bf5SDavid du Colombier<a href="../lib/gs_cmdl.ps">lib/gs_cmdl.ps</a>,
28633ff48bf5SDavid du Colombier<a href="../lib/gs_fform.ps">lib/gs_fform.ps</a>,
28643ff48bf5SDavid du Colombier<a href="../lib/gs_l2img.ps">lib/gs_l2img.ps</a>.
28653ff48bf5SDavid du Colombier
28663ff48bf5SDavid du Colombier</dl>
28673ff48bf5SDavid du Colombier
28683ff48bf5SDavid du Colombier</dl>
28693ff48bf5SDavid du Colombier
28703ff48bf5SDavid du Colombier<h3><a name="PDF_interpreter"></a>PDF interpreter</h3>
28713ff48bf5SDavid du Colombier
28723ff48bf5SDavid du Colombier<p>
28733ff48bf5SDavid du ColombierGhostscript's PDF interpreter is written entirely in PostScript, because its
28743ff48bf5SDavid du Colombierdata structures are the same as PostScript's, and it is much more convenient
28753ff48bf5SDavid du Colombierto manipulate PostScript-like data structures in PostScript than in C.
28763ff48bf5SDavid du ColombierThere is definitely a performance cost, but apparently not a substantial
28773ff48bf5SDavid du Colombierone: we considered moving the main interpreter loop (read a token using
28783ff48bf5SDavid du Colombierslightly different syntax than PostScript, push it on the stack if literal,
28793ff48bf5SDavid du Colombierlook it up in a special dictionary for execution if not) into C, but we did
28803ff48bf5SDavid du Colombiersome profiling and discovered that this wasn't accounting for enough of the
28813ff48bf5SDavid du Colombiertime to be worthwhile.
28823ff48bf5SDavid du Colombier
28833ff48bf5SDavid du Colombier<p>
28843ff48bf5SDavid du ColombierUntil recently, there was essentially no C code specifically for the purpose
28853ff48bf5SDavid du Colombierof supporting PDF interpretation.  The one major exception is the PDF 1.4
28863ff48bf5SDavid du Colombiertransparency features, which we (but not Adobe) have made available to
28873ff48bf5SDavid du ColombierPostScript code.
28883ff48bf5SDavid du Colombier
28893ff48bf5SDavid du Colombier<p>
28903ff48bf5SDavid du ColombierIn addition to patching the <b><tt>run</tt></b> operator to detect PDF
28913ff48bf5SDavid du Colombierfiles, the interpreter provides some procedures in <a
28923ff48bf5SDavid du Colombierhref="../lib/pdf_main.ps">lib/pdf_main.ps</a> that are meant to be called
28933ff48bf5SDavid du Colombierfrom applications such as previewers.
28943ff48bf5SDavid du Colombier
28953ff48bf5SDavid du Colombier<dl>
28963ff48bf5SDavid du Colombier
28973ff48bf5SDavid du Colombier<dt>
28983ff48bf5SDavid du ColombierFiles:
28993ff48bf5SDavid du Colombier<dd>
29003ff48bf5SDavid du Colombier<a href="../lib/pdf_base.ps">lib/pdf_base.ps</a>,
29013ff48bf5SDavid du Colombier<a href="../lib/pdf_draw.ps">lib/pdf_draw.ps</a>,
29023ff48bf5SDavid du Colombier<a href="../lib/pdf_font.ps">lib/pdf_font.ps</a>,
29033ff48bf5SDavid du Colombier<a href="../lib/pdf_main.ps">lib/pdf_main.ps</a>,
2904*593dc095SDavid du Colombier<a href="../lib/pdf_rbld.ps">lib/pdf_rbld.ps</a>,
29053ff48bf5SDavid du Colombier<a href="../lib/pdf_ops.ps">lib/pdf_ops.ps</a>,
29063ff48bf5SDavid du Colombier<a href="../lib/pdf_sec.ps">lib/pdf_sec.ps</a>.
29073ff48bf5SDavid du Colombier
29083ff48bf5SDavid du Colombier</dl>
29093ff48bf5SDavid du Colombier
2910*593dc095SDavid du Colombier<h3><a name="PPD"></a>PostScript Printer Description</h3>
2911*593dc095SDavid du Colombier<p>
2912*593dc095SDavid du ColombierA PostScript Printer Description tells a generic PostScript printer
2913*593dc095SDavid du Colombierdriver how to generate PostScript for a particular printer.
2914*593dc095SDavid du ColombierGhostscript includes a PPD file for generating PostScript
2915*593dc095SDavid du Colombierintended to be converted to PDF.  A Windows INF file for
2916*593dc095SDavid du Colombierinstalling the PPD on Windows 2000 and XP is included.
2917*593dc095SDavid du Colombier
2918*593dc095SDavid du Colombier<dl>
2919*593dc095SDavid du Colombier
2920*593dc095SDavid du Colombier<dt>
2921*593dc095SDavid du ColombierFiles:
2922*593dc095SDavid du Colombier<dd>
2923*593dc095SDavid du Colombier<a href="../lib/ghostpdf.ppd">lib/ghostpdf.ppd</a>,
2924*593dc095SDavid du Colombier<a href="../lib/ghostpdf.inf">lib/ghostpdf.inf</a>.
2925*593dc095SDavid du Colombier
2926*593dc095SDavid du Colombier</dl>
2927*593dc095SDavid du Colombier
29283ff48bf5SDavid du Colombier<h3><a name="Build_process"></a>Build process</h3>
29293ff48bf5SDavid du Colombier
29303ff48bf5SDavid du Colombier<h4><a name="Makefile_structure"></a>Makefile structure</h4>
29313ff48bf5SDavid du Colombier
29323ff48bf5SDavid du Colombier<p>
29333ff48bf5SDavid du ColombierGhostscript's makefiles embody a number of design decisions and assumptions
29343ff48bf5SDavid du Colombierthat may not be obvious from a casual reading of the code.
29353ff48bf5SDavid du Colombier
29363ff48bf5SDavid du Colombier<ul>
29373ff48bf5SDavid du Colombier
29383ff48bf5SDavid du Colombier<li>All files are stored in subdirectories.  The names of all subdirectories
29393ff48bf5SDavid du Colombierused in the build process are defined in the top-level makefiles for the
29403ff48bf5SDavid du Colombiervarious platforms: there are no "hard wired" directory names in any makefile
29413ff48bf5SDavid du Colombierrule.  Subdirectory names in the makefiles are relative to the directory
29423ff48bf5SDavid du Colombierthat is current at build time: normally this directory is the parent of the
29433ff48bf5SDavid du Colombiervarious subdirectories, and holds only a <b><tt>makefile</tt></b>, which in
29443ff48bf5SDavid du Colombierturn simply references the real top-level makefile in the source
29453ff48bf5SDavid du Colombiersubdirectory.
29463ff48bf5SDavid du Colombier
29473ff48bf5SDavid du Colombier<li>All compiler and linker switches are likewise defined by macros, again
29483ff48bf5SDavid du Colombierpreferably in the top-level platform makefile.
29493ff48bf5SDavid du Colombier
29503ff48bf5SDavid du Colombier<li>There is an absolute distinction between "source-like" subdirectories,
29513ff48bf5SDavid du Colombierwhich are read-only during the build process, and "object-like"
29523ff48bf5SDavid du Colombiersubdirectories, all of whose contents are generated by the build process and
29533ff48bf5SDavid du Colombierwhich can be emptied (<b><tt>rm&nbsp;*</tt></b>) at any time with no bad
29543ff48bf5SDavid du Colombiereffects.  The source subdirectories are defined by macros named
29553ff48bf5SDavid du Colombier<b><tt>xxxSRCDIR</tt></b>.
29563ff48bf5SDavid du Colombier
29573ff48bf5SDavid du Colombier<li>Object subdirectories may distinguish further between those that hold
29583ff48bf5SDavid du Colombierthe results of the build process that are needed at run time (i.e., that
29593ff48bf5SDavid du Colombiershould be included in a run-time distribution), defined by
29603ff48bf5SDavid du Colombier<b><tt>BINDIR</tt></b>, and those that are not needed at run time, defined
29613ff48bf5SDavid du Colombierby <b><tt>xxxGENDIR</tt></b> and <b><tt>xxxOBJDIR</tt></b>.  (The
29623ff48bf5SDavid du Colombierdistinction between these is historical and probably no longer relevant.)
29633ff48bf5SDavid du Colombier
29643ff48bf5SDavid du Colombier<li>There may be multiple object subdirectories for different build
29653ff48bf5SDavid du Colombierconfigurations.  On Unix, the <b><tt>obj</tt></b> and <b><tt>bin</tt></b>
29663ff48bf5SDavid du Colombierdirectories are used for normal production builds, the
29673ff48bf5SDavid du Colombier<b><tt>debugobj</tt></b> directory for debugging builds, and the
29683ff48bf5SDavid du Colombier<b><tt>pgobj</tt></b> directory for profiling builds; other platforms may
29693ff48bf5SDavid du Colombieruse different conventions.  The Unix makefiles support targets named
29703ff48bf5SDavid du Colombier<b><tt>debug</tt></b> and <b><tt>pg</tt></b> for debugging and profiling
29713ff48bf5SDavid du Colombierbuilds respectively; other platforms generally do not.
29723ff48bf5SDavid du Colombier
29733ff48bf5SDavid du Colombier<li>Makefiles will be maintained by hand.  This requires editing the
29743ff48bf5SDavid du Colombierfollowing makefile elements whenever the relevant source files changes:
29753ff48bf5SDavid du Colombier
29763ff48bf5SDavid du Colombier<ul>
29773ff48bf5SDavid du Colombier
29783ff48bf5SDavid du Colombier<li>Every header (.h) file must have a corresponding macro definition in a
29793ff48bf5SDavid du Colombiermakefile.  If <b><tt>abc.h</tt></b> #includes <b><tt>def.h</tt></b> and
29803ff48bf5SDavid du Colombier<b><tt>xyz.h</tt></b>, the definition must have the form
29813ff48bf5SDavid du Colombier
29823ff48bf5SDavid du Colombier<blockquote><pre>
29833ff48bf5SDavid du Colombierxyz_h=$(xxxSRCD)xyz.h $(def_h) $(xyz_h)
29843ff48bf5SDavid du Colombier</pre></blockquote>
29853ff48bf5SDavid du Colombier
29863ff48bf5SDavid du Colombierwhere <b><tt>xxxSRCD</tt></b> is the macro defining the relevant source
29873ff48bf5SDavid du Colombierdirectory (including a trailing '/').  Note that the '.' in the file name
29883ff48bf5SDavid du Colombierhas been replaced by an underscore.  Note also that the definition must
29893ff48bf5SDavid du Colombierfollow all definitions it references, since some <b><tt>make</tt></b>
29903ff48bf5SDavid du Colombierprograms expand macros in definitions at the time of definition rather than
29913ff48bf5SDavid du Colombierat the time of use.
29923ff48bf5SDavid du Colombier
29933ff48bf5SDavid du Colombier<li>Every .c file must have a corresponding rule in a makefile.  If
29943ff48bf5SDavid du Colombier<b><tt>abc.c</tt></b> #includes <b><tt>def.h</tt></b> and
29953ff48bf5SDavid du Colombier<b><tt>lmn.h</tt></b>, the rule must have approximately the form
29963ff48bf5SDavid du Colombier
29973ff48bf5SDavid du Colombier<blockquote><pre>
29983ff48bf5SDavid du Colombier$(xxxOBJD)abc.$(OBJ) : $(xxxSRCD)abc.c $(def_h) $(lmn_h)
29993ff48bf5SDavid du Colombier    $(xxCC) $(xxO_)abc.$(OBJ) $(C_) $(xxxSRCD)abc.c
30003ff48bf5SDavid du Colombier</pre></blockquote>
30013ff48bf5SDavid du Colombier
30023ff48bf5SDavid du Colombierwhere <b><tt>xxxSRCD</tt></b> is as before; <b><tt>xxxOBJD</tt></b> is the
30033ff48bf5SDavid du Colombierrelevant object directory; <b><tt>xxCC</tt></b> defines the name of the C
30043ff48bf5SDavid du Colombiercompiler plus the relevant compilation switches; and <b><tt>xxO_</tt></b>
30053ff48bf5SDavid du Colombierand <b><tt>C_</tt></b> are macros used to bridge syntactic differences
30063ff48bf5SDavid du Colombierbetween different <b><tt>make</tt></b> programs.
30073ff48bf5SDavid du Colombier
30083ff48bf5SDavid du Colombier</ul>
30093ff48bf5SDavid du Colombier
30103ff48bf5SDavid du Colombier</ul>
30113ff48bf5SDavid du Colombier
30123ff48bf5SDavid du Colombier<p>
30133ff48bf5SDavid du ColombierThe requirement to keep makefiles up to date by hand has been controversial.
30143ff48bf5SDavid du ColombierTwo alternatives are generally proposed.
30153ff48bf5SDavid du Colombier
30163ff48bf5SDavid du Colombier<ul>
30173ff48bf5SDavid du Colombier
30183ff48bf5SDavid du Colombier<li>Programs like <b><tt>makedeps</tt></b>, which generate build rules
30193ff48bf5SDavid du Colombierautomatically from the #include lists in C files.  We have found such
30203ff48bf5SDavid du Colombierprograms useless: they "wire in" specific, concrete directory names, not
30213ff48bf5SDavid du Colombieronly for our own code but even for the system header files; they have to be
30223ff48bf5SDavid du Colombierrun manually whenever code files are added, renamed, or deleted, or whenever
30233ff48bf5SDavid du Colombierthe list of #includes in any file changes; and they cannot deal with
30243ff48bf5SDavid du Colombierdifferent source files requiring different compilation switches.
30253ff48bf5SDavid du Colombier
30263ff48bf5SDavid du Colombier<li>MSVC-style "project" files.  These are equally useless: they are not
30273ff48bf5SDavid du Colombierportable across different vendors' tools -- in fact, there may not even be a
30283ff48bf5SDavid du Colombierusable import/export facility to convert their data to or from text form --
30293ff48bf5SDavid du Colombierand they cannot combine configuration-independent data with
30303ff48bf5SDavid du Colombierconfiguration-specific data.
30313ff48bf5SDavid du Colombier
30323ff48bf5SDavid du Colombier</ul>
30333ff48bf5SDavid du Colombier
30343ff48bf5SDavid du Colombier<p>
30353ff48bf5SDavid du ColombierWe have seriously considered writing our own build program in Tcl or Python
30363ff48bf5SDavid du Colombierthat would eliminate these problems, or perhaps porting the tools developed
30373ff48bf5SDavid du Colombierby Digital's Vesta research project (if we can get access to them); however,
30383ff48bf5SDavid du Colombiereither of these approaches would create potential portability problems of
30393ff48bf5SDavid du Colombierits own, not to mention difficulties in integrating with others' build
30403ff48bf5SDavid du Colombiersystems.
30413ff48bf5SDavid du Colombier
30423ff48bf5SDavid du Colombier<p>
30433ff48bf5SDavid du ColombierFor more information about makefiles:
30443ff48bf5SDavid du Colombier
30453ff48bf5SDavid du Colombier<ul>
30463ff48bf5SDavid du Colombier
30473ff48bf5SDavid du Colombier<li>For a detailed list of makefiles, and a discussion of makefile issues
30483ff48bf5SDavid du Colombierrelated to portability, see the <a href="#Makefiles">Makefiles</a> section
30493ff48bf5SDavid du Colombierbelow.
30503ff48bf5SDavid du Colombier
30513ff48bf5SDavid du Colombier<li>For more detailed information about editing configuration information in
30523ff48bf5SDavid du Colombiermakefiles, see <a
30533ff48bf5SDavid du Colombierhref="Make.htm#Makefile_overview">doc/Make.htm#Makefile_overview</a>.
30543ff48bf5SDavid du Colombier
30553ff48bf5SDavid du Colombier<li>For a complete example of adding a new driver to a makefile, see <a
30563ff48bf5SDavid du Colombierhref="Drivers.htm#Adding_drivers">doc/Drivers.htm#Adding_drivers</a>.
30573ff48bf5SDavid du Colombier
30583ff48bf5SDavid du Colombier<li>For a few more notes on makefile coding conventions, see <a
30593ff48bf5SDavid du Colombierhref="C-style.htm#Makefiles">doc/C-style.htm#Makefiles</a>.
30603ff48bf5SDavid du Colombier
30613ff48bf5SDavid du Colombier</ul>
30623ff48bf5SDavid du Colombier
30633ff48bf5SDavid du Colombier<h4><a name="dev_files"></a>.dev files</h4>
30643ff48bf5SDavid du Colombier
30653ff48bf5SDavid du Colombier<p>
30663ff48bf5SDavid du ColombierOn top of the general conventions just described, Ghostscript's makefiles
30673ff48bf5SDavid du Colombieradd a further layer of structure in order to support an open-ended set of
30683ff48bf5SDavid du Colombierfine-grained, flexible configuration options.  Selecting an option (usually
30693ff48bf5SDavid du Colombiercalled a "module") for inclusion in the build may affect the build in many
30703ff48bf5SDavid du Colombierways:
30713ff48bf5SDavid du Colombier
30723ff48bf5SDavid du Colombier<ul>
30733ff48bf5SDavid du Colombier
30743ff48bf5SDavid du Colombier<li>Almost always, it requires linking in some compiled code files.
30753ff48bf5SDavid du Colombier
30763ff48bf5SDavid du Colombier<li>It may require running some additional initialization procedures at
30773ff48bf5SDavid du Colombierstartup.
30783ff48bf5SDavid du Colombier
30793ff48bf5SDavid du Colombier<li>It may require reading in some additional PostScript files at startup.
30803ff48bf5SDavid du ColombierFor example, a Level 2 PostScript build requires support for PostScript
30813ff48bf5SDavid du Colombierresources and for setpagedevice, which are implemented in PostScript code.
30823ff48bf5SDavid du Colombier
30833ff48bf5SDavid du Colombier<li>It may require adding entries to a variety of internal tables that
30843ff48bf5SDavid du Colombiercatalogue such things as drivers, IODevices, Function types, etc.
30853ff48bf5SDavid du Colombier
30863ff48bf5SDavid du Colombier<li>It may require that other particular modules be included.  For example,
30873ff48bf5SDavid du Colombierthe "PostScript Level 2" module requires the modules for various filters,
30883ff48bf5SDavid du Colombiercolor spaces, etc.
30893ff48bf5SDavid du Colombier
30903ff48bf5SDavid du Colombier<li>It may require <em>removing</em> some other (default) module from the
30913ff48bf5SDavid du Colombierbuild.  For example, the core (Level 1) PostScript build has a "stub" for
30923ff48bf5SDavid du Colombierbinary tokens, which are a Level 2 feature but are referenced by the core
30933ff48bf5SDavid du Colombierscanner: a Level 2 build must remove the stub.  For more information about
30943ff48bf5SDavid du Colombierthis, look for the string <b><tt>-replace</tt></b> in the makefiles and in
30953ff48bf5SDavid du Colombier<a href="../src/genconf.c">src/genconf.c</a>.
30963ff48bf5SDavid du Colombier
30973ff48bf5SDavid du Colombier</ul>
30983ff48bf5SDavid du Colombier
30993ff48bf5SDavid du Colombier<p>
31003ff48bf5SDavid du ColombierEach module is defined in the makefiles by rules that create a file named
31013ff48bf5SDavid du Colombier<b><em>xxx</em><tt>.dev</tt></b>.  The dependencies of the rule include all
31023ff48bf5SDavid du Colombierthe files that make up the module (compiled code files, PostScript files,
31033ff48bf5SDavid du Colombieretc.); the body of the rule creates the .dev file by writing the description
31043ff48bf5SDavid du Colombierof the module into it.  A program called <b><tt>genconf</tt></b>, described
31053ff48bf5SDavid du Colombierin the next section, merges all the relevant .dev files together.  For
31063ff48bf5SDavid du Colombierexamples of .dev rules, see any of the Ghostscript makefiles.
31073ff48bf5SDavid du Colombier
31083ff48bf5SDavid du Colombier<p>
31093ff48bf5SDavid du ColombierUltimately, a person must specify the root set of modules to include in a
31103ff48bf5SDavid du Colombierbuild (which of course may require other modules, recursively).
31113ff48bf5SDavid du ColombierGhostscript's makefiles do this with a set of macros called
31123ff48bf5SDavid du Colombier<b><tt>FEATURE_DEVS</tt></b> and <b><tt>DEVICE_DEVS</tt>n</b>, defined in
31133ff48bf5SDavid du Colombiereach top-level makefile, but nothing in the module machinery depends on
31143ff48bf5SDavid du Colombierthis.
31153ff48bf5SDavid du Colombier
31163ff48bf5SDavid du Colombier<h4><a name="Generators"></a>Generators</h4>
31173ff48bf5SDavid du Colombier
31183ff48bf5SDavid du Colombier<p>
31193ff48bf5SDavid du ColombierGhostscript's build procedure is somewhat unusual in that it compiles and
31203ff48bf5SDavid du Colombierthen executes some support programs during the build process.  These
31213ff48bf5SDavid du Colombierprograms then generate data or source code that is used later on in the
31223ff48bf5SDavid du Colombierbuild.
31233ff48bf5SDavid du Colombier
31243ff48bf5SDavid du Colombier<p>
31253ff48bf5SDavid du ColombierThe most important and complex of the generator programs is
31263ff48bf5SDavid du Colombier<b><tt>genconf</tt></b>.  <b><tt>genconf</tt></b> merges all the .dev files
31273ff48bf5SDavid du Colombierthat make up the build, and creates three or more output files used in later
31283ff48bf5SDavid du Colombierstages:
31293ff48bf5SDavid du Colombier
31303ff48bf5SDavid du Colombier<ul>
31313ff48bf5SDavid du Colombier
31323ff48bf5SDavid du Colombier<li><b><tt>gconfig.h</tt></b>, consisting mainly of macro calls, one call
31333ff48bf5SDavid du Colombierper "resource" making up the build, other than "resources" listed in the
31343ff48bf5SDavid du Colombierother output files.
31353ff48bf5SDavid du Colombier
31363ff48bf5SDavid du Colombier<li><b><tt>gconfigf.h</tt></b>, produced only for PostScript builds with
31373ff48bf5SDavid du Colombiercompiled-in fonts, consisting of one macro call per font.
31383ff48bf5SDavid du Colombier
31393ff48bf5SDavid du Colombier<li>A linker control file whose name varies from one platform to another,
31403ff48bf5SDavid du Colombiercontaining the list of compiled code files to be linked.
31413ff48bf5SDavid du Colombier
31423ff48bf5SDavid du Colombier<li>If necessary, another linker control file, also varying between
31433ff48bf5SDavid du Colombierplatforms, that contains other information for the linker such as the list
31443ff48bf5SDavid du Colombierof system libraries to be searched.  (On Unix platforms, the two linker
31453ff48bf5SDavid du Colombiercontrol functions are combined in a single file.)
31463ff48bf5SDavid du Colombier
31473ff48bf5SDavid du Colombier</ul>
31483ff48bf5SDavid du Colombier
31493ff48bf5SDavid du Colombier<dl>
31503ff48bf5SDavid du Colombier
31513ff48bf5SDavid du Colombier<dt>
31523ff48bf5SDavid du ColombierSource generators:
31533ff48bf5SDavid du Colombier<dd>
31543ff48bf5SDavid du Colombier
31553ff48bf5SDavid du Colombier<dl>
31563ff48bf5SDavid du Colombier
31573ff48bf5SDavid du Colombier<dt>
31583ff48bf5SDavid du Colombier<a href="../src/genarch.c">src/genarch.c</a>
31593ff48bf5SDavid du Colombier<dd>
31603ff48bf5SDavid du ColombierCreates a header file containing a variety of information about the hardware
31613ff48bf5SDavid du Colombierand compiler that isn't provided in any standard system header file.  Always
31623ff48bf5SDavid du Colombierused.
31633ff48bf5SDavid du Colombier
31643ff48bf5SDavid du Colombier<dt>
31653ff48bf5SDavid du Colombier<a href="../src/genconf.c">src/genconf.c</a> (also generates non-source)
31663ff48bf5SDavid du Colombier<dd>
31673ff48bf5SDavid du ColombierConstructs header files and linker control files from the collection of
31683ff48bf5SDavid du Colombieroptions and modules that make up the build.  See above.  Always used.
31693ff48bf5SDavid du Colombier
31703ff48bf5SDavid du Colombier<dt>
31713ff48bf5SDavid du Colombier<a href="../src/genht.c">src/genht.c</a>
31723ff48bf5SDavid du Colombier<dd>
31733ff48bf5SDavid du ColombierConverts a PostScript halftone (in a particular constrained format) to a C
31743ff48bf5SDavid du Colombierdata structure that can be compiled into an executable.  Only used if any
31753ff48bf5SDavid du Colombiersuch halftones are included in the build.
31763ff48bf5SDavid du Colombier
31773ff48bf5SDavid du Colombier<dt>
31783ff48bf5SDavid du Colombier<a href="../src/geninit.c">src/geninit.c</a>
31793ff48bf5SDavid du Colombier<dd>
31803ff48bf5SDavid du ColombierConverts PostScript initialization files to C data structures that can be
31813ff48bf5SDavid du Colombiercompiled into an executable.  Only used when building a PostScript
31823ff48bf5SDavid du Colombierinterpreter, and only if <b><tt>COMPILE_INITS</tt></b> was set to 1 in the
31833ff48bf5SDavid du Colombiermakefile.
31843ff48bf5SDavid du Colombier
3185*593dc095SDavid du Colombier<dt>
3186*593dc095SDavid du Colombier<a href="../src/mkromfs.c">src/mkromfs.c</a>
3187*593dc095SDavid du Colombier<dd>
3188*593dc095SDavid du ColombierTakes a set of directories, and creates a compressed filesystem
3189*593dc095SDavid du Colombierimage that can be compiled into the executable as static data and accessed
3190*593dc095SDavid du Colombierthrough the %rom% iodevice prefix. Future: this will be used to implement the
3191*593dc095SDavid du Colombier<b><tt>COMPILE_INITS=1</tt></b> feature (a compressed init fileset is more
3192*593dc095SDavid du Colombierefficient than the current 'gsinit.c' produced by 'geninit.c'). This IODevice
3193*593dc095SDavid du Colombieris more versatile since other files can be encapsulated such as fonts, helper
3194*593dc095SDavid du ColombierPostScript files and Resources.
3195*593dc095SDavid du Colombier
31963ff48bf5SDavid du Colombier</dl>
31973ff48bf5SDavid du Colombier
31983ff48bf5SDavid du Colombier<dt>
31993ff48bf5SDavid du ColombierOther generators:
32003ff48bf5SDavid du Colombier<dd>
32013ff48bf5SDavid du Colombier
32023ff48bf5SDavid du Colombier<dl>
32033ff48bf5SDavid du Colombier
32043ff48bf5SDavid du Colombier<dt>
32053ff48bf5SDavid du Colombier<a href="../src/echogs.c">src/echogs.c</a>
32063ff48bf5SDavid du Colombier<dd>
32073ff48bf5SDavid du ColombierImplements a variety of shell-like functions to get around quirks,
32083ff48bf5SDavid du Colombierlimitations, and omissions in the shells on various platforms.  Always used.
32093ff48bf5SDavid du Colombier
32103ff48bf5SDavid du Colombier<dt>
32113ff48bf5SDavid du Colombier<a href="../src/genconf.c">src/genconf.c</a> (also generates source)
32123ff48bf5SDavid du Colombier<dd>
32133ff48bf5SDavid du ColombierSee above.
32143ff48bf5SDavid du Colombier
32153ff48bf5SDavid du Colombier<dt>
32163ff48bf5SDavid du Colombier<a href="../src/gendev.c">src/gendev.c</a> (not used)
32173ff48bf5SDavid du Colombier<dd>
32183ff48bf5SDavid du ColombierWas intended as a replacement for <b><tt>genconf</tt></b>, but was never
32193ff48bf5SDavid du Colombiercompleted.
32203ff48bf5SDavid du Colombier
32213ff48bf5SDavid du Colombier</dl>
32223ff48bf5SDavid du Colombier
32233ff48bf5SDavid du Colombier</dl>
32243ff48bf5SDavid du Colombier
32253ff48bf5SDavid du Colombier<h4><a name="Build_support"></a>Support</h4>
32263ff48bf5SDavid du Colombier
32273ff48bf5SDavid du Colombier<p>
32283ff48bf5SDavid du ColombierThere are a number of programs, scripts, and configuration files that exist
32293ff48bf5SDavid du Colombieronly for the sake of the build process.
32303ff48bf5SDavid du Colombier
32313ff48bf5SDavid du Colombier<dl>
32323ff48bf5SDavid du Colombier
32333ff48bf5SDavid du Colombier<dt>
32343ff48bf5SDavid du ColombierFiles for PC environments:
32353ff48bf5SDavid du Colombier<dd>
3236*593dc095SDavid du Colombier<a href="../src/gswin.icx">src/gswin.icx</a>,
3237*593dc095SDavid du Colombier<a href="../src/gswin16.icx">src/gswin16.icx</a>,
32383ff48bf5SDavid du Colombier<a href="../src/bcc32.cfg">src/bcc32.cfg</a>,
32393ff48bf5SDavid du Colombier<a href="../src/cp.bat">src/cp.bat</a>,
32403ff48bf5SDavid du Colombier<a href="../src/cp.cmd">src/cp.cmd</a>,
32413ff48bf5SDavid du Colombier<a href="../src/dw32c.def">src/dw32c.def</a>,
32423ff48bf5SDavid du Colombier<a href="../src/dwmain.rc">src/dwmain.rc</a>,
32433ff48bf5SDavid du Colombier<a href="../src/dwmain16.def">src/dwmain16.def</a>,
32443ff48bf5SDavid du Colombier<a href="../src/dwmain32.def">src/dwmain32.def</a>,
32453ff48bf5SDavid du Colombier<a href="../src/dwsetup.def">src/dwsetup.def</a>,
32463ff48bf5SDavid du Colombier<a href="../src/dwsetup.rc">src/dwsetup.rc</a>,
32473ff48bf5SDavid du Colombier<a href="../src/dwuninst.def">src/dwuninst.def</a>,
32483ff48bf5SDavid du Colombier<a href="../src/dwuninst.rc">src/dwuninst.rc</a>,
32493ff48bf5SDavid du Colombier<a href="../src/gs16spl.def">src/gs16spl.def</a>,
32503ff48bf5SDavid du Colombier<a href="../src/gs16spl.rc">src/gs16spl.rc</a>,
32513ff48bf5SDavid du Colombier<a href="../src/gsdll2.def">src/gsdll2.def</a>,
32523ff48bf5SDavid du Colombier<a href="../src/gsdll2.rc">src/gsdll2.rc</a>,
32533ff48bf5SDavid du Colombier<a href="../src/gsdll32.def">src/gsdll32.def</a>,
32543ff48bf5SDavid du Colombier<a href="../src/gsdll32.rc">src/gsdll32.rc</a>,
32553ff48bf5SDavid du Colombier<a href="../src/gsdll32w.lnk">src/gsdll32w.lnk</a>,
32563ff48bf5SDavid du Colombier<a href="../src/gsos2.def">src/gsos2.def</a>,
32573ff48bf5SDavid du Colombier<a href="../src/gsos2.icx">src/gsos2.icx</a>,
32583ff48bf5SDavid du Colombier<a href="../src/gsos2.rc">src/gsos2.rc</a>,
32593ff48bf5SDavid du Colombier<a href="../src/gspmdrv.def">src/gspmdrv.def</a>,
32603ff48bf5SDavid du Colombier<a href="../src/gspmdrv.icx">src/gspmdrv.icx</a>,
32613ff48bf5SDavid du Colombier<a href="../src/gspmdrv.rc">src/gspmdrv.rc</a>,
32623ff48bf5SDavid du Colombier<a href="../src/gswin.rc">src/gswin.rc</a>,
32633ff48bf5SDavid du Colombier<a href="../src/gswin32.rc">src/gswin32.rc</a>,
32643ff48bf5SDavid du Colombier<a href="../src/gswin386.rc">src/gswin386.rc</a>,
32653ff48bf5SDavid du Colombier<a href="../src/mv.bat">src/mv.bat</a>,
32663ff48bf5SDavid du Colombier<a href="../src/mv.cmd">src/mv.cmd</a>,
32673ff48bf5SDavid du Colombier<a href="../src/rm.bat">src/rm.bat</a>,
32683ff48bf5SDavid du Colombier<a href="../src/rm.cmd">src/rm.cmd</a>,
32693ff48bf5SDavid du Colombier<a href="../src/turboc.cfg">src/turboc.cfg</a>.
32703ff48bf5SDavid du Colombier
32713ff48bf5SDavid du Colombier<dt>
3272*593dc095SDavid du ColombierFiles for MacOS:
3273*593dc095SDavid du Colombier<dd>
3274*593dc095SDavid du Colombier<a href="../lib/Info-macos.plist">lib/Info-macos.plist</a>.
3275*593dc095SDavid du Colombier
3276*593dc095SDavid du Colombier<dt>
32773ff48bf5SDavid du ColombierFiles for OpenVMS:
32783ff48bf5SDavid du Colombier<dd>
32793ff48bf5SDavid du Colombier<a href="../src/append_l.com">src/append_l.com</a>,
32803ff48bf5SDavid du Colombier<a href="../src/copy_one.com">src/copy_one.com</a>,
32813ff48bf5SDavid du Colombier<a href="../src/rm_all.com">src/rm_all.com</a>,
32823ff48bf5SDavid du Colombier<a href="../src/rm_one.com">src/rm_one.com</a>.
32833ff48bf5SDavid du Colombier
32843ff48bf5SDavid du Colombier<dt>
32853ff48bf5SDavid du ColombierOther files:
32863ff48bf5SDavid du Colombier<dd>
32873ff48bf5SDavid du Colombier<a href="../src/bench.c">src/bench.c</a>,
32883ff48bf5SDavid du Colombier<a href="../src/catmake">src/catmake</a>,
32893ff48bf5SDavid du Colombier<a href="../src/instcopy">src/instcopy</a>.
32903ff48bf5SDavid du Colombier
32913ff48bf5SDavid du Colombier</dl>
32923ff48bf5SDavid du Colombier
32933ff48bf5SDavid du Colombier<h3><a name="Utilities"></a>Utilities</h3>
32943ff48bf5SDavid du Colombier
32953ff48bf5SDavid du Colombier<p>
32963ff48bf5SDavid du ColombierGhostscript comes with many utilities for doing things like viewing bitmap
32973ff48bf5SDavid du Colombierfiles and converting between file formats.  Some of these are written in
32983ff48bf5SDavid du ColombierPostScript, some as scripts, and some as scripts that invoke special
32993ff48bf5SDavid du ColombierPostScript code.
33003ff48bf5SDavid du Colombier
33013ff48bf5SDavid du Colombier<h4><a name="Utilities_in_PostScript"></a>Utilities in PostScript</h4>
33023ff48bf5SDavid du Colombier
33033ff48bf5SDavid du Colombier<p>
33043ff48bf5SDavid du ColombierThese are all documented in <a href="Psfiles.htm">doc/Psfiles.htm</a>, q.v.
33053ff48bf5SDavid du Colombier
33063ff48bf5SDavid du Colombier<h4><a name="Utility_scripts"></a>Utility scripts</h4>
33073ff48bf5SDavid du Colombier
33083ff48bf5SDavid du Colombier<p>
33093ff48bf5SDavid du ColombierMany of these scripts come in both Unix and MS-DOS (<b><tt>.bat</tt></b>
33103ff48bf5SDavid du Colombierversions; some also have an OS/2 (<b><tt>.cmd</tt></b>) version.  The choice
33113ff48bf5SDavid du Colombierof which versions are provided is historical and irregular.  These scripts
33123ff48bf5SDavid du Colombiershould all be documented somewhere, but currently, many of them have man
33133ff48bf5SDavid du Colombierpages, a few have their own documentation in the doc directory, and some
33143ff48bf5SDavid du Colombieraren't documented at all.
33153ff48bf5SDavid du Colombier
33163ff48bf5SDavid du Colombier<dl>
33173ff48bf5SDavid du Colombier
33183ff48bf5SDavid du Colombier<dt>
33193ff48bf5SDavid du ColombierScript files without PC versions:
33203ff48bf5SDavid du Colombier<dd>
33213ff48bf5SDavid du Colombier<a href="../lib/afmdiff.awk">lib/afmdiff.awk</a>,
33223ff48bf5SDavid du Colombier<a href="../lib/dvipdf">lib/dvipdf</a>,
33233ff48bf5SDavid du Colombier<a href="../lib/fixmswrd.pl">lib/fixmswrd.pl</a>,
33243ff48bf5SDavid du Colombier<a href="../lib/lprsetup.sh">lib/lprsetup.sh</a>,
33253ff48bf5SDavid du Colombier<a href="../lib/pj-gs.sh">lib/pj-gs.sh</a>,
33263ff48bf5SDavid du Colombier<a href="../lib/pphs">lib/pphs</a>,
33273ff48bf5SDavid du Colombier<a href="../lib/printafm">lib/printafm</a>,
33283ff48bf5SDavid du Colombier<a href="../lib/pv.sh">lib/pv.sh</a>,
33293ff48bf5SDavid du Colombier<a href="../lib/sysvlp.sh">lib/sysvlp.sh</a>,
33303ff48bf5SDavid du Colombier<a href="../lib/unix-lpr.sh">lib/unix-lpr.sh</a>,
33313ff48bf5SDavid du Colombier<a href="../lib/wftopfa">lib/wftopfa</a>.
33323ff48bf5SDavid du Colombier
33333ff48bf5SDavid du Colombier<dt>
33343ff48bf5SDavid du ColombierScript files with PC versions:
33353ff48bf5SDavid du Colombier<dd>
33363ff48bf5SDavid du Colombier<a href="../lib/bdftops">lib/bdftops</a>,
33373ff48bf5SDavid du Colombier<a href="../lib/bdftops.bat">lib/bdftops.bat</a>,
33383ff48bf5SDavid du Colombier<a href="../lib/bdftops.cmd">lib/bdftops.cmd</a>,
3339*593dc095SDavid du Colombier<a href="../lib/dumphint">lib/dumphint</a>,
3340*593dc095SDavid du Colombier<a href="../lib/dumphint.bat">lib/dumphint.bat</a>,
33413ff48bf5SDavid du Colombier<a href="../lib/eps2eps">lib/eps2eps</a>,
33423ff48bf5SDavid du Colombier<a href="../lib/eps2eps.bat">lib/eps2eps.bat</a>,
33433ff48bf5SDavid du Colombier<a href="../lib/eps2eps.cmd">lib/eps2eps.cmd</a>,
3344*593dc095SDavid du Colombier<a href="../lib/ps2write.bat">lib/ps2write.bat</a>,
3345*593dc095SDavid du Colombier<a href="../lib/ps2write.cmd">lib/ps2write.cmd</a>,
3346*593dc095SDavid du Colombier<a href="../lib/ps2ps2">lib/ps2ps2</a>,
3347*593dc095SDavid du Colombier<a href="../lib/ps2ps2.bat">lib/ps2ps2.bat</a>,
3348*593dc095SDavid du Colombier<a href="../lib/ps2ps2.cmd">lib/ps2ps2.cmd</a>,
33493ff48bf5SDavid du Colombier<a href="../lib/font2c">lib/font2c</a>,
33503ff48bf5SDavid du Colombier<a href="../lib/font2c.bat">lib/font2c.bat</a>,
33513ff48bf5SDavid du Colombier<a href="../lib/font2c.cmd">lib/font2c.cmd</a>,
33523ff48bf5SDavid du Colombier<a href="../lib/gsbj">lib/gsbj</a>,
33533ff48bf5SDavid du Colombier<a href="../lib/gsbj.bat">lib/gsbj.bat</a>,
33543ff48bf5SDavid du Colombier<a href="../lib/gsdj">lib/gsdj</a>,
33553ff48bf5SDavid du Colombier<a href="../lib/gsdj.bat">lib/gsdj.bat</a>,
33563ff48bf5SDavid du Colombier<a href="../lib/gsdj500">lib/gsdj500</a>,
33573ff48bf5SDavid du Colombier<a href="../lib/gsdj500.bat">lib/gsdj500.bat</a>,
33583ff48bf5SDavid du Colombier<a href="../lib/gslj">lib/gslj</a>,
33593ff48bf5SDavid du Colombier<a href="../lib/gslj.bat">lib/gslj.bat</a>,
33603ff48bf5SDavid du Colombier<a href="../lib/gslp">lib/gslp</a>,
33613ff48bf5SDavid du Colombier<a href="../lib/gslp.bat">lib/gslp.bat</a>,
33623ff48bf5SDavid du Colombier<a href="../lib/gsnd">lib/gsnd</a>,
33633ff48bf5SDavid du Colombier<a href="../lib/gsnd.bat">lib/gsnd.bat</a>,
33643ff48bf5SDavid du Colombier<a href="../lib/pdf2dsc">lib/pdf2dsc</a>,
33653ff48bf5SDavid du Colombier<a href="../lib/pdf2dsc.bat">lib/pdf2dsc.bat</a>,
33663ff48bf5SDavid du Colombier<a href="../lib/pdf2ps">lib/pdf2ps</a>,
33673ff48bf5SDavid du Colombier<a href="../lib/pdf2ps.bat">lib/pdf2ps.bat</a>,
33683ff48bf5SDavid du Colombier<a href="../lib/pdf2ps.cmd">lib/pdf2ps.cmd</a>,
33693ff48bf5SDavid du Colombier<a href="../lib/pdfopt">lib/pdfopt</a>,
33703ff48bf5SDavid du Colombier<a href="../lib/pdfopt.bat">lib/pdfopt.bat</a>,
33713ff48bf5SDavid du Colombier<a href="../lib/pf2afm">lib/pf2afm</a>,
33723ff48bf5SDavid du Colombier<a href="../lib/pf2afm.bat">lib/pf2afm.bat</a>,
33733ff48bf5SDavid du Colombier<a href="../lib/pf2afm.cmd">lib/pf2afm.cmd</a>,
3374*593dc095SDavid du Colombier<a href="../lib/pfbtopfa">lib/pfbtopfa</a>,
3375*593dc095SDavid du Colombier<a href="../lib/pfbtopfa.bat">lib/pfbtopfa.bat</a>,
33763ff48bf5SDavid du Colombier<a href="../lib/ps2ascii">lib/ps2ascii</a>,
33773ff48bf5SDavid du Colombier<a href="../lib/ps2ascii.bat">lib/ps2ascii.bat</a>,
33783ff48bf5SDavid du Colombier<a href="../lib/ps2ascii.cmd">lib/ps2ascii.cmd</a>,
33793ff48bf5SDavid du Colombier<a href="../lib/ps2epsi">lib/ps2epsi</a>,
33803ff48bf5SDavid du Colombier<a href="../lib/ps2epsi.bat">lib/ps2epsi.bat</a>,
33813ff48bf5SDavid du Colombier<a href="../lib/ps2epsi.cmd">lib/ps2epsi.cmd</a>,
33823ff48bf5SDavid du Colombier<a href="../lib/ps2pdf">lib/ps2pdf</a>,
33833ff48bf5SDavid du Colombier<a href="../lib/ps2pdf.bat">lib/ps2pdf.bat</a>,
33843ff48bf5SDavid du Colombier<a href="../lib/ps2pdf.cmd">lib/ps2pdf.cmd</a>,
33853ff48bf5SDavid du Colombier<a href="../lib/ps2pdf12">lib/ps2pdf12</a>,
33863ff48bf5SDavid du Colombier<a href="../lib/ps2pdf12.bat">lib/ps2pdf12.bat</a>,
33873ff48bf5SDavid du Colombier<a href="../lib/ps2pdf12.cmd">lib/ps2pdf12.cmd</a>,
33883ff48bf5SDavid du Colombier<a href="../lib/ps2pdf13">lib/ps2pdf13</a>,
33893ff48bf5SDavid du Colombier<a href="../lib/ps2pdf13.bat">lib/ps2pdf13.bat</a>,
33903ff48bf5SDavid du Colombier<a href="../lib/ps2pdf13.cmd">lib/ps2pdf13.cmd</a>,
33913ff48bf5SDavid du Colombier<a href="../lib/ps2pdf14">lib/ps2pdf14</a>,
33923ff48bf5SDavid du Colombier<a href="../lib/ps2pdf14.bat">lib/ps2pdf14.bat</a>,
33933ff48bf5SDavid du Colombier<a href="../lib/ps2pdf14.cmd">lib/ps2pdf14.cmd</a>,
33943ff48bf5SDavid du Colombier<a href="../lib/ps2pdfwr">lib/ps2pdfwr</a>,
33953ff48bf5SDavid du Colombier<a href="../lib/ps2pdfxx.bat">lib/ps2pdfxx.bat</a>,
33963ff48bf5SDavid du Colombier<a href="../lib/ps2ps">lib/ps2ps</a>,
33973ff48bf5SDavid du Colombier<a href="../lib/ps2ps.bat">lib/ps2ps.bat</a>,
33983ff48bf5SDavid du Colombier<a href="../lib/ps2ps.cmd">lib/ps2ps.cmd</a>.
33993ff48bf5SDavid du Colombier
34003ff48bf5SDavid du Colombier<dt>
34013ff48bf5SDavid du ColombierScript files with only PC versions:
34023ff48bf5SDavid du Colombier<dd>
34033ff48bf5SDavid du Colombier<a href="../lib/gsndt.bat">lib/gsndt.bat</a>,
34043ff48bf5SDavid du Colombier<a href="../lib/gssetgs.bat">lib/gssetgs.bat</a>,
34053ff48bf5SDavid du Colombier<a href="../lib/gst.bat">lib/gst.bat</a>,
34063ff48bf5SDavid du Colombier<a href="../lib/gstt.bat">lib/gstt.bat</a>,
34073ff48bf5SDavid du Colombier<a href="../lib/lp386.bat">lib/lp386.bat</a>,
34083ff48bf5SDavid du Colombier<a href="../lib/lp386r2.bat">lib/lp386r2.bat</a>,
34093ff48bf5SDavid du Colombier<a href="../lib/lpgs.bat">lib/lpgs.bat</a>,
34103ff48bf5SDavid du Colombier<a href="../lib/lpr2.bat">lib/lpr2.bat</a>,
34113ff48bf5SDavid du Colombier<a href="../lib/pftogsf.bat">lib/pftogsf.bat</a>,
34123ff48bf5SDavid du Colombier<a href="../lib/wmakebat.bat">lib/wmakebat.bat</a>.
34133ff48bf5SDavid du Colombier
34143ff48bf5SDavid du Colombier</dl>
34153ff48bf5SDavid du Colombier
34163ff48bf5SDavid du Colombier<hr>
34173ff48bf5SDavid du Colombier
34183ff48bf5SDavid du Colombier<h2><a name="Memory_management"></a>Memory management</h2>
34193ff48bf5SDavid du Colombier
34203ff48bf5SDavid du Colombier<h3><a name="Memory_manager_architecture"></a>Memory manager architecture</h3>
34213ff48bf5SDavid du Colombier
34223ff48bf5SDavid du Colombier<p>
34233ff48bf5SDavid du ColombierIn many environments, the memory manager is a set of library facilities that
34243ff48bf5SDavid du Colombierimplicitly manage the entire address space in a homogenous manner.
34253ff48bf5SDavid du ColombierGhostscript's memory manager architecture has none of these properties:
34263ff48bf5SDavid du Colombier
34273ff48bf5SDavid du Colombier<ul>
34283ff48bf5SDavid du Colombier
34293ff48bf5SDavid du Colombier<li>Rather than a single library accessed as procedures, Ghostscript
34303ff48bf5SDavid du Colombierincludes multiple allocator types, each of which in turn may have multiple
34313ff48bf5SDavid du Colombierinstances (allocators).  Allocators are 'objects' with a substantial set of
34323ff48bf5SDavid du Colombiervirtual functions.
34333ff48bf5SDavid du Colombier
34343ff48bf5SDavid du Colombier<li>Rather than managing the entire address space, each allocator manages a
34353ff48bf5SDavid du Colombierstorage pool, which it may or may not be able to expand or reduce by calling
34363ff48bf5SDavid du Colombieron a 'parent' allocator.
34373ff48bf5SDavid du Colombier
34383ff48bf5SDavid du Colombier<li>Rather than a single genus of untyped storage blocks, Ghostscript's
34393ff48bf5SDavid du Colombierallocators provide two genera -- type-tagged 'objects', and 'strings' --
34403ff48bf5SDavid du Colombierwith substantially different properties.
34413ff48bf5SDavid du Colombier
34423ff48bf5SDavid du Colombier</ul>
34433ff48bf5SDavid du Colombier
34443ff48bf5SDavid du Colombier<h4><a name="Objects_vs_strings"></a>Objects vs strings</h4>
34453ff48bf5SDavid du Colombier
34463ff48bf5SDavid du Colombier<p>
34473ff48bf5SDavid du ColombierAs noted above, allocators provide two different storage genera.
34483ff48bf5SDavid du Colombier
34493ff48bf5SDavid du Colombier<p>
34503ff48bf5SDavid du ColombierObjects:
34513ff48bf5SDavid du Colombier
34523ff48bf5SDavid du Colombier<ul>
34533ff48bf5SDavid du Colombier<li>Are aligned in storage to satisfy the most stringent alignment
34543ff48bf5SDavid du Colombierrequirement imposed by the CPU or compiler;
34553ff48bf5SDavid du Colombier<li>Can be referenced only by pointers to their start, not to any internal
34563ff48bf5SDavid du Colombierlocation, unless special arrangements are made;
34573ff48bf5SDavid du Colombier<li>May contain pointers to other objects, or to strings;
34583ff48bf5SDavid du Colombier<li>Have an associated <em>structure descriptor</em> that specifies their
34593ff48bf5SDavid du Colombiersize (usually) and the location of any pointers contained within them.
34603ff48bf5SDavid du Colombier</ul>
34613ff48bf5SDavid du Colombier
34623ff48bf5SDavid du Colombier<p>
34633ff48bf5SDavid du ColombierGiven a pointer to an object, the allocator that allocated it must be able
34643ff48bf5SDavid du Colombierto return the object's size and the pointer to its structure descriptor.
34653ff48bf5SDavid du Colombier(It is up to the client to know what allocator allocated an object.)
34663ff48bf5SDavid du Colombier
34673ff48bf5SDavid du Colombier<p>
34683ff48bf5SDavid du ColombierStrings:
34693ff48bf5SDavid du Colombier
34703ff48bf5SDavid du Colombier<ul>
34713ff48bf5SDavid du Colombier<li>Are not aligned in storage;
34723ff48bf5SDavid du Colombier<li>Can be referenced by pointers (consisting of a starting address and a
34733ff48bf5SDavid du Colombierlength) to any substring, starting anywhere within the string;
34743ff48bf5SDavid du Colombier<li>May not contain pointers;
34753ff48bf5SDavid du Colombier<li>Do not have a structure descriptor.
34763ff48bf5SDavid du Colombier</ul>
34773ff48bf5SDavid du Colombier
34783ff48bf5SDavid du Colombier<p>
34793ff48bf5SDavid du ColombierThe object/string distinction reflects a space/capability tradeoff.  The
34803ff48bf5SDavid du Colombierper-object space overhead of the standard type of allocator is typically 12
34813ff48bf5SDavid du Colombierbytes; this is too much to impose on every string of a few bytes.  On the
34823ff48bf5SDavid du Colombierother hand, restricting object pointers to reference the start of the object
34833ff48bf5SDavid du Colombiercurrently makes object garbage collection and compaction more
34843ff48bf5SDavid du Colombierspace-efficient.  If we were to redesign the standard allocator, we would
34853ff48bf5SDavid du Colombierprobably opt for a different design in which strings were allocated within
34863ff48bf5SDavid du Colombiercontainer objects of a few hundred bytes, and pointers into the middle of
34873ff48bf5SDavid du Colombierall objects were allowed.
34883ff48bf5SDavid du Colombier
34893ff48bf5SDavid du Colombier<h4><a name="Structure_descriptors"></a>Structure descriptors</h4>
34903ff48bf5SDavid du Colombier
34913ff48bf5SDavid du Colombier<p>
34923ff48bf5SDavid du ColombierEvery object allocated by a Ghostscript allocator has an associated
34933ff48bf5SDavid du Colombierstructure descriptor, which the caller provides when allocating the object.
34943ff48bf5SDavid du ColombierThe structure descriptor serves several purposes:
34953ff48bf5SDavid du Colombier
34963ff48bf5SDavid du Colombier<ul>
34973ff48bf5SDavid du Colombier<li>Specifying the size of the object for allocation;
34983ff48bf5SDavid du Colombier<li>Providing pointer-enumeration and pointer-relocation procedures for
34993ff48bf5SDavid du Colombierthe garbage collector;
35003ff48bf5SDavid du Colombier<li>Providing an optional finalization procedure to be called when the
35013ff48bf5SDavid du Colombierobject is freed (either explicitly or automatically).
35023ff48bf5SDavid du Colombier</ul>
35033ff48bf5SDavid du Colombier
35043ff48bf5SDavid du Colombier<p>
35053ff48bf5SDavid du ColombierStructure descriptors are read-only, and are normally defined statically
35063ff48bf5SDavid du Colombierusing one of the large set of <b><tt>gs_private_st_</tt></b> or
35073ff48bf5SDavid du Colombier<b><tt>gs_public_st_</tt></b> macros in <a
35083ff48bf5SDavid du Colombierhref="../src/gsstruct.h">src/gsstruct.h</a>.
35093ff48bf5SDavid du Colombier
35103ff48bf5SDavid du Colombier<p>
35113ff48bf5SDavid du ColombierWhile the structure descriptor normally specifies the size of the object,
35123ff48bf5SDavid du Colombierone can also allocate an array of bytes or objects, whose size is a multiple
35133ff48bf5SDavid du Colombierof the size in the descriptor.  For this reason, every object stores its
35143ff48bf5SDavid du Colombiersize as well as a reference to its descriptor.
35153ff48bf5SDavid du Colombier
35163ff48bf5SDavid du Colombier<p>
3517*593dc095SDavid du ColombierBecause the standard Ghostscript garbage collector is non-conservative and
3518*593dc095SDavid du Colombiercan move objects, every object allocated by a Ghostscript allocator must
3519*593dc095SDavid du Colombierhave an accurate structure descriptor.  If you define a new type of object
35203ff48bf5SDavid du Colombier(structure) that will be allocated in storage managed by Ghostscript, you
35213ff48bf5SDavid du Colombier<em>must</em> create an accurate descriptor for it, and use that descriptor
35223ff48bf5SDavid du Colombierto allocate it.  The process of creating accurate descriptors for all
35233ff48bf5SDavid du Colombierstructures was long and painful, and accounted for many hard-to-diagnose
35243ff48bf5SDavid du Colombierbugs.
35253ff48bf5SDavid du Colombier
35263ff48bf5SDavid du Colombier<p>
35273ff48bf5SDavid du ColombierBy convention, the structure descriptor for structure type
35283ff48bf5SDavid du Colombier<b><tt>xxx_t</tt></b> is named <b><tt>st_xxx</tt></b> (this is preferred),
35293ff48bf5SDavid du Colombieror occasionally <b><tt>st_xxx_t</tt></b>.
35303ff48bf5SDavid du Colombier
35313ff48bf5SDavid du Colombier<p>
35323ff48bf5SDavid du ColombierNote that a structure descriptor is only required for objects allocated by
35333ff48bf5SDavid du Colombierthe Ghostscript allocator.  A structure type <b><tt>xxx_t</tt></b> does not
35343ff48bf5SDavid du Colombierrequire a structure descriptor if instances of that type are used
35353ff48bf5SDavid du Colombier<em>only</em> in the following ways:
35363ff48bf5SDavid du Colombier
35373ff48bf5SDavid du Colombier<ul>
35383ff48bf5SDavid du Colombier
35393ff48bf5SDavid du Colombier<li>Instances are allocated only on the C stack, e.g., as
35403ff48bf5SDavid du Colombier<b><tt>xxx_t&nbsp;xxx1,&nbsp;xxx2;</tt></b>, or on the C heap, with
35413ff48bf5SDavid du Colombier<b><tt>malloc</tt></b> or through the Ghostscript "wrapper" defined in <a
35423ff48bf5SDavid du Colombierhref="../src/gsmalloc.h">src/gsmalloc.h</a>.
35433ff48bf5SDavid du Colombier
35443ff48bf5SDavid du Colombier<li>Pointers to instances are not stored in places where the garbage
35453ff48bf5SDavid du Colombiercollector will try to trace the pointer.
35463ff48bf5SDavid du Colombier
35473ff48bf5SDavid du Colombier<li>Code never attempts to get the structure type or size of an instance
35483ff48bf5SDavid du Colombierthrough the allocator API.
35493ff48bf5SDavid du Colombier
35503ff48bf5SDavid du Colombier</ul>
35513ff48bf5SDavid du Colombier
35523ff48bf5SDavid du Colombier<p>
35533ff48bf5SDavid du ColombierIn general, structures without descriptors are problem-prone, and are
35543ff48bf5SDavid du Colombierdeprecated; in new code, they should only be used if the structure is
35553ff48bf5SDavid du Colombierconfined to a single .c file and its instances are only allocated on the C
35563ff48bf5SDavid du Colombierstack.
35573ff48bf5SDavid du Colombier
35583ff48bf5SDavid du Colombier<dl>
35593ff48bf5SDavid du Colombier<dt>
35603ff48bf5SDavid du ColombierFiles:
35613ff48bf5SDavid du Colombier<dd>
35623ff48bf5SDavid du Colombier<a href="../src/gsstruct.h">src/gsstruct.h</a>,
35633ff48bf5SDavid du Colombier<a href="../src/gsstype.h">src/gsstype.h</a>.
35643ff48bf5SDavid du Colombier</dl>
35653ff48bf5SDavid du Colombier
35663ff48bf5SDavid du Colombier<h4><a name="Garbage_collection"></a>Garbage collection</h4>
35673ff48bf5SDavid du Colombier
35683ff48bf5SDavid du Colombier<p>
35693ff48bf5SDavid du ColombierThe allocator architecture is designed to support compacting garbage
35703ff48bf5SDavid du Colombiercollection.  Every object must be able to enumerate all the pointers it
35713ff48bf5SDavid du Colombiercontains, both for tracing and for relocation.  As noted just above, the
35723ff48bf5SDavid du Colombierstructure descriptor provides procedures that do this.
35733ff48bf5SDavid du Colombier
35743ff48bf5SDavid du Colombier<p>
35753ff48bf5SDavid du ColombierWhether or not a particular allocator type actually provides a garbage
35763ff48bf5SDavid du Colombiercollector is up to the allocator: garbage collection is invoked through a
35773ff48bf5SDavid du Colombiervirtual procedure.  In practice, however, there are only two useful garbage
35783ff48bf5SDavid du Colombiercollectors for Ghostscript's own allocator:
35793ff48bf5SDavid du Colombier
35803ff48bf5SDavid du Colombier<ul>
35813ff48bf5SDavid du Colombier<li>The "real" garbage collector associated with the PostScript interpreter,
35823ff48bf5SDavid du Colombierdescribed <a href="#Interpreter_GC">below</a>;
35833ff48bf5SDavid du Colombier<li>A "non" garbage collector that only merges adjacent free blocks.
35843ff48bf5SDavid du Colombier</ul>
35853ff48bf5SDavid du Colombier
3586*593dc095SDavid du Colombier<p>
3587*593dc095SDavid du ColombierAs noted above, because the architecture supports compacting garbage
3588*593dc095SDavid du Colombiercollection, a "real" garbage collector cannot be run at arbitrary times,
3589*593dc095SDavid du Colombierbecause it cannot reliably find and relocate pointers that are on the C
3590*593dc095SDavid du Colombierstack.  In general, it is only safe to run a "real" garbage collector when
3591*593dc095SDavid du Colombiercontrol is at the top level of the program, when there are no pointers to
3592*593dc095SDavid du Colombiergarbage collectable objects from the stack (other than designated roots).
3593*593dc095SDavid du Colombier
35943ff48bf5SDavid du Colombier<dl>
35953ff48bf5SDavid du Colombier<dt>
35963ff48bf5SDavid du ColombierFiles:
35973ff48bf5SDavid du Colombier<dd>
35983ff48bf5SDavid du Colombier<a href="../src/gsgc.h">src/gsgc.h</a>,
35993ff48bf5SDavid du Colombier<a href="../src/gsnogc.c">src/gsnogc.c</a>,
36003ff48bf5SDavid du Colombier<a href="../src/gsnogc.h">src/gsnogc.h</a>.
36013ff48bf5SDavid du Colombier</dl>
36023ff48bf5SDavid du Colombier
36033ff48bf5SDavid du Colombier<h4><a name="Movability"></a>Movability</h4>
36043ff48bf5SDavid du Colombier
36053ff48bf5SDavid du Colombier<p>
36063ff48bf5SDavid du ColombierAs just noted, objects are normally movable by the garbage collector.
36073ff48bf5SDavid du ColombierHowever, some objects must be immovable, usually because some other piece of
36083ff48bf5SDavid du Colombiersoftware must retain pointers to them.  The allocator API includes
36093ff48bf5SDavid du Colombierprocedures for allocating both movable (default) and immovable objects.
36103ff48bf5SDavid du ColombierNote, however, that even immovable objects must be traceable (have a
36113ff48bf5SDavid du Colombierstructure descriptor), and may be freed, by the garbage collector.
36123ff48bf5SDavid du Colombier
36133ff48bf5SDavid du Colombier<h4><a name="Parent_hierarchy"></a>Parent hierarchy</h4>
36143ff48bf5SDavid du Colombier
36153ff48bf5SDavid du Colombier<p>
36163ff48bf5SDavid du ColombierWhen an allocator needs to add memory to the pool that it manages, it
36173ff48bf5SDavid du Colombierrequests the memory from its <em>parent</em> allocator.  Every allocator has
36183ff48bf5SDavid du Colombiera pointer to its parent; multiple allocators may share a single parent.  The
36193ff48bf5SDavid du Colombierultimate ancestor of all allocators that can expand their pool dynamically
36203ff48bf5SDavid du Colombieris an allocator that calls <b><tt>malloc</tt></b>, described <a
36213ff48bf5SDavid du Colombierhref="#malloc">below</a>.  However, especially in embedded environments, an
36223ff48bf5SDavid du Colombierallocator may be limited to a fixed-size pool assigned to it when it is
36233ff48bf5SDavid du Colombiercreated.
36243ff48bf5SDavid du Colombier
36253ff48bf5SDavid du Colombier<h4><a name="Allocator_API"></a>Allocator API</h4>
36263ff48bf5SDavid du Colombier
36273ff48bf5SDavid du ColombierIn summary, the allocator API provides the following principal operations:
36283ff48bf5SDavid du Colombier
36293ff48bf5SDavid du Colombier<ul>
36303ff48bf5SDavid du Colombier<li>Allocate and free movable (default) or immovable objects and strings.
36313ff48bf5SDavid du Colombier<li>Return the structure type and size of an object.
36323ff48bf5SDavid du Colombier<li>Resize (shrink or grow) movable objects and strings, preserving
36333ff48bf5SDavid du Colombierthe contents insofar as possible.
36343ff48bf5SDavid du Colombier<li>Report the size of the managed pool, and how much of it is in use.
36353ff48bf5SDavid du Colombier<li>Register and unregister root pointers for the garbage collector.
36363ff48bf5SDavid du Colombier<li>Free the allocator itself.
36373ff48bf5SDavid du Colombier<li>Consolidate adjacent free blocks to reduce fragmentation.
36383ff48bf5SDavid du Colombier</ul>
36393ff48bf5SDavid du Colombier
36403ff48bf5SDavid du Colombier<p>
36413ff48bf5SDavid du ColombierFor details, see <a href="../src/gsmemory.h">src/gsmemory.h</a>.
36423ff48bf5SDavid du Colombier
36433ff48bf5SDavid du Colombier<p>
36443ff48bf5SDavid du ColombierThe allocator API also includes one special hook for the PostScript
36453ff48bf5SDavid du Colombierinterpreter: the concept of stable allocators.  See the section on <a
36463ff48bf5SDavid du Colombierhref="#save_forgetsave_restore"><b><tt>save</tt></b> and
36473ff48bf5SDavid du Colombier<b><tt>restore</tt></b></a> below for details.
36483ff48bf5SDavid du Colombier
36493ff48bf5SDavid du Colombier<dl>
36503ff48bf5SDavid du Colombier<dt>
36513ff48bf5SDavid du ColombierFiles:
36523ff48bf5SDavid du Colombier<dd>
36533ff48bf5SDavid du Colombier<a href="../src/gsmemraw.h">src/gsmemraw.h</a>,
36543ff48bf5SDavid du Colombier<a href="../src/gsmemory.c">src/gsmemory.c</a>,
36553ff48bf5SDavid du Colombier<a href="../src/gsmemory.h">src/gsmemory.h</a>,
36563ff48bf5SDavid du Colombier<a href="../src/gsstruct.h">src/gsstruct.h</a>,
36573ff48bf5SDavid du Colombier<a href="../src/gsstype.h">src/gsstype.h</a>.
36583ff48bf5SDavid du Colombier</dl>
36593ff48bf5SDavid du Colombier
36603ff48bf5SDavid du Colombier<h3><a name="Freeing_storage"></a>Freeing storage</h3>
36613ff48bf5SDavid du Colombier
36623ff48bf5SDavid du Colombier<p>
36633ff48bf5SDavid du ColombierGhostscript's memory management architecture provides three different ways
36643ff48bf5SDavid du Colombierto free objects: explicitly, by reference counting, or by garbage
36653ff48bf5SDavid du Colombiercollection.  They provide different safety / performance / convenience
36663ff48bf5SDavid du Colombiertradeoffs; we believe that all three are necessary.
36673ff48bf5SDavid du Colombier
36683ff48bf5SDavid du Colombier<p>
36693ff48bf5SDavid du ColombierObjects are always freed as a whole; strings may be freed piecemeal.
36703ff48bf5SDavid du Colombier
36713ff48bf5SDavid du Colombier<p>
36723ff48bf5SDavid du ColombierAn object may have an associated finalization procedure, defined in the
36733ff48bf5SDavid du Colombierstructure descriptor.  This procedure is called just before the object is
36743ff48bf5SDavid du Colombierfreed, independent of which method is being used to free the object.  A few
36753ff48bf5SDavid du Colombiertypes of objects have a virtual finalization procedure as well: the
36763ff48bf5SDavid du Colombierfinalization procedure defined in the descriptor simply calls the one in the
36773ff48bf5SDavid du Colombierobject.
36783ff48bf5SDavid du Colombier
36793ff48bf5SDavid du Colombier<h4><a name="Explicit_freeing"></a>Explicit freeing</h4>
36803ff48bf5SDavid du Colombier
36813ff48bf5SDavid du Colombier<p>
36823ff48bf5SDavid du ColombierObjects and strings may be freed explicitly, using the
36833ff48bf5SDavid du Colombier<b><tt>gs_free_</tt></b> virtual procedures in the allocator API.  It is up
36843ff48bf5SDavid du Colombierto the client to ensure that all allocated objects are freed at most once,
36853ff48bf5SDavid du Colombierand that there are no dangling pointers.
36863ff48bf5SDavid du Colombier
36873ff48bf5SDavid du Colombier<p>
36883ff48bf5SDavid du ColombierExplicit freeing is the fastest method, but is the least convenient and
36893ff48bf5SDavid du Colombierleast safe.  It is most appropriate when storage is freed in the same
36903ff48bf5SDavid du Colombierprocedure where it is allocated, or for storage that is known to be
36913ff48bf5SDavid du Colombierreferenced by only one pointer.
36923ff48bf5SDavid du Colombier
36933ff48bf5SDavid du Colombier<h4><a name="Reference_counting"></a>Reference counting</h4>
36943ff48bf5SDavid du Colombier
36953ff48bf5SDavid du Colombier<p>
36963ff48bf5SDavid du ColombierObjects may be managed by reference counting.  When an object is allocated,
36973ff48bf5SDavid du Colombierits reference count may be set to 0 or 1.  Subsequently, when the reference
36983ff48bf5SDavid du Colombiercount is decremented to 0, the object is freed.
36993ff48bf5SDavid du Colombier
37003ff48bf5SDavid du Colombier<p>
37013ff48bf5SDavid du ColombierThe reference counting machinery provides its own virtual finalization
37023ff48bf5SDavid du Colombierprocedure for all reference-counted objects.  The machinery calls this
37033ff48bf5SDavid du Colombierprocedure when it is about to free the object (but not when the object is
37043ff48bf5SDavid du Colombierfreed in any other way, which is probably a design bug).  This is in
37053ff48bf5SDavid du Colombieraddition to (and called before) any finalization procedure associated with
37063ff48bf5SDavid du Colombierthe object type.
37073ff48bf5SDavid du Colombier
37083ff48bf5SDavid du Colombier<p>
37093ff48bf5SDavid du ColombierReference counting is as fast as explicit freeing, but takes more space in
37103ff48bf5SDavid du Colombierthe object.  It is most appropriate for relatively large objects which are
37113ff48bf5SDavid du Colombierreferenced only from a small set of pointers.  Note that reference counting
37123ff48bf5SDavid du Colombiercannot free objects that are involved in a pointer cycle (e.g., A -> B -> C
37133ff48bf5SDavid du Colombier-> A).
37143ff48bf5SDavid du Colombier
37153ff48bf5SDavid du Colombier<dl>
37163ff48bf5SDavid du Colombier<dt>
37173ff48bf5SDavid du ColombierFiles:
37183ff48bf5SDavid du Colombier<dd>
37193ff48bf5SDavid du Colombier<a href="../src/gsrefct.h">src/gsrefct.h</a>.
37203ff48bf5SDavid du Colombier</dl>
37213ff48bf5SDavid du Colombier
37223ff48bf5SDavid du Colombier<h4><a name="Real_garbage_collection"></a>(Real) garbage collection</h4>
37233ff48bf5SDavid du Colombier
37243ff48bf5SDavid du Colombier<p>
37253ff48bf5SDavid du ColombierObjects and strings may be freed automatically by a garbage collector.  See
37263ff48bf5SDavid du Colombier<a href="#Interpreter_GC">below</a>.
37273ff48bf5SDavid du Colombier
37283ff48bf5SDavid du Colombier<h3><a name="Special_implementations"></a>Special implementations</h3>
37293ff48bf5SDavid du Colombier
37303ff48bf5SDavid du Colombier<h4><a name="malloc"></a>malloc</h4>
37313ff48bf5SDavid du Colombier
37323ff48bf5SDavid du Colombier<p>
37333ff48bf5SDavid du ColombierAs mentioned <a href="#Parent_hierarchy">above</a>, the ultimate ancestor of
37343ff48bf5SDavid du Colombierall allocators with an expandable pool is one that calls
37353ff48bf5SDavid du Colombier<b><tt>malloc</tt></b>.
37363ff48bf5SDavid du Colombier
37373ff48bf5SDavid du Colombier<dl>
37383ff48bf5SDavid du Colombier<dt>
37393ff48bf5SDavid du ColombierFiles:
37403ff48bf5SDavid du Colombier<dd>
37413ff48bf5SDavid du Colombier<a href="../src/gsmalloc.h">src/gsmalloc.h</a>,
37423ff48bf5SDavid du Colombier<a href="../src/gsmalloc.c">src/gsmalloc.c</a>.
37433ff48bf5SDavid du Colombier</dl>
37443ff48bf5SDavid du Colombier
37453ff48bf5SDavid du Colombier<h4><a name="Locking"></a>Locking</h4>
37463ff48bf5SDavid du Colombier
37473ff48bf5SDavid du Colombier<p>
37483ff48bf5SDavid du ColombierIn a multi-threaded environment, if an allocator must be callable from
37493ff48bf5SDavid du Colombiermultiple threads (for example, if it is used to allocate structures in one
37503ff48bf5SDavid du Colombierthread that are passed to, and freed by, another thread), the allocator must
37513ff48bf5SDavid du Colombierprovide mutex protection.  Ghostscript provides this capability in the form
37523ff48bf5SDavid du Colombierof a <em>wrapper</em> allocator, that simply forwards all calls to a
37533ff48bf5SDavid du Colombier<em>target</em> allocator under protection of a mutex.  Using the wrapper
37543ff48bf5SDavid du Colombiertechnique, any allocator can be made thread-safe.
37553ff48bf5SDavid du Colombier
37563ff48bf5SDavid du Colombier<dl>
37573ff48bf5SDavid du Colombier<dt>
37583ff48bf5SDavid du ColombierFiles:
37593ff48bf5SDavid du Colombier<dd>
37603ff48bf5SDavid du Colombier<a href="../src/gsmemlok.h">src/gsmemlok.h</a>,
37613ff48bf5SDavid du Colombier<a href="../src/gsmemlok.c">src/gsmemlok.c</a>.
37623ff48bf5SDavid du Colombier</dl>
37633ff48bf5SDavid du Colombier
37643ff48bf5SDavid du Colombier<h4><a name="Retrying"></a>Retrying</h4>
37653ff48bf5SDavid du Colombier
37663ff48bf5SDavid du Colombier<p>
37673ff48bf5SDavid du ColombierIn an embedded environment, job failure due to memory exhaustion is very
37683ff48bf5SDavid du Colombierundesirable.  Ghostscript provides a wrapper allocator that, when an
37693ff48bf5SDavid du Colombierallocation attempt fails, calls a client-provided procedure that can attempt
37703ff48bf5SDavid du Colombierto free memory, then ask for the original allocation to be retried.  For
37713ff48bf5SDavid du Colombierexample, such a procedure can wait for a queue to empty, or can free memory
37723ff48bf5SDavid du Colombieroccupied by caches.
37733ff48bf5SDavid du Colombier
37743ff48bf5SDavid du Colombier<dl>
37753ff48bf5SDavid du Colombier<dt>
37763ff48bf5SDavid du ColombierFiles:
37773ff48bf5SDavid du Colombier<dd>
37783ff48bf5SDavid du Colombier<a href="../src/gsmemret.h">src/gsmemret.h</a>,
37793ff48bf5SDavid du Colombier<a href="../src/gsmemret.c">src/gsmemret.c</a>.
37803ff48bf5SDavid du Colombier</dl>
37813ff48bf5SDavid du Colombier
37823ff48bf5SDavid du Colombier<h3><a name="Standard_implementation"></a>Standard implementation</h3>
37833ff48bf5SDavid du Colombier
37843ff48bf5SDavid du Colombier<p>
37853ff48bf5SDavid du ColombierThe standard Ghostscript allocator gets storage from its parent (normally
37863ff48bf5SDavid du Colombierthe <b><tt>malloc</tt></b> allocator) in large blocks called
37873ff48bf5SDavid du Colombier<em>chunks</em>, and then allocates objects up from the low end and strings
37883ff48bf5SDavid du Colombierdown from the high end.  Large objects or strings are allocated in their own
37893ff48bf5SDavid du Colombierchunk.
37903ff48bf5SDavid du Colombier
37913ff48bf5SDavid du Colombier<p>
37923ff48bf5SDavid du ColombierThe standard allocator maintains a set of free-block lists for small object
37933ff48bf5SDavid du Colombiersizes, one list per size (rounded up to the word size), plus a free-block
37943ff48bf5SDavid du Colombierlist for large objects (but not for objects so large that they get their own
37953ff48bf5SDavid du Colombierchunk: when such an object is freed, its chunk is returned to the parent).
37963ff48bf5SDavid du ColombierThe lists are not sorted; adjacent blocks are only merged if needed.
37973ff48bf5SDavid du Colombier
37983ff48bf5SDavid du Colombier<p>
37993ff48bf5SDavid du ColombierWhile the standard allocator implements the generic allocator API, and is
38003ff48bf5SDavid du Colombierusable with the library alone, it includes a special hook for the PostScript
38013ff48bf5SDavid du Colombierinterpreter to aid in the efficient allocation of PostScript composite
38023ff48bf5SDavid du Colombierobjects (arrays and dictionaries).  See the section on <a
38033ff48bf5SDavid du Colombierhref="#Refs">Refs</a> below for details.
38043ff48bf5SDavid du Colombier
38053ff48bf5SDavid du Colombier<dl>
38063ff48bf5SDavid du Colombier<dt>
38073ff48bf5SDavid du ColombierFiles:
38083ff48bf5SDavid du Colombier<dd>
38093ff48bf5SDavid du Colombier<a href="../src/gsalloc.c">src/gsalloc.c</a>,
38103ff48bf5SDavid du Colombier<a href="../src/gsalloc.h">src/gsalloc.h</a>,
38113ff48bf5SDavid du Colombier<a href="../src/gxalloc.h">src/gxalloc.h</a>,
38123ff48bf5SDavid du Colombier<a href="../src/gxobj.h">src/gxobj.h</a>.
38133ff48bf5SDavid du Colombier</dl>
38143ff48bf5SDavid du Colombier
38153ff48bf5SDavid du Colombier<h3><a name="PostScript_interpreter_extensions"></a>PostScript interpreter extensions</h3>
38163ff48bf5SDavid du Colombier
38173ff48bf5SDavid du Colombier<p>
38183ff48bf5SDavid du ColombierThe PostScript interpreter uses an allocator that extends the graphic
38193ff48bf5SDavid du Colombierlibrary's standard allocator to handle PostScript objects,
38203ff48bf5SDavid du Colombier<b><tt>save</tt></b> and <b><tt>restore</tt></b>, and real garbage
38213ff48bf5SDavid du Colombiercollection.
38223ff48bf5SDavid du Colombier
38233ff48bf5SDavid du Colombier<h4><a name="Refs"></a>Refs (PostScript "objects")</h4>
38243ff48bf5SDavid du Colombier
38253ff48bf5SDavid du Colombier<p>
38263ff48bf5SDavid du ColombierGhostscript represents what the PLRM calls PostScript "objects" using a
38273ff48bf5SDavid du Colombierstructure called a <b><tt>ref</tt></b>, defined in <a
38283ff48bf5SDavid du Colombierhref="../src/iref.h">src/iref.h</a>; packed refs, used for the elements of
38293ff48bf5SDavid du Colombierpacked arrays, are defined in <a href="../src/ipacked.h">src/ipacked.h</a>.
38303ff48bf5SDavid du ColombierSee those files for detailed information.
38313ff48bf5SDavid du Colombier
38323ff48bf5SDavid du Colombier<dl>
38333ff48bf5SDavid du Colombier<dt>
38343ff48bf5SDavid du ColombierFiles:
38353ff48bf5SDavid du Colombier<dd>
38363ff48bf5SDavid du Colombier<a href="../src/ipacked.h">src/ipacked.h</a>,
38373ff48bf5SDavid du Colombier<a href="../src/iref.h">src/iref.h</a>.
38383ff48bf5SDavid du Colombier</dl>
38393ff48bf5SDavid du Colombier
38403ff48bf5SDavid du Colombier<p>
38413ff48bf5SDavid du ColombierThe PLRM calls for two types of "virtual memory" (VM) space: global and
38423ff48bf5SDavid du Colombierlocal.  Ghostscript adds a third space, <em>system</em> VM, whose lifetime
38433ff48bf5SDavid du Colombieris an entire session -- i.e., it is effectively "permanent".  All three
38443ff48bf5SDavid du Colombierspaces are subject to garbage collection.  There is a separate allocator
38453ff48bf5SDavid du Colombierinstance for each VM space (actually, two instances each for global and
38463ff48bf5SDavid du Colombierlocal spaces; see <a href="#save_forgetsave_restore">below</a>).  In a
38473ff48bf5SDavid du Colombiersystem with multiple contexts and multiple global or local VMs, each global
38483ff48bf5SDavid du Colombieror local VM has its own allocator instance(s).
38493ff48bf5SDavid du Colombier
38503ff48bf5SDavid du Colombier<p>
38513ff48bf5SDavid du ColombierRefs that represent PostScript composite objects, and therefore include
38523ff48bf5SDavid du Colombierpointers to stored data, include a 2-bit VM space tag to indicate in which
38533ff48bf5SDavid du ColombierVM the object data are stored.  In addition to system, global, and local VM,
38543ff48bf5SDavid du Colombierthere is a tag for "foreign" VM, which means that the memory is not managed
38553ff48bf5SDavid du Colombierby a Ghostscript allocator at all.  Every store into a composite object must
38563ff48bf5SDavid du Colombiercheck for <b><tt>invalidaccess</tt></b>: the VM space tag values are chosen
38573ff48bf5SDavid du Colombierto help make this check efficient.  See <a
38583ff48bf5SDavid du Colombierhref="../src/ivmspace.h">src/ivmspace.h</a>, <a
38593ff48bf5SDavid du Colombierhref="../src/iref.h">src/iref.h</a>, and <a
38603ff48bf5SDavid du Colombierhref="../src/store.h">src/store.h</a> for details.
38613ff48bf5SDavid du Colombier
38623ff48bf5SDavid du Colombier<dl>
38633ff48bf5SDavid du Colombier<dt>
38643ff48bf5SDavid du ColombierFiles:
38653ff48bf5SDavid du Colombier<dd>
38663ff48bf5SDavid du Colombier<a href="../src/ivmspace.h">src/ivmspace.h</a>.
38673ff48bf5SDavid du Colombier</dl>
38683ff48bf5SDavid du Colombier
38693ff48bf5SDavid du Colombier<p>
38703ff48bf5SDavid du ColombierPostScript composite objects (arrays and dictionaries) are usually small.
38713ff48bf5SDavid du ColombierUsing a separate memory manager object for each composite object would waste
38723ff48bf5SDavid du Colombiera lot of space for object headers.  Therefore, the interpreter's memory
38733ff48bf5SDavid du Colombiermanager packs multiple composite objects (also called "ref-containing
38743ff48bf5SDavid du Colombierobjects") into a single memory manager object, similar to the way the memory
38753ff48bf5SDavid du Colombiermanager packs multiple objects into a chunk (see <a
38763ff48bf5SDavid du Colombierhref="#Standard_implementation">above</a>).  See <a
38773ff48bf5SDavid du Colombierhref="../src/gxalloc.h">src/gxalloc.h</a> for details.  This memory manager
38783ff48bf5SDavid du Colombierobject has a structure descriptor, like all other memory manager objects.
38793ff48bf5SDavid du Colombier
38803ff48bf5SDavid du Colombier<p>
38813ff48bf5SDavid du ColombierNote that the <b><tt>value.pdict</tt></b>, <b><tt>value.refs</tt></b>, or
38823ff48bf5SDavid du Colombier<b><tt>value.packed</tt></b> member of a ref must point to a PostScript
38833ff48bf5SDavid du Colombiercomposite object, and therefore can point into the middle of a memory
38843ff48bf5SDavid du Colombiermanager object.  This requires special handling by the garbage collector (<a
38853ff48bf5SDavid du Colombierhref="#Interpreter_GC">q.v.</a>).
38863ff48bf5SDavid du Colombier
38873ff48bf5SDavid du Colombier<dl>
38883ff48bf5SDavid du Colombier<dt>
38893ff48bf5SDavid du ColombierFiles:
38903ff48bf5SDavid du Colombier<dd>
38913ff48bf5SDavid du Colombier<a href="../src/ialloc.c">src/ialloc.c</a>,
38923ff48bf5SDavid du Colombier<a href="../src/ialloc.h">src/ialloc.h</a>,
38933ff48bf5SDavid du Colombier<a href="../src/iastate.h">src/iastate.h</a>,
38943ff48bf5SDavid du Colombier<a href="../src/iastruct.h">src/iastruct.h</a>,
38953ff48bf5SDavid du Colombier<a href="../src/ilocate.c">src/ilocate.c</a>,
38963ff48bf5SDavid du Colombier<a href="../src/imemory.h">src/imemory.h</a>,
38973ff48bf5SDavid du Colombier<a href="../src/istruct.h">src/istruct.h</a>.
38983ff48bf5SDavid du Colombier</dl>
38993ff48bf5SDavid du Colombier
39003ff48bf5SDavid du Colombier<h4><a name="save_forgetsave_restore"></a>save/.forgetsave/restore</h4>
39013ff48bf5SDavid du Colombier
39023ff48bf5SDavid du Colombier<p>
39033ff48bf5SDavid du ColombierIn addition to <b><tt>save</tt></b> and <b><tt>restore</tt></b>, Ghostscript
39043ff48bf5SDavid du Colombierprovides a <b><tt>.forgetsave</tt></b> operator that makes things as though
39053ff48bf5SDavid du Colombiera given <b><tt>save</tt></b> had never happened.  (In data base terminology,
39063ff48bf5SDavid du Colombier<b><tt>save</tt></b> is "begin transaction", <b><tt>restore</tt></b> is
39073ff48bf5SDavid du Colombier"abort transaction", and <b><tt>.forgetsave</tt></b> is "end/commit
39083ff48bf5SDavid du Colombiertransaction").  <b><tt>.forgetsave</tt></b> was implemented for a specific
39093ff48bf5SDavid du Colombiercommercial customer (who may no longer even be using it): it was a pain to
39103ff48bf5SDavid du Colombiermake work, but it's in the code now, and should be maintained.  See the
39113ff48bf5SDavid du Colombierextensive comments in <a href="../src/isave.c">src/isave.c</a> for more
39123ff48bf5SDavid du Colombierinformation about how these operations work.
39133ff48bf5SDavid du Colombier
39143ff48bf5SDavid du Colombier<dl>
39153ff48bf5SDavid du Colombier<dt>
39163ff48bf5SDavid du ColombierFiles:
39173ff48bf5SDavid du Colombier<dd>
39183ff48bf5SDavid du Colombier<a href="../src/idosave.h">src/idosave.h</a>,
39193ff48bf5SDavid du Colombier<a href="../src/isave.c">src/isave.c</a>,
39203ff48bf5SDavid du Colombier<a href="../src/isave.h">src/isave.h</a>,
39213ff48bf5SDavid du Colombier<a href="../src/isstate.h">src/isstate.h</a>,
39223ff48bf5SDavid du Colombier<a href="../src/store.h">src/store.h</a>.
39233ff48bf5SDavid du Colombier</dl>
39243ff48bf5SDavid du Colombier
39253ff48bf5SDavid du Colombier<h4><a name="Stable_allocators"></a>Stable allocators</h4>
39263ff48bf5SDavid du Colombier
39273ff48bf5SDavid du Colombier<p>
39283ff48bf5SDavid du ColombierEven though <b><tt>save</tt></b> and <b><tt>restore</tt></b> are concepts
39293ff48bf5SDavid du Colombierfrom the PostScript interpreter, the generic allocator architecture and API
39303ff48bf5SDavid du Colombierinclude a feature to support them, called <em>stable</em> allocators.  Every
39313ff48bf5SDavid du Colombierallocator has an associated stable allocator, which tags pointers with the
39323ff48bf5SDavid du Colombiersame VM space number but which is not subject to <b><tt>save</tt></b> and
39333ff48bf5SDavid du Colombier<b><tt>restore</tt></b>.  System VM is intrinsically stable (its associated
39343ff48bf5SDavid du Colombierstable allocator is the same allocator), so there are only 5 allocators in
39353ff48bf5SDavid du Colombierordinary single-context usage: system VM, stable global VM, ordinary global
39363ff48bf5SDavid du ColombierVM, stable local VM, ordinary local VM.
39373ff48bf5SDavid du Colombier
39383ff48bf5SDavid du Colombier<p>
39393ff48bf5SDavid du ColombierThe reason that we cannot simply allocate all stable objects in system VM is
39403ff48bf5SDavid du Colombierthat their refs must still be tagged with the correct VM space number, so
39413ff48bf5SDavid du Colombierthat the check against storing pointers from global VM to local VM can be
39423ff48bf5SDavid du Colombierenforced properly.
39433ff48bf5SDavid du Colombier
39443ff48bf5SDavid du Colombier<p>
39453ff48bf5SDavid du ColombierAll PostScript objects are normally allocated with the non-stable
39463ff48bf5SDavid du Colombierallocators.  The stable allocators should be used with care, since using
39473ff48bf5SDavid du Colombierthem can easily create dangling pointers: if storage allocated with a stable
39483ff48bf5SDavid du Colombierallocator contains any references to PostScript objects, the client is
39493ff48bf5SDavid du Colombierresponsible for ensuring that the references don't outlive the referenced
39503ff48bf5SDavid du Colombierobjects, normally by ensuring that any such referenced objects are allocated
3951*593dc095SDavid du Colombierat the outermost <b><tt>save</tt></b> level.
3952*593dc095SDavid du Colombier
3953*593dc095SDavid du Colombier<p>
3954*593dc095SDavid du ColombierThe original reason for wanting stable allocators was the PostScript stacks,
3955*593dc095SDavid du Colombierwhich are essentially PostScript arrays but are not subject to
3956*593dc095SDavid du Colombier<b><tt>save</tt></b> and <b><tt>restore</tt></b>.  Some other uses of stable
3957*593dc095SDavid du Colombierallocators are:
3958*593dc095SDavid du Colombier
3959*593dc095SDavid du Colombier<ul>
3960*593dc095SDavid du Colombier
3961*593dc095SDavid du Colombier<li>Several per-context structures for DPS.
3962*593dc095SDavid du Colombier
3963*593dc095SDavid du Colombier<li>Paths (see <b><tt>gstate_path_memory</tt></b> in
3964*593dc095SDavid du Colombier<a href="../src/gsstate.c">src/gsstate.c</a>.
3965*593dc095SDavid du Colombier
3966*593dc095SDavid du Colombier<li>Row buffers for images (see <b><tt>gs_image_row_memory</tt></b> in <a
3967*593dc095SDavid du Colombierhref="../src/gsimage.c">src/gsimage.c</a>), because the data-reading
3968*593dc095SDavid du Colombierprocedure for an image can invoke <b><tt>save</tt></b> and
3969*593dc095SDavid du Colombier<b><tt>restore</tt></b>.
3970*593dc095SDavid du Colombier
3971*593dc095SDavid du Colombier<li>Notification lists for fonts, to handle the sequence allocate .. save
3972*593dc095SDavid du Colombier.. register .. restore.
3973*593dc095SDavid du Colombier
3974*593dc095SDavid du Colombier<li>The parameter lists for pdfwrite and pswrite devices (in <a
3975*593dc095SDavid du Colombierhref="../src/gdevpsdp.c">src/gdevpsdp.c</a>), because the whole issue of
3976*593dc095SDavid du Colombierlocal vs. global VM for setpagedevice is, in the words of Ed Taft of Adobe,
3977*593dc095SDavid du Colombier"a mess".
3978*593dc095SDavid du Colombier
3979*593dc095SDavid du Colombier<li>Many places in the pdfwrite driver, because many of its bookkeeping
3980*593dc095SDavid du Colombierstructures must not be restorable.
3981*593dc095SDavid du Colombier
3982*593dc095SDavid du Colombier</ul>
3983*593dc095SDavid du Colombier
3984*593dc095SDavid du Colombier<p>
3985*593dc095SDavid du ColombierFor more specific examples, search the sources for references to
3986*593dc095SDavid du Colombier<b><tt>gs_memory_stable</tt></b>.
39873ff48bf5SDavid du Colombier
39883ff48bf5SDavid du Colombier<h4><a name="Interpreter_GC"></a>Garbage collection</h4>
39893ff48bf5SDavid du Colombier
39903ff48bf5SDavid du Colombier<p>
39913ff48bf5SDavid du ColombierThe interpreter's garbage collector is a compacting, non-conservative,
39923ff48bf5SDavid du Colombiermark-and-sweep collector.
39933ff48bf5SDavid du Colombier
39943ff48bf5SDavid du Colombier<ul>
39953ff48bf5SDavid du Colombier<li>It compacts storage because that is the only way to avoid permanent
39963ff48bf5SDavid du Colombiersandbars, which is essential in limited-memory environments.
39973ff48bf5SDavid du Colombier<li>It is non-conservative because conservative collectors (which attempt
39983ff48bf5SDavid du Colombierto determine whether arbitrary bit patterns are pointers) cannot compact.
39993ff48bf5SDavid du Colombier<li>It uses mark-and-sweep, rather than a more modern copying approach,
40003ff48bf5SDavid du Colombierbecause it cannot afford the extra memory required for copying.
40013ff48bf5SDavid du Colombier</ul>
40023ff48bf5SDavid du Colombier
40033ff48bf5SDavid du Colombier<p>
4004*593dc095SDavid du ColombierBecause the garbage collector is non-conservative, it cannot be run if there
4005*593dc095SDavid du Colombierare any pointers to movable storage from the C stack.  Thus it cannot be run
4006*593dc095SDavid du Colombierautomatically when the allocator is unable to allocate requested space.
4007*593dc095SDavid du ColombierInstead, when the allocator has allocated a given amount of storage (the
4008*593dc095SDavid du Colombier<b><tt>vm_threshold</tt></b> amount, corresponding to the PostScript
4009*593dc095SDavid du Colombier<b><tt>VMThreshold</tt></b> parameter), it sets a flag that the interpreter
4010*593dc095SDavid du Colombierchecks in the main loop.  When the interpreter sees that this flag is set,
4011*593dc095SDavid du Colombierit calls the garbage collector: at that point, there are no problematic
4012*593dc095SDavid du Colombierpointers from the stack.
4013*593dc095SDavid du Colombier
4014*593dc095SDavid du Colombier<p>
40153ff48bf5SDavid du ColombierRoots for tracing must be registered with the allocator.  Most roots are
40163ff48bf5SDavid du Colombierregistered during initialization.
40173ff48bf5SDavid du Colombier
40183ff48bf5SDavid du Colombier<p>
40193ff48bf5SDavid du Colombier"Mark-and-sweep" is a bit of a misnomer.  The garbage collector actually has
40203ff48bf5SDavid du Colombier5 main phases:
40213ff48bf5SDavid du Colombier
40223ff48bf5SDavid du Colombier<ul>
40233ff48bf5SDavid du Colombier<li>Sweep to clear marks;
40243ff48bf5SDavid du Colombier<li>Trace and mark;
40253ff48bf5SDavid du Colombier<li>Sweep to compute relocation;
40263ff48bf5SDavid du Colombier<li>Sweep to relocate pointers;
40273ff48bf5SDavid du Colombier<li>Sweep and compact.
40283ff48bf5SDavid du Colombier</ul>
40293ff48bf5SDavid du Colombier
40303ff48bf5SDavid du Colombier<p>
40313ff48bf5SDavid du ColombierThere is some extra complexity to handle collecting local VM only.  In this
40323ff48bf5SDavid du Colombiercase, all pointers in global VM are treated as roots, and global VM is not
40333ff48bf5SDavid du Colombiercompacted.
40343ff48bf5SDavid du Colombier
40353ff48bf5SDavid du Colombier<p>
40363ff48bf5SDavid du ColombierAs noted above, PostScript arrays and strings can have refs that point
40373ff48bf5SDavid du Colombierwithin them (because of <b><tt>getinterval</tt></b>).  Thus the garbage
40383ff48bf5SDavid du Colombiercollector must mark each element of an array, and even each byte of a
40393ff48bf5SDavid du Colombierstring, individually.  Specifically, it marks objects, refs, and strings
40403ff48bf5SDavid du Colombierusing 3 different mechanisms:
40413ff48bf5SDavid du Colombier
40423ff48bf5SDavid du Colombier<ul>
40433ff48bf5SDavid du Colombier
40443ff48bf5SDavid du Colombier<li>Objects have a mark bit in their header: see
40453ff48bf5SDavid du Colombier<a href="../src/gxobj.h">src/gxobj.h</a>,
40463ff48bf5SDavid du Colombier
40473ff48bf5SDavid du Colombier<li>Refs and packed refs have a reserved mark bit: see <a
40483ff48bf5SDavid du Colombierhref="../src/iref.h">src/iref.h</a> and <a
40493ff48bf5SDavid du Colombierhref="../src/ipacked.h">src/ipacked.h</a>.
40503ff48bf5SDavid du Colombier
40513ff48bf5SDavid du Colombier<li>Strings use a separate bit table, with one bit per string byte: see
40523ff48bf5SDavid du Colombier<a href="../src/gxalloc.h">src/gxalloc.h</a>,
40533ff48bf5SDavid du Colombier
40543ff48bf5SDavid du Colombier</ul>
40553ff48bf5SDavid du Colombier
40563ff48bf5SDavid du Colombier<p>
40573ff48bf5SDavid du ColombierSimilarly, it records the relocation information for objects, refs, and
40583ff48bf5SDavid du Colombierstrings differently:
40593ff48bf5SDavid du Colombier
40603ff48bf5SDavid du Colombier<ul>
40613ff48bf5SDavid du Colombier
40623ff48bf5SDavid du Colombier<li>Objects record relocation in the object header.
40633ff48bf5SDavid du Colombier
40643ff48bf5SDavid du Colombier<li>Refs record relocation in unused fields of refs such as nulls that
40653ff48bf5SDavid du Colombierdon't use their <b><tt>value</tt></b> field.  Every memory manager object
40663ff48bf5SDavid du Colombierthat stores ref-containing objects as described above has an extra, unused
40673ff48bf5SDavid du Colombierref at the end for this purpose.
40683ff48bf5SDavid du Colombier
40693ff48bf5SDavid du Colombier<li>Strings use a separate relocation table.
40703ff48bf5SDavid du Colombier
40713ff48bf5SDavid du Colombier</ul>
40723ff48bf5SDavid du Colombier
40733ff48bf5SDavid du Colombier<dl>
40743ff48bf5SDavid du Colombier<dt>
40753ff48bf5SDavid du ColombierFiles:
40763ff48bf5SDavid du Colombier<dd>
40773ff48bf5SDavid du Colombier<a href="../src/igc.c">src/igc.c</a>,
40783ff48bf5SDavid du Colombier<a href="../src/igc.h">src/igc.h</a>,
40793ff48bf5SDavid du Colombier<a href="../src/igcref.c">src/igcref.c</a>,
40803ff48bf5SDavid du Colombier<a href="../src/igcstr.c">src/igcstr.c</a>,
40813ff48bf5SDavid du Colombier<a href="../src/igcstr.h">src/igcstr.h</a>,
40823ff48bf5SDavid du Colombier<a href="../src/ireclaim.c">src/ireclaim.c</a>.
40833ff48bf5SDavid du Colombier</dl>
40843ff48bf5SDavid du Colombier
40853ff48bf5SDavid du Colombier<hr>
40863ff48bf5SDavid du Colombier
40873ff48bf5SDavid du Colombier<h2><a name="Portability"></a>Portability</h2>
40883ff48bf5SDavid du Colombier
40893ff48bf5SDavid du Colombier<p>
40903ff48bf5SDavid du ColombierOne of Ghostscript's most important features is its great portability across
40913ff48bf5SDavid du Colombierplatforms (CPUs, operating systems, compilers, and build tools).  The code
40923ff48bf5SDavid du Colombiersupports portability through two mechanisms:
40933ff48bf5SDavid du Colombier
40943ff48bf5SDavid du Colombier<ul>
40953ff48bf5SDavid du Colombier
40963ff48bf5SDavid du Colombier<li><a href="#Structural">Structural mechanisms</a> -- segregating
40973ff48bf5SDavid du Colombierplatform-dependent information into files in a particular way.
40983ff48bf5SDavid du Colombier
40993ff48bf5SDavid du Colombier<li><a href="#Coding">Coding standards</a> -- avoiding relying on byte
41003ff48bf5SDavid du Colombierorder, scalar size, and platform-specific compiler or library features.
41013ff48bf5SDavid du Colombier
41023ff48bf5SDavid du Colombier</ul>
41033ff48bf5SDavid du Colombier
41043ff48bf5SDavid du Colombier<h3><a name="Structural"></a>Structural</h3>
41053ff48bf5SDavid du Colombier
41063ff48bf5SDavid du Colombier<h4><a name="CPU_and_compiler"></a>CPU and compiler</h4>
41073ff48bf5SDavid du Colombier
41083ff48bf5SDavid du Colombier<p>
41093ff48bf5SDavid du ColombierGhostscript attempts to discover characteristics of the CPU and compiler
41103ff48bf5SDavid du Colombierautomatically during the build process, by compiling and then executing a
41113ff48bf5SDavid du Colombierprogram called <b><tt>genarch</tt></b>.  <b><tt>genarch</tt></b> generates a
41123ff48bf5SDavid du Colombierfile <b><tt>obj/arch.h</tt></b>, which almost all Ghostscript files then
41133ff48bf5SDavid du Colombierinclude.  This works well for things like word size, byte order, and
41143ff48bf5SDavid du Colombierfloating point representation, but it can't determine whether or not a
41153ff48bf5SDavid du Colombiercompiler supports a particular feature, because if a feature is absent, the
41163ff48bf5SDavid du Colombiercompilation may fail.
41173ff48bf5SDavid du Colombier
41183ff48bf5SDavid du Colombier<dl>
41193ff48bf5SDavid du Colombier<dt>
41203ff48bf5SDavid du ColombierFiles:
41213ff48bf5SDavid du Colombier<dd>
41223ff48bf5SDavid du Colombier<a href="../src/genarch.c">src/genarch.c</a>,
41233ff48bf5SDavid du Colombier<a href="../obj/arch.h">obj/arch.h</a>.
41243ff48bf5SDavid du Colombier</dl>
41253ff48bf5SDavid du Colombier
41263ff48bf5SDavid du Colombier<h4><a name="Library_headers"></a>Library headers</h4>
41273ff48bf5SDavid du Colombier
41283ff48bf5SDavid du Colombier<p>
41293ff48bf5SDavid du ColombierDespite the supposed standardization of ANSI C, platforms vary considerably
41303ff48bf5SDavid du Colombierin where (and whether) they provide various standard library facilities.
41313ff48bf5SDavid du ColombierCurrently, Ghostscript's build process doesn't attempt to sort this out
41323ff48bf5SDavid du Colombierautomatically.  Instead, for each library header file
41333ff48bf5SDavid du Colombier<b><tt>&lt;</tt></b><em>xxx</em><b><tt>.h&gt;</tt></b> there is a
41343ff48bf5SDavid du Colombiercorresponding Ghostscript source file
41353ff48bf5SDavid du Colombier<b><tt>src/</tt></b><em>xxx</em><b><tt>_.h</tt></b>, containing a set of
41363ff48bf5SDavid du Colombiercompile-time conditionals that attempt to select the correct platform header
41373ff48bf5SDavid du Colombierfile, or in some cases substitute Ghostscript's own code for a missing
41383ff48bf5SDavid du Colombierfacility.  You may need to edit these files when moving to platforms with
41393ff48bf5SDavid du Colombierunusually non-standard libraries.
41403ff48bf5SDavid du Colombier
41413ff48bf5SDavid du Colombier<dl>
41423ff48bf5SDavid du Colombier<dt>
41433ff48bf5SDavid du ColombierFiles:
41443ff48bf5SDavid du Colombier<dd>
41453ff48bf5SDavid du Colombier<a href="../src/ctype_.h">src/ctype_.h</a>,
41463ff48bf5SDavid du Colombier<a href="../src/dirent_.h">src/dirent_.h</a>,
41473ff48bf5SDavid du Colombier<a href="../src/dos_.h">src/dos_.h</a>,
41483ff48bf5SDavid du Colombier<a href="../src/errno_.h">src/errno_.h</a>,
41493ff48bf5SDavid du Colombier<a href="../src/fcntl_.h">src/fcntl_.h</a>,
41503ff48bf5SDavid du Colombier<a href="../src/jerror_.h">src/jerror_.h</a>,
41513ff48bf5SDavid du Colombier<a href="../src/malloc_.h">src/malloc_.h</a>,
41523ff48bf5SDavid du Colombier<a href="../src/math_.h">src/math_.h</a>,
41533ff48bf5SDavid du Colombier<a href="../src/memory_.h">src/memory_.h</a>,
41543ff48bf5SDavid du Colombier<a href="../src/pipe_.h">src/pipe_.h</a>,
41553ff48bf5SDavid du Colombier<a href="../src/png_.h">src/png_.h</a>,
41563ff48bf5SDavid du Colombier<a href="../src/stat_.h">src/stat_.h</a>,
4157*593dc095SDavid du Colombier<a href="../src/stdint_.h">src/stdint_.h</a>,
41583ff48bf5SDavid du Colombier<a href="../src/stdio_.h">src/stdio_.h</a>,
41593ff48bf5SDavid du Colombier<a href="../src/string_.h">src/string_.h</a>,
41603ff48bf5SDavid du Colombier<a href="../src/time_.h">src/time_.h</a>,
41613ff48bf5SDavid du Colombier<a href="../src/unistd_.h">src/unistd_.h</a>,
41623ff48bf5SDavid du Colombier<a href="../src/vmsmath.h">src/vmsmath.h</a>,
41633ff48bf5SDavid du Colombier<a href="../src/windows_.h">src/windows_.h</a>,
41643ff48bf5SDavid du Colombier<a href="../src/x_.h">src/x_.h</a>.
41653ff48bf5SDavid du Colombier</dl>
41663ff48bf5SDavid du Colombier
41673ff48bf5SDavid du Colombier<p>
41683ff48bf5SDavid du ColombierIt has been suggested that the GNU <b><tt>configure</tt></b> scripts do the
41693ff48bf5SDavid du Colombierabove better, for Unix systems, than Ghostscript's current methods.  While
41703ff48bf5SDavid du Colombierthis may be true, we have found <b><tt>configure</tt></b> scripts difficult
41713ff48bf5SDavid du Colombierto write, understand, and maintain; and the <b><tt>autoconf</tt></b> tool
41723ff48bf5SDavid du Colombierfor generating <b><tt>configure</tt></b> scripts, which we found easy to
41733ff48bf5SDavid du Colombieruse, doesn't cover much of the ground that Ghostscript requires.
41743ff48bf5SDavid du Colombier
41753ff48bf5SDavid du Colombier<h4><a name="Cross_platform_APIs"></a>Cross-platform APIs</h4>
41763ff48bf5SDavid du Colombier
41773ff48bf5SDavid du Colombier<p>
41783ff48bf5SDavid du ColombierFor a few library facilities that are available on all platforms but are not
41793ff48bf5SDavid du Colombierwell standardized, or that may need to be changed for special environments,
41803ff48bf5SDavid du ColombierGhostscript defines its own APIs.  It is an architectural property of
41813ff48bf5SDavid du ColombierGhostscript that the implementations of these APIs are the only .c files for
41823ff48bf5SDavid du Colombierwhich the choice of platform (as opposed to choices of drivers or optional
41833ff48bf5SDavid du Colombierfeatures) determines whether they are compiled and linked into an
41843ff48bf5SDavid du Colombierexecutable.
41853ff48bf5SDavid du Colombier
41863ff48bf5SDavid du Colombier<dl>
41873ff48bf5SDavid du Colombier
41883ff48bf5SDavid du Colombier<dt>
41893ff48bf5SDavid du ColombierAPI:
41903ff48bf5SDavid du Colombier<dd>
41913ff48bf5SDavid du Colombier<a href="../src/gp.h">src/gp.h</a>,
41923ff48bf5SDavid du Colombier<a href="../src/gpcheck.h">src/gpcheck.h</a>,
41933ff48bf5SDavid du Colombier<a href="../src/gpgetenv.h">src/gpgetenv.h</a>,
41943ff48bf5SDavid du Colombier<a href="../src/gpmisc.h">src/gpmisc.h</a>,
41953ff48bf5SDavid du Colombier<a href="../src/gpsync.h">src/gpsync.h</a>.
41963ff48bf5SDavid du Colombier
41973ff48bf5SDavid du Colombier<dt>
41983ff48bf5SDavid du ColombierImplementation files shared among multiple platforms:
41993ff48bf5SDavid du Colombier<dd>
42003ff48bf5SDavid du Colombier<a href="../src/gp_getnv.c">src/gp_getnv.c</a>,
42013ff48bf5SDavid du Colombier<a href="../src/gp_mktmp.c">src/gp_mktmp.c</a>,
42023ff48bf5SDavid du Colombier<a href="../src/gp_nsync.c">src/gp_nsync.c</a>,
42033ff48bf5SDavid du Colombier<a href="../src/gp_psync.c">src/gp_psync.c</a>,
42043ff48bf5SDavid du Colombier<a href="../src/gp_strdl.c">src/gp_strdl.c</a>,
42053ff48bf5SDavid du Colombier<a href="../src/gpmisc.c">src/gpmisc.c</a>.
42063ff48bf5SDavid du Colombier
42073ff48bf5SDavid du Colombier<dt>
42083ff48bf5SDavid du ColombierPlatform-specific implementation files:
42093ff48bf5SDavid du Colombier<dd>
42103ff48bf5SDavid du Colombier<a href="../src/gp_dosfe.c">src/gp_dosfe.c</a>,
42113ff48bf5SDavid du Colombier<a href="../src/gp_dosfs.c">src/gp_dosfs.c</a>,
42123ff48bf5SDavid du Colombier<a href="../src/gp_dvx.c">src/gp_dvx.c</a>,
42133ff48bf5SDavid du Colombier<a href="../src/gp_iwatc.c">src/gp_iwatc.c</a>,
42143ff48bf5SDavid du Colombier<a href="../src/gp_msdos.c">src/gp_msdos.c</a>,
42153ff48bf5SDavid du Colombier<a href="../src/gp_mshdl.c">src/gp_mshdl.c</a>,
42163ff48bf5SDavid du Colombier<a href="../src/gp_msio.c">src/gp_msio.c</a>,
42173ff48bf5SDavid du Colombier<a href="../src/gp_mslib.c">src/gp_mslib.c</a>,
42183ff48bf5SDavid du Colombier<a href="../src/gp_mswin.c">src/gp_mswin.c</a>,
42193ff48bf5SDavid du Colombier<a href="../src/gp_mswin.h">src/gp_mswin.h</a>,
42203ff48bf5SDavid du Colombier<a href="../src/gp_ntfs.c">src/gp_ntfs.c</a>,
42213ff48bf5SDavid du Colombier<a href="../src/gp_os2.c">src/gp_os2.c</a>,
4222*593dc095SDavid du Colombier<a href="../src/gp_os2.h">src/gp_os2.h</a>,
42233ff48bf5SDavid du Colombier<a href="../src/gp_os9.c">src/gp_os9.c</a>,
42243ff48bf5SDavid du Colombier<a href="../src/gp_stdia.c">src/gp_stdia.c</a>,
42253ff48bf5SDavid du Colombier<a href="../src/gp_stdin.c">src/gp_stdin.c</a>,
42263ff48bf5SDavid du Colombier<a href="../src/gp_sysv.c">src/gp_sysv.c</a>,
42273ff48bf5SDavid du Colombier<a href="../src/gp_unifn.c">src/gp_unifn.c</a>,
42283ff48bf5SDavid du Colombier<a href="../src/gp_unifs.c">src/gp_unifs.c</a>,
42293ff48bf5SDavid du Colombier<a href="../src/gp_unix.c">src/gp_unix.c</a>,
4230*593dc095SDavid du Colombier<a href="../src/gp_unix_cache.c">src/gp_unix_cache.c</a>,
42313ff48bf5SDavid du Colombier<a href="../src/gp_vms.c">src/gp_vms.c</a>,
42323ff48bf5SDavid du Colombier<a href="../src/gp_wgetv.c">src/gp_wgetv.c</a>,
42333ff48bf5SDavid du Colombier<a href="../src/gp_win32.c">src/gp_win32.c</a>,
4234*593dc095SDavid du Colombier<a href="../src/gp_wsync.c">src/gp_wsync.c</a>,
4235*593dc095SDavid du Colombier<a href="../src/gs_dll_call.h">src/gs_dll_call.h</a>.
42363ff48bf5SDavid du Colombier
42373ff48bf5SDavid du Colombier</dl>
42383ff48bf5SDavid du Colombier
42393ff48bf5SDavid du Colombier<h4><a name="Makefiles"></a>Makefiles</h4>
42403ff48bf5SDavid du Colombier
42413ff48bf5SDavid du Colombier<p>
42423ff48bf5SDavid du ColombierFor information on the structure and conventions used within makefiles, see
42433ff48bf5SDavid du Colombierthe <a href="#Makefile_structure">Makefile structure</a> section above.
42443ff48bf5SDavid du Colombier
42453ff48bf5SDavid du Colombier<p>
42463ff48bf5SDavid du ColombierGhostscript's makefiles are structured very similarly to the cross-platform
42473ff48bf5SDavid du Colombierlibrary files.  The great majority of the makefiles are portable across all
42483ff48bf5SDavid du Colombierplatforms and all versions of <b><tt>make</tt></b>.  To achieve this, the
42493ff48bf5SDavid du Colombierplatform-independent makefiles must obey two constraints beyond those of the
42503ff48bf5SDavid du ColombierPOSIX <b><tt>make</tt></b> program:
42513ff48bf5SDavid du Colombier
42523ff48bf5SDavid du Colombier<ul>
42533ff48bf5SDavid du Colombier
42543ff48bf5SDavid du Colombier<li>No conditionals or <b><tt>include</tt></b>s are allowed.  While most
42553ff48bf5SDavid du Colombier<b><tt>make</tt></b> programs now provide some form of conditional execution
42563ff48bf5SDavid du Colombierand some form of inclusion, there is no agreement on the syntax.
42573ff48bf5SDavid du Colombier(Conditionals and includes are allowed in platform-dependent makefiles; in
42583ff48bf5SDavid du Colombierfact, an inclusion facility is required.)
42593ff48bf5SDavid du Colombier
42603ff48bf5SDavid du Colombier<li>There must be a space on both sides of the : that separates the target
42613ff48bf5SDavid du Colombierof a rule from its dependencies.  This is required for compatibility with
42623ff48bf5SDavid du Colombierthe OpenVMS <b><tt>MMS</tt></b> and <b><tt>MMK</tt></b> programs.
42633ff48bf5SDavid du Colombier
42643ff48bf5SDavid du Colombier</ul>
42653ff48bf5SDavid du Colombier
42663ff48bf5SDavid du Colombier<p>
42673ff48bf5SDavid du ColombierThe top-level makefile for each platform (where "platform" includes the OS,
42683ff48bf5SDavid du Colombierthe compiler, and the flavor of <b><tt>make</tt></b>) contains all the build
42693ff48bf5SDavid du Colombieroptions, plus <b><tt>include</tt></b>s for the generic makefiles and any
42703ff48bf5SDavid du Colombierplatform-dependent makefiles that are shared among multiple platforms.
42713ff48bf5SDavid du Colombier
42723ff48bf5SDavid du Colombier<p>
42733ff48bf5SDavid du ColombierWhile most of the top-level makefiles build a PostScript and/or PDF
42743ff48bf5SDavid du Colombierinterpreter configuration, there are also a few makefiles that build a test
42753ff48bf5SDavid du Colombierprogram that only uses the graphics library without any language
42763ff48bf5SDavid du Colombierinterpreter.  Among other things, this can be helpful in verifying that no
42773ff48bf5SDavid du Colombieraccidental dependencies on the interpreter have crept into the library or
42783ff48bf5SDavid du Colombierdrivers.
42793ff48bf5SDavid du Colombier
42803ff48bf5SDavid du Colombier<p>
42813ff48bf5SDavid du ColombierFor families of similar platforms, the question arises whether to use
42823ff48bf5SDavid du Colombiermultiple top-level makefiles, or whether to use a single top-level makefile
42833ff48bf5SDavid du Colombierthat may require minor editing for some (or all) platforms.  Ghostscript
42843ff48bf5SDavid du Colombiercurrently uses the following top-level makefiles for building interpreter
42853ff48bf5SDavid du Colombierconfigurations:
42863ff48bf5SDavid du Colombier
42873ff48bf5SDavid du Colombier<ul>
42883ff48bf5SDavid du Colombier
4289*593dc095SDavid du Colombier<li>POSIX systems (inluding Linux and Unix):
42903ff48bf5SDavid du Colombier<ul>
4291*593dc095SDavid du Colombier<li><a href="../src/configure.ac">src/configure.ac</a>,
4292*593dc095SDavid du ColombierGNU Autoconf source script for automatic build configuration.
4293*593dc095SDavid du Colombier<li><a href="../src/Makefile.in">src/Makefile.in</a>,
4294*593dc095SDavid du Colombiersource for the top-level makefile used in the Autoconf build.
42953ff48bf5SDavid du Colombier<li><a href="../src/unix-gcc.mak">src/unix-gcc.mak</a>,
42963ff48bf5SDavid du Colombierfor Unix with gcc.
42973ff48bf5SDavid du Colombier<li><a href="../src/unixansi.mak">src/unixansi.mak</a>,
42983ff48bf5SDavid du Colombierfor Unix with an ANSI C compiler other than gcc.
42993ff48bf5SDavid du Colombier</ul>
43003ff48bf5SDavid du Colombier
43013ff48bf5SDavid du Colombier<li>PC:
43023ff48bf5SDavid du Colombier<ul>
43033ff48bf5SDavid du Colombier<li><a href="../src/bcwin32.mak">src/bcwin32.mak</a>,
43043ff48bf5SDavid du Colombierfor MS Windows with Borland C++ Builder.
43053ff48bf5SDavid du Colombier<li><a href="../src/msvc32.mak">src/msvc32.mak</a>,
43063ff48bf5SDavid du Colombierfor MS Windows with Microsoft Visual C (MSVC).
43073ff48bf5SDavid du Colombier<li><a href="../src/os2.mak">src/os2.mak</a>,
43083ff48bf5SDavid du Colombierfor MS-DOS or OS/2 GCC/EMX environment.
43093ff48bf5SDavid du Colombier<li><a href="../src/watcw32.mak">src/watcw32.mak</a>,
43103ff48bf5SDavid du Colombierfor MS Windows with Watcom C.
43113ff48bf5SDavid du Colombier</ul>
43123ff48bf5SDavid du Colombier
43133ff48bf5SDavid du Colombier<li>Macintosh:
43143ff48bf5SDavid du Colombier<ul>
4315*593dc095SDavid du Colombier<li><a href="../src/macosx.mak">src/macosx.mak</a>,
4316*593dc095SDavid du Colombiercommandline makefile for MacOS X.
43173ff48bf5SDavid du Colombier<li><a href="../src/macos-mcp.mak">src/macos-mcp.mak</a>,
4318*593dc095SDavid du Colombierdummy makefile to generate an xml project file for Metrowerks Codewarrior.
43193ff48bf5SDavid du Colombier</ul>
43203ff48bf5SDavid du Colombier
43213ff48bf5SDavid du Colombier
43223ff48bf5SDavid du Colombier<li>Other:
43233ff48bf5SDavid du Colombier<ul>
43243ff48bf5SDavid du Colombier<li><a href="../src/all-arch.mak">src/all-arch.mak</a>,
43253ff48bf5SDavid du Colombierfor building on many Unix systems in a networked test environment.
43263ff48bf5SDavid du Colombier<li><a href="../src/dvx-gcc.mak">src/dvx-gcc.mak</a>,
43273ff48bf5SDavid du Colombierfor DesqView/X with gcc.
43283ff48bf5SDavid du Colombier<li><a href="../src/openvms.mak">src/openvms.mak</a>,
43293ff48bf5SDavid du Colombierfor OpenVMS with Digital's CC compiler and the MMS build program.
43303ff48bf5SDavid du Colombier<li><a href="../src/openvms.mmk">src/openvms.mmk</a>,
43313ff48bf5SDavid du Colombierfor OpenVMS with Digital's CC compiler and the MMK build program.
43323ff48bf5SDavid du Colombier</ul>
43333ff48bf5SDavid du Colombier
43343ff48bf5SDavid du Colombier</ul>
43353ff48bf5SDavid du Colombier
43363ff48bf5SDavid du Colombier<p>
43373ff48bf5SDavid du ColombierThe following top-level makefiles build the library test program:
43383ff48bf5SDavid du Colombier
43393ff48bf5SDavid du Colombier<ul>
43403ff48bf5SDavid du Colombier<li><a href="../src/ugcclib.mak">src/ugcclib.mak</a>,
43413ff48bf5SDavid du Colombieron Unix with gcc.
43423ff48bf5SDavid du Colombier<li><a href="../src/msvclib.mak">src/msvclib.mak</a>,
43433ff48bf5SDavid du Colombieron MS Windows with MSVC.
43443ff48bf5SDavid du Colombier<li><a href="../src/watclib.mak">src/watclib.mak</a>,
43453ff48bf5SDavid du Colombieron extended MS-DOS with Watcom C.
43463ff48bf5SDavid du Colombier</ul>
43473ff48bf5SDavid du Colombier
43483ff48bf5SDavid du Colombier<p>
43493ff48bf5SDavid du ColombierThe MSVC makefiles may require editing to select between different versions
43503ff48bf5SDavid du Colombierof MSVC, since different versions may have slightly incompatible command
43513ff48bf5SDavid du Colombierline switches or customary installation path names.  The Unix makefiles
43523ff48bf5SDavid du Colombieroften require editing to deal with differing library path names and/or
43533ff48bf5SDavid du Colombierlibrary names.  For details, see <a href="Make.htm#Unix_build">the Unix
43543ff48bf5SDavid du Colombiersection</a> of the documentation for building Ghostscript.
43553ff48bf5SDavid du Colombier
43563ff48bf5SDavid du Colombier<dl>
43573ff48bf5SDavid du Colombier
43583ff48bf5SDavid du Colombier<dt>
43593ff48bf5SDavid du ColombierLibrary test program:
43603ff48bf5SDavid du Colombier<dd>
43613ff48bf5SDavid du Colombier<a href="../src/gslib.c">src/gslib.c</a>.
43623ff48bf5SDavid du Colombier
43633ff48bf5SDavid du Colombier<dt>
43643ff48bf5SDavid du ColombierPlatform-independent makefiles:
43653ff48bf5SDavid du Colombier<dd>
43663ff48bf5SDavid du Colombier
43673ff48bf5SDavid du Colombier<dl>
43683ff48bf5SDavid du Colombier
43693ff48bf5SDavid du Colombier<dt>
43703ff48bf5SDavid du ColombierGraphics library and support:
43713ff48bf5SDavid du Colombier<dd>
43723ff48bf5SDavid du Colombier<a href="../src/contrib.mak">src/contrib.mak</a>,
43733ff48bf5SDavid du Colombier<a href="../src/devs.mak">src/devs.mak</a>,
43743ff48bf5SDavid du Colombier<a href="../src/gs.mak">src/gs.mak</a>,
43753ff48bf5SDavid du Colombier<a href="../src/lib.mak">src/lib.mak</a>,
43763ff48bf5SDavid du Colombier<a href="../src/version.mak">src/version.mak</a>.
43773ff48bf5SDavid du Colombier
43783ff48bf5SDavid du Colombier<dt>
43793ff48bf5SDavid du ColombierPostScript interpreter and fonts:
43803ff48bf5SDavid du Colombier<dd>
43813ff48bf5SDavid du Colombier<a href="../src/cfonts.mak">src/cfonts.mak</a>,
43823ff48bf5SDavid du Colombier<a href="../src/int.mak">src/int.mak</a>,
43833ff48bf5SDavid du Colombier<a href="../src/wmin.mak">src/wmin.mak</a>.
43843ff48bf5SDavid du Colombier
43853ff48bf5SDavid du Colombier<dt>
43863ff48bf5SDavid du ColombierThird-party libraries:
43873ff48bf5SDavid du Colombier<dd>
43883ff48bf5SDavid du Colombier<a href="../src/icclib.mak">src/icclib.mak</a>,
43893ff48bf5SDavid du Colombier<a href="../src/ijs.mak">src/ijs.mak</a>,
4390*593dc095SDavid du Colombier<a href="../src/jasper.mak">src/jasper.mak</a>,
4391*593dc095SDavid du Colombier<a href="../src/jbig2.mak">src/jbig2.mak</a>,
43923ff48bf5SDavid du Colombier<a href="../src/jpeg.mak">src/jpeg.mak</a>,
43933ff48bf5SDavid du Colombier<a href="../src/libpng.mak">src/libpng.mak</a>,
43943ff48bf5SDavid du Colombier<a href="../src/zlib.mak">src/zlib.mak</a>.
43953ff48bf5SDavid du Colombier
43963ff48bf5SDavid du Colombier</dl>
43973ff48bf5SDavid du Colombier
43983ff48bf5SDavid du Colombier<dt>
43993ff48bf5SDavid du ColombierShared platform-dependent makefiles:
44003ff48bf5SDavid du Colombier<dd>
44013ff48bf5SDavid du Colombier
44023ff48bf5SDavid du Colombier<dl>
44033ff48bf5SDavid du Colombier
44043ff48bf5SDavid du Colombier<dt>
44053ff48bf5SDavid du ColombierUnix:
44063ff48bf5SDavid du Colombier<dd>
44073ff48bf5SDavid du Colombier<a href="../src/unix-aux.mak">src/unix-aux.mak</a>,
44083ff48bf5SDavid du Colombier<a href="../src/unix-dll.mak">src/unix-dll.mak</a>,
44093ff48bf5SDavid du Colombier<a href="../src/unix-end.mak">src/unix-end.mak</a>,
44103ff48bf5SDavid du Colombier<a href="../src/unixhead.mak">src/unixhead.mak</a>,
44113ff48bf5SDavid du Colombier<a href="../src/unixinst.mak">src/unixinst.mak</a>,
44123ff48bf5SDavid du Colombier<a href="../src/unixlink.mak">src/unixlink.mak</a>.
44133ff48bf5SDavid du Colombier
44143ff48bf5SDavid du Colombier<dt>
44153ff48bf5SDavid du ColombierMicrosoft Windows and MS-DOS:
44163ff48bf5SDavid du Colombier<dd>
44173ff48bf5SDavid du Colombier<a href="../src/msvccmd.mak">src/msvccmd.mak</a>,
44183ff48bf5SDavid du Colombier<a href="../src/msvctail.mak">src/msvctail.mak</a>,
44193ff48bf5SDavid du Colombier<a href="../src/pcwin.mak">src/pcwin.mak</a>,
44203ff48bf5SDavid du Colombier<a href="../src/wccommon.mak">src/wccommon.mak</a>,
44213ff48bf5SDavid du Colombier<a href="../src/wctail.mak">src/wctail.mak</a>,
44223ff48bf5SDavid du Colombier<a href="../src/winint.mak">src/winint.mak</a>,
44233ff48bf5SDavid du Colombier<a href="../src/winlib.mak">src/winlib.mak</a>,
44243ff48bf5SDavid du Colombier<a href="../src/winplat.mak">src/winplat.mak</a>.
44253ff48bf5SDavid du Colombier
44263ff48bf5SDavid du Colombier<dt>
44273ff48bf5SDavid du ColombierOther:
44283ff48bf5SDavid du Colombier<dd>
44293ff48bf5SDavid du Colombier<a href="../src/dvx-head.mak">src/dvx-head.mak</a>,
4430*593dc095SDavid du Colombier<a href="../src/dvx-tail.mak">src/dvx-tail.mak</a>.<br>
4431*593dc095SDavid du Colombier<a href="../src/macos-fw.mak">src/macos-fw.mak</a>,
4432*593dc095SDavid du Colombierfor building as a MacOS X Framework.
44333ff48bf5SDavid du Colombier
44343ff48bf5SDavid du Colombier</dl>
44353ff48bf5SDavid du Colombier
44363ff48bf5SDavid du Colombier</dl>
44373ff48bf5SDavid du Colombier
44383ff48bf5SDavid du Colombier<h3><a name="Coding"></a>Coding</h3>
44393ff48bf5SDavid du Colombier
44403ff48bf5SDavid du Colombier<p>
44413ff48bf5SDavid du ColombierCoding for portability requires avoiding both <em>explicit</em>
44423ff48bf5SDavid du Colombierdependencies, such as platform-dependent <b><tt>#ifdef</tt></b>s, and
44433ff48bf5SDavid du Colombier<em>implicit</em> dependencies, such as dependencies on byte order or the
44443ff48bf5SDavid du Colombiersize of the integral types.
44453ff48bf5SDavid du Colombier
44463ff48bf5SDavid du Colombier<h4><a name="Explicit_dependencies"></a>Explicit dependencies</h4>
44473ff48bf5SDavid du Colombier
44483ff48bf5SDavid du Colombier<p>
44493ff48bf5SDavid du ColombierThe platform-independent .c files never, ever, use <b><tt>#ifdef</tt></b> or
44503ff48bf5SDavid du Colombier<b><tt>#if</tt></b> to select code for specific platforms.  Instead, we
44513ff48bf5SDavid du Colombieralways try to characterize some abstract property that is being tested.  For
44523ff48bf5SDavid du Colombierexample, rather than checking for macros that are defined on those specific
44533ff48bf5SDavid du Colombierplatforms that have 64-bit <b><tt>long</tt></b> values, we define a macro
44543ff48bf5SDavid du Colombier<b><tt>ARCH_SIZEOF_LONG</tt></b> that can then be tested.  Such macros are
44553ff48bf5SDavid du Colombieralways defined in a .h file, either automatically in <b><tt>arch.h</tt></b>,
44563ff48bf5SDavid du Colombieror explicitly in a <em>xxx</em><b><tt>_.h</tt></b> file, as described in
44573ff48bf5SDavid du Colombierearlier sections.
44583ff48bf5SDavid du Colombier
44593ff48bf5SDavid du Colombier<dl>
44603ff48bf5SDavid du Colombier<dt>
44613ff48bf5SDavid du ColombierFiles:
44623ff48bf5SDavid du Colombier<dd>
44633ff48bf5SDavid du Colombier<a href="../src/std.h">src/std.h</a>,
4464*593dc095SDavid du Colombier<a href="../src/stdpn.h">src/stdpn.h</a>,
44653ff48bf5SDavid du Colombier<a href="../src/stdpre.h">src/stdpre.h</a>.
44663ff48bf5SDavid du Colombier</dl>
44673ff48bf5SDavid du Colombier
44683ff48bf5SDavid du Colombier<h4><a name="Implicit_dependencies"></a>Implicit dependencies</h4>
44693ff48bf5SDavid du Colombier
44703ff48bf5SDavid du Colombier<p>
44713ff48bf5SDavid du ColombierThe most common source of byte ordering dependencies is casting between
44723ff48bf5SDavid du Colombiertypes (T1 *) and (T2 *) where T1 and T2 are numeric types that aren't merely
44733ff48bf5SDavid du Colombiersigned/unsigned variants of each other.  To avoid this, the only casts
44743ff48bf5SDavid du Colombierallowed in the code are between numeric types, from a pointer type to a long
44753ff48bf5SDavid du Colombierintegral type, and between pointer types.
44763ff48bf5SDavid du Colombier
44773ff48bf5SDavid du Colombier<p>
44783ff48bf5SDavid du ColombierGhostscript's code assumes the following about the sizes of various types:
44793ff48bf5SDavid du Colombier
44803ff48bf5SDavid du Colombier<dl>
44813ff48bf5SDavid du Colombier<dt>char<dd>8 bits
44823ff48bf5SDavid du Colombier<dt>short<dd>16 bits
44833ff48bf5SDavid du Colombier<dt>int<dd>32 or 64 bits
44843ff48bf5SDavid du Colombier<dt>long<dd>32 or 64 bits
44853ff48bf5SDavid du Colombier<dt>float<dd>32 bits (may work with 64 bits)
44863ff48bf5SDavid du Colombier<dt>double<dd>64 bits (may work with 128 bits)
44873ff48bf5SDavid du Colombier</dl>
44883ff48bf5SDavid du Colombier
44893ff48bf5SDavid du Colombier<p>
44903ff48bf5SDavid du ColombierThe code does not assume that the <b><tt>char</tt></b> type is signed (or
44913ff48bf5SDavid du Colombierunsigned); except for places where the value is always a literal string, or
44923ff48bf5SDavid du Colombierfor interfacing to library procedures, the code uses <b><tt>byte</tt></b> (a
44933ff48bf5SDavid du ColombierGhostscript synonym for <b><tt>unsigned char</tt></b>) almost everywhere.
44943ff48bf5SDavid du Colombier
44953ff48bf5SDavid du Colombier<p>
44963ff48bf5SDavid du ColombierPointers are signed on some platforms and unsigned on others.  In the few
44973ff48bf5SDavid du Colombierplaces in the memory manager where it's necessary to reliably order-compare
44983ff48bf5SDavid du Colombier(as opposed to equality-compare) pointers that aren't known to point to the
44993ff48bf5SDavid du Colombiersame allocated block of memory, the code uses the
45003ff48bf5SDavid du Colombier<b><tt>PTR_</tt></b><em>relation</em> macros rather than direct comparisons.
45013ff48bf5SDavid du Colombier
45023ff48bf5SDavid du Colombier<p>
45033ff48bf5SDavid du ColombierSee the files listed above for other situations where a macro provides
45043ff48bf5SDavid du Colombierplatform-independence or a workaround for bugs in specific compilers or
45053ff48bf5SDavid du Colombierlibraries (of which there are a distressing number).
45063ff48bf5SDavid du Colombier
45073ff48bf5SDavid du Colombier<h4><a name="Platform_specific_code"></a>Platform-specific code</h4>
45083ff48bf5SDavid du Colombier
45093ff48bf5SDavid du Colombier<p>
45103ff48bf5SDavid du ColombierThere are some features that are inherently platform-specific:
45113ff48bf5SDavid du Colombier
45123ff48bf5SDavid du Colombier<ul>
45133ff48bf5SDavid du Colombier
45143ff48bf5SDavid du Colombier<li>Microsoft Windows requires a lot of special top-level code, and also has
45153ff48bf5SDavid du Colombieran installer and uninstaller.
45163ff48bf5SDavid du Colombier
45173ff48bf5SDavid du Colombier<li>OS/2 requires a little special code.
45183ff48bf5SDavid du Colombier
45193ff48bf5SDavid du Colombier<li>MacOS also requires special top-level code (now distributed with the
45203ff48bf5SDavid du Colombierstandard Ghostscript package).
45213ff48bf5SDavid du Colombier
45223ff48bf5SDavid du Colombier<li>All platforms supporting DLLs (currently all three of the above) share
45233ff48bf5SDavid du Colombiersome special top-level code.
45243ff48bf5SDavid du Colombier
45253ff48bf5SDavid du Colombier</ul>
45263ff48bf5SDavid du Colombier
45273ff48bf5SDavid du Colombier<dl>
45283ff48bf5SDavid du Colombier
45293ff48bf5SDavid du Colombier<dt>
45303ff48bf5SDavid du ColombierMS Windows files:
45313ff48bf5SDavid du Colombier<dd>
45323ff48bf5SDavid du Colombier<a href="../src/dpmain.c">src/dpmain.c</a>,
45333ff48bf5SDavid du Colombier<a href="../src/dwdll.c">src/dwdll.c</a>,
45343ff48bf5SDavid du Colombier<a href="../src/dwdll.h">src/dwdll.h</a>,
45353ff48bf5SDavid du Colombier<a href="../src/dwimg.c">src/dwimg.c</a>,
45363ff48bf5SDavid du Colombier<a href="../src/dwimg.h">src/dwimg.h</a>,
45373ff48bf5SDavid du Colombier<a href="../src/dwinst.cpp">src/dwinst.cpp</a>,
45383ff48bf5SDavid du Colombier<a href="../src/dwinst.h">src/dwinst.h</a>,
45393ff48bf5SDavid du Colombier<a href="../src/dwmain.c">src/dwmain.c</a>,
45403ff48bf5SDavid du Colombier<a href="../src/dwmain.h">src/dwmain.h</a>,
45413ff48bf5SDavid du Colombier<a href="../src/dwmainc.c">src/dwmainc.c</a>,
45423ff48bf5SDavid du Colombier<a href="../src/dwnodll.c">src/dwnodll.c</a>,
45433ff48bf5SDavid du Colombier<a href="../src/dwreg.c">src/dwreg.c</a>,
45443ff48bf5SDavid du Colombier<a href="../src/dwreg.h">src/dwreg.h</a>,
45453ff48bf5SDavid du Colombier<a href="../src/dwsetup.cpp">src/dwsetup.cpp</a>,
45463ff48bf5SDavid du Colombier<a href="../src/dwsetup.h">src/dwsetup.h</a>,
45473ff48bf5SDavid du Colombier<a href="../src/dwtext.c">src/dwtext.c</a>,
45483ff48bf5SDavid du Colombier<a href="../src/dwtext.h">src/dwtext.h</a>,
4549*593dc095SDavid du Colombier<a href="../src/dwtrace.c">src/dwtrace.c</a>,
4550*593dc095SDavid du Colombier<a href="../src/dwtrace.h">src/dwtrace.h</a>,
45513ff48bf5SDavid du Colombier<a href="../src/dwuninst.cpp">src/dwuninst.cpp</a>,
45523ff48bf5SDavid du Colombier<a href="../src/dwuninst.h">src/dwuninst.h</a>,
45533ff48bf5SDavid du Colombier<a href="../src/gp_msdll.c">src/gp_msdll.c</a>,
45543ff48bf5SDavid du Colombier<a href="../src/gp_mspol.c">src/gp_mspol.c</a>,
45553ff48bf5SDavid du Colombier<a href="../src/gp_msprn.c">src/gp_msprn.c</a>,
45563ff48bf5SDavid du Colombier<a href="../src/gs16spl.c">src/gs16spl.c</a>,
45573ff48bf5SDavid du Colombier<a href="../src/gsdllwin.h">src/gsdllwin.h</a>.
45583ff48bf5SDavid du Colombier
45593ff48bf5SDavid du Colombier<dt>
45603ff48bf5SDavid du ColombierOS/2 files:
45613ff48bf5SDavid du Colombier<dd>
4562*593dc095SDavid du Colombier<a href="../src/gp_os2pr.c">src/gp_os2pr.c</a>,
45633ff48bf5SDavid du Colombier<a href="../src/gsdllos2.h">src/gsdllos2.h</a>.
45643ff48bf5SDavid du Colombier
45653ff48bf5SDavid du Colombier<dt>
45663ff48bf5SDavid du ColombierUnix files:
45673ff48bf5SDavid du Colombier<dd>
4568*593dc095SDavid du Colombier<a href="../src/dxmain.c">src/dxmain.c</a>,
45693ff48bf5SDavid du Colombier<a href="../src/dxmainc.c">src/dxmainc.c</a>.
45703ff48bf5SDavid du Colombier
45713ff48bf5SDavid du Colombier<dt>
45723ff48bf5SDavid du ColombierMacintosh files:
45733ff48bf5SDavid du Colombier<dd>
4574*593dc095SDavid du Colombier<a href="../src/gdevmac.c">src/gdevmac.c</a>,
4575*593dc095SDavid du Colombier<a href="../src/gdevmac.h">src/gdevmac.h</a>,
4576*593dc095SDavid du Colombier<a href="../src/gdevmacpictop.h">src/gdevmacpictop.h</a>,
4577*593dc095SDavid du Colombier<a href="../src/gdevmacttf.h">src/gdevmacttf.h</a>,
4578*593dc095SDavid du Colombier<a href="../src/gdevmacxf.c">src/gdevmacxf.c</a>,
4579*593dc095SDavid du Colombier<a href="../src/gp_mac.c">src/gp_mac.c</a>,
4580*593dc095SDavid du Colombier<a href="../src/gp_mac.h">src/gp_mac.h</a>,
4581*593dc095SDavid du Colombier<a href="../src/gp_macio.c">src/gp_macio.c</a>,
4582*593dc095SDavid du Colombier<a href="../src/gp_macpoll.c">src/gp_macpoll.c</a>,
4583*593dc095SDavid du Colombier<a href="../src/gsiomacres.c">src/gsiomacres.c</a>,
4584*593dc095SDavid du Colombier<a href="../src/macgenmcpxml.sh">src/macgenmcpxml.sh</a>,
4585*593dc095SDavid du Colombier<a href="../src/macsystypes.h">src/macsystypes.h</a>,
4586*593dc095SDavid du Colombier<a href="../src/macos_carbon_pre.h">src/macos_carbon_pre.h</a>,
4587*593dc095SDavid du Colombier<a href="../src/macos_carbon_d_pre.h">src/macos_carbon_d_pre.h</a>,
4588*593dc095SDavid du Colombier<a href="../src/macos_classic_d_pre.h">src/macos_classic_d_pre.h</a>,
4589*593dc095SDavid du Colombier
4590*593dc095SDavid du Colombier<a href="../src/dmmain.c">src/dmmain.c</a>,
4591*593dc095SDavid du Colombier<a href="../src/dmmain.r">src/dmmain.r</a>.
45923ff48bf5SDavid du Colombier
45933ff48bf5SDavid du Colombier<dt>
45943ff48bf5SDavid du ColombierVMS files:
45953ff48bf5SDavid du Colombier<dd>
45963ff48bf5SDavid du Colombier<a href="../src/vms_x_fix.h">src/vms_x_fix.h</a>.
45973ff48bf5SDavid du Colombier
45983ff48bf5SDavid du Colombier<dt>
45993ff48bf5SDavid du ColombierDLL files:
46003ff48bf5SDavid du Colombier<dd>
46013ff48bf5SDavid du Colombier<a href="../src/gsdll.c">src/gsdll.c</a>,
46023ff48bf5SDavid du Colombier<a href="../src/gsdll.h">src/gsdll.h</a>,
46033ff48bf5SDavid du Colombier<a href="../src/gdevdsp.c">src/gdevdsp.c</a>,
46043ff48bf5SDavid du Colombier<a href="../src/gdevdsp.h">src/gdevdsp.h</a>,
46053ff48bf5SDavid du Colombier<a href="../src/gdevdsp2.h">src/gdevdsp2.h</a>,
46063ff48bf5SDavid du Colombier<a href="../src/iapi.c">src/iapi.c</a>,
46073ff48bf5SDavid du Colombier<a href="../src/iapi.h">src/iapi.h</a>,
46083ff48bf5SDavid du Colombier<a href="../src/idisp.c">src/idisp.c</a>,
46093ff48bf5SDavid du Colombier<a href="../src/idisp.h">src/idisp.h</a>.
46103ff48bf5SDavid du Colombier<p>
46113ff48bf5SDavid du ColombierThe new DLL interface (new as of 7.0) is especially useful with the
46123ff48bf5SDavid du Colombiernew display device, so it is included here. Both are due to Russell
46133ff48bf5SDavid du ColombierLang.
46143ff48bf5SDavid du Colombier
46153ff48bf5SDavid du Colombier</dl>
46163ff48bf5SDavid du Colombier
46173ff48bf5SDavid du Colombier
46183ff48bf5SDavid du Colombier<hr>
46193ff48bf5SDavid du Colombier
46203ff48bf5SDavid du Colombier<h2><a name="Adding_features_and_options"></a>Adding features and options</h2>
46213ff48bf5SDavid du Colombier
46223ff48bf5SDavid du Colombier<p>
46233ff48bf5SDavid du Colombier[Ray, please supply more information about what you want here]
46243ff48bf5SDavid du Colombier
46253ff48bf5SDavid du Colombier<h2><a name="Troubleshooting"></a>Troubleshooting</h2>
46263ff48bf5SDavid du Colombier
46273ff48bf5SDavid du Colombier<p>
46283ff48bf5SDavid du ColombierThe Ghostscript code has many tracing and debugging features that can be
46293ff48bf5SDavid du Colombierenabled at run time using the <b><tt>-Z</tt></b> command line switch, if the
46303ff48bf5SDavid du Colombierexecutable was compiled with <b><tt>DEBUG</tt></b> defined.  One
46313ff48bf5SDavid du Colombierparticularly useful combination is <b><tt>-Z@\?</tt></b>, which fills free
46323ff48bf5SDavid du Colombiermemory blocks with a pattern and also turns on run-time memory consistency
46333ff48bf5SDavid du Colombierchecking.  For more information, see <a
46343ff48bf5SDavid du Colombierhref="Use.htm#Debugging">doc/Use.htm#Debugging</a>; you can also search for
46353ff48bf5SDavid du Colombieroccurrences of <b><tt>if_debug</tt></b> or <b><tt>gs_debug_c</tt></b> in the
46363ff48bf5SDavid du Colombiersource code.  Note that many of these features are in the graphics library
46373ff48bf5SDavid du Colombierand do not require a PostScript interpreter.
46383ff48bf5SDavid du Colombier
46393ff48bf5SDavid du Colombier<p>
46403ff48bf5SDavid du ColombierThe code also contains many run-time procedures whose only purpose is to be
46413ff48bf5SDavid du Colombiercalled from the debugger to print out various data structures, including all
46423ff48bf5SDavid du Colombierthe procedures in <a href="../src/idebug.c">src/idebug.c</a> (for the
46433ff48bf5SDavid du ColombierPostScript interpreter) and the <b><tt>debug_dump_</tt></b> procedures in <a
46443ff48bf5SDavid du Colombierhref="../src/gsmisc.c">src/gsmisc.c</a>.
46453ff48bf5SDavid du Colombier
46463ff48bf5SDavid du Colombier<dl>
46473ff48bf5SDavid du Colombier<dt>
46483ff48bf5SDavid du ColombierFiles:
46493ff48bf5SDavid du Colombier<dd>
46503ff48bf5SDavid du Colombier<a href="Use.htm#Debugging">doc/Use.htm#Debugging</a>,
46513ff48bf5SDavid du Colombier<a href="../src/gdebug.h">src/gdebug.h</a>,
46523ff48bf5SDavid du Colombier<a href="../src/gsmdebug.h">src/gsmdebug.h</a>,
46533ff48bf5SDavid du Colombier<a href="../src/idebug.h">src/idebug.h</a>,
46543ff48bf5SDavid du Colombier<a href="../src/idebug.c">src/idebug.c</a>.
46553ff48bf5SDavid du Colombier</dl>
46563ff48bf5SDavid du Colombier
46573ff48bf5SDavid du Colombier<!-- [2.0 end contents] ==================================================== -->
46583ff48bf5SDavid du Colombier
46593ff48bf5SDavid du Colombier<!-- [3.0 begin visible trailer] =========================================== -->
46603ff48bf5SDavid du Colombier<hr>
46613ff48bf5SDavid du Colombier
46623ff48bf5SDavid du Colombier<p>
46633ff48bf5SDavid du Colombier<small>Copyright &copy; 2001 artofcode LLC.
46643ff48bf5SDavid du ColombierAll rights reserved.</small>
46653ff48bf5SDavid du Colombier
46663ff48bf5SDavid du Colombier<p>
4667*593dc095SDavid du ColombierThis software is provided AS-IS with no warranty, either express or
4668*593dc095SDavid du Colombierimplied.
4669*593dc095SDavid du Colombier
4670*593dc095SDavid du ColombierThis software is distributed under license and may not be copied,
4671*593dc095SDavid du Colombiermodified or distributed except as expressly authorized under the terms
4672*593dc095SDavid du Colombierof the license contained in the file LICENSE in this distribution.
4673*593dc095SDavid du Colombier
4674*593dc095SDavid du ColombierFor more information about licensing, please refer to
4675*593dc095SDavid du Colombierhttp://www.ghostscript.com/licensing/. For information on
4676*593dc095SDavid du Colombiercommercial licensing, go to http://www.artifex.com/licensing/ or
4677*593dc095SDavid du Colombiercontact Artifex Software, Inc., 101 Lucas Valley Road #110,
4678*593dc095SDavid du ColombierSan Rafael, CA  94903, U.S.A., +1(415)492-9861.
46793ff48bf5SDavid du Colombier
46803ff48bf5SDavid du Colombier<p>
4681*593dc095SDavid du Colombier<small>Ghostscript version 8.53, 20 October 2005
46823ff48bf5SDavid du Colombier
46833ff48bf5SDavid du Colombier<!-- [3.0 end visible trailer] ============================================= -->
46843ff48bf5SDavid du Colombier
4685*593dc095SDavid du Colombier</small></body>
46863ff48bf5SDavid du Colombier</html>
4687